编码器 | 基于 Transformers 的编码器-解码器模型

这篇具有很好参考价值的文章主要介绍了编码器 | 基于 Transformers 的编码器-解码器模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于 transformer 的编码器-解码器模型是 表征学习模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外,建议读者对 自注意力 (self-attention) 架构 有一个基本了解,可以阅读 Jay Alammar 的 这篇博文 复习一下原始 transformer 模型。

本文分 4 个部分:

  • 背景 - 简要回顾了神经编码器-解码器模型的历史,重点关注基于 RNN 的模型。
  • 编码器-解码器 - 阐述基于 transformer 的编码器-解码器模型,并阐述如何使用该模型进行推理。
  • 编码器 - 阐述模型的编码器部分。
  • 解码器 - 阐述模型的解码器部分。

每个部分都建立在前一部分的基础上,但也可以单独阅读。这篇分享是第三部分 编码器

编码器

如前一节所述, 基于 transformer 的编码器将输入序列映射到上下文相关的编码序列:

\[f_{\theta_{\text{enc}}}: \mathbf{X}_{1:n} \to \mathbf{\overline{X}}_{1:n} \]

仔细观察架构,基于 transformer 的编码器由许多 残差注意力模块 堆叠而成。每个编码器模块都包含一个 双向 自注意力层,其后跟着两个前馈层。这里,为简单起见,我们忽略归一化层 (normalization layer)。此外,我们不会深入讨论两个前馈层的作用,仅将其视为每个编码器模块 \({}^1\) 的输出映射层。双向自注意层将每个输入向量 \(\mathbf{x'}_j, \forall j \in {1, \ldots, n}\) 与全部输入向量 \(\mathbf{x'}_1, \ldots, \mathbf{x'}_n\) 相关联并通过该机制将每个输入向量 \(\mathbf{x'}_j\) 提炼为与其自身上下文相关的表征: \(\mathbf{x''}_j\)。因此,第一个编码器块将输入序列 \(\mathbf{X}_{1:n}\) (如下图浅绿色所示) 中的每个输入向量从 上下文无关 的向量表征转换为 上下文相关 的向量表征,后面每一个编码器模块都会进一步细化这个上下文表征,直到最后一个编码器模块输出最终的上下文相关编码 \(\mathbf{\overline{X}}_{1:n}\) (如下图深绿色所示)。

我们对 编码器如何将输入序列 "I want to buy a car EOS" 变换为上下文编码序列这一过程进行一下可视化。与基于 RNN 的编码器类似,基于 transformer 的编码器也在输入序列最后添加了一个 EOS,以提示模型输入向量序列已结束 \({}^2\)

上图中的 基于 transformer 的编码器由三个编码器模块组成。我们在右侧的红框中详细列出了第二个编码器模块的前三个输入向量: \(\mathbf{x}_1\)\(\mathbf {x}_2\)\(\mathbf{x}_3\)。红框下部的全连接图描述了双向自注意力机制,上面是两个前馈层。如前所述,我们主要关注双向自注意力机制。

可以看出,自注意力层的每个输出向量 \(\mathbf{x''}_i, \forall i \in {1, \ldots, 7}\)直接 依赖于 所有 输入向量 \(\mathbf{x'}_1, \ldots, \mathbf{x'}_7\)。这意味着,单词 “want” 的输入向量表示 \(\mathbf{x'}_2\) 与单词 “buy” (即 \(\mathbf{x'}_4\)) 和单词 “I” (即 \(\mathbf{x'}_1\)) 直接相关。 因此,“want” 的输出向量表征, \(\mathbf{x''}_2\),是一个融合了其上下文信息的更精细的表征。

我们更深入了解一下双向自注意力的工作原理。编码器模块的输入序列 \(\mathbf{X'}_{1:n}\) 中的每个输入向量 \(\mathbf{x'}_i\) 通过三个可训练的权重矩阵 \(\mathbf{W}_q\)\(\mathbf{W}_v\)\(\mathbf{W}_k\) 分别投影至 key 向量 \(\mathbf{k}_i\)value 向量 \(\mathbf{v}_i\)query 向量 \(\mathbf{q}_i\) (下图分别以橙色、蓝色和紫色表示):

\[\mathbf{q}_i = \mathbf{W}_q \mathbf{x'}_i, \]
\[\mathbf{v}_i = \mathbf{W}_v \mathbf{x'}_i, \]
\[\mathbf{k}_i = \mathbf{W}_k \mathbf{x'}_i, \]
\[\forall i \in {1, \ldots n } \]

请注意,对每个输入向量 \(\mathbf{x}_i (\forall i \in {i, \ldots, n}\)) 而言,其所使用的权重矩阵都是 相同 的。将每个输入向量 \(\mathbf{x}_i\) 投影到 querykeyvalue 向量后,将每个 query 向量 \(\mathbf{q}_j (\forall j \in {1, \ldots, n}\)) 与所有 key 向量 \(\mathbf{k}_1, \ldots, \mathbf{k}_n\) 进行比较。哪个 key 向量与 query 向量 \(\mathbf{q}_j\) 越相似,其对应的 value 向量 \(\mathbf{v}_j\) 对输出向量 \(\mathbf{x''}_j\) 的影响就越重要。更具体地说,输出向量 \(\mathbf{x''}_j\) 被定义为所有 value 向量的加权和 \(\mathbf{v}_1, \ldots, \mathbf{v}_n\) 加上输入向量 \(\mathbf{x'}_j\)。而各 value 向量的权重与 \(\mathbf{q}_j\) 和各个 key 向量 \(\mathbf{k}_1, \ldots, \mathbf{k}_n\) 之间的余弦相似度成正比,其数学公式为 \(\textbf{Softmax}(\mathbf{K}_{1:n}^\intercal \mathbf{q}_j)\),如下文的公式所示。关于自注意力层的完整描述,建议读者阅读 这篇 博文或 原始论文。

好吧,又复杂起来了。我们以上例中的一个 query 向量为例图解一下双向自注意层。为简单起见,本例中假设我们的 基于 transformer 的解码器只有一个注意力头 config.num_heads = 1 并且没有归一化层。

图左显示了上个例子中的第二个编码器模块,右边详细可视化了第二个输入向量 \(\mathbf{x'}_2\) 的双向自注意机制,其对应输入词为 “want”。首先将所有输入向量 \(\mathbf{x'}_1, \ldots, \mathbf{x'}_7\) 投影到它们各自的 query 向量 \(\mathbf{q}_1, \ldots, \mathbf{q}_7\) (上图中仅以紫色显示前三个 query 向量), value 向量 \(\mathbf{v}_1, \ldots, \mathbf{v}_7\) (蓝色) 和 key 向量 \(\mathbf{k}_1, \ldots, \mathbf{k}_7\) (橙色)。然后,将 query 向量 \(\mathbf{q}_2\) 与所有 key 向量的转置 ( \(\mathbf{K}_{1:7}^{\intercal}\)) 相乘,随后进行 softmax 操作以产生 自注意力权重 。 自注意力权重最终与各自的 value 向量相乘,并加上输入向量 \(\mathbf{x'}_2\),最终输出单词 “want” 的上下文相关表征, \(\mathbf{x''}_2\) (图右深绿色表示)。整个等式显示在图右框的上部。 \(\mathbf{K}_{1:7}^{\intercal}\)\(\mathbf{q}_2\) 的相乘使得将 “want” 的向量表征与所有其他输入 (“I”,“to”,“buy”,“a”,“car”,“EOS”) 的向量表征相比较成为可能,因此自注意力权重反映出每个输入向量 \(\mathbf{x'}_j\) 对 “want” 一词的最终表征 \(\mathbf{x''}_2\) 的重要程度。

为了进一步理解双向自注意力层的含义,我们假设以下句子: “ 房子很漂亮且位于市中心,因此那儿公共交通很方便 ”。 “那儿”这个词指的是“房子”,这两个词相隔 12 个字。在基于 transformer 的编码器中,双向自注意力层运算一次,即可将“房子”的输入向量与“那儿”的输入向量相关联。相比之下,在基于 RNN 的编码器中,相距 12 个字的词将需要至少 12 个时间步的运算,这意味着在基于 RNN 的编码器中所需数学运算与距离呈线性关系。这使得基于 RNN 的编码器更难对长程上下文表征进行建模。此外,很明显,基于 transformer 的编码器比基于 RNN 的编码器-解码器模型更不容易丢失重要信息,因为编码的序列长度相对输入序列长度保持不变, \(\textbf{len }(\mathbf{X}_{1:n}) = \textbf{len}(\mathbf{\overline{X}}_{1:n}) = n\),而 RNN 则会将 \(\textbf{len}((\mathbf{X}_{1:n}) = n\) 压缩到 \(\textbf{len}(\mathbf{c}) = 1\),这使得 RNN 很难有效地对输入词之间的长程依赖关系进行编码。

除了更容易学到长程依赖外,我们还可以看到 transformer 架构能够并行处理文本。从数学上讲,这是通过将自注意力机制表示为 querykeyvalue 的矩阵乘来完成的:

\[\mathbf{X''}_{1:n} = \mathbf{V}_{1:n} \text{Softmax}(\mathbf{Q}_{1:n}^\intercal \mathbf{K}_{1:n}) + \mathbf{X'}_{1:n} \]

输出 \(\mathbf{X''}_{1:n} = \mathbf{x''}_1, \ldots, \mathbf{x''}_n\) 是由一系列矩阵乘计算和 softmax 操作算得,因此可以有效地并行化。请注意,在基于 RNN 的编码器模型中,隐含状态 \(\mathbf{c}\) 的计算必须按顺序进行: 先计算第一个输入向量的隐含状态 \(\mathbf{x}_1\); 然后计算第二个输入向量的隐含状态,其取决于第一个隐含向量的状态,依此类推。RNN 的顺序性阻碍了有效的并行化,并使其在现代 GPU 硬件上比基于 transformer 的编码器模型的效率低得多。

太好了,现在我们应该对:
a) 基于 transformer 的编码器模型如何有效地建模长程上下文表征,以及
b) 它们如何有效地处理长序列向量输入这两个方面有了比较好的理解了。

现在,我们写一个 MarianMT 编码器-解码器模型的编码器部分的小例子,以验证这些理论在实践中行不行得通。


\({}^1\) 关于前馈层在基于 transformer 的模型中所扮演的角色的详细解释超出了本文的范畴。Yun 等人 (2017) 的工作认为前馈层对于将每个上下文向量 \(\mathbf{x'}_i\) 映射到目标输出空间至关重要,而单靠 自注意力 层无法达成这一目的。这里请注意,每个输出词元 \(\mathbf{x'}\) 都经由相同的前馈层处理。更多详细信息,建议读者阅读论文。

\({}^2\) 我们无须将 EOS 附加到输入序列,虽然有工作表明,在很多情况下加入它可以提高性能。相反地,基于 transformer 的解码器必须把 \(\text{BOS}\) 作为第 0 个目标向量,并以之为条件预测第 1 个目标向量。

from transformers import MarianMTModel, MarianTokenizer
import torch

tokenizer = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-de")
model = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-de")

embeddings = model.get_input_embeddings()

# create ids of encoded input vectors
input_ids = tokenizer("I want to buy a car", return_tensors="pt").input_ids

# pass input_ids to encoder
encoder_hidden_states = model.base_model.encoder(input_ids, return_dict=True).last_hidden_state

# change the input slightly and pass to encoder
input_ids_perturbed = tokenizer("I want to buy a house", return_tensors="pt").input_ids
encoder_hidden_states_perturbed = model.base_model.encoder(input_ids_perturbed, return_dict=True).last_hidden_state

# compare shape and encoding of first vector
print(f"Length of input embeddings {embeddings(input_ids).shape[1]}. Length of encoder_hidden_states {encoder_hidden_states.shape[1]}")

# compare values of word embedding of "I" for input_ids and perturbed input_ids
print("Is encoding for `I` equal to its perturbed version?: ", torch.allclose(encoder_hidden_states[0, 0], encoder_hidden_states_perturbed[0, 0], atol=1e-3))

输出:

    Length of input embeddings 7. Length of encoder_hidden_states 7
    Is encoding for `I` equal to its perturbed version?: False

我们比较一下输入词嵌入的序列长度 ( embeddings(input_ids),对应于 \(\mathbf{X}_{1:n}\)) 和 encoder_hidden_​​states 的长度 (对应于\(\mathbf{\overline{X}}_{1:n}\))。同时,我们让编码器对单词序列 “I want to buy a car” 及其轻微改动版 “I want to buy a house” 分别执行前向操作,以检查第一个词 “I” 的输出编码在更改输入序列的最后一个单词后是否会有所不同。

不出意外,输入词嵌入和编码器输出编码的长度, \(\textbf{len}(\mathbf{X}_{1:n})\)\(\textbf{len }(\mathbf{\overline{X}}_{1:n})\),是相等的。同时,可以注意到当最后一个单词从 “car” 改成 “house” 后,\(\mathbf{\overline{x}}_1 = \text{“I”}\) 的编码输出向量的值也改变了。因为我们现在已经理解了双向自注意力机制,这就不足为奇了。

顺带一提, 自编码 模型 (如 BERT) 的架构与 基于 transformer 的编码器模型是完全一样的。 自编码 模型利用这种架构对开放域文本数据进行大规模自监督预训练,以便它们可以将任何单词序列映射到深度双向表征。在 Devlin 等 (2018) 的工作中,作者展示了一个预训练 BERT 模型,其顶部有一个任务相关的分类层,可以在 11 个 NLP 任务上获得 SOTA 结果。你可以从 此处 找到 🤗 transformers 支持的所有 自编码 模型。

敬请关注其余部分的文章。


英文原文: https://hf.co/blog/encoder-decoder

原文作者: Patrick von Platen

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

审校/排版: zhongdongy (阿东)文章来源地址https://www.toymoban.com/news/detail-472403.html

到了这里,关于编码器 | 基于 Transformers 的编码器-解码器模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉 | 目标检测】术语理解9:AIGC的理解,对比学习,解码器,Mask解码器,耦合蒸馏,半耦合,图像编码器和组合解码器的耦合优化

    AIGC指的是使用人工智能技术自动生成的各类数字内容,包括文本、图像、音频、视频等。它利用机器学习模型进行智能化内容生成。 主要的技术手段包括: 自然语言生成(NLG):使用RNN、GPT等语言模型生成文本。 生成对抗网络(GAN):使用GAN生成高质量图片。 自动语音合成(TTS):使用

    2024年02月04日
    浏览(67)
  • 深入了解Transformer:从编码器到解码器的神经网络之旅

    自2017年问世以来,Transformer模型在自然语言处理(NLP)领域引发了一场革命。它的独特设计和高效性能使其成为了解决复杂语言任务的关键工具。 (1)自注意力机制 Transformer的核心在于自注意力机制。它允许模型在处理每个词时考虑句子中的所有其他词,从而有效捕获长距离依

    2024年01月17日
    浏览(49)
  • LeViT-UNet:transformer 编码器和CNN解码器的有效整合

    levi - unet[2]是一种新的医学图像分割架构,它使用transformer 作为编码器,这使得它能够更有效地学习远程依赖关系。levi - unet[2]比传统的U-Nets更快,同时仍然实现了最先进的分割性能。 levi - unet[2]在几个具有挑战性的医学图像分割基准上取得了比其他法更好的性能,包括Synap

    2024年02月12日
    浏览(45)
  • SpringBoot项目整合OpenFeign、实现动态IP+URL请求、自定义(编码器\解码器)

    OpenFeign 是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中. 启动类加上注解: @EnableDiscoveryClient 动态URL 工具类: FeignUtils.class

    2024年02月02日
    浏览(50)
  • 机器学习&&深度学习——从编码器-解码器架构到seq2seq(机器翻译)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——注意力提示、注意力池化(核回归) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 接下来就要慢慢开始实战了,把这边过了,我们接下来就要进行机器翻译的实战

    2024年02月13日
    浏览(41)
  • RK3399Pro-硬件编解码器MPP库快速上手--(二)MPP编码入门

    整个编码分为mpp_create,mpp_init, 再通过mpp的接口mpi-control接口来进行参数设置.一般需要配置三类信息: 码率控制方式(MPPEncRcCfg),通过命令MPP_ENC_RC_CFG配置; 输入控制配置(MppEncPrepCfg),通过命令MPP_ENC_SET_PREP_CFG配置; 协议控制配置(MppEncCodecCfg),通过命令MPP_ENC_SET_CO

    2024年02月02日
    浏览(35)
  • 利用第三方解码器ffmpeg让群晖DSM6.2.4版本的Video Station支持DTS视频编码和EAC3音频编码

    截至2022年5月6日,此方法可用! 本文章可以解决群晖版本6.2.4-25556 Update5(Video Station版本2.5.0-1656)在播放dts、eac3音频编码的视频时提示不支持的问题。 对于群晖6.2.3版本,Video Station版本2.4.9,网上随便搜的方法都可以使用,但是用在6.2.4未必可行。原因在于Video Station版本2

    2023年04月08日
    浏览(40)
  • 基于扩散模型的图像压缩:创建基于Stable Diffusion的有损压缩编解码器

    Stable Diffusion是最近在图像生成领域大火的模型,在对他研究的时候我发现它可以作为非常强大的有损图像压缩编解码器。在介绍之前,我们先看看它与高压缩率下的JPG和WebP相比的而结果,所有都是512x512像素的分辨率为单位: 上面这图的细节如下: 这是JPG压缩结果大小为5

    2024年02月12日
    浏览(43)
  • 自然语言处理(七):来自Transformers的双向编码器表示(BERT)

    BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的自然语言处理模型,由Google于2018年提出。它是基于Transformer模型架构的深度双向(双向指同时考虑上下文信息)表示学习模型。 BERT的目标是通过在大规模文本语料上进行自监督学习来学习通用的语言表示。在预

    2024年02月09日
    浏览(42)
  • BERT:来自 Transformers 的双向编码器表示 – 释放深度上下文化词嵌入的力量

    BERT是 Transformers 双向编码器表示 的缩写,是 2018 年推出的改变游戏规则的 NLP 模型之一。BERT 的情感分类、文本摘要和问答功能使其看起来像是一站式 NLP 模型。尽管更新和更大的语言模型已经出现,但 BERT 仍然具有相关性,并且值得学习它的架构、方法和功能。  这篇综合文

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包