文章目录
一个月之后,要学习Bert模型了,发现学过的transformer已经忘光了,所以又回来重新学习,参考了好多的资料,并且做了下面的学习笔记供之后再回来温习,欢迎大家一起交流学习。
一、前言
Google于2017年6月发布在arxiv上的一篇文章《Attention is all you need》,提出解决seq2seq问题的transformer模型,用全attention的结构代替了LSTM,抛弃了之前传统的encoder-decoder模型必须结合CNN或者RNN的固有模式,只用Attention,可谓大道至简。该模型可以高度并行地工作,所以在提升翻译性能的同时训练速度也特别快。
论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。
二、模型结构
模型的整体结构如下图所示:
这个结构看起来很复杂,简化之后,其实也就是一个seq2seq模型的。如下图所示:左边一个encoders,右边一个decoders。
文中提到了encoder和decoder都是由6个相同的层组成的。所以,又可以表示成下面的结构,每一个encoder的输出会和每一个decoder进行结合。
我们取出其中的一层,进行详细的展示。得到了下图所示的结构:
Encoder的每一层有两个操作,分别是Self-Attention和Feed Forward;而Decoder的每一层有三个操作,分别是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。
二、Self-Attention Mechanism
Attention是用于计算"相关程度",例如在翻译过程中,不同的英文对中文的依赖程度不同,根据依赖程度大小Attention会将不同的权重分配给各个词,一般是通过query(Q)、key和value 的方式来计算权重映射到输出上的,其中query、每个key、每个value都是向量,其中权重是由Query和每个key计算出来的。论文中使用了Scaled Dot-Product Attention,结构图如下:
Self-Attention计算方法分为四步:
-
第一步:每个输入x,进入self-attention后,先生成embedding向量a,向量a再分别乘以不同的权重向量w,产生三个向量:q、k和v。
-
第二步:计算 q 1 q^{1} q1和每个 k ( k 1 , k 2 , k 3 , k 4 ) k(k^{1},k^{2},k^{3},k^{4}) k(k1,k2,k3,k4)的相似度,得到 α 1 , 1 , α 1 , 2 , α 1 , 3 , α 1 , 4 \alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4} α1,1,α1,2,α1,3,α1,4
在这里q,k的相似度计算用到的是缩放的点乘
α 1 , i = q 1 . k i / d \alpha_{1,i}=q^{1}.k^{i}/\sqrt{d} α1,i=q1.ki/d
其中 d d d是 q q q和 k k k的维度 -
第三步:将得到的相似度进行softmax操作,进行归一化
α ^ 1 , i = e x p ( α 1 , i ) / ∑ j e x p ( α 1 , j ) \hat{\alpha}_{1,i}=exp(\alpha_{1,i})/\sum _{j}exp(\alpha_{1,j}) α^1,i=exp(α1,i)/j∑exp(α1,j)
- 第四步:针对计算出来的权重,对所有的
v
v
v进行加权求和计算,如下图。
b 1 = ∑ i α ^ 1 , i v i b^{1}=\sum _{i}\hat{\alpha}_{1,i}v^{i} b1=i∑α^1,ivi
类似的,可以得到 b 2 b^{2} b2, b 3 b^{3} b3, b 4 b^{4} b4
其实,上面的第三步和第四步可以表示成下面的公式:
三、为什么计算可并行
上述的整个过程,可以简化为下面的操作,且计算过程是可以并行的。
为什么计算过程是可以并行的?下面我们来看看解释:
1、矩阵Q可以表示为
[
q
1
,
q
2
,
q
3
,
q
4
]
[q^{1},q^{2},q^{3},q^{4}]
[q1,q2,q3,q4]
矩阵K可以表示为
[
k
1
,
k
2
,
k
3
,
k
4
]
[k^{1},k^{2},k^{3},k^{4}]
[k1,k2,k3,k4]
矩阵V可以表示为
[
v
1
,
v
2
,
v
3
,
v
4
]
[v^{1},v^{2},v^{3},v^{4}]
[v1,v2,v3,v4]
2、
K
K
K和
Q
Q
Q的相似度计算可以表示为矩阵点乘的形式。
3、权重向量
α
^
\hat\alpha
α^ 跟
V
V
V相乘亦可以表示为下面的形式。
那么经过上面的介绍,我们就可以把整个self-attention表示成下图所示的形式,其实就是一堆矩阵乘法,用GPU是可以并行计算的。
四、Mult-head Attention
Multi-Head Attention就是把Scaled Dot-Product Attention的过程做
h
h
h次,然后把输出拼接起来。论文中,它的结构图如下:
下面以2-head Attention为例来进行介绍:对于每个词向量
a
i
a^{i}
ai会生成两个
q
i
,
1
q^{i,1}
qi,1,
q
i
,
2
q^{i,2}
qi,2,
k
i
,
1
k^{i,1}
ki,1,
k
i
,
2
k^{i,2}
ki,2,
v
i
,
1
v^{i,1}
vi,1,
v
i
,
2
v^{i,2}
vi,2,经过上面的self-attention之后,同样也是会得到两个输出:
b
i
,
1
b^{i,1}
bi,1,
b
i
,
2
b^{i,2}
bi,2
得到的两个结果向量
b
i
,
1
b^{i,1}
bi,1,
b
i
,
2
b^{i,2}
bi,2进行concatenate,得到一个向量
b
i
b^{i}
bi。也可以让
b
i
b^{i}
bi乘上一个权重向量
W
0
W_{0}
W0进行降维。如下图所示:
做mult-head attention有什么好处呢?论文中这样说:
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
也就是说,不同的head关注的点是不一样的。mult-head的话,可以让每个head去做自己的事情,各司其职。具体用多少个head,这个参数是可以调试的。
下图展示的就是多头自注意力的全部,这样可以一眼看清。
五、positional Encoding
因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。
这里每个分词的position embedding向量维度也是
d
d
d, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。具体来说,采用正弦和余弦函数进行编码,其中position embedding计算公式如下:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos,2i)=sin(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}})
PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中,
p
o
s
pos
pos表示位置,
i
i
i表示维度。
六、残差连接和层归一化
残差连接(residual connection)是将multi-head attention的输入和输出进行add操作。
层归一化(Layer Normalization):https://arxiv.org/abs/1607.06450
层规范化就是针对 Batch Normalization (BN)的不足而提出的。与 BN 不同,LN 是一种横向的规范化,如图所示。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
其中 i 枚举了该层所有的输入神经元。对应到标准公式中,四大参数 μ, σ 均为标量(BN中是向量),所有输入共享一个规范化变换。
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
七、position-wise Feed-Forward Networks
在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前馈网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0, xW_{1}+b_{1})W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2
其中每一层的参数都不同。
参考资料:
- Attention is all you need: https://arxiv.org/abs/1706.03762
- [简书]一步步解析Attention is All You Need!: https://www.jianshu.com/p/b1030350aadb
- [李宏毅]NLP领域BERT大火却不懂Transformer? https://www.bilibili.com/video/av71295187/?spm_id_from=333.788.videocard.14
- The Illustrated Transformer:https://jalammar.github.io/illustrated-transformer/
- 细讲 | Attention Is All You Need https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w
- BERT大火却不懂Transformer?读这一篇就够了https://mp.weixin.qq.com/s/WDq8tUpfiKHNC6y_8pgHoA
- 详解深度学习中的 Normalization,不只是BN(2)http://www.dataguru.cn/article-13032-1.html
- The Annotated Transformer:http://nlp.seas.harvard.edu/2018/04/03/attention.html#background
- 深入理解Transformer及其源码:https://www.cnblogs.com/zingp/p/11696111.html