Attention机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hohaizx/article/details/82820835

在sequence-to-sequence学习中,输入和输出都是序列,通常采用Encoder-Decoder的框架进行处理。这种结构首先通过编码器(如CNN/RNN/LSTM等)将输入序列编码成一个固定长度的中间向量,然后将该向量作为解码器(如DNN/CNN/RNN/LSTM)的输入进行解码得到最终结果。以机器翻译为例,其Encoder-Decoder结构如下:

上图中,Encoder和Decoder都是RNN,分别省略了隐含层初始值(e0e_0d0d_0)。在Encoder阶段,编码器将输入的“机器学习”编码成隐含层状态,其中e4e_4可以认为是读取了所有输入信息和隐含层信息,因此我们希冀e4e_4能够包含整个输入句子的信息。然后,在Decoder阶段,我们将e4e_4作为解码器的输入,逐一得到输出“machine”、“learning”和“===”。上图中红色虚线表示可选操作,即e4e_4可以作为d2d_2d3d_3的输入也可以不输入d2d_2d3d_3。在上述Encoder-Decoder结构中,大家或许和我都存在同一个疑问:编码器最后一个隐含层状态(e4e_4)能够代表整个输入的信息吗?这个问题确实是存在的,将不论长短的输入序列都编码到固定长度的隐向量时必定会带来信息的损失,特别是当序列很长时,模型难以学到合适的向量表示,解码器将受限于该固定长度的向量表示,模型性能会变得很差。在Neural machine translation by jointly learning to align and translate, 2015中,作者也明确指出了这个问题:

A potential issue with this encoder–decoder approach is that a neural network needs to be able to compress all the necessary information of a source sentence into a fixed-length vector. This may make it difficult for the neural network to cope with long sentences, especially those that are longer than the sentences in the training corpus.

Attention机制

既然采用固定的向量表示输入序列会限制模型性能,那能不能让解码器每次接收的输入都不一样呢,在每次输出时,让解码器有侧重的关注输入序列的不同部分(如:输出“machine”时,应更加关注“机”和“器”,输出“learning”时,应更加关注“学”和“习”),这就是Attention机制的思想。

可以看到,Decoder分别接收了不一样的输入C1C_1C2C_2C3C_3,并且C1C_1C2C_2C3C_3的值是从Encoder的隐变量中计算出来的。以C1C_1为例,其具体计算过程如下:

  1. 首先,e1e_1z0z_0一起输入match模块,得到α11\alpha_1^1,同理,e2e_2e3e_3e4e_4分别和z0z_0输入match模块也能得到α12\alpha_1^2α13\alpha_1^3α14\alpha_1^4。match模块可以看作是在计算eezz的相似度,如上图右边所示。zz是Decoder模块的隐含层变量,因此这里z0z_0是隐含层的初始值。match模块常有三种选择:1)直接计算向量的余弦相似度;2)一个小的神经网络模型,输入是eehh,输出是一个标量;3)α=eTWz\alpha=e^TWz。采用(2)和(3)两种方式时,match模块的参数也是随着网络反向传播一同学习的。
  2. 计算出Encoder每一个隐变量eezz的相似度后,需要将其归一化,常采用softmax函数,归一化后得到的α^\hat\alpha可以看作是Decoder在输出Y1Y1时对Encoder中每一个隐含层信息的关注度。
  3. 最后对隐含层信息求加权和即可得到c1c_1
    c1=α^1ieic_1=\sum\hat\alpha_1^ie_i

Attention机制的计算公式可以整理如下:
αti=match(zt1,ei)=Vtanh(Wei+Uzt1+b)α^ti=exp(αti)k=1Txexp(αtk)ct=k=1Txα^1kekzt=f(zt1,yt1,ct) \alpha_t^i=match(z_{t-1},e_i)=V\cdot tanh(W\cdot e_i+U\cdot z_{t-1}+b)\\ \hat\alpha_t^i=\frac{exp(\alpha_t^i)}{\sum_{k=1}^{T_x}exp(\alpha_t^k)}\\ c_t=\sum_{k=1}^{T_x}\hat\alpha_1^ke_k\\ z_t=f(z_{t-1},y_{t-1},c_t)

加入Attention机制的Encoder-Decoder整体框架如下图所示

总结

Attention机制几乎是现在所有序列学习的必备,Attention不是一种模型而是一种思想,受到人类在处理数据时分散注意力的启发,许多模型加上Attention机制都得到了state-of-art的结果,也促成了该思想的蓬勃发展。

最后,祝大家中秋快乐!

参考文献

Neural machine translation by jointly learning to align and translate, 2015
李宏毅机器学习2017秋
Deep Learning基础–理解LSTM/RNN中的Attention机制

展开阅读全文

没有更多推荐了,返回首页