1. Transformer整体结构
首先介绍Transformer的整体结构,下图是Transformer用于中英文翻译的整体结构:
可以看到Transformer由Encoder和Decoder两部分组成,Encoder和Decoder都包含了6个block。
-
Transformer的工作流程大体如下:
- 第一步:获取输入句子的每一个单词的表示向量X,X右单词的Embedding(Embedding就是从原始数据提取出来的Feature)和单词位置的Embedding相加得到。
- 第二步:将得到的单词表示向量矩阵(如上图所示,每一行是一个单词的表示x)传入Encoder中,经过6个Encoder block后可以得到句子中所有单词的编码信息矩阵C,如下图,单词向量矩阵用\(X_{n*d}\)表示,n是句子中单词个数,d是表示向量的维度(d=512)。每一个Encoder block输出的矩阵维度与输入完全一致。
- 第三步:将Encoder输出的编码信息矩阵C传递到Decoder中,Decoder依次会根据当前翻译过的单词1~i翻译下一个单词i+1,如下图所示。在使用过程中,翻译到单词i+1的时候需要通过Mask(掩盖)操作盖住i+1之后的单词。
上图Decoder接收了Encoder的编码矩阵C,然后首先输入一个翻译开始符" ",预测第一个单词"I";然后输入翻译开始符" "和单词"I",预测单词"have",以此类推。这是Transformer使用时候的大致流程,接下来是里面各个部分的细节。
- 第一步:获取输入句子的每一个单词的表示向量X,X右单词的Embedding(Embedding就是从原始数据提取出来的Feature)和单词位置的Embedding相加得到。
2. Transformer的输入
Transformer中单词的输入表示x由单词Embedding和位置Embedding(Positional Encodeing)相加得到。
2.1 单词Embedding
单词的Embedding有很多种方式可以获取,例如可以采用Word2Vec、Glove等算法预训练得到,也可以在Transformer中训练得到。
2.2 位置Embedding
Transformer中除了单词的Embedding,还需要使用位置Embedding表示单词出现在句子中的位置。
因为Transformer不采用RNN结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于NLP来说非常重要。所以Transformer中使用位置Embedding保存单词在序列中的相对或绝对位置。
位置Embedding用PE表示,PE的维度与单词Embedding是一样的。PE可以通过训练得到,也可以使用某种公式计算得到。在Transformer中采用了后者,计算公式如下:
其中,pos表示单词在句子中的位置,d表示PE的维度(与词Embedding一样),2i表示偶数的维度,2i+1表示奇数维度(即2i<=d,2i+1<=d)使用这种公式计算PE有以下的好处:
- 使PE能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有20个单词,突然来了一个长度为21的句子,则使用公式计算的方法可以计算出第21位的Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距k,PE(pos+k)可以用PE(pos)计算得到。
- 因为Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)
3. Self-Attention(自注意力机制)
Transformer的内部结构图如下: