注意力模型(Attention Model)
在上个笔记中你已经见到了,注意力模型如何让一个神经网络只注意到一部分的输入句子。当它在生成句子的时候,更像人类翻译。让我们把这些想法转化成确切的式子,来实现注意力模型。
跟上个笔记一样,我们先假定有一个输入句子,并使用双向的RNN,或者双向的GRU或者双向的LSTM,去计算每个词的特征。实际上GRU和LSTM经常应用于这个,可能LSTM更经常一点。
对于前向传播(the forward occurrence),你有第一个时间步的前向传播的激活值(a forward occurrence first time step),第一个时间步后向传播的激活值,后向的激活值,以此类推。
他们一共向前了五个时间步,也向后了五个时间步,技术上我们把这里设置为0。我们也可以后向传播6次,设一个都是0的因子,实际上就是个都是0的因子。为了简化每个时间步的记号,即使你在双向RNN已经计算了前向的特征值和后向的特征值,我就用a^()来一起表示这些联系。
所以a^()就是时间步t上的特征向量。但是为了保持记号的一致性,我们用第二个,也就是t',实际上我将用t'来索引法语句子里面的词。接下来我们只进行前向计算,就是说这是个单向的RNN,用状态S表示生成翻译。
所以第一个时间步,它应该生成y^(<1>),当你输入上下文C的时候就会这样,如果你想用时间来索引它,你可以写C^(
<1>),但有时候我就写个C,就是没有上标的C,这个会取决于注意力参数,即a^(<1,1>),a^(<1,2>)以此类推,告诉我们应该花多少注意力。同样的,这个a参数告诉我们上下文有多少取决于我们得到的特征,或者我们从不同时间步中得到的激活值。
所以我们定义上下文的方式实际上来源于被注意力权重加权的不同时间步中的特征值。于是更公式化的注意力权重将会满足非负的条件,所以这就是个0或正数,它们加起来等于1。我们等会会见到我们如何确保这个成立,我们将会有上下文,或者说在t=1时的上下文,我会经常省略上标,这就会变成对t'的求和。这个权重的所有的t'值,加上这些激活值。
所以这里的这项(上图编号1所示)就是注意力权重,这里的这项(上图编号2)来自于这里(上图编号3),于是a^()就是y^()应该在t'时花在a上注意力的数量。换句话来说,当你在t处生成输出词,你应该花多少注意力在第t'个输入词上面,这是生成输出的其中一步。然后下一个时间步,你会生成第二个输出。
于是相似的,你现在有了一个新的注意力权重集,再找到一个新的方式将它们相加,这就产生了一个新的上下文,这个也是输入,且允许你生成第二个词。只有现在才用这种方式相加,它会变成第二个时间步的上下文。即对t'的a^(
<2,t'>)进行求和,于是使用这些上下文向量,C^(<1>)写到这里,C^(<2>)也同理。这里的神经网络看起来很像相当标准的RNN序列,这里有着上下文向量作为输出,我们可以一次一个词地生成翻译,我们也定义了如何通过这些注意力权重和输入句子的特征值来计算上下文向量。剩下唯一要做的事情就是定义如何计算这些注意力权重。让我们下张幻灯片看看。
回忆一下a^(),是你应该花费在a^()上的注意力的数量,当你尝试去生成第t个输出的翻译词,让我们先把式子写下来,再讨论它是怎么来的。这个式子你可以用来计算a^(),在此之前我们要先计算e^(),关键要用softmax,来确保这些权重加起来等于1。如果你对t'求和,比如每一个固定的t值,这些加起来等于1。如果你对t'求和,然后优先使用softmax,确保这些值加起来等于1。
现在我们如何计算这些e项,一种我们可以用的方式是用下面这样的小的神经网络,于是s^()就是神经网络在上个时间步的状态,于是这里我们有一个神经网络,如果你想要生成y^(),那么s^()就是上一时间步的隐藏状态,即s^()。
这是给小神经网络的其中一个输入,也就是在神经网络中的一个隐藏层,因为你需要经常计算它们,然后a^(),即上个时间步的的特征是另一个输入。直观来想就是,如果你想要决定要花多少注意力在t'的激活值上。于是,似乎它会很大程度上取决于你上一个时间步的的隐藏状态的激活值。你还没有当前状态的激活值,因为上下文会输入到这里,所以你还没计算出来,但是看看你生成上一个翻译的RNN的隐藏状态,然后对于每一个位置,每一个词都看向他们的特征值,这看起来很自然,即a^()和e^()应该取决于这两个量。
但是我们不知道具体函数是什么,所以我们可以做的事情就是训练一个很小的神经网络,去学习这个函数到底是什么。
相信反向传播算法,相信梯度下降算法学到一个正确的函数。
这表示,如果你应用这整个的模型,然后用梯度下降来训练它,这是可行的。这个小型的神经网络做了一件相当棒的事情,告诉你y^()应该花多少注意力在a^()上面,然后这个式子确保注意力权重加起来等于1,于是当你持续地一次生成一个词,这个神经网络实际上会花注意力在右边的这个输入句子上,它会完全自动的通过梯度下降来学习。
这个算法的一个缺点就是它要花费三次方的时间,就是说这个算法的复杂是O(n3)的,如果你有T_x个输入单词和T_y个输出单词,于是注意力参数的总数就会是T_x×T_y,所以这个算法有着三次方的消耗。但是在机器翻译的应用上,输入和输出的句子一般不会太长,可能三次方的消耗是可以接受,但也有很多研究工作,尝试去减少这样的消耗。那么讲解注意想法在机器翻译中的应用,就到此为止了。虽然没有讲到太多的细节,但这个想法也被应用到了其他的很多问题中去了,比如图片加标题(image captioning),图片加标题就是看一张图,写下这张图的标题。底下的这篇论文来源于Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。
因为机器翻译是一个非常复杂的问题,在之前的练习中,你应用了注意力,在日期标准化的问题(the date normalization problem)上面,问题输入了像这样的一个日期,这个日期实际上是阿波罗登月的日期,把它标准化成标准的形式,或者这样的日期。
用一个序列的神经网络,即序列模型去标准化到这样的形式,这个日期实际上是威廉·莎士比亚的生日。一般认为是这个日期正如你之前联系中见到的,你可以训练一个神经网络,输入任何形式的日期,生成标准化的日期形式。其他可以做的有意思的事情是看看可视化的注意力权重(the visualizations of the attention weights)。这个一个机器翻译的例子,这里被画上了不同的颜色,不同注意力权重的大小,我不想在这上面花太多时间,但是你可以发现,对应的输入输出词,你会发现注意力权重,会变高,因此这显示了当它生成特定的输出词时通常会花注意力在输入的正确的词上面,包括学习花注意在哪。 在注意力模型中,使用反向传播时, 什么时候学习完成。
这就是注意力模型,在深度学习中真的是个非常强大的想法。