朝花夕拾(一)——Transformer
好的,之前说要做这么一个朝花夕拾的系列,拖了很久也没开始动手,今天下定决心要开一篇出来。今天的回顾的这篇论文是Attention Is All You Need,提出了Transformer这个架构,并利用Transformer完成机器翻译的任务。Transformer这个架构的论文作为本系列的第一篇应该是相当合适的,因为后续的很多工作将在Transformer这个模型架构下进行。
动机
在Transformer之前主流的序列到序列模型(seq2seq model)使用的是循环神经网络或者卷积神经网络,包含一个编码器和一个解码器。表现最好的模型还通过注意力机制连接编码器和解码器。循环神经网络需要为每一个位置生成一个隐藏层状态\(h_t\),计算这个隐藏状态需要前一个位置生成的隐藏层状态\(h_{t-1}\)和该位置的输入\(t\)。这种固有的串行计算方式妨碍了训练样本的并行化,在序列长度较长时,序列内部的并行化计算变得非常重要。因为显存约束,限制了通过样本之间的批处理缓解序列内部不能并行计算的问题。意思就是序列较短的时候,RNN还可以用大批量,一次计算多个样本的第\(t\)个位置的隐藏层状态来达到并行计算吃满GPU的效果。但是如果序列太长了,那就制约你使用大批量,因为序列长隐藏层状态多了,还用大批量显存会吃不消。那调小批量?bs小了因为序列内部是串行计算的,所以导致计算效率比较低。 这篇论文提出了一种新的简单网络架构Transformer,这个架构完全基于注意力机制,而且不需要循环神经网络和卷积神经网络参与。Transformer完全依靠注意力机制获取输入输出之间的全局依赖关系,运行序列内部的并行化计算,相较于RNN并行化程度更高。实验表明Transformer模型在翻译质量上优于其他模型,同时具备更强的并行计算能力,训练时间明显减少。
方法
主要是提出了一种新的不依赖RNN和CNN结构的全新序列到序列架构——Transformer。其架构如下图所示:
可以看到其由一个Encoder和Decoder组成,每个Encoder/Decoder都有N个Encoder块/Deocder块堆叠组成,输入的Embedding层将inputs_id映射为嵌入向量,并通过正弦式位置编码为不同位置的token加入位置信息。之后每个Encoder块先经过多头注意力,之后再经过残差链接和层归一化(注意此处是Post-Norm,现在很多GPT类似的Decoder only的模型为了训练稳定性而选择Pre-Norm)。再之后通过FFN层,再进行残差链接和层归一化。取最后一层的Encoder块的输出,作为每个Decoder块的输入之一。Decoder块使用了右移后的输出,通过预测下一个token来训练模型。Decoder块先将输入加入位置编码,之后过带mask的多头自注意力,之后Add&Norm,再之后过以上一层输出映射后作为Q,以最后一层Encoder块映射作为K和V,进行交叉注意力,之后Add&Norm,最后经过FFN层,Add&Norm结束。取最后一个Deocder的输出经过线性头映射并通过Softmax函数得到当前token对应的下一个token的概率分布。
自注意力机制
也叫缩放点积注意力机制。公式: \[
Attention(Q,K,V) = \text{Softmax} \left (\frac{QK^T}{\sqrt{d_k}} \right
) V
\]
多头自注意力机制
通过多头让不同的头关注序列的不同方面,增强模型的表达能力。公式: \[ \begin{aligned} \text{MultiHead}(Q,K,V) &= \text{Concat}(\text{head}_1,\cdots, \text{head}_h ) W^O \\ \text{where head}_i &= \text{Attention}(QW^Q_i, KW^K_i, VW^V_i) \end{aligned} \]