Condition Generation by RNN&Attention
文章目录
摘要
本章主要讲述了用RNN实现Generation的方法和原理,首先用Generation句子为例,介绍了Generation的基本原理(输入vector经过RNN处理输出句子),再将此方法类比到Generation图片上(将图片上的每个像素点看成一个word),但是图片还受各个像素点之间几何位置的影响,于是又用3D-LSTM完善了Generation图片功能。在实际应用中,我们还需要根据外部条件来Generation,最基本的做法是在Decoder中每个时间点都接入相同的外部条件的vector,这种做法当外部条件很复杂且包含很多无用信息时,是很没效率的,于是提出了Dynamic Conditional Generation,筛选出对应时间点最有效的信息接入,很大的提高了效率和准确率。然后介绍了Memory Network(常用于machine根据文章回答问题)的基本原理,介绍了简单的Memory Network(一次搜索),和复杂的Memory Network(多次搜索)。一、Generation
1.1 Generation 句子
1.1.1 目标
一开始就向machine输入一个token,这个token代表的是BOS(begin of sentence),然后machine根据BOS输出一句话或者一首诗。
1.1.2 做法
如下图,首先将BOS输入(BOS是经过机器训练得到的一个vector),在第一个RNN的输出中得到一个character distribution,根据它我们sample出’床’字,将该输出作为下一个RNN的输入,以此类推,最后得到一篇诗。
1.2 Generation 图片
1.1.1做法
同样的道理,我们可以用上述方法生成图片,如下图,我们可以将该图片看作9个word的句子,该图片由blue、red、yellow、gray等这些words组成。
如下图,接下来我们就可用Generation 句子的方法来Generation图片了。
显然,这个方法在Generation图片时,只考虑的各个像素点的顺序关系(如下图),没考虑到各个像素点位置不同也会到影响生成的图片。
所以更好的办法是需要能考虑到各个像素点的几何关系的,如下图。
我们可以用3D-LSTM来实现该目的(如下图),在Generation时,根据周围的像素点得到要输出的像素点,这里采用的是2X2的filter,输出更复杂的图片时,我们可以采用更大的的filter。
二、Conditional Generation
在实际使用中,随机的生产句子和图片是没有意义的,我们希望可以让机器根据特定条件Generation相对应的句子或者图片,如插图说明(输入图片,输出图片说明)、智能对话等。
2.1 Image Caption Generation
2.1.1 做法
将image丢入已经train好的CNN,得到vector,再将该vector丢入上面用来Generation的RNN,为了让machine对image印象深刻,在每一个RNN都输入该image vector(如下图)。
2.1.2 扩展(机器翻译)
同样的方法我们也可以用来做Machine translation、Chat-bot,例如将中文的 “机器学习” 翻译为英文的 “machine learning”。首先我们可以将 "机器学习"这四个字用vector表示,然后用4个RNN将其转换为一个包含了所以信息的vector(下图红色方块)。
再如下图,进行2.1.1的做法。
前者就是Encoder(编码器),后者就是Decoder(解码器)。
2.1.3 扩展(智能对话)
同样的方法也可以实现Chat-bot,对话时machine是需要考虑history的,所以需要用到多层Encoder,例如可以用双层Encoder将前两句对话内容考虑进来最后得到vector,然后再用把vector丢给Decoder。如果想考虑更多history时,可以再使用更多层的Encoder,这样结果更准确。
三、Attention:Dynamic Conditional Generation
在前面我们将Encoder接入Decoder时所有的Encoder都是保持不变的,这样当输入比较复杂且包含很多无用信息时是比较没效率的,所以我们可以用Dynamic Conditional Generation让其可以直接找出Encoder之中有效信息。
3.1 做法(机器翻译)
如下图,首先将 ”机器学习“ 每个字的vector作为输入,接下来有一个初始的vector Z0,根据Z0、h1得到a01(1代表输入值是h1,0代表时间点0)。
根据上述方法得到a02、a03、a04再经过softmax处理,最后得到0时间点输入值c0。
将c0放入Decoder第一个接入点。
依次类推,最后得到c1、c2、c3,分别放入Decoder对应接入点,实现将有效信息放入对应Decoder,提高效率与准确率。
3.2 做法(Image Caption Generation)
对于image caption,我们做Dynamic Conditional Generation时只需要对image进行特别的处理就可以用和上面一模一样的方法,即找一组filter对图片进行卷积,得到一组vector,再进行上述操作。
四、Memory Network
Memory network最早被应用在reading comprehension,也就是给machine看一个document,然后问它问题,让machine回答。
4.1 做法
如下图,输入问题Query,将其转换为vector(q),再用q分别与x1,x2…xN(文章中每个句子的vector)计算匹配度得到a1,a2…aN,再通过如下公式得到最后的vector,最后将Query和得到的vector一起丢入DNN,得到答案。
4.2 Memory Network’s complex version
将Document中的句子分为两组不同的vector(hi和xi),xi用来和q做match得到ai,然后再用ai和hi相乘求和得到vector,再将该vector和q相加重新训练,经过多次训练后再输出到DNN中得到答案。该model的优点是可以让machine多次在文章中搜索答案,且每次搜索答案时,都带着前面搜素过的记忆。
方法
- 智能对话时,用的是多层编码器来处理历史对话记录,将该信息用一个vector表示,再放入Decoder得到machine的回答。
- 机器翻译时,用的是Dynamic Conditional Generation方法处理输入数据,得到每一时刻的vector,将其分别放入对应时刻的Decoder,得到翻译结果。
- 在Image Caption Generation时,用的是一组filter处理image,得到一组vector0,再用Dynamic Conditional Generation处理该组vector0得到vector1,将其分别放入对应时刻的Decoder,得到结果。
结论
- Generation图片时用3D-LSTM可以考虑到各个像素点的几何位置,结果更准确。
- 在做机器翻译、Image Caption Generation等时当外部条件输入很复杂如翻译大段文字时,Dynamic Conditional Generation可以有效的提高效率。
- machine根据文章回答问题时用复杂的Memory Network可以实现让machine多次反复阅读文章找答案的功能,比简单的Memory Network一次阅读直接输出答案准确率更高。
展望
- 在1.2中Generation图片时,本文例子是采用最简单的2*2的filter,其实我们可以根据需求,选择合适的filter,更大的filter将考虑更多的像素点,计算时间会需要更久但准确率更高。
- 在2.1.3中智能对话时,可以使用更多层的Encoder,让machine考虑更多的历史对话记录,从而得到更准确的答案。