注意力模型(Attention Model)

八月的第一天,苏神yyds!

来源:Coursera吴恩达深度学习课程

在注意力模型直观理解中我们看到注意力模型如何让一个神经网络只注意到一部分的输入句子。当它在生成句子的时候,更像人类翻译。让我们把这些想法转化成确切的式子,来实现注意力模型(Attention Model)

如上图所示,我们先假定有一个输入句子,并使用双向的RNN(bidirectional RNN),或者双向的GRU或者双向的LSTM,去计算每个词的特征(features)。实际上GRU和LSTM经常应用于这个,可能LSTM更经常一点。对于前向传播(forward occurrence),有第一个时间步的前向传播的激活值(a forward occurrence first time step),第一个时间步后向传播(backward occurrence)的激活值,后向的激活值,以此类推。他们一共向前了五个时间步,也向后了五个时间步,技术上我们把这里设置为0。我们也可以后向传播6次,设一个都是0的因子,实际上就是个都是0的因子。为了简化每个时间步的记号,即使你在双向RNN已经计算了前向的特征值和后向的特征值,我们用a^来一起表示这些联系(these concatenated)。

a^是时间步t上的特征向量(feature vector)。但是为了保持记号的一致性,我们用第二个,也就是t’,实际上我们将用t’来索引法语句子里面的词

接下来我们只进行前向计算,就是说这是个单向的RNN,用状态S表示生成翻译(translation)。所以第一个时间步,它应该生成y^<1>,当你输入上下文C的时候就会这样,如果你想用时间来索引它,你可以写C^<1>,但有时候Andrew就写个C,就是没有上标的C,这个会取决于注意力参数,即α^<1,1>α^<1,2>以此类推,告诉我们应该花多少注意力。同样的,这个a参数告诉我们上下文有多少取决于我们得到的特征,或者我们从不同时间步中得到的激活值。所以我们定义上下文的方式实际上来源于被注意力权重加权的不同时间步中的特征值。于是更公式化的注意力权重将会满足非负的条件,所以这就是个0或正数,它们加起来等于1。我们等会会见到我们如何确保这个成立,我们将会有上下文,或者说在t = 1时的上下文,Andrew会经常省略上标,这就会变成对t’的求和。这个权重的所有的t’值,加上这些激活值。于是α^就是y^应该在t’时花在a^上注意力的数量(so α^ is the amounention that’s y^ should pay to a^)。换句话来说,当你在t处生成输出词,你应该花多少注意力在第t’个输入词上面,这是生成输出的其中一步。然后下一个时间步(绿色标记),你会生成第二个输出。于是相似的,你现在有了一个新的注意力权重集,再找到一个新的方式将它们相加,这就产生了一个新的上下文,这个也是输入,且允许你生成第二个词。只有现在才用这种方式相加,它会变成第二个时间步的上下文。即对t’的α^<2,t’>进行求和,于是使用这些上下文向量,C^<1>写到这里,C^<2>也同理。这里的神经网络看起来很像相当标准的RNN序列(紫色标记),这里有着上下文向量作为输出(output),我们可以一次一个词地生成翻译,我们也定义了如何通过这些注意力权重和输入句子的特征值来计算上下文向量。剩下唯一要做的事情就是定义如何计算这些注意力权重(attention weights)。让我们下张幻灯片看看。

回忆一下α^,表示当你尝试去生成第t个输出的翻译词时应该花费在a^上的注意力的数量。这个式子你可以用来计算α^,在此之前我们要先计算e^,关键要用softmax,来确保这些权重加起来等于1。如果你对t’求和,比如每一个固定的t值,这些加起来等于1。如果你对t’求和,然后优先使用softmax,确保这些值加起来等于1。 

如何计算这些e项呢?一种方式是用小的神经网络,于是s^就是神经网络在上个时间步的状态,于是这里我们有一个神经网络,如果你想要生成y^,那么s^就是上一时间步的隐藏状态,即s^。这是给小神经网络的其中一个输入,也就是在神经网络中的一个隐藏层,因为你需要经常计算它们,然后a^,即上个时间步的的特征是另一个输入。直观来想就是,如果你想要决定要花多少注意力在t’的激活值上。于是,似乎它会很大程度上取决于你上一个时间步的的隐藏状态的激活值。你还没有当前状态的激活值,因为上下文会输入到这里,所以你还没计算出来,但是看看你生成上一个翻译的RNN的隐藏状态,然后对于每一个位置,每一个词都看向他们的特征值,这看起来很自然,即α^和e^应该取决于这两个量:s^和a^(蓝色圆圈标记)。但是我们不知道具体函数是什么,所以我们可以做的事情就是训练一个很小的神经网络,去学习这个函数到底是什么。相信反向传播算法,相信梯度下降算法学到一个正确的函数(right function)。这表示,如果你应用这整个的模型,然后用梯度下降来训练它,这是可行的。这个小型的神经网络做了一件相当棒的事情,告诉你y^应该花多少注意力在a^上面,然后这个式子(蓝色圆圈标记)确保注意力权重加起来等于1,于是当你持续地一次生成一个词,这个神经网络实际上会花注意力在右边的这个输入句子上,它会完全自动的通过梯度下降来学习。

这个算法的一个缺点(downside)就是它要花费三次方的时间(take quadratic time),就是说这个算法的复杂是O(n^3)的,如果你有T_x个输入单词和T_y个输出单词,于是注意力参数的总数就会是T_x *T_y,所以这个算法有着三次方的消耗。但是在机器翻译的应用上,输入和输出的句子一般不会太长,可能三次方的消耗是可以接受,但也有很多研究工作,尝试去减少这样的消耗。这个想法被应用在很多问题中,比如图片加标题(image captioning),图片加标题就是看一张图,写下这张图的标题(caption)。具体参考这篇论文:Neural image caption generation with visual attention

因为机器翻译是一个非常复杂的问题(complicated problem)。当在日期标准化的问题(the date normalization problem)上应用了注意力,输入左侧这样的一个日期,这个日期实际上是阿波罗登月的日期(the Apollo Moon landing),输出是右侧标准的形式。用一个序列的神经网络,即序列模型去标准化到这样的形式,这个日期实际上是威廉·莎士比亚的生日(the birthday of William Shakespeare)。一般认为你可以训练一个神经网络,输入任何形式的日期,生成标准化的日期形式。也可以看看可视化的注意力权重(the visualizations of the attention weights)。这个一个机器翻译的例子,不同注意力权重的大小被画上了不同的颜色,这显示了当它生成特定的输出词时通常会花注意力在输入的正确的词上面,包括学习花注意在哪。以及使用反向传播时,什么时候学习完成。

这就是注意力模型,在深度学习中真的是个非常强大的想法(powerful idea)

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

你可能感兴趣的:(吴恩达深度学习笔记,深度学习知识点储备,笔记,python,深度学习,注意力模型,语言模型,神经网络)