和seq2seq模型相似,Transformer同样基于编码器-解码器架构,其区别主要在于以下三点:
Transformer blocks:将seq2seq模型重的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
以下分为三个部分:
- Encoder
- Decoder
- 数据预处理:Positional Encoding
Encoder:
分为三个部分:
- Multi-Head Attention
- Add & Norm
- Feed Forward
Multi-Head Attention
是多个self-attention架构,self-attention是Q, K, V同一个的attention
Multi-Head Attention是首先将Q, K, V通过线性变换投影到高维
ps:此处Q, K, V相同
将h个head输出连接并通过全连接层
其中Attention函数有很多种,其中一种为
Feed Forward
Z = Multihead
通过Feed Forward以后就输出encoder的编码
Decoder
Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:
输出:对应i位置的输出词的概率分布
输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出
解码:这里要特别注意一下,编码可以并行计算,一次性全部encoding出来,但解码不是一次把所有序列解出来的,而是像rnn一样一个一个解出来的,因为要用上一个位置的输入当作attention的query
数据预处理
之前都是用rnn一个一个处理,是有顺序的,现在是一次性并行处理没有顺序,需要有变量记录顺序,也就是位置信息
最开始通过上述公式,可以得到单词的位置信息,然后在编码和解码之前,和单词的embedding相加