Transformer解释
一、背景
在Transformer出现之前,LSTM、GRU等RNN系列网络以及encoder-encoder+attention架构基本是解决NLP问题的全部基础。但是,RNN的一个缺陷是由于是自回归的模型,只能串行的一步步计算,无法并行计算。而ConvS2S等网络,使用CNN作为基本构建模块,这样可以并行计算所有的输入和输出位置的隐层表示。但是,随着输入和输出位置信号的越来越远,计算的数量也随之增加,这使学习变得更加困难。Transformer的出现改进了这一算法,两个输入之间的距离对其计算来说没有影响,都是一致的,并且可以并行计算。
二、Transformer整体架构
整体结构图:
左边为Encoder,右边为Decoder
三、Transformer细节剖析
1.编码器
Encoder部分,它是由N层方框里面的内容堆叠起来的。
每一层有两部分构成:
1.multi-head self-attention
2.全连接前馈网络
在每一部分都由残差+layer normalization连接。这样的方框有6个,即N=6,模型隐藏层单元数 d m o d e l d_{model} dmodel=512(隐层单元数)
2.自注意力机制
引入QKV三个矩阵,实现对任意位置添加注意力。使用Q矩阵(查询矩阵)去查询键值对(key-value pair)中的key,然后得到一个概率分布,再据此对value进行加权相加,获取当前query下的注意力。
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
常用的attention方式有两种:
一、乘性attention,即向量内积
二、加性attention,即使用额外一层隐藏层来计算。
此处attention计算方式与乘性attention计算方式的不同在于使用了一个缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk1。
在 d k d_k dk比较小的时候,不加缩放的效果和加性attention效果差不多,但是当 d k d_k dk的数量较大时,不加缩放的比加性attention效果要差不少,作者怀疑当 d k d_k dk比较大的时候,内积的量级也会随之增大,导致softmax函数会被推向梯度较小的区域,为了避免这个问题,加上了这个缩放项进行量级缩小。
单独一个attention可能过于单薄,作者又提出了multi-head attention。multi-head attention由多个self attention组合而成。将注意力的计算分散到不同的子空间进行,以达成能够多方面及逆行注意力的学习。并行地将
Q
Q
Q
K
K
K
V
V
V通过不同的映射矩阵映射到不同的空间(每个空间是一个头),再分别对这些空间中的注意力头进行“Scaled Dot-Product Attention”的学习,最后将得到的多头注意力进行拼接,经过一个额外的映射层映射到原来的空间。
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
.
.
.
,
h
e
a
d
h
)
W
O
w
h
e
r
e
h
e
a
d
1
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O\\ where\space head_1 = Attention(QW_i^Q,KW_i^K,VW_i^V)
MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere head1=Attention(QWiQ,KWiK,VWiV)
这里的
W
i
Q
∈
R
d
m
o
d
e
l
∗
d
Q
,
W
i
K
∈
R
d
m
o
d
e
l
∗
d
K
,
W
i
V
∈
R
d
m
o
d
e
l
∗
d
V
,
W
O
∈
R
h
d
v
∗
d
m
o
d
e
l
W_i^Q \in R^{d_{model}*d_Q},W_i^K \in R^{d_{model}*d_K},W_i^V \in R^{d_{model}*d_V},W^O \in R^{hd_{v}*d_{model}}
WiQ∈Rdmodel∗dQ,WiK∈Rdmodel∗dK,WiV∈Rdmodel∗dV,WO∈Rhdv∗dmodel.表示第i个头的变换矩阵,h表示头的个数。
作者论文中, h h h=8,并且 d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model}/h = 64 dk=dv=dmodel/h=64。整体维度不变,计算量没有增加
(这里我的理解是,每一个空间由 W i Q , W i K , W i V W_i^Q,W_i^K,W_i^V WiQ,WiK,WiV决定,QKV分别乘上这三个矩阵后,获得的内积就为qkv在第i个头所在空间的映射。通过这种方法,我们就获得了多个空间的qkv映射,计算attention之后再拼接,乘上个 W O W^O WO获得原本空间的映射)
(矩阵论——矩阵空间-优快云博客矩阵空间的子空间由不同的基构成)
3.前馈网络
这部分是整体架构图中的Feed Forward Network模块,其实就是一个简单的全连接前馈网络。在多头注意力层之后,用于进一步提取和变换特征。前馈网络是提升模型非线性表达能力的重要组成部分。函数为:
F
F
N
(
x
)
=
R
e
L
U
(
x
W
1
+
b
1
)
W
2
+
b
2
FFN(x) = ReLU(xW_1 + b1)W_2 +b_2
FFN(x)=ReLU(xW1+b1)W2+b2
这里的
x
:
输入向量(从注意力层输出)
W
1
:
第一个线性层的权重矩阵,大小为
d
m
o
d
e
l
×
d
f
f
b
1
:
是第一个线性层的偏执
W
2
:
第一个线性层的权重矩阵,大小为
d
f
f
×
d
m
o
d
e
l
b
2
:
是第二个线性层的偏执
R
e
L
U
:激活函数
x:输入向量(从注意力层输出)\\ W_1:第一个线性层的权重矩阵,大小为d_{model} × d_{ff}\\ b_1:是第一个线性层的偏执\\ W_2:第一个线性层的权重矩阵,大小为d_{ff} × d_{model}\\ b_2:是第二个线性层的偏执\\ ReLU:激活函数
x:输入向量(从注意力层输出)W1:第一个线性层的权重矩阵,大小为dmodel×dffb1:是第一个线性层的偏执W2:第一个线性层的权重矩阵,大小为dff×dmodelb2:是第二个线性层的偏执ReLU:激活函数
其中
d
m
o
d
e
l
d_{model}
dmodel是Transformer的隐藏层维度,
d
f
f
d_{ff}
dff是前馈网络的中间温度,通常
d
f
f
d_{ff}
dff大于
d
m
o
d
e
l
d_{model}
dmodel,论文中的
d
f
f
=
2048
=
4
×
d
m
o
d
e
l
d_{ff} = 2048 = 4 × d_{model}
dff=2048=4×dmodel
4.add&norm
使用残差和归一化的思想,缓解深层网络中的梯度消失问题,同时,缓解数值不稳定的问题。
O
u
t
p
u
t
=
L
a
y
e
r
N
o
r
m
(
x
+
S
u
b
L
a
y
e
r
(
x
)
)
x
:
表示子层输入
S
u
b
L
a
y
e
r
(
x
)
:
表示子层的输出
(
多头注意力或前馈网络的结果
)
x
+
S
u
b
L
a
y
e
r
(
x
)
:
表示残差链接的结果
L
a
y
e
r
N
o
r
m
(
)
:
归一化
Output= LayerNorm(x + SubLayer(x))\\ x:表示子层输入\\ SubLayer(x):表示子层的输出(多头注意力或前馈网络的结果)\\ x+SubLayer(x):表示残差链接的结果\\ LayerNorm():归一化
Output=LayerNorm(x+SubLayer(x))x:表示子层输入SubLayer(x):表示子层的输出(多头注意力或前馈网络的结果)x+SubLayer(x):表示残差链接的结果LayerNorm():归一化
5.解码器
解码器由N层方格中的结构堆叠起来的(在论文中,N=6),encode和decode结构大致相同,但是也有一定的区别
一、自注意力机制(Masked self attention)
为了不使注意力机制收到未来信息的影响,我们在预测第i个输出是,就要将第i+1之后的单词掩盖住,注意,Mask操作是在self-Attention的softmax之前使用的
例如,下面是Decoder的输入矩阵X和Mask矩阵
随后,在通过x计算获得 Q K T QK^T QKT以及矩阵 V V V之后, Q K T QK^T QKT与Mask矩阵相乘,获得 M a s k Q K T Mask QK^T MaskQKT矩阵
随后进行softmax
最后,使用Mask Q K T QK^T QKT与矩阵 V V V相乘,得到输出 Z 1 Z_1 Z1。
通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 Z i Z_i Zi,随后通过Multi-Head Attention拼接多个 Z i Z_i Zi,获得一个输出 Z Z Z
二、多头自注意力机制(Multi-head attention)
Decode 中的Mulit-head attention和encode中的结构区别不大,但是输入的 Q K QK QK不是由decode上一层的结果得到的,而是从encode中的输出得来的。
这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。
三、Softmax预测输出
最后的部分是利用softmax预测下一个单词。由于mask的影响,之前的输出 Z Z Z的每一行只包含本行和上面行的所有信息,位于下侧的行信息不存在
Transformer总结
Transformer通过多头注意力机制,解决了RNN和LSTM对时间步的依赖,使整个输入序列可以实现同时计算,而不是逐步处理。
但是去除了时间步的依赖,我们缺失了位置的信息,因此需要输入添加位置Embedding来补充位置信息。
总结
Transformer通过多头注意力机制,解决了RNN和LSTM对时间步的依赖,使整个输入序列可以实现同时计算,而不是逐步处理。
但是去除了时间步的依赖,我们缺失了位置的信息,因此需要输入添加位置Embedding来补充位置信息。
参考:
https://arxiv.org/abs/1706.03762
https://jalammar.github.io/illustrated-transformer/
https://blog.youkuaiyun.com/qq_36667170/article/details/124359818
https://www.zhihu.com/tardis/zm/art/600773858