Conditional generation by RNN & Attention
摘要:
这节课学的内容很多,而且讲的也比较分散,听起来有点难。
主要围绕的是文字的生成,其中包括在一定条件下的文字生产,一共有两个例子,一是对图片生成文字描述,一个是对提问做出正确的回答。
从另一个角度来讲,文字生成还可以分成静态生产与动态生成(attention),所谓的动态生成,指的是在decoder中,每个时间点的输入是不同的,这样的好处是可以是每一次的输出结果更加准确。
还讲了memory network,以根据文章提问题为例,在简单版本中,可以找到文章中与提问相关的内容,做出正确的回答,在复杂版本中,是在简单版本的基础上,再次阅读问题,循环多次以便达到更好的效果。
最后讲了生成中的几种情况:
1讲的是在视频生成标题中,要注意每个图片的attention weight要尽可能接近,避免输出word时过于关注某一张图片。
2讲了generation和训练时,每个时间点考虑的输入时不一样的,分别来自于model 和reference。这种情况叫做exposure bias。最好的解决办法是先参考reference,后参考model。
3讲的是beam search,一种选取最高分数路径的方法
4讲了object level和component level的对比。只从word角度来评判生成句子的正确性是不够的,还要总体来看,考虑语法上可能出现的问题。
目录
六、Tips for generation 生成句子的一些技巧
2.mismatch between train and test
4.object level和component level的对比
一、什么是生成(generation)?
就是模型通过学习一些数据,然后生成类似的数据。让机器看一些动物图片,然后自己来产生动物的图片,这就是生成。
Generation:生成一个由一个个元件组成的结构体
举例1:通过rnn依次生成一个句子。(句子由词和字组成)
<bos>表示句子开始:begin of sentence
将bos这个特殊的character输入到rnn中,会得到一个character的分布,最后对应“床”这个字。之后将床作为第二个rnn的输出,重复上面的操作,这样就得到了一首诗。
举例2:通过rnn生成一个图片。(图片由像素组成)
和句子的原理相同,把每个像素看作句子里的一个character。因此,例子中的图片就可以看做有九个word的句子。
只是将图片看成和句子一样的结构不是很恰当,像素之间的位置是会相互影响的,但是句子结构没法做到这一点。
右上角是将图片单纯考虑成句子结构
右下角考虑了图片每个像素之间位置的相互影响。
通过3d的lstm可以实现这个结构。
二、condition generation
我们不希望只是简单的随机生成句子,生成的句子应该是针对于特定环境的。
比如给机器一张图片,它可以生成对图片的描述。
和机器交流时,能生成适当的的回复。
1.如何实现image caption generation
先将图片输入到cnn中得到一个vector,在每次RNN输出之前,将这个vector输入给rnn。这样图片就会影响rnn的输出结果。(为了防止rnn有可能遗忘掉图片)
2.如何实现chat-bot:以机器翻译为例
想法:先将输入转化为一个vector,之后就和上面的方法一样了。
做法:将机器学习四个字输入到一个rnn中,取最后的中间层的输出(认为这个vector包含之前四个字的所有信息),再将得到的这个vector输入给另一个rnn,重复上面的操作。最终得到输出machine learning。
这两个RNN可以是一样的,也可以是不一样的。这个方法就是sequence-to-sequence learning
3.一种情形:
M代表机器说的话,在这里机器再次用hi来打招呼并不合适。这就要机器会考虑到谈话阶段上下文语境。
让机器考虑上下文语境的一种解法:
运用双层的encode,先将之前说过的话,全部都通过rnn变成一个vector,再将这些vector都读一遍,最后将读过的结果丢给decode。这就意味着考虑了之前说过的话。
三、attention:动态的条件生成网络
在之前的条件生成网络中,decoder每个时间点接入的c是相同。(c是之前全部信息的vector)
在attention中,每个时间点接入rnn的c是变化的。(c1代表“机器”,c2代表“学习”)
做法:以机器翻译为例
将每个字单独用rnn处理成vector h,z0为一个参数。可以看做是把h1和z0同时输入到一个match的网络,得到α10。0代表时间点0,1代表输入的是h1。
Match的做法有很多,图片右下角是其中的三个例子。
对得到α做softmax,这一步不是必要的。之后用求到的α计算c0。再将c0作为decoder的输入。图中的数据表示c0中只包含“机器”的信息,也就是h1和h2。
Z1是将c0丢到rnn中之后,rnn的中间层的输出。
之后在重复之前的操作,将z1与每个h做match得到α,做softmax,求c1输入给rnn。得到learning……
按我自己的理解,做这些操作就是为了给decoder的rnn,每次选择合适的输入
四、image caption generation 图像标题生成
将图像分块,做卷积池化,在flatten之前,每一块图像经过filter,成为一组vector。
将z0与每一个vector做match。得到不同的权重,在进行weighted sum。输入给rnn得到第一个词。
同样的方法得到第二个词。
这个paper讲的是在注意力机制下的图片标题生成。
表明了当机器识别有下划线的词时,关注的区域是灰色图片中有光晕的地方。
对于视频标题生成
将一段视频分成一张张图片,
以第一段视频为例,机器识别出man是通过第一张和第四张图片,识别出road是通过第三张图片。
五、memory network 记忆网络
举例:根据文章提问,看机器能否给出正确的回答。
X1到Xn表示文章有n个句子。将问题用一个vector q来表示,计算q与x1到xn的match,得到α1到αn。之后做红色方框中的式子,这个过程意味着在文章中选择与q相关的句子。
将相关的信息输入到dnn中,最后得到想要的回答。
将句子转换为vector,这一步也可以一起训练
Memory network的复杂版本
将文章中的句子变成两组不同的vector(x和h),用x这组vector计算attention,用h表示每个句子的信息。这样∑ah就等于训练出来的信息。这个求和得到的vector可以直接丢给dnn,得到问题的答案。也可以丢给q,相加,得到一个新的q。重复之前的操作。传给q并且更新q,这个过程叫做hopping,可以看做是机器重复的阅读文章
(类似于做英文阅读理解,带着问题找答案,再读过文章后看问题)
这张图片就表示之前说的整个过程,橙色和蓝色代表h和x。用一个计算vector,一个计算句子信息。然后计算extract information ∑ah。将求和结果与q相加,重复这个操作。
其中上下两个蓝色的vector可以是一样的,也可以是不一样的。
六、Tips for generation 生成句子的一些技巧
1.attention的一种情况
α下表代表次序,上标代表专注的图片。
在生成word2(woman)时,α下标2的分布表明主要关注的是第二张图片。Word4(women)也是一样的情况。这说明在w2和w4时,过于专注同一个component。这样会导致生成的结果表现很差。
一个好的attention希望每个component(图片)有相近的关注权重。
τ是每一个component在不同time的累加。正则项 括号中的内容表示每个图片中∑α与τ的差的平方
可以通过这个正则项,让其尽可能变小,这样每个component的attention weight就会相近。(也就是每张图片的总的柱体长度更接近)
2.mismatch between train and test
在训练时,丢入condition和bos,得到黄色方框,接着将对应的reference a和condition丢到rnn中,得到b ……
Loss函数是C=∑Ct Ct是每次的输出与对应的reference做交叉熵
第一次输入和训练过程是一样的,第二次输入时遇到了问题。
在generation时,我们并不知道reference应该是什么,这时候给rnn的输入就不是B,而是把上一个输出的黄色方框当做下一个时间点的输入。
训练时,输入是reference
测试时,输入是上一个时间点的输出
这件事情叫做exposure bias
举一个例子
上面试训练阶段走过的路径AAB。
假设将第一个a,错误的选成b。对训练阶段来说,只是错了一小部分。
但是在测试时,如果将a错选成b,那么根据错误的结果继续走下去,整个答案就全都错了。
针对这个问题,应该修改训练的方法
在训练时,如果输出的结果与reference不一样,也要把输出的结果传给下一个时间点的输入,这样training和test就会是match的。但是这样在实际操作中是train不起来的。
拿上图来举例,在训练的时候,
第一个时间点,结果是B,reference是A,机器会把A的可能性调大。
第二个时间点,结果是A,reference是B,机器会把B的可能性调大。
但是,如果在前一个时间点,A的概率上升了,输出就发生改变了,也就意味着后面时间点的输入发生了改变,这时候调高B的概率就没有意义了。这就会导致机器很难去训练。
改进方案:scheduled sampling
在初试方案和改进方案中,最大的区别在于训练过程中,下一个时间点的输入是取reference还是取上一个时间点的输出?
在本方案中,训练过程结合了上述两种方案,结合概率(抛硬币),分别考虑来自reference和来自model的结果。
右上角的图片,纵轴表示看reference的概率。
一开始参照reference,之后慢慢增加model
数据表明,scheduled sampling的效果是比只看reference和只看model的效果要更好的
3.beam search
先走的是橙色的路径,概率是0.6*0.6*0.6,
走的是绿色的路径。概率是0.4*0.9*0.9,
那么怎么找到最高分数的路径呢?这个方法就叫做beam search
每一步选几条最好的路径
上边图片中,是每步保留两条路径。走到叶子结点处,再将两条路径进行比较。
另一种想法:如果直接将上一个时间点的分布丢给下一个时间点,(比如右边的情况)
将分布直接传给下一个时间点并不好。
问题:你觉得如何? 机器应该回答:高兴想笑或者难过想哭
在左边的方案中,第一个时间点 A代表难过,B代表高兴,它们的概率可能是很接近的。
输出A或B都可以,这里选择输出B。将B输入给下一个时间点,“高兴”后面接着“想笑”的概率很大(比“想哭”大),这时候输出就是想笑。
在右边的方案中,由于传给第二个时间的的是概率分布,而且两个概率是近似的,这时候第二个时间的输出,想笑和想哭的概率也是近似的,这是时候就可能会产生“高兴想哭”或者“难过想笑”,这两种错误的回答。
4.object level和component level的对比
Component level是从每个单词是否接近图片中的内容,来评价训练的结果好坏。但是这可能会导致训练出来的并不是一个句子,不符合语法。
从the dog is is fast 到the dog is running fast,这个loss差距是很小的。
这时候就应该从整个句子的语法入手,做loss函数去评判句子语法的好坏。目前还没有公认的比较好的loss函数去处理这种情况。假设整个loss函数是R,这个R是不可以用梯度下降的。
总结:
这节课主要讲的是不同情况下的生成语句,以及可能遇到的各种问题。
李宏毅老师主要是拿出具体的例子和paper来讲一些特殊情况。有些方法是没有学过的,听起来还是有点难的。
这一部分应该是属于nlp里的知识了。