赞
踩
诞生原因与解决的问题:
先从整体结构入手,然后再依次将内部的层
输入序列
(
x
1
,
.
.
.
,
x
n
)
(x_1,...,x_n)
(x1,...,xn),encoder编码后生成对应的向量
(
z
1
,
.
.
.
,
z
n
)
(z_1,...,z_n)
(z1,...,zn),根据z进行decoder生成输出序列
(
y
1
,
.
.
.
,
y
m
)
(y_1,...,y_m)
(y1,...,ym)。
n和m不一定一样,例如英文翻译成中文。
注: encoder可以同时生成整个序列,但decoder只能一次生成一个元素。而且
y
i
y_i
yi是根据
y
1
,
.
.
.
,
y
i
−
1
y_1,...,y_{i-1}
y1,...,yi−1生成的,也就是图中右下方shifted right的含义,将之前时刻的输出作为输入,对序列来看就是依次向右输入decoder。
堆叠了N=6个图片左边的结构,由multi-head attention和MLP模块组成,每个模块(sublayer)都有残差链接,模块后接LayerNorm。可以表示为: L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x))。输出维度 d m o d e l = 512 d_{model}=512 dmodel=512。一共有两个参数可以调,即N和 d m o d e l d_{model} dmodel。
BatchNorm对每个特征做归一化。在处理图片中就是对单个channel归一化。
LayerNorm对每个样本做归一化,没有样本间的依赖。这里batch由很多句子组成,而sequence是句子中的单词,feature是单词向量。
BatchNorm和LayerNorm都有两个可学习的参数
(
λ
,
β
)
(\lambda,\beta)
(λ,β),来调整归一化后的均值和方差。
这里不用BatchNorm的原因是,每个样本的长度不相同。而LayerNorm是在每个样本中进行的,相对稳定。
堆叠N=6个图片右侧的结构,里面有三个自结构。后两个与encoder相同,但在前面加了一个masked multi head attention,并使用了残差链接。由于attention的存在,训练时可以看到全部时刻的输出,Mask的作用是防止解码器训练时提前看到当前时刻之后的输出。
Attention是由query和key-value的映射得出的,本质上是value的加权和。与query相近的key,对应的value会有更大的权重。
Attention计算表达式为:
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(dk
QKTV)
其中每个query和key维度都是
d
k
d_k
dk,value维度是
d
v
d_v
dv。对query和key做内积,值越大相似度越高,除
d
k
\sqrt{d_k}
dk
来减少维度的影响,最后用softmax得到非负的和为1的权重,然后求得Attention。除
d
k
\sqrt{d_k}
dk
(scale)的理由:当维度较高时,内积的结果可能过大或过小,导致softmax的结果更接近于1或0(接近onehot编码),导致梯度消失。假设向量q,k满足各分量独立同分布,均值为0,方差为1,那么qk点积均值为0,方差为dk,从统计学计算,若果让qk点积的方差控制在1,需要将其除以dk的平方根,使softmax更加平滑
上式的QKV是矩阵形式,图示如下:
防止计算t时刻输出时,提前看到t时刻及之后的输出。将 k t ∗ q t , k t + 1 ∗ q t + 1 , . . . , k n ∗ q n k_t*q_t,k_{t+1}*q_{t+1},...,k_{n}*q_{n} kt∗qt,kt+1∗qt+1,...,kn∗qn的结果换成非常大的负数,如 − 1 e 10 -1e^{10} −1e10。这些负数在softmax后变成0,因此保证了时序性。
用CNN替换RNN来减少时序计算。但卷积计算一次只能看一个小窗口,两个距离较远的元素需要多层卷积才能得到二者关系,但用transformer的注意力机制一次就可以看到整个序列,因此单层卷积就可以得到整体结果。此外卷积的优点是可以生成多个输出通道,每个输出通道可以被认为是用来识别不一样的模式。由此诞生了multi head attention。
多头注意力机制的原因:
单次注意力的运算没有可学习的参数。使用不同的投影方式(可学习的部分)将QKV投影到
d
k
,
d
k
,
d
v
d_k,d_k,d_v
dk,dk,dv(具体数值在后面有讲解),分别求注意力,然后连接。这样可以对不同的模式产生不同的计算方法,让不同投影的度量空间去匹配不同的模式,类似卷积有多个输出通道。
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
i
=
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 head_i = Attention(QW^Q_i,KW^K_i,VW^V_i)
MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
其中,文中h=8(有8个头),投影方式是参数矩阵(4个可学习的地方)
W
i
Q
∈
R
d
m
o
d
e
l
∗
d
k
,
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
i
O
∈
R
h
d
v
∗
d
m
o
d
e
l
W^Q_i\in \mathbb{R}^{d_{model}*d_k},W^K_i\in \mathbb{R}^{d_{model}*d_k},W^V_i\in \mathbb{R}^{d_{model}*d_v},W^O_i\in \mathbb{R}^{hd_v*d_{model}}
WiQ∈Rdmodel∗dk,WiK∈Rdmodel∗dk,WiV∈Rdmodel∗dv,WiO∈Rhdv∗dmodel。由于有残差连接,输入和输出的维度应该是相同的,即
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512,因此投影维度
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。
Attention在结构图中表现为橙色。可以分为自注意力和非自注意力。
自注意力意味着query,key,value相同(自己与自己比对,求权重)。
对应encoder的attention和decoder的masked attention。
假设句子长为n,则输入(图中的红色是value)是n个长为d的向量。每个query会得到一个输出,输出是value的加权和,因此输出维度也是d。query与对应的key权重是最大的(
q
i
=
k
i
q_i=k_i
qi=ki),其次是与query相似的key,如图中绿色线表示,权重越大越粗。
decoder的masked attention中,t时刻及以后的权重求出来是0,原因在2.1中mask部分已经讲过。
非自注意力意味着query与key-value不相同。
对应decoder里的第二层attention。
假设encoder的输出是m个长为d的向量,decoder的masked attention输出是n个长为d的向量(例如英语翻译成中文,最后翻译的字数是不同的)。decoder第二层attention的输入是encoder的输出作为key-value,decoder的masked attention的输出作为query。因此本层是比对解码的query和编码的key的相似度。输出是n个长为d的向量,过程参照2.1中的矩阵乘法图示。
把每个词都经过同一个MLP作用一次,映射到对应的语义空间。
用公式表达为:
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
x是每个单词,本质上是一个单隐藏层的MLP,激活函数是ReLU。其中输入和输出的维度是
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512,隐藏层维度
d
f
=
2048
d_f=2048
df=2048。
不考虑残差连接,LayerNorm和多头。
相同:都使用MLP进行语义空间转换。
不同:
Transformer:attention层将序列中所有信息(包括时序信息)抓取出来,aggregation,因此MLP只需要对单个单词做就可以。
RNN:每个时序信息都由上一时刻的输出获得(绿色线)
图中的MLP都是同一个。
对句中所有单词,依次学习一个长为d=512的向量来表示。位置在encoder和decoder前。因为学习后embedding向量的L2norm值偏小,由于后续要添加positional encoding,因此乘了个 d m o d e l \sqrt{d_{model}} dmodel ,使他们在同一范围(scale)。
Attention并不存在时序信息,只是加权和。如果序列打乱,得到的attention结果是相同的(加法交换律)。Positional Encoding的作用就是为输入加入时序信息。公式略。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。