注意力机制(二)

上两篇文章中,我们介绍了循环神经网络经典的应用结构自编码模型,以及其应对长序列问题的改进模型——带注意力机制的自编码模型。其本质都是通过一个Encoder和一个Decoder实现机器翻译、文本转换、机器问答等功能。

注意力机制(二)_第1张图片

传送门:序列处理之RNN模型、注意力机制(一)

里面的网络结构通常是循环网络或卷积网络。今天我们学习另外一种网络结构,用6个结构相同的Encoder串联构成编码层,用6个结构相同的Decoder串联构成解码层,这种自编码模型称为Transformer.

eea3e34e66b010c24392394f8db78b76.png

a83ed72785753bcc1915574e90c8467b.gif

Transformer架构

2e87f7ebde876a020d37fe0d3269fb7f.png

Transformer的架构一般如下图所示:

注意力机制(二)_第2张图片

这里,最后一层Encoder的输出将传入Decoder的每一层。其中,每个编码器由一层自注意力和一层前馈网络构成,每一个解码器中间还多一个用来接收最后一个编码器的输出值的自编码层:

注意力机制(二)_第3张图片

0a1e568e9ec3c04323c2582c18f4aaa2.png

4b6d6be5bbc97d69f0862afe1e03d400.gif

Transformer特点

ed5d513a36281b95a183ef5e84d902a2.png

上面是Transformer的主要架构,下面我们深入剖析其细节。我们知道,对于语言翻译类问题,单词的次序是一个非常重要的因素,RNN本身就考虑了单词次序位置关系,所以Transformer也要考虑这个问题。

实际上,Transformer使用位置编码(Position Encoding)来记录单词在语句中的位置或次序,位置编码取值遵循一定的规则生成,每个单词的词嵌入与对应位置编码相加(位置编码向量与词嵌入维度相同)得到最终的词嵌入(称为带有时间信息的嵌入):

注意力机制(二)_第4张图片

对解码器的输入(目标数据)也做同样的处理。这里存在一个问题,即对语料库进行批量处理时,可能会遇到长度不一致的语句,可以做下面处理:对于短语句可用填充方式补齐;对于长语句可用截尾方法对齐(负值很大负数,进行softmax运算时变为0)

Transformer是一种自注意力机制,这与一般的注意力机制的区别点在于Query的来源不同。一般的注意力机制的query来源于目标语句(非源语句),而自注意力机制的query来源于语句本身(非目标语句)。自注意力机制的计算步骤主要如下:

1)把输入单词转换为带时间(时序)信息的嵌入向量

2)根据嵌入向量生成q、k、v三个向量,分别代表query、key、value

3)根据q,计算每个单词点积后得分:score=q•k

4)对score进行规范化处理,softmax后结果为a

5)a与对应v相乘,然后累加得到当前语句各单词之间的自注意力z=∑av

e8045e6b6b60c5a23778f6fb94bf7166.png

e417cda5ed1debf47f79549032402be1.gif

缩放点积注意力

88a0cb33e9e22c4bd65a3d1fd60d4d02.png

Transformer的核心内容就是这五个计算步骤。为了加深理解,我们通过一个例子加以可视化展示。

假设要翻译的语句为:Thinking Machines。单词Thinking预处理(带有时序的词嵌入)后用向量x1表示,单词Machines预处理后用x2表示。计算单词Thinking与当前语句各单词的注意力得分(Score):

注意力机制(二)_第5张图片

同样的方式可以计算单词Machines与当前语句各单词的注意力得分,这里不再展示了。然后对score得分进行规范化处理,考虑到实际计算中score得分可能较大,为保证计算梯度时不影响稳定性,一般进行归一化操作后再进行softmax处理,这里,score得分除以k向量维度的算术平方根:

注意力机制(二)_第6张图片

这里需要解释一下,一般词嵌入的维度比较大(比如512),且与q、k、v维度满足以下关系:

注意力机制(二)_第7张图片

这样就可以得到单词Thinking对当前语句各单词的注意力z。

可以看到,计算注意力都是基于向量的运算,如果把向量堆砌成矩阵,则可以进行矩阵运算得到Q、K、V:

注意力机制(二)_第8张图片

其中,W的三个矩阵为可学习矩阵,与神经网络的权重矩阵类似。在此基础上,注意力计算过程可以表示为下面可视化过程:

注意力机制(二)_第9张图片

这个计算注意力z的过程又称为缩放点积注意力(Scaled Dot-Product Attetion).

上图中,MatMul表示点击运算,Mask表示掩码,用于遮掩某些值使其在参数更新时不产生效果。Transformer模型涉及两张掩码方式——Padding Mask(填充掩码)和Sequence Mask(序列掩码),而后者只会用在Decoder的自注意力中,用于防止Decoder预测目标值时看到未来的值。

0149f48bfd661e9f4d4b2b71af10e6cb.png

fc22d84279a1fe3a1de283c63a8669ac.gif

Transformer全流程

1be017e26a82fa0d101e5934aed131d4.png

我们知道,Transformer的Encoder和Decoder组件分别有6层,随着网络层数的增加,表达能力也越强,但也会出现收敛速度慢、易出现梯度消失等问题。为此,Transformer采用两种方法克服这种缺陷——残差连接(Residual Connection)归一化(Normalization),具体方法是在每个编码器或解码器的两个子层(Self-Attention和FFNN,前馈神经网络)间增加由残差连接和归一化组成的层:

注意力机制(二)_第10张图片

Decoder做一样的处理,特别之处是在最后的输出通过一个全连接层及Softmax函数作用后得到预测值的对数概率:

注意力机制(二)_第11张图片

假设这里采取贪婪解码方法,用argmax函数获取概率最大值对应的索引:

注意力机制(二)_第12张图片

bd3c65e89aba94c4384899a6d3340928.png

a4396cece2ea85724abd6af848f6c25c.gif

多头注意力机制

096665526ede5d7209c6e8b4e7c1c683.png


类似多核卷积神经网络,自注意力采取多个组合(多个Wq,Wk,Wv矩阵),就形成了多头注意力机制(Multi-Head Attention)。它可以从3个方面提升注意力层的性能:

1)扩展模型专注于不同位置的能力

2)将缩放点注意力过程做h次,再把输出合并起来

3)为注意力层(Attention Layer)提供多个”表示子空间“

结合上面的内容,我们得到了一个完整的Transformer架构图:

注意力机制(二)_第13张图片

参考资料:《深入浅出Embedding》

你可能感兴趣的:(神经网络,人工智能,深度学习,python,java)