谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。
Attention is All You Need:https://arxiv.org/abs/1706.03762
Tensorflow:https://github.com/tensorflow/tensor2tensor
Pytorch代码:http://nlp.seas.harvard.edu/2018/04/03/attention.html
学习资料:https://jalammar.github.io/illustrated-transformer/
输入:embedding之后的维度为512,位置编码 Positional Encoding
为了能和embedding层的信息做sum,positional encoding layer与embedding层保持相同的维度数。论文选择使用不同频率的正弦和余弦函数,即sine和cosine,来表征token的位置信息,具体公式如下:
pos表示token的位置,即当前token是第几个token;i 表示dimension
左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们拼在一起而得到每一个位置编码向量。
输出:集束搜索(beam search)
论文中将6个编码器和解码器叠加在一起,彼此结构相同但是不共享参数。
单一编码器
1. 自注意力(self-attention)层:对每个单词编码时关注输入句子的其他单词
词嵌入乘以训练的权重矩阵(,,),得到(Q,K,V)
多头注意力则是每个头保持独立的查询/键/值权重矩阵(,,),产生不同的查询/键/值矩阵(Q,K,V),从而得到不同的Z,把不同的Z拼接在一起,然后用一个附加的权重矩阵与它们相乘,最后得到融合所有注意力头信息的矩阵Z。
多头的作用:每个head相当于一个单独的通道,可以去独立的去抽取不同的有效特征,这样可以使得self-attention变成一个能力超强的特征抽取器,而计算成本与使用Single Attention几乎一致。
2. 前馈(feed-forward)神经网络:窗口为一个单词的一维卷积神经网络
前馈神经网络包括两个线性变换,使用ReLU作为激活函数。也可以将其理解为卷积核大小为1的CNN。输入输出的维度为512,内部层维度为2048。
3. 求和与归一化:
在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接
单一解码器
1. 自注意力(self-attention)层:
mask:解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。在softmax步骤前,它会把后面的位置给隐去。
Q=上一层decoder编码结果,K=V=Encoder编码结果
引入encoder的信息,并根据上一层Masked Multi-Head Attention的输出,关注生成最相关的下一个词。
2. 编码-解码注意力层:用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似):
通过在它下面的层来创造查询矩阵Q,并且从编码器的输出中取得键/值矩阵(K, V)
3. 前馈(feed-forward)层
同Encoder部分。
线性变换层:全连接神经网络,把解码组件产生的向量投射到对数几率(logits)的向量里
Softmax 层:把分数变成概率
使用KL div loss实现标签平滑, 相比使用独热目标分布,创建一个分布,其包含正确单词的置信度和整个词汇表中分布的其余平滑项。
标签平滑将真实概率的构造改成:
采用了Adam optimizer,其中参数选择为
1)transformer在翻译模型中取得了stat-of-the-art性能
2)更低的单层计算复杂度
3)可以并行计算
4)能更好的解决长距离依赖问题
学习资料:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb