Generation
可以generation文字,也可以generation图片
如果想生成一张图片,我们可以把图片的每个pixel看成一个character,从而组成一个sentence,比如下图中蓝色pixel就表示blue,红色的pixel表示red,…
接下来就可以用language model来生成图片,最初时间步的输入是特殊字符BOS
对于一般的generation,如下图的右上部分所示,先根据蓝色pixel生成红色pixel,再根据红色pixel生成黄色pixel,再根据黄色pixel生成灰色pixel,…,并没有考虑pixel之间的位置关系
还有另外一个比较理想的生成图像方法,如果考虑了pixel之间的位置关系,如下图的右下部分所示,黑色pixel由附近的红色和灰色pixel生成
在上图的左上角部分,该lstm块输入了三组参数,也输出了三组参数,把这些方块叠起来就可以达到中部位置图像的效果
Conditional Generation
如果要对一张图片进行解释,我们先使用一个CNN model将image转化为一个vector(红色方框),先生成了第一个单词"A",在生成第二个单词时,还需要将整个image的vector作为输入,不然RNN可能会忘记image的一些信息
RNN也可以用来做机器翻译,比如我们想要翻译“机器学习”,就先把这四个字分别输入绿色的RNN里面,最后一个时间节点的输出(红色方框)就包含了整个sentence的information,这个过程称之为Encoder
把encoder的information再作为另外一个rnn的input,再进行output,这个过程称之为Decoder
encoder和decoder是jointly train(联合训练)的,这两者的参数可以是一样的,也可以是不一样的
encoder将之前所有说过的话都进行整合了,再作为decoder的input
Attention
Dynamic Conditional Generation
如果需要翻译的文字非常复杂,无法用一个vector来表示,就算可以表示也没办法表示全部的关键信息,这时候如果decoder每次input的都还是同一个vector,就不会得到很好的结果
因此我们现在先把“机器”作为decoder的第一个输入,这样就可以得到更好的结果
Machine Translation
绿色方块为RNN中hidden layer的output;还有一个vector,是可以通过network学出来的;把这两者输入一个match函数,可以得到match分数
这个match函数可以自己设计,可以有参数,也可以没有参数
得出的结果再输入softmax函数进入下一步运算
再来计算match分数
再继续算出input,从而得出第二个单词“learning”
一直重复这个过程,只到全部翻译完成
Speech Recognition
语音信号也可以看成一系列的vector sequence,第一个红色方框所在的帧match分数很高,就把对应的vector放到decoder,machine就会得出“h”
Image Caption Generation(图片字幕生成)
image可以分成多个region,每个region可以用一个vector来表示,计算这些vector和
z
0
z^0
z0之间match的分数,为0.7、0.1…,再进行weighted sum,得到红色方框的结果,再输入RNN,得到Word1,此时hidden layer的输出为
z
1
z^1
z1
再计算
z
1
z^1
z1和vector之间的match分数,把分数作为RNN的input,从而得出Word 2
这里是一些具体的例子
Memory Network
问machine一个问题,machine能够给出对应的答案
还有一个更加复杂的版本
Neural Turing Machine(神经图灵机)
Neural Turing Machine不仅可以读取memory的内容,也可以根据match分数来修改memory的内容;即你不仅可以通过memory读取information,也可以把information写到memory里面去
Tips for Generation
Attention
attention是可以调节的,有时会出现一些bad attention,在产生第二个word(women)时,focus到第二个component,在产生第四个word时,也focus到第二个component上,也是women,多次attent在同一个frame上,就会产生一些很奇怪的结果
Good Attention:至少要包含input的每一个frame,每个frame都应该attent一下,每个frame进行attent的量也不能太多,这个量最好是同等级的
Mismatch between Train and Test
Exposure Bias(曝光偏差):在training的时候,input为真正的答案;但在testing的时候,input为上一个时间节点的output
在下图中,由于RNN从来没有到右子树B训练过,但如果在testing时一开始就遇到了B,network就会出现错误
Modifying Training Process?
那么我们如何解决这种mismatch问题呢?可以尝试modify训练process
如果machine现在output B,即使是错误的output(和reference A不一样),我们也应该让这个错误的output作为下一次的input,那么training和testing就是match的
但在实际操作中,training是非常麻烦的;现在我们使用gradient descent来进行training,第一个gradient的方向告诉我们要把A的几率增大,output B,在第二个时间点,input为B,看到reference为B,把B的几率增大,就可以和reference相对应起来;
但实际上,第一个output为A的几率上升,那么output发生了变化,第二个时间点的input就发生了变化,是A;那么我们之前学习到的让B上升就没有意义了
Scheduled Sampling
由于使用Modifying Training Process很难train,现在我们就使用Scheduled Sampling
对于到底是model里的ouput,还是reference来作为input,我们可以给一个几率;铜板是正面,就使用model的output,如果是反面,就用reference
右上角的图,纵轴表示from reference的几率,一开始只看reference,reference的几率不断变小,model的几率不断增加
Beam Search(光束搜索)
同时走两条path
Better idea?
为什么不直接把distribution作为下一个input呢?即下图中的右图
但右边的结果会比较差,对于几率接近的输入,左图会sample一个几率最高的(高兴),但右图会保留这个distribution
Object level v.s. Component level
Reinforcement learning?
本文图片来自李宏毅老师课程PPT,文字是对李宏毅老师上课内容的笔记或者原话复述,在此感谢李宏毅老师的教导。