Attention is all you need论文学习笔记
看了Bert的论文,由于基础知识薄弱,且bert本质还是transformer,之前没有接触过所以不太懂,于是看了这篇论文了解一下transformer。
参考:https://cloud.tencent.com/developer/article/1377062,讲的很清楚,图源于该微信公众号文章。
1.背景知识: attention
transformer完全利用attention机制来解决自然语言翻译等问题,所谓的attention机制就是将有限的注意力集中在重点信息问题上。当神经网络对语言进行识别时,每次集中于部分特征上,识别更加准确。而衡量这些特征最直观的方法是权重,Attention模型的结果就是在每次识别时,首先计算每个特征的权值,然后对特征进行加权求和,权值越大,该特征对当前识别的贡献就大。
首先attention函数的本质是:一个查询到一系列(键key-值value)对的映射
计算attention的三个步骤:
第一步: query 和 key 进行相似度计算,得到权值
第二步:将权值进行归一化,得到直接可用的权重
第三步:将权重和 value 进行加权求和
2.Introduction
该论文用attention机制搭建了整个模型框架,完全避免循环和卷积。
提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self- attention)。
在WMT2014语料中的英德和英法翻译任务上取得了先进结果,并且训练速度比主流模型更快,并行性更好。
3.Model Architecture
模型主要是编码器和解码器组成
encoder:6层 每层有两个子层,Muti-Head attention、前馈神经网络,其中multi-head self-attention mechanism,用来计算输入的self-attention,第二个子层是简单的全连接网络。
decoder:6层 每层有三个子层,第一个是Masked multi-head self-attention,也是计算输入的self-attention,第二个sub-layer是对encoder的输入进行attention计算。第三个sub-layer是全连接网络,与Encoder相同。
Encoder的输出,会和每一层的Decoder进行结合。
encoder的过程:
input->positional embedding->mutu-head attention->feed-forward
按照encoding的过程介绍
首先介绍一下positional embedding
由于模型不包含循环和卷积,为了让模型利用序列的顺序,必须注入序列中关于词符相对或者绝对位置的一些信息。 为此,将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。通过使用不同频率的正弦和余弦函数来计算:(不太懂)
将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。
文章提出了缩放版的点积Attention和多头Attention
Scaled Dot-Product Attention:
第一步:输入X,通过3个线性转换把X转换为Q,K,V。例如单词Thinking通过嵌入变换将X1向量分别与Wq,Wk,Wv三个矩阵做点乘得到q1,k1,v1向量
第二步:向量{q1,k1}做点乘得到得分(Score) 112, {q1,k2}做点乘得到得分96。
第三步:对该得分进行规范,除以8。这个在论文中的解释是为了使得梯度更稳定。之后对得分[14,12]做softmax得到比例 [0.88,0.12]。
第四步:用得分比例[0.88,0.12] 乘以[v1,v2]值(Values)得到一个加权后的值。将这些值加起来得到z1。这就是这一层的输出。求得的z1就包含了其他位置的编码
接着文章提出了Multi-Head Attention,就是Scaled Dot-Product Attention的过程做H次,然后把输出Z合起来。
Position-wise Feed-forward Networks:在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
在解码器中,transformer用到了masked self-attention,因为是生成过程,因此在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask,所谓的masked就是要做language modelling的时候,不给模型看到未来的信息。沿着对角线把灰色的区域用0覆盖掉。
encoder:
在每个子层我们都模拟了残差网络,每个子层的输出都是
Sublayer(x) 表示Sub-layer对输入 x 做的映射,
transfomer模型:
4.Experiment
可以看出,transformer 用了最少的资源得到了state-of-art的输出回报