赞
踩
参考文章:
Transformer是自然语言处理领域具有里程碑意义的研究成果,后来也逐渐被广泛用于视觉信息处理与分析。之前在总结RNN时有说到,存在一种从长度为M的输入到长度为N的输出的这种seq2seq结构,通过Encoder-Decoder的结构实现对向量化内容的编解码。
Transformer的整体架构如上图所示,但从结构来看会觉得很复杂,可以一步一步理解。首先是N层堆叠的编码器结构和N层堆叠的解码器结构组成,如下图所示:
再进一步细化,Encoder的结构都是相同的,但是和RNN不同,Encoder不同的层并不会共享权重。编码器的输入首先通过一个self-attention层,self-attention层的输出反馈给前馈神经网络,如图所示:
解码器也有编码器的两个层,但在这两层之间有一个注意层,帮助解码器关注输入句子的相关部分。
Transformer的输入是Embedding后的文本向量,该向量化过程由两部分结果相加得到的,通常向量化表征的维度一般为256或者512(实验确定值,一个时计算资源限制,一个是实验验证效果较好),如图所示:
每个向量化后单词都会流经编码器的两层,如下:
编码器接收文本向量列表作为输入,它通过将这些向量传递到“self-attention”层,然后传入前馈神经网络,然后将输出向上发送到下一个编码器来处理。
计算self-attention的第一步是从编码器的每个输入向量中创**「建三个向量」(在本例中,输入是每个单词的嵌入)。因此,我们为每个单词创建一个「查询向量」、一个「键向量」和一个「值向量」。这些向量是通过将嵌入乘以我们在训练过程中「训练的三个矩阵」**来创建的,这三个矩阵是需要学习的参数矩阵
W
Q
、
W
K
、
W
V
W^Q、W^K、W^V
WQ、WK、WV。
假如Thinking、Machines这两个单词经过Embedding后得到向量是
x
1
,
x
2
x_{1},x_{2}
x1,x2,那么
q
1
=
x
1
W
Q
,
q
2
=
x
2
W
Q
q_{1}=x_{1}W^Q,q_{2}=x_{2}W^Q
q1=x1WQ,q2=x2WQ,同理可得
k
1
=
x
1
W
K
,
k
2
=
x
2
W
K
k_{1}=x_{1}W^K,k_{2}=x_{2}W^K
k1=x1WK,k2=x2WK、
v
1
=
x
1
W
V
,
v
2
=
x
2
W
V
v_{1}=x_{1}W^V,v_{2}=x_{2}W^V
v1=x1WV,v2=x2WV。计算self-attention的第二步是计算分数,假设我们正在计算例子中第一个单词“Thinking”的self-attention,计算当前词与输入句子的每个词的之间相关性:
第三步和第四步是将分数除以
d
m
o
d
e
l
\sqrt {d_{model}}
dmodel
(
64
=
8
\sqrt {64}=8
64
=8)(这一步的操作是为了让梯度的传播更稳定,该值是实验设定,非固定值),然后通过softmax操作传递结果。Softmax将分数标准化,使其全部为正值,加起来等于1。
当最终通过softmax计算出来的归一化分数越高时,说明目标词汇和当前词汇的相关性更高。
第五步是将每个value vector乘以softmax分数。这样通过对计算出来的关联性分数乘以向量,就可以实现对不同部分词汇有不同的关注度。
第六步是对加权值向量求和。这将在该位置(对于第一个单词)生成self-attention层的输出,
z
i
=
∑
i
=
1
N
s
o
f
t
m
a
x
(
q
i
k
i
d
m
o
d
e
l
)
v
i
z_{i}=\sum_{i=1}^{N}softmax(\frac {q_{i}k_{i}}{\sqrt {d_{model}}})v_{i}
zi=i=1∑Nsoftmax(dmodel
qiki)vi如图所示:
在Transformer中,整个过程是矩阵计算,结合上述步骤,矩阵运算可表达为:
论文中通过添加一种称为“多头”注意力机制,进一步细化了self-attention层。这从两个方面提高了注意层的性能:
每个编码器中的每个子层(self-attention,ffnn)在其周围都有一个残差连接,然后是一个层进行归一化步骤。
Decoder的初始输入为开始符号转换成对应的向量作为初始的query向量 Q Q Q,编码器中学习到的注意力向量 K 、 V K、V K、V会作为解码器的Key矩阵和 Value矩阵来使用,之后的每进行一次解码,对应的query会加上上一步的输出结果转换成的向量,再进行下一步的解码,直到解码器输出终止符(如:<EOS>):
Decoder解码过程
最后一个线性层的工作,后面是一个 Softmax 层。线性层是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影到一个更大的向量中,称为 logits 向量,该向量表示当前输出为当前索引映射词汇的概率,最终输出概率最大的预测结果。
最终的目标是使得每个输出结果和目标结果之间的差距最小,一般采用的是交叉熵损失:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。