赞
踩
Transformer模型是由Attention all you need这样一篇文章所提出的。Transformer模型延续了Encoder-Decoder模型的结构。整体的Transformer模型结构如下图所示:
我们可以大致的将这个模型分为左侧的编码器结构和右侧的解码器结构。编码器结构如下图所示:
解码器结构如图所示:
下面,我们就按照这两个结构进行具体的介绍。
在这里,为了方便介绍,我们该出编码器的结构图:
注意:在transformer模型中,主要是以字为基本单元的,也就是说我们不需要分词。
inputs的size为[max_sequence_length,embedding_size],其中max_sequence表示的整个句子的大小。embedding_size表示的是每一个字的向量表示维度。注意:对于输入的句子,因为没有能够处理时序数据的网络结构,所以需要我们预先将句子处理称为max_sequence_length的长度。
在编码器的基本结构中,在输入input embedding之后,首先进入的是Position Encoding,我们可以发现,在Encoder中没有类似于RNN的结构,所有在这里,论文加入的Position Encoding来提供每一个字的顺序信息。
对于位置信息的计算,论文中采用的是sin和cos函数来计算的,具体的计算公式为:
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
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos,2i+1)=sin(pos/10000^{2i/d_{model}})
PE(pos,2i+1)=sin(pos/100002i/dmodel)
其中pos指的是句子中字的位置,pos∈[0,max_sequence_length),i表示的是对应的字向量的维度,i∈[0,embedding_dimension],上面有两个进行位置编码的式子,这里主要是将奇数序号的维度和偶数序号的维度进行分开计算。从而产生周期性的变化。
根据上面的结构,在添加完位置信息之后,下一步就进入到了Self-Attention层。我们来简单的介绍一下这种结构。通常情况下,一个句子是由若干个字或者若干个词组成的,如下图所示:
这上面的句子中,一共包含四个汉字,每一个汉字的表示成为一个[1,embedding_size]大小的字向量,所谓的self-Attention,就是分别计算每一个汉字和其他汉字之间的关系强弱来作为权重,在利用这个权重将其他汉字的表示和当前汉字的表示进行加权求和,最终获得当前汉字的表示。我们来逐步的介绍其计算步骤:
对应的属性计算公式就是:
Q
u
e
r
y
1
⋅
K
e
y
T
Query_1·Key^T
Query1⋅KeyT
这样就计算出来的第一个字和句子中其他的字的相似度的值。同理,对于句子中其他的字也是这样计算。将其整理成句子的形式就是:
Q
u
e
r
y
⋅
K
e
y
T
Query·Key^T
Query⋅KeyT
其结果中的每一个行表示一个字,每一个列表示当前行表示的字和其他字之间的相似度的值。进一步,我们将其进行softmax归一化,形成概率值。有公式表达就是:
s
o
f
t
m
a
x
(
Q
u
e
r
y
⋅
K
e
y
T
d
k
)
softmax(\frac{Query·Key^T}{\sqrt{d_k}})
softmax(dk
Query⋅KeyT)
这里的
d
k
d_k
dk表示的一个
k
e
y
i
key_i
keyi向量的维度。这么操作的目的是softmax的概率分布变成正态分布,使得softmax的效果更加稳定。
在获得每一个字和句子中其他字的关系权重之后,下一步就是利用权重来计算求和的过程,用公式表示就是:
s
o
f
t
m
a
x
(
Q
u
e
r
y
⋅
K
e
y
T
d
k
)
⋅
V
a
l
u
e
softmax(\frac{Query·Key^T}{\sqrt{d_k}})·Value
softmax(dk
Query⋅KeyT)⋅Value。具体的过程,我在这里就不展开了,和上面描述的过程类似。这样输出的结果是一个句子的表示矩阵。每一行是代表句子中的一个字,这个字的行向量中包含了其他字的信息。
这里,我们需要在说明一点,我们之前提到过,input输入的句子的长度是我们事先设定好的,对于某些长度不够的句子,我们会采用padding的方式进行填充,但是这些padding值在计算softmax的时候回产生一个问题,这些padding值也会参与到softmax的计算,也就是说这些padding值对句子中的其他字会产生一个权重。为了避免这种情况的发生,会对padding值在计算的时候添加一个特别大的负的偏置项,使得softmax(padding)≈0。
这个部分比较好理解,为了从不同的角度去计算不同字之间的关系,我们可以将所有的字都映射到多个空间中来计算其相似度。也就是,可以准备多个 W k , W q , W v W_k,W_q,W_v Wk,Wq,Wv来将原始的句子向量映射到不同的空间中去。在经过Query,Key,Value的点乘操作,获取到不同空间中的结果,最后将这些结果相加获取到最终的值。我们映射的空间的个数就是头数。
这一步主要是两个操作,第一个是Add,也称为残差连接,这个运算的意义在于,当Attention层的数量特别多的时候,反向传播经过的层数会特别多,通过残差连接的方式可以是梯度可以快速的到达输入层,避免了梯度消失的情况。(似乎还有一种说法是Attention层数过多会使得原始的数据信息丢失,通过残差连接可以补充原始信息)。计算公式为:
o
u
t
p
u
t
=
i
n
p
u
t
+
o
u
t
p
u
t
a
t
t
e
n
t
i
o
n
output = input+output_{attention}
output=input+outputattention
进一步,在经过残差连接之后,对输出的数据进行归一化操作,也就是Norm操作。所谓的归一化,在这里就是将隐藏层的输出归一化为标准正态分布,可以起到加快训练速度,加速收敛的作用。其计算公式为:
u
i
=
1
m
∑
j
=
1
m
X
i
j
u_i=\frac{1}{m}∑_{j=1}^mX_{ij}
ui=m1j=1∑mXij
σ
i
2
=
1
m
∑
j
=
1
m
(
X
i
j
−
u
i
)
2
σ_i^2=\frac{1}{m}∑_{j=1}^m(X_{ij}-u_i)^2
σi2=m1j=1∑m(Xij−ui)2
L
a
y
e
r
N
o
r
m
(
X
i
)
=
α
∗
X
i
j
−
u
i
σ
i
2
+
ε
+
β
LayerNorm(X_i)=α*\frac{X_{ij}-u_i}{\sqrt{σ_i^2+ε}}+β
LayerNorm(Xi)=α∗σi2+ε
Xij−ui+β
其中m表示的隐藏层向量的维度,也就是矩阵的列数。上述的公式简单的来说就是分别对每一行的数据进行求均值和方差的过程,在将每一行的数据变成标准的正态分布。在计算的过程中引入了α,β两个参数,主要是为了弥补归一化操作损失掉的信息。ε为为了放置方差为0的情况。*表示对应的元素的乘积。
最后的Feed Forward就是一个简单的全连接和使用激活函数的操作,这里就不进行赘述了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。