依据 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个范畴多年研究成果的结晶。本文扼要介绍了神经编码器-解码器模型的前史,更多布景知识,主张读者阅览由 Sebastion Ruder 撰写的这篇精彩 博文。此外,主张读者对 自注意力 (self-attention) 架构 有一个基本了解,能够阅览 Jay Alammar 的 这篇博文 复习一下原始 transformer 模型。
本文分 4 个部分:
- 布景 – 扼要回忆了神经编码器-解码器模型的前史,要点重视依据 RNN 的模型。
- 编码器-解码器 – 论述依据 transformer 的编码器-解码器模型,并论述怎么运用该模型进行推理。
- 编码器 – 论述模型的编码器部分。
- 解码器 – 论述模型的解码器部分。
每个部分都树立在前一部分的基础上,但也能够独自阅览。这篇分享是第二部分 编码器-解码器。
编码器-解码器
2017 年,Vaswani 等人引入了 transformer 架构,然后催生了 依据 transformer 的编码器-解码器模型。
与依据 RNN 的编码器-解码器模型相似,依据 transformer 的编码器-解码器模型由一个编码器和一个解码器组成,且其编码器和解码器均由 残差注意力模块 (residual attention blocks) 堆叠而成。依据 transformer 的编码器-解码器模型的关键立异在于: 残差注意力模块无需运用循环结构即可处理长度 nn 可变的输入序列 X1:n\mathbf{X}_{1:n}。不依靠循环结构使得依据 transformer 的编码器-解码器能够高度并行化,这使得模型在现代硬件上的核算效率比依据 RNN 的编码器-解码器模型高出几个数量级。
回忆一下,要处理 序列到序列 问题,咱们需求找到输入序列 X1:n\mathbf{X}_{1:n} 到变长输出序列 Y1:m\mathbf{Y}_{1:m} 的映射。咱们看看怎么运用依据 transformer 的编码器-解码器模型来找到这样的映射。
与依据 RNN 的编码器-解码器模型相似,依据 transformer 的编码器-解码器模型界说了在给定输入序列 X1:n\mathbf{X}_{1:n} 条件下方针序列 Y1:m\mathbf{Y}_{1:m} 的条件散布:
依据 transformer 的编码器部分将输入序列 X1:n\mathbf{X}_{1:n} 编码为 隐含状况序列 X‾1:n\mathbf{\overline{X}}_{1:n},即:
fenc:X1:n→X‾1:nf_{\theta_{\text{enc}}}: \mathbf{X}_{1:n} \to \mathbf{\overline{X}}_{1:n}
然后,依据 transformer 的解码器担任建模在给定隐含状况序列 X‾1:n\mathbf{\overline{X}}_{1:n} 的条件下方针向量序列 Y1:m\mathbf{Y}_{1:m} 的概率散布:
pdec(Y1:m∣X‾1:n) p_{\theta_{dec}}(\mathbf{Y}_{1:m} | \mathbf{\overline{X}}_{1:n})
依据贝叶斯法则,该序列散布可被分解为每个方针向量 yi\mathbf{y}_i 在给定隐含状况 X‾1:n\mathbf{\overline{X} }_{1:n} 和其一切前驱方针向量 Y0:i−1\mathbf{Y}_{0:i-1} 时的条件概率之积:
因而,在生成 yi\mathbf{y}_i 时,依据 transformer 的解码器将隐含状况序列 X‾1:n\mathbf{\overline{X}}_{1:n} 及其一切前驱方针向量 Y0:i−1\mathbf{Y}_{0 :i-1} 映射到 logit 向量 li\mathbf{l}_i。 然后经由 softmax 运算对 logit 向量 li\mathbf{l}_i 进行处理,然后生成条件散布 pdec(yi∣Y0:i−1,X‾1:n)p_{\theta_{\text{dec}}}(\mathbf{y}_i | \mathbf{Y}_{0: i-1}, \mathbf{\overline{X}}_{1:n})。这个流程跟依据 RNN 的解码器是相同的。但是,与依据 RNN 的解码器不同的是,在这儿,方针向量 yi\mathbf{y}_i 的散布是 显式 (或直接) 地以其一切前驱方针向量 y0,…,yi−1\mathbf{y}_0, \ldots, \mathbf{y}_{i-1} 为条件的,稍后咱们将具体介绍。此处第 0 个方针向量 y0\mathbf{y}_0 仍表明为 BOS\text{BOS} 向量。有了条件散布 pdec(yi∣Y0:i−1,X‾1:n)p_{\theta_{\text{dec}}}(\mathbf{y}_i | \mathbf{Y}_{0: i-1}, \mathbf{\overline{X} }_{1:n}),咱们就能够 自回归 生成输出了。至此,咱们界说了可用于推理的从输入序列 X1:n\mathbf{X}_{1:n} 到输出序列 Y1:m\mathbf{Y}_{1:m} 的映射。
咱们可视化一下运用 依据 transformer 的编码器-解码器模型 _自回归_地生成序列的完整进程。
上图中,绿色为依据 transformer 的编码器,赤色为依据 transformer 的解码器。与上一节相同,咱们展示了怎么将表明为 (x1=I,x2=want,x3=to,x4=buy,x5=a,x6=car,x7=EOS)(\mathbf{x}_1 = \text{I},\mathbf{ x}_2 = \text{want},\mathbf{x}_3 = \text{to},\mathbf{x}_4 = \text{buy},\mathbf{x}_5 = \text{a},\mathbf{x}_6 = \text{car},\mathbf{x}_7 = \text{EOS}) 的英语语句 “I want to buy a car” 翻译成表明为 (y0=BOS,y1=Ich,y2=will,y3=ein,y4=Auto,y5=kaufen,y6=EOS)(\mathbf{y}_0 = \text{BOS},\mathbf{y }_1 = \text{Ich},\mathbf{y}_2 = \text{will},\mathbf{y}_3 = \text{ein},\mathbf{y}_4 = \text{Auto},\mathbf{y}_5 = \text{kaufen},\mathbf{y}_6=\text{EOS}) 的德语语句 “Ich will ein Auto kaufen”。
首要,编码器将完整的输入序列 X1:7\mathbf{X}_{1:7} = “I want to buy a car” (由浅绿色向量表明) 处理为上下文相关的编码序列 X‾1:7\mathbf{\overline{X}}_{1:7}。这儿上下文相关的意思是, 举个比如 ,x‾4\mathbf{\overline{x}}_4 的编码不仅取决于输入 x4\mathbf{x}_4 = “buy”,还与一切其他词 “I”、“want”、“to”、“a”、“car” 及 “EOS” 相关,这些词即该词的 上下文 。
接下来,输入编码 X‾1:7\mathbf{\overline{X}}_{1:7} 与 BOS 向量 ( 即 y0\mathbf{y}_0) 被一同馈送到解码器。解码器将输入 X‾1:7\mathbf{\overline{X}}_{1:7} 和 y0\mathbf{y}_0 变换为第一个 logit l1\mathbf{l }_1 (图中以深赤色显现),然后得到第一个方针向量 y1\mathbf{y}_1 的条件散布:
penc,dec(y∣y0,X1:7)=penc,dec(y∣BOS,IwanttobuyacarEOS)=pdec(y∣BOS,X‾1:7)p_{\theta_{enc, dec}}(\mathbf{y} | \mathbf{y}_0, \mathbf{X}_{1:7}) = p_{\theta_{enc, dec}}(\mathbf{y} | \text{BOS}, \text{I want to buy a car EOS}) = p_{\theta_{dec}}(\mathbf{y} | \text{BOS}, \mathbf{\overline{X}}_{1:7})
然后,从该散布中采样出第一个方针向量 y1\mathbf{y}_1 = Ich\text{Ich} (由灰色箭头表明),得到第一个输出后,咱们会并将其持续馈送到解码器。现在,解码器开端以 y0\mathbf{y}_0 = “BOS” 和 y1\mathbf{y}_1 = “Ich” 为条件来界说第二个方针向量的条件散布 y2\mathbf{y}_2:
pdec(y∣BOSIch,X‾1:7)p_{\theta_{dec}}(\mathbf{y} | \text{BOS Ich}, \mathbf{\overline{X}}_{1:7})
再采样一次,生成方针向量 y2\mathbf{y}_2 = “will”。重复该自回归进程,直到第 6 步从条件散布中采样到 EOS:
EOS∼pdec(y∣BOSIchwilleinAutokaufen,X‾1:7)\text{EOS} \sim p_{\theta_{dec}}(\mathbf{y} | \text{BOS Ich will ein Auto kaufen}, \mathbf{\overline{X}}_{1:7})
这儿有一点比较重要,咱们仅在第一次前向传达时用编码器将 X1:n\mathbf{X}_{1:n} 映射到 X‾1:n\mathbf{\overline{X}}_{1:n}。从第2次前向传达开端,解码器能够直接运用之前算得的编码 X‾1:n\mathbf{\overline{X}}_{1:n}。为清楚起见,下图画出了上例中第一次和第2次前向传达所需求做的操作。
能够看出,仅在步骤 i=1i=1 时,咱们才需求将 “I want to buy a car EOS” 编码为 X‾1:7\mathbf{\overline{X}}_{1:7}。从 i=2i=2 开端,解码器仅仅简略地复用了已生成的编码。
在 transformers 库中,这一自回归生成进程是在调用 .generate()
办法时在后台完结的。咱们用一个翻译模型来实践体会一下。
from transformers import MarianMTModel, MarianTokenizer
tokenizer = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-de")
model = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-de")
# create ids of encoded input vectors
input_ids = tokenizer("I want to buy a car", return_tensors="pt").input_ids
# translate example
output_ids = model.generate(input_ids)[0]
# decode and print
print(tokenizer.decode(output_ids))
输出:
<pad> Ich will ein Auto kaufen
.generate()
接口做了很多作业。首要,它将 input_ids
传递给编码器。然后,它将一个预界说的符号连同已编码的 input_ids
一同传递给解码器 (在运用 MarianMTModel
的情况下,该预界说符号为 \text{<pad>} )。接着,它运用波束查找解码机制依据最新的解码器输出的概率散布 1{}^1 自回归地采样下一个输出词。更多有关波束查找解码作业原理的具体信息,主张阅览 这篇博文。
咱们在附录中加入了一个代码片段,展示了怎么“从头开端”完成一个简略的生成办法。假如你想要彻底了解 自回归 生成的幕后作业原理,强烈主张阅览附录。
总结一下:
- 依据 transformer 的编码器完成了从输入序列 X1:n\mathbf{X}_{1:n} 到上下文相关的编码序列 X‾1:n\mathbf{\overline{X}}_{1 :n} 之间的映射。
- 依据 transformer 的解码器界说了条件散布 pdec(yi∣Y0:i−1,X‾1:n)p_{\theta_{\text{dec}}}(\mathbf{y}_i | \mathbf{Y}_{0: i-1}, \mathbf{ \overline{X}}_{1:n})。
- 给定适当的解码机制,能够自回归地从 pdec(yi∣Y0:i−1,X‾1:n),∀i∈1,…,mp_{\theta_{\text{dec}}}(\mathbf{y}_i | \mathbf{Y}_{0: i-1}, \mathbf{\overline{X}}_{1:n}), \forall i \in {1, \ldots, m} 中采样出输出序列 Y1:m\mathbf{Y}_{1:m}。
太好了,现在咱们已经大致了解了 依据 transformer 的 编码器-解码器模型的作业原理。下面的部分,咱们将更深入地研究模型的编码器和解码器部分。更具体地说,咱们将确切地看到编码器怎么利用自注意力层来发生一系列上下文相关的向量编码,以及自注意力层怎么完成高效并行化。然后,咱们将具体解释自注意力层在解码器模型中的作业原理,以及解码器怎么经过 交叉注意力 层以编码器输出为条件来界说散布 pdec(yi∣Y0:i−1,X‾1:n)p_{\theta_{\text{dec}}}(\mathbf{y}_i | \mathbf{Y}_{0: i-1}, \mathbf{\overline{X}}_{1:n})。在此进程中,依据 transformer 的编码器-解码器模型怎么处理依据 RNN 的编码器-解码器模型的长程依靠问题的答案将变得清楚明了。
1{}^1 能够从 此处 获取 "Helsinki-NLP/opus-mt-en-de"
的解码参数。能够看到,其运用了 num_beams=6
的波束查找。
敬请重视其余部分的文章。
英文原文: hf.co/blog/encode…
原文作者: Patrick von Platen
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,作业方向为 transformer-family 模型在各模态数据上的使用及大规模模型的训练推理。
审校/排版: zhongdongy (阿东)