在Transformer总结(一)中介绍了基础的注意力机制,接下来将结合具体的任务场景,介绍Transformer的整体架构,并简单探讨一下相应原理。其中涉及到的组件将在Transformer总结(三)中详细说明。
Seq2Seq(Sequence to Sequence)模型,主要用于处理序列到序列的映射问题,常见的应用场景如下:
Encoder-Decoder是一个更为通用的框架,而Seq2Seq是这个框架下的一种特定实现,专门用于处理序列转换问题。Seq2Seq模型依赖于Encoder-Decoder架构,但具体实现时会有所不同。
一般的Encoder-Decoder架构如下:
编码器(Encoder)的作用:
解码器(Decoder)的作用:
对应到具体的seq2seq场景,可以参照下列图片展示的流程:
感谢李沐老师的教材,下列图片展示了一个机器翻译任务:
- 编码器先对句子中的单词进行编码学习,得到单词的特征表示和相应阶段的隐藏状态。
- 解码器借助由编码器得到的上下文变量,再结合每次的输入内容,从而预测输出,然后将此时的输出作为下一次的输入;以‘
’作为初始输入,依次进行,直到输出为‘ ’标识,表示句子结尾,结束输出。
编码器(Encoder)的处理:
考虑由一个序列组成的样本(批量大小是 1 1 1)。
h t = f ( x t , h t − 1 ) . \mathbf{h}_t = f(\mathbf{x}_t, \mathbf{h}_{t-1}). ht=f(xt,ht−1).
总之,编码器通过选定的函数 q q q,将所有时间步的隐状态转换为上下文变量:
c = q ( h 1 , … , h T ) . \mathbf{c} = q(\mathbf{h}_1, \ldots, \mathbf{h}_T). c=q(h1,…,hT).
解码器(Decoder)的处理:
s t ′ = g ( y t ′ − 1 , c , s t ′ − 1 ) . \mathbf{s}_{t^\prime} = g(y_{t^\prime-1}, \mathbf{c}, \mathbf{s}_{t^\prime-1}). st′=g(yt′−1,c,st′−1).
在上述展示的内容中,解码器如何使用上下文变量 c \mathbf{c} c是值得探讨的,解码器仅在其初始化阶段使用解码器最终得到的隐藏状态,每次计算使用的上下文 c \mathbf{c} c是一个固定值,但很明显这种方法不能高效地利用解码器中的信息,因为它忽略了输入词元与解码器中词元的关系,所以可以往其中简单引入注意力机制,Bahdanau Attention正是对上述架构的加强:
Bahdanau Attention:
- 在解码器的处理过程中, c t ′ = ∑ t = 1 T α ( s t ′ − 1 , h t ) h t , \mathbf{c}_{t'} = \sum_{t=1}^T \alpha(\mathbf{s}_{t' - 1}, \mathbf{h}_t) \mathbf{h}_t, ct′=∑t=1Tα(st′−1,ht)ht,,每个时间步的上下文变量都是重新计算出来的,这里使用的是加型注意力机制计算注意力权重
- 30和50表示的是训练阶段使用句子的单词数目上限;search表示引入了注意力机制,enc表示传统机制;根据结果可以看到,在长句子中,引入注意力机制的模型不仅鲁棒性更强,而且效果也更好
NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE原文
Bahdanau Attention基于RNN,观察上述的实现,可以发现RNN存在一些局限:
针对上述两点,自注意力可以做出提升:
Attention Is All You Need原文
Transformer架构完全基于注意力,它摒弃了传统的循环神经网络(RNN)结构,转而采用自注意力机制来处理序列数据。这种机制允许模型并行计算序列中所有位置的表示,从而有效捕捉长距离依赖关系。
编码器架构
编码器由几个完全一样的块组成,而每个块则由两个子层组成,分别为:
对于每个子层,再使用residual connection和layer normalization。子层的输出为:
L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x + Sublayer(x)) LayerNorm(x+Sublayer(x))
为了方便进行残差连接,所以需要统一子层输入输出的维度,此时涉及到了两个超参数,分别为:块数、子层的输入输出维度;而论文中超参数设定块数为6,维度为512。
解码器架构
解码器同样使用6个完全一样的块组成,但与编码器不同的是,此时每个块由三个子层组成,分别为:
对于每个子层,同样使用residual connection和layer normalization。
接下来将以上述的机器翻译任务为例,简单说明一下如何实现结果的预测,关于一些操作的具体实现会在后文中详细说明,在Transformer总结(一)也稍有提及。
若动图无法加载,可见动图来源
需要重点说明的是,解码器是一个自回归模型,使用上一次预测的结果作为下一次的输入,所以它在预测阶段是串行的,但是在训练阶段可以使用 强制教学(Teacher Forcing) 从而并行计算。
teacher-forcing ,在训练网络过程中,每次不使用上一个state的输出作为下一个state的输入,而是直接使用训练数据的标准答案(ground truth)的对应上一项作为下一个state的输入。
这也就意味着训练阶段不必依赖于之前的输出生成输入,而是直接得到每个时间步的输入,也就是可以并行计算。
由强制教学出发,此时便可以说明masked multi-head self-attention mechanism中掩码的作用。掩码通过控制注意力权重,从而在计算多头注意力时query不会关注当前时间步之后的信息,等会将详细说明。预测阶段,也就不需要使用这里的Sequence Mask机制了。
具体细节可见知乎讲解,此处仅以动图进行演示。
其中值得说明的是整体右移一位(Shifted Right),解码器每次处理都需要输入,但在最开始的时候还没有上一个阶段的预测输出,此时就要以起始符作为初始的输入,而这个起始符将导致输入句子在原始的基础上右移一位。