Tansformer架构
网络结构
下面结合具体案例进行网络结构参数,其中案例以机器翻译为例:将“我有一只猫”翻译成“I have a cat <end>”。
输入Embedding
在Transformer中对于输入的序列“我 有 一只 猫”进行Embedding操作,得到输入序列的向量XXX,其中XXX由嵌入Word Embedding和位置嵌入Positional Embedding两个操作得到的向量进行点加而成。
- ** Word Embedding**: 词嵌入方式可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。其中自训练的方式实际上就是采用OneHot编码+一系列全连接层得到的。
- Positional Embedding: 位置编码采用的是以下公式,其中dmodel是向量的维度,从公式中可以看出,位置向量中偶数维为sin函数,奇数维为cos函数。
PE(pos,2i)=sin(pos100002idmodel)PE(pos, 2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})PE(pos,2i)=sin(10000dmodel2ipos)
PE(pos,2i+1)=cos(pos100002idmodel)PE(pos, 2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})PE(pos,2i+1)=cos(10000dmodel2ipos)
注意:
-
为什么需要Position Embedding?
Transformer结构中采用了若干个注意力机制单元,而注意力机制单元与RNN网络单元而言,未考虑序列的位置信息,因此通过Positional Embedding操作,加入位置信息。 -
为什么采用上面公式进行位置编码?
Positional Embedding不仅仅需要将位置转变成向量,同时相对位置信息通过编码的向量也能同样得到表征,如下图所示,pospospos相对位置kkk的位置向量可以通过pospospos和kkk的位置向量的线性组合得到,即 555的位置向量可以由111和444或者222和333的位置向量线性组合得到。公式中 PE(pos+k,2i)=PE(pos,2i)×PE(k,2i+1)+PE(pos,2i+1)×PE(k,2i)PE(pos+k,2i)=PE(pos,2i)\times PE(k,2i+1)+PE(pos,2i+1)\times PE(k,2i)PE(pos+k,2i)=PE(pos,2i)×PE(k,2i+1)+PE(pos,2i+1)×PE(k,2i) 是2i+12i+12i+1的原因是,因为cos()cos()cos()函数对应的是奇数维度。
编码器Encoder
在Transformer中编码器由NNN个编码器单元组成,其中默认N=6N=6N=6。对于输入Embedding之后的词向量XXX,经过6个编码单元输出新的向量。
对于每一个编码单元包含两个核心层** Multi-Head Attention** 和 Feed Forward,两个核心层输出时都会进行残差连接和归一化,即Add & Norm。
Attention机制:
注意力机制:定义QQQ、KKK、VVV三个序列向量,计算注意力向量V′V'V′。记序列中第iii个词对应的QiQ_iQi、KiK_iKi、ViV_iVi,计算对应的注意力向量Vi′V_i'