李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

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角度来评判生成句子的正确性是不够的,还要总体来看,考虑语法上可能出现的问题。

 

目录

一、什么是生成(generation)?

二、condition generation

1.如何实现image caption generation

2.如何实现chat-bot:以机器翻译为例

3.一种情形:

三、attention:动态的条件生成网络

做法:以机器翻译为例

四、image caption generation 图像标题生成

五、memory network 记忆网络

举例:根据文章提问,看机器能否给出正确的回答。

Memory network的复杂版本

六、Tips for generation 生成句子的一些技巧

1.attention的一种情况

2.mismatch between train and test

3.beam search

4.object level和component level的对比

总结:


 

 

一、什么是生成(generation)?

就是模型通过学习一些数据,然后生成类似的数据。让机器看一些动物图片,然后自己来产生动物的图片,这就是生成。

Generation:生成一个由一个个元件组成的结构体

 

举例1:通过rnn依次生成一个句子。(句子由词和字组成)

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

<bos>表示句子开始:begin of sentence

将bos这个特殊的character输入到rnn中,会得到一个character的分布,最后对应“床”这个字。之后将床作为第二个rnn的输出,重复上面的操作,这样就得到了一首诗。

 

举例2:通过rnn生成一个图片。(图片由像素组成)

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

和句子的原理相同,把每个像素看作句子里的一个character。因此,例子中的图片就可以看做有九个word的句子。

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

只是将图片看成和句子一样的结构不是很恰当,像素之间的位置是会相互影响的,但是句子结构没法做到这一点。

右上角是将图片单纯考虑成句子结构

右下角考虑了图片每个像素之间位置的相互影响。

通过3d的lstm可以实现这个结构。

 

二、condition generation

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

我们不希望只是简单的随机生成句子,生成的句子应该是针对于特定环境的。

比如给机器一张图片,它可以生成对图片的描述。

和机器交流时,能生成适当的的回复。

 

1.如何实现image caption generation

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

先将图片输入到cnn中得到一个vector,在每次RNN输出之前,将这个vector输入给rnn。这样图片就会影响rnn的输出结果。(为了防止rnn有可能遗忘掉图片)

 

2.如何实现chat-bot:以机器翻译为例

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

想法:先将输入转化为一个vector,之后就和上面的方法一样了。

做法:将机器学习四个字输入到一个rnn中,取最后的中间层的输出(认为这个vector包含之前四个字的所有信息),再将得到的这个vector输入给另一个rnn,重复上面的操作。最终得到输出machine learning。

这两个RNN可以是一样的,也可以是不一样的。这个方法就是sequence-to-sequence learning

 

3.一种情形:

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

M代表机器说的话,在这里机器再次用hi来打招呼并不合适。这就要机器会考虑到谈话阶段上下文语境。

让机器考虑上下文语境的一种解法:

运用双层的encode,先将之前说过的话,全部都通过rnn变成一个vector,再将这些vector都读一遍,最后将读过的结果丢给decode。这就意味着考虑了之前说过的话。

 

三、attention:动态的条件生成网络

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

在之前的条件生成网络中,decoder每个时间点接入的c是相同。(c是之前全部信息的vector)

在attention中,每个时间点接入rnn的c是变化的。(c1代表“机器”,c2代表“学习”)

 

做法:以机器翻译为例

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将每个字单独用rnn处理成vector h,z0为一个参数。可以看做是把h1和z0同时输入到一个match的网络,得到α10。0代表时间点0,1代表输入的是h1。

Match的做法有很多,图片右下角是其中的三个例子。

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

对得到α做softmax,这一步不是必要的。之后用求到的α计算c0。再将c0作为decoder的输入。图中的数据表示c0中只包含“机器”的信息,也就是h1和h2。

Z1是将c0丢到rnn中之后,rnn的中间层的输出。

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

之后在重复之前的操作,将z1与每个h做match得到α,做softmax,求c1输入给rnn。得到learning……

按我自己的理解,做这些操作就是为了给decoder的rnn,每次选择合适的输入

 

四、image caption generation 图像标题生成

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将图像分块,做卷积池化,在flatten之前,每一块图像经过filter,成为一组vector。

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将z0与每一个vector做match。得到不同的权重,在进行weighted sum。输入给rnn得到第一个词。

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

同样的方法得到第二个词。

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

这个paper讲的是在注意力机制下的图片标题生成。

表明了当机器识别有下划线的词时,关注的区域是灰色图片中有光晕的地方。

 

对于视频标题生成

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将一段视频分成一张张图片,

以第一段视频为例,机器识别出man是通过第一张和第四张图片,识别出road是通过第三张图片。

 

五、memory network 记忆网络

 

举例:根据文章提问,看机器能否给出正确的回答。

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

X1到Xn表示文章有n个句子。将问题用一个vector q来表示,计算q与x1到xn的match,得到α1到αn。之后做红色方框中的式子,这个过程意味着在文章中选择与q相关的句子。

将相关的信息输入到dnn中,最后得到想要的回答。

将句子转换为vector,这一步也可以一起训练

 

Memory network的复杂版本

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将文章中的句子变成两组不同的vector(x和h),用x这组vector计算attention,用h表示每个句子的信息。这样∑ah就等于训练出来的信息。这个求和得到的vector可以直接丢给dnn,得到问题的答案。也可以丢给q,相加,得到一个新的q。重复之前的操作。传给q并且更新q,这个过程叫做hopping,可以看做是机器重复的阅读文章

(类似于做英文阅读理解,带着问题找答案,再读过文章后看问题)

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

这张图片就表示之前说的整个过程,橙色和蓝色代表h和x。用一个计算vector,一个计算句子信息。然后计算extract information ∑ah。将求和结果与q相加,重复这个操作。

其中上下两个蓝色的vector可以是一样的,也可以是不一样的。

 

六、Tips for generation 生成句子的一些技巧

 

1.attention的一种情况

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

α下表代表次序,上标代表专注的图片。

在生成word2(woman)时,α下标2的分布表明主要关注的是第二张图片。Word4(women)也是一样的情况。这说明在w2和w4时,过于专注同一个component。这样会导致生成的结果表现很差。

一个好的attention希望每个component(图片)有相近的关注权重。

τ是每一个component在不同time的累加。正则项 括号中的内容表示每个图片中∑α与τ的差的平方

可以通过这个正则项,让其尽可能变小,这样每个component的attention weight就会相近。(也就是每张图片的总的柱体长度更接近)

 

2.mismatch between train and test

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

在训练时,丢入condition和bos,得到黄色方框,接着将对应的reference a和condition丢到rnn中,得到b ……

Loss函数是C=∑Ct   Ct是每次的输出与对应的reference做交叉熵

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

第一次输入和训练过程是一样的,第二次输入时遇到了问题。

在generation时,我们并不知道reference应该是什么,这时候给rnn的输入就不是B,而是把上一个输出的黄色方框当做下一个时间点的输入。

训练时,输入是reference

测试时,输入是上一个时间点的输出

这件事情叫做exposure bias

 

举一个例子

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

上面试训练阶段走过的路径AAB。

假设将第一个a,错误的选成b。对训练阶段来说,只是错了一小部分。

但是在测试时,如果将a错选成b,那么根据错误的结果继续走下去,整个答案就全都错了。

 

针对这个问题,应该修改训练的方法

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

在训练时,如果输出的结果与reference不一样,也要把输出的结果传给下一个时间点的输入,这样training和test就会是match的。但是这样在实际操作中是train不起来的。

拿上图来举例,在训练的时候,

第一个时间点,结果是B,reference是A,机器会把A的可能性调大。

第二个时间点,结果是A,reference是B,机器会把B的可能性调大。

但是,如果在前一个时间点,A的概率上升了,输出就发生改变了,也就意味着后面时间点的输入发生了改变,这时候调高B的概率就没有意义了。这就会导致机器很难去训练。

 

改进方案:scheduled sampling

在初试方案和改进方案中,最大的区别在于训练过程中,下一个时间点的输入是取reference还是取上一个时间点的输出?

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

在本方案中,训练过程结合了上述两种方案,结合概率(抛硬币),分别考虑来自reference和来自model的结果。

右上角的图片,纵轴表示看reference的概率。

一开始参照reference,之后慢慢增加model

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

数据表明,scheduled sampling的效果是比只看reference和只看model的效果要更好的

 

3.beam search

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

先走的是橙色的路径,概率是0.6*0.6*0.6,

走的是绿色的路径。概率是0.4*0.9*0.9,

那么怎么找到最高分数的路径呢?这个方法就叫做beam search

 

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

每一步选几条最好的路径

上边图片中,是每步保留两条路径。走到叶子结点处,再将两条路径进行比较。

 

另一种想法:如果直接将上一个时间点的分布丢给下一个时间点,(比如右边的情况)

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

将分布直接传给下一个时间点并不好。

问题:你觉得如何? 机器应该回答:高兴想笑或者难过想哭

在左边的方案中,第一个时间点 A代表难过,B代表高兴,它们的概率可能是很接近的。

输出A或B都可以,这里选择输出B。将B输入给下一个时间点,“高兴”后面接着“想笑”的概率很大(比“想哭”大),这时候输出就是想笑。

在右边的方案中,由于传给第二个时间的的是概率分布,而且两个概率是近似的,这时候第二个时间的输出,想笑和想哭的概率也是近似的,这是时候就可能会产生“高兴想哭”或者“难过想笑”,这两种错误的回答。

 

4.object level和component level的对比

李宏毅机器学习20—Conditional generation by RNN & Attention (第六周)

Component level是从每个单词是否接近图片中的内容,来评价训练的结果好坏。但是这可能会导致训练出来的并不是一个句子,不符合语法。

从the dog is is fast 到the dog is running fast,这个loss差距是很小的。

这时候就应该从整个句子的语法入手,做loss函数去评判句子语法的好坏。目前还没有公认的比较好的loss函数去处理这种情况。假设整个loss函数是R,这个R是不可以用梯度下降的。

 

总结:

这节课主要讲的是不同情况下的生成语句,以及可能遇到的各种问题。

李宏毅老师主要是拿出具体的例子和paper来讲一些特殊情况。有些方法是没有学过的,听起来还是有点难的。

这一部分应该是属于nlp里的知识了。

上一篇:阿里一面:CyclicBarrier和CountDownLatch的区别?


下一篇:阿里一面:CyclicBarrier和CountDownLatch的区别?