导读
使用详细的例子来理解RNN中的注意力机制。
RNNs已成功地应用于机器翻译、情绪分析、图像字幕、时间序列预测等序列数据的处理。改进的RNN模型,如长短时记忆网络(LSTMs),使长序列训练克服了梯度消失等问题。然而,即使是更高级的模型也有其局限性,研究人员在处理长数据序列时也很难开发出高质量的模型。例如,在机器翻译中,RNN必须找到由几十个单词组成的长输入和输出句子之间的联系。现有的RNN体系结构似乎需要改变和适应,以便更好地处理这些任务。
Attention是结合在RNN中的一种机制,它可以在预测输出序列的某一部分时,将注意力集中在输入序列的某一部分,从而使学习更容易,质量更高。注意机制使其在许多任务中的性能得到提高,使其成为现代RNN网络的一个组成部分。
本工作是基 Bahdanau, Cho, and Bengio的论文Neural machine translation by jointly learning to align and translate。
我们先简单回顾一下基本的RNNs。我们关注的RNN编解码器架构如下:
RNN编码器有一个输入序列x1, x2, x3, x4。我们用c1 c2 c3表示编码器的状态。编码器输出单个输出向量c作为输入传递给解码器。和编码器一样,解码器也是一个单层的RNN,我们用s1、s2、s3表示解码器的状态,用y1、y2、y3、y4表示网络的输出。
这种结构的问题在于解码器需要将整个输入序列x1、x2、x3、x4表示为单个向量c,这会导致信息丢失。此外,解码器需要从这个单一向量中解码传递的信息,这本身就是一项复杂的任务。
细节:
这种编译码方法的一个潜在问题是,神经网络需要能够将源语句的所有必要信息压缩成一个固定长度的向量。这可能会使神经网络难以处理长句,尤其是那些比训练语料库中的句子长的的长句。
带注意力机制的RNNs
带注意力机制的RNN是这样的:
我们的注意力模型有一个单层的RNN编码器,同样有4个步骤。我们用x1、x2、x3、x4表示编码器的输入向量,用h1、h2、h3、h4表示输出向量。
注意力机制位于编码器和解码器之间,其输入是由编码器的输出向量h1, h2, h3, h4和解码器的状态s0, s1, s2、s3构成,注意力的输出向量序列被称为上下文向量用c1, c2, c3, c4表示。
上下文向量
上下文向量使解码器能够在预测输出时关注输入的某些部分。每个上下文向量是编码器的输出向量h1, h2, h3, h4的加权和,每个向量hi包含整个输入序列信息(因为它在计算时可以得到编码器的状态),这个向量强烈关注第i个输入序列向量的周围部分。向量h1, h2, h3, h4被aij进行加权,得到输入xj对于输出i时刻的yi的相关程度。
上下文向量c1、c2、c3、c4这样得到:
注意力权重是通过一个额外的全连接的浅网络来学习的,用fc表示,这就是注意力机制输入的s0、s1、s2、s3部分发挥作用的地方。注意力权重的计算方法为:
使用注意力全连接网络和softmax函数学习注意力权值:
在时间步i,注意力机制使用h1, h2, h3, h4和si-1作为输入,它使用fc神经网络和softmax函数计算权重αi1,αi2,αi3,αi4计算上下文向量。
可以看到在上面的图片中,向量的全连接网络使用 [si-1,hi] 作为输入在时间步i。网络有一个全连接层、输出层用eij表示,经过softmax函数计算权重的取值范围为[0,1]。
注意,我们对所有对[si-1,h1], [si-1,h2], [si-1,h3], [si-1,h4]使用相同的全连接网络,这意味着存在一个学习注意力权重的单一网络。
注意,由于第i步的计算涉及到si-1(解码器的状态),所以需要在每一个时间步上分别计算注意权值
注意力权重αij反映的是hj对前面的隐藏状态si-1在决定下一个状态si和生成yi时候的重要性。大的αij会导致RNN关注输入xj(通过编码器的输出hj来表示),来对yi的输出进行预测。
利用反向传播对fc网络与编码器、解码器进行训练,将RNN的预测误差项反向传播到解码器,然后通过fc注意力网络,再从解码器反向传播到编码器。
注意,由于注意力的权重是使用一个额外的神经网络fc学习的,我们有一组额外的权重来允许这个学习发生,我们用Wa表示这个权重矩阵。
一个包含4个输入时间步长和4个输出时间步长的RNN,在训练过程中会对以下权重矩阵进行微调。注意注意矩阵的维数4×4,将每个输入连接到每个输出:
这种机制使解码器能够决定输入序列的哪些部分需要注意。通过让解码器具有注意力机制,我们将编码器从必须将输入序列中的所有信息编码为单个向量中解放出来。信息可以传播到h1、h2、h3、h4序列中,解码器可以选择性地检索这些序列。
参考文献是这样描述的:
这种方法与基本编码码器最重要的区别在于,它不试图将整个输入语句编码成一个固定长度的向量。相反,它将输入的句子编码成一个向量序列,并在解码时自适应地选择这些向量的子集。这使得神经翻译模型不必将源句的所有信息(无论其长度)压缩到一个固定长度的向量中。我们证明这可以让模型更好地处理长句
计算注意力权重和上下文向量
让我们来看一个详细的例子,看看如何计算上下文向量。
第一步是由编码器计算向量h1、h2、h3、h4。然后这些被用作注意力机制的输入。在这里,解码器首先通过输入其初始状态向量s0进行处理,我们得到了第一个注意力输入序列[s0, h1], [s0, h2], [s0, h3], [s0, h4]。
注意力机制计算第一组的权重α11,α12,α13,α14,启用第一个上下文向量c1的计算。解码器现在使用[s0,c1]并计算RNN的第一个输出y1
在接下来的时间步中,注意力机制输入序列[s1, h1], [s1, h2], [s1, h3], [s1, h4]。
计算第二组注意力权重α21,α22,α23,α24,启用第二个上下文向量c2的计算。解码器使用[s1,c2]计算RNN的第二个输出y2。
在下一个时间步中,注意力机制的输入序列为[s2, h1], [s2, h2], [s2, h3], [s2, h4]。
计算第三组注意力权重α31,α32,α33,α34,启用第三个上下文向量c3的计算。解码器使用[s2,c3]并计算输出y3。
在下一个时间步中,注意力机制的输入序列为[s3, h1], [s3, h2], [s3, h3], [s3, h4]。
计算第四组注意力权重,α41,α42,α43,α44,启用第三个上下文向量c4的计算。解码器使用[s3,c4]并计算输出y4。
最后我们以英语法语机器翻译的一个例子结束。下面是注意力RNN发现的两个对齐。每个图的x轴和y轴分别对应源句中的单词(英语)和生成的翻译(法语)。
每个像素显示的是第j个源单词和第i个目标单词之间的权重αij,使用灰度来表示(0:黑色、1:白色)。
我们看到了注意力机制是如何允许RNN在输出翻译时只关注输入句子的一小部分的。请注意较大的注意力参数(由白色像素给出)如何连接英语和法语句子的相应部分,从而使得网络能够实现最先进的结果。
英文原文:https://medium.com/datadriveninvestor/attention-in-rnns-321fbcd64f05
作者:Nir Arbel
编译:ronghuaiyang
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。