上篇中(P19)我们讲解了指代消解问题的定义、端到端训练的模块和简化运算以及前沿研究等
而在本篇中,我们将进入条件生成领域,将从三个方面进行讲解 : Generation 怎么产生一个有结构的东西 Attention 产生结构的辅助 Tips for Generation 一些生成任务的技巧
注意,本视频是李宏毅老师过去的教学视频,但为了视频笔记的配套一致性,笔者还是将本视频做成笔记供给大家学习。如果你已经对一般的生成任务方法和技巧、attention有足够的了解请跳过本篇。
我们要产生一个有结构的由多个部分组成的东西,以下我们要讲的就是如何通过RNN一个一个地产生出来。
任务目标如果是要产生一个句子,解法:我们可以利用RNN每次一个一个地产生词或字,依次生成,直到整个句子的产生,如上图,最开始我们会将特殊的token <BOS>输入到RNN中,此时RNN会给出 p ( w 1 ) p(w_1) p(w1)也就是在词汇表中每个词出现在<BOS>后面的概率,其中最大的是床,接下来,将床输入到RNN中,会得到 p ( w 2 ∣ w 1 ) p(w_2|w_1) p(w2∣w1)的条件概率,同样概率最大的是前,依次逐字生成整个句子。
如上图,便是大家可以参考的文献,可以生成图片、声音、手写文字、讲话
同样,生成的可以不仅仅是文章,也可以是其他的,如生成图片,因为图片就是由pixels组成,假设这张图片就是3x3的,有9个pixels,这时我们可以把这张图片看成是一个句子,它由9个字组成,每个pixel就代表一个字。具体图片的生成模型可以参加下图,一种三维的LSTM模型。
如果我们仅仅使用上述使用RNN逐字生成整个句子的方法,是有一定问题的,问题1:这样逐字生成的句子看起来会像是合乎文法的东西,但是没有办法控制它会产生什么,完全是随机产生的。问题2:我们有时候是希望模型能够在一定条件下去生成合乎情景的句子。
比如,如上图,假如我们在做Caption Generation 字幕生成的时候,当给机器看一张新垣结衣在跳舞的一幕时,我们是希望机器能够输出“一个年轻的女孩在跳舞的”。我们需要的是一种合乎语境的生成或者回复。
那我们该怎么做这种合乎情景的生成呢?此时我们就需要机器根据某些条件再进行生成。
具体而言,对于Image Caption Generation 图片字幕生成,这种有条件的生成该怎么做呢?
如上图,首先我们将图片经过CNN处理得到一个向量,再将这个向量与<BOS>一起作为RNN的输入,同时在每一步中都将这个向量与前一步的输出组合在一起作为这一步的输入。这样就可以做到通过图片影响RNN做条件生成了。
其实,同样的方法也可以使用在Machine Translation 机器翻译上,闲聊机器人上。如上图所示,对于机器翻译任务,我们一样把要翻译的句子“机器学习”用一个RNN逐字读入,并把最后一层RNN的输出向量作为这个要翻译句子的表示,将这个向量同样的方式每一步都放入生成英文的RNN中,再逐字生成对应的翻译句“machine learning .”
其实,如上图所示,左边的RNN就是一个Encoder,右边的RNN就是一个Decoder,而且这两个部分是可以一起训练的,那这俩个RNN是否是共享参数呢?其实,都可以。
Attention是什么呢?Attention就是Dynamic Conditional Generation 动态条件生成。
就如,我们刚在所讲的图片字幕生成、翻译生成,为了让Encoder影响Decoder,我们会把Encoder的输出每个时间点都接给Decoder,且每个时间点接的向量都是相同固定的。但是我们可以让Decoder在每个时间点看到的信息都是不一样的,这样做的好处有1 Encoder可能没办法把整个序列变成一个向量表示,那每次Decoder看到的都是一样的差,也就产生不了好的结果,2 Decoder可以考虑比较需要的信息。
这样该怎么设计模型呢?该怎么做呢?接下来我们将以机器翻译作为例子进行讲解。
这里的z0会和每一个h计算attention 如 z0和h1 得到 α1、z0和h2 得到 α2,…接下来再将同一行的α做softmax,使这些α和为1,再将这些softmax后的α去乘上各自的h得到最终的向量c0。
就像上图一样,假设softmax后得到的α1 = 0.5 α2 = 0.5 α3 = 0 α4 = 0最终c0 = 0.5h1 + 0.5h2
接下来c0会被当做Decoder的Input,这个c在文献上常常被称为Context vector。
其实 ,记忆网络针对训练任务就是阅读理解,做法也很简单。
首先将文章表示成句子序列 x 1 , x 2 , . . . , x N x^1,x^2,...,x^N x1,x2,...,xN,再将问题表示成embedidng向量,并与文章的句子序列进行一一匹配,就是相当于在做attention,再把匹配度当作权重参数,将句子序列分别乘上权重参数 α 1 , α 2 , . . . , α N \alpha_1,\alpha_2,...,\alpha_N α1,α2,...,αN并求和,这个加权的和就是我们从文章中提取到与问题最相关的信息,再把这个加权和向量丢给DNN进行答案的生成。
进阶版不过是把文章表示成两种句子序列,对句子序列 x 1 , x 2 , . . . , x N x^1,x^2,...,x^N x1,x2,...,xN运算过程一样,经过注意力机制,与问题向量得到对应的权重参数 α 1 , α 2 , . . . , α N \alpha_1,\alpha_2,...,\alpha_N α1,α2,...,αN,只不过,此时的加权求和的部分变成了句子向量 h 1 , h 2 , . . . , h N h^1,h^2,...,h^N h1,h2,...,hN的加权求和,并可以将这个加权和再丢给向量q,q再重新去计算权重参数,再重新更新加权和,循环训练多次,这个过程叫做Hopping就像是反复思考。
刚刚讲的Memory Network是在外部信息Memory上去做attention,并在memory上提取信息。而神经图灵机不仅可以从memory上提取出信息,还可以把根据attention得到的信息写到memory里面去。
实现过程可参见下面两张图,具体实现过程过于复杂,不再阐述
在做Attention的时候,有时会出现这样的情况,在不同的位置attention注意的地方是一样的,就比如 w 1 , w 2 , w 3 , w 4 w_1,w_2,w_3,w_4 w1,w2,w3,w4序列,在 w 2 , w 4 w_2,w_4 w2,w4时两者均attend到第二张图片,即woman,此时将会输出 w 1 , w o m a n , w 3 , w o m a n w_1,woman,w_3,woman w1,woman,w3,woman这样奇怪的句子。
而解决attention总关注一部分,而不考虑其他部分的问题。在ICML,2015上提出一种正则化方法,如上图,将每次attention得到的各个数值进行正则化,保证每一部分的attention值不会差别太大。
其实这里老师要讲的就是,Beam Search问题,请参加本系列笔记P4 Spell中的Beam Search,不再阐述。