赞
踩
由于transformer模型没有循环神经网络的迭代操作,所以我们必须提供每个字的位置信息给transformer,才能识别出语言中的顺序关系。
现在定义一个位置嵌入的概念,也就是position encoding,位置嵌入的维度为[max_sequence_length,embedding_dimension],嵌入的维度同词向量的维度。max_sequence_length属于超参数,指的是限定的最大单个句子长度。
注意:我们一般以字为单位训练transformer模型,也就是说我们不用分词了。首先我们要初始化字向量为[vocab_size,embedding_dimension],vocab_size为总共的字库数量,embedding_dimension为字向量的维度,也就是每个字的数学表达。
论文中使用sine和cosine函数的线性变换来提供给模型位置信息:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
\quad \quad \quad \quad \quad PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}}) \\ \quad \quad \quad \quad \quad PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
注意:在上面self attention的计算过程中,我们通常使用mini batch来计算,也就是一次计算多句话,也就是X的维度是[batch_size,sequence_length],sequence_length是句长,而一个mini batch是由多个不等长的句子组成,我们就需要按照这个mini batch中最大的句长对剩余的句子进行补齐长度,我们一般使用0进行填充,这个过程叫padding。
但这时在进行softmax的时候会产生问题:
s
o
f
t
m
a
x
=
e
x
i
∑
j
=
1
K
e
z
j
softmax = \frac{e^{x_i}}{\sum_{j=1}^Ke^{z_j}}
softmax=∑j=1Kezjexi,
e
0
e^0
e0是1,是有值的,这样的话softmax中被padding的部分就参与了运算,这就等于是让无效的部分参与了运算,会有很大的隐患,这时就需要一个mask让这些无效区域不参与运算,我们一般给无效区域加一个很大的负数的偏置,也就是:
z
i
l
l
e
g
a
l
=
z
i
l
l
e
g
a
l
+
b
i
a
s
i
l
l
e
g
a
l
b
i
a
s
i
l
l
e
g
a
l
→
−
∞
e
z
i
l
l
e
g
a
l
→
0
\quad \quad \quad \quad \quad z_{illegal} = z_{illegal}+bias_{illegal}\\ \quad \quad \quad \quad \quad\quad \quad bias_{illegal}→-∞\\ \quad \quad \quad \quad \quad\quad \quad \quad e^{z_{illegal}}→0
zillegal=zillegal+biasillegalbiasillegal→−∞ezillegal→0
经过上式的masking,我们使无效区域经过softmax计算之后还几乎为0,这样就避免了无效区域参与计算。
我们在上一步得到了经过注意力矩阵加权之后的V,也就是Attention(Q,K,V),我们对它进行一下转置,使其和
X
e
m
b
e
d
d
i
n
g
X_{embedding}
Xembedding的维度一致,也就是batch_size,sequence_length,embedding_dimension,然后把他们加起来做残差连接,直接进行元素相加,因为他们的维度一致:
X
e
m
b
e
d
d
i
n
g
+
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
\quad \quad \quad \quad \quad X_{embedding}+Attention(Q,K,V)
Xembedding+Attention(Q,K,V)
在之后的运算里,每经过一个模块的运算,都要把运算之前的值和运算之后的值相加,从而得到残差连接,训练的时候可以使梯度直接走捷径反传到最初始层:
X
+
S
u
b
L
a
y
e
r
(
X
)
\quad \quad \quad \quad \quad X+SubLayer(X)
X+SubLayer(X)
Layer Normalization的作用是把神经网络中隐藏层归一化为标准正太分布,也就是独立同分布,以起到加快训练速度,加速收敛的作用:
μ
i
=
1
m
∑
i
=
1
m
x
i
j
\quad \quad \quad \quad \quad \mu_i=\frac{1}{m}\sum_{i=1}^mx_{ij}
μi=m1∑i=1mxij
上式中以矩阵的行(row)为单位求均值;
σ
j
2
=
1
m
∑
i
=
1
m
(
x
i
j
−
μ
i
)
2
\quad \quad \quad \quad \quad \sigma_j^2=\frac{1}{m}\sum_{i=1}^m(x_{ij}-\mu_i)^2
σj2=m1∑i=1m(xij−μi)2
上式中以矩阵的行(row)为单位求方差;
L
a
y
e
r
N
o
r
m
(
x
)
=
a
⊙
x
i
j
−
μ
i
σ
i
2
+
ϵ
+
β
\quad \quad \quad \quad \quad LayerNorm(x)=a⊙\frac{x_{ij}-\mu_i}{\sqrt {\sigma_i^2}+\epsilon}+\beta
LayerNorm(x)=a⊙σi2
+ϵxij−μi+β
然后用每一行的每一个元素减去这行的均值,再除以这行的标准差,从而得到归一化的数值,
ϵ
\epsilon
ϵ是为了防止除以0;之后引入两个可训练参数
α
,
β
\alpha,\beta
α,β来弥补归一化的过程中损失掉的信息,注意⊙表示元素相乘而不是点积,我们一般初始化为
α
\alpha
α为全1,而
β
\beta
β为全0。
经过上面3个步骤, 我们已经基本了解到了transformer编码器的主要构成部分,下面用公式把一个transformer block的计算过程整理一下:
X = E m b e d d i n g L o o k u p ( X ) + P o s i t i o n E n c o d i n g X ∈ R b a t c h _ s i z e ∗ s e q _ l e n ∗ e m b e d _ d i m \quad \quad \quad \quad \quad X=EmbeddingLookup(X)+PositionEncoding\\ \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad X∈R^{batch\_size*seq\_len*embed\_dim} X=EmbeddingLookup(X)+PositionEncodingX∈Rbatch_size∗seq_len∗embed_dim
Q = L i n e a r ( X ) = X W Q K = L i n e a r ( X ) = X W K V = L i n e a r ( X ) = X W V X a t t e n t i o n = S e l f A t t e n t i o n ( Q , K , V ) \quad \quad \quad \quad \quad Q=Linear(X)=XW_Q\\ \quad \quad \quad \quad \quad K=Linear(X)=XW_K\\ \quad \quad \quad \quad \quad V=Linear(X)=XW_V\\ \quad \quad \quad \quad X_{attention}=SelfAttention(Q,K,V) Q=Linear(X)=XWQK=Linear(X)=XWKV=Linear(X)=XWVXattention=SelfAttention(Q,K,V)
X a t t e n t i o n = X + X a t t e n t i o n X a t t e n t i o n = L a y e r N o r m ( X a t t e n t i o n ) \quad \quad \quad \quad \quad X_{attention}=X+X_{attention}\\ \quad \quad \quad \quad X_{attention}=LayerNorm(X_attention) Xattention=X+XattentionXattention=LayerNorm(Xattention)
x h i d d e n = A c t i v a t e ( L i n e a r ( L i n e a r ( X a t t e n t i o n ) ) ) \quad \quad \quad \quad \quad x_{hidden}=Activate(Linear(Linear(X_{attention}))) xhidden=Activate(Linear(Linear(Xattention)))
X h i d d e n = X a t t e n t i o n + X h i d d e n X h i d d e n = L a y e r N o r m ( X h i d d e n ) X h i d d e n ∈ R b a t c h _ s i z e ∗ s e q _ l e n ∗ e m b e d _ d i m \quad \quad \quad \quad \quad X_{hidden}=X_{attention}+X_{hidden}\\ \quad \quad \quad \quad \quad X_{hidden}=LayerNorm(X_{hidden})\\ \quad \quad \quad \quad X_{hidden}∈R^{batch\_size*seq\_len*embed\_dim} Xhidden=Xattention+XhiddenXhidden=LayerNorm(Xhidden)Xhidden∈Rbatch_size∗seq_len∗embed_dim
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。