《Attention is All You Need》论文理解Transformer

谷歌的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

再把sin和cos的两个值拼接起来,如下图所示:

左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们拼在一起而得到每一个位置编码向量。

输出:集束搜索(beam search)

模型结构

论文中将6个编码器和解码器叠加在一起,彼此结构相同但是不共享参数。

单一编码器

1. 自注意力(self-attention)层:对每个单词编码时关注输入句子的其他单词

词嵌入乘以训练的权重矩阵(W^{Q}W^KW^V),得到(Q,K,V)

多头注意力则是每个头保持独立的查询/键/值权重矩阵(W^{Q}W^KW^V),产生不同的查询/键/值矩阵(Q,K,V),从而得到不同的Z,把不同的Z拼接在一起,然后用一个附加的权重矩阵W^{O}与它们相乘,最后得到融合所有注意力头信息的矩阵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部分。

 

最终的线性变换和Softmax层

线性变换层:全连接神经网络,把解码组件产生的向量投射到对数几率(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

发布了93 篇原创文章 · 获赞 119 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_18310041/article/details/95772906