Transformer是谷歌大脑在2017年底发表的论文attention is all you need中所提出的seq2seq模型。现在已经取得了大范围的应用和扩展,而BERT就是从Transformer中衍生出来的预训练语言模型
这篇文章分为以下几个部分
- Transformer直观认识
- Positional Encoding
- Self Attention Mechanism
- 残差连接和Layer Normalization
- Transformer Encoder整体结构
- Transformer Decoder整体结构
- 总结
- 参考文章
0. Transformer直观认识
Transformer和LSTM的最大区别,就是LSTM的训练是迭代的、串行的,必须要等当前字处理完,才可以处理下一个字。而Transformer的训练时并行的,即所有字是同时训练的,这样就大大增加了计算效率。Transformer使用了位置嵌入(Positional Encoding)来理解语言的顺序,使用自注意力机制(Self Attention Mechanism)和全连接层进行计算,这些后面会讲到
Transformer模型主要分为两大部分,分别是Encoder和Decoder。Encoder负责把输入(语言序列)隐射成隐藏层(下图中第2步用九宫格代表的部分),然后解码器再把隐藏层映射为自然语言序列。例如下图机器翻译的例子(Decoder输出的时候,是通过N层Decoder Layer才输出一个token,并不是通过一层Decoder Layer就输出一个token)
本篇文章大部分内容在于解释Encoder部分,即把自然语言序列映射为隐藏层的数学表达的过程。理解了Encoder的结构,再理解Decoder就很简单了
上图为Transformer Encoder Block结构图,注意:下面的内容标题编号分别对应着图中1,2,3,4个方框的序号
1. Positional Encoding
由于Transformer模型没有循环神经网络的迭代操作, 所以我们必须提供每个字的位置信息给Transformer,这样它才能识别出语言中的顺序关系
现在定义一个位置嵌入的概念,也就是Positional Encoding,位置嵌入的维度为[max_sequence_length, embedding_dimension]
, 位置嵌入的维度与词向量的维度是相同的,都是embedding_dimension
。max_sequence_length
属于超参数,指的是限定每个句子最长由多少个词构成
注意,我们一般以字为单位训练Transformer模型。首先初始化字编码的大小为[vocab_size, embedding_dimension]
,vocab_size
为字库中所有字的数量,embedding_dimension
为字向量的维度,对应到PyTorch中,其实就是nn.Embedding(vocab_size, embedding_dimension)
论文中使用了sin和cos函数的线性变换来提供给模型位置信息: