十八、Conditional Generation by RNN & Attention
- Generation
- Attention
- Tips for Generation
- Pointer Network
(一)Generation
产生有structure的object,假设可以拆成很多component,使用RNN把这个component一个一个产生出来。
举例来说,怎么让machine产生句子,一个句子由word或者character组成,使用RNN把character或word一个一个产生出来。
一开始丢一个token到RNN,就会得到一个character的distribution,从这个character distribution做sample,接下来再把这个sample出来的character丢到RNN,RNN就会告诉你要接的character的distribution,再做sample,一直反复…
不仅仅是文章可以generate,image也可以,image是由pixel所构成,用RNN来generate pixel,把一张image看成sentence,下图可以看成由9个“词汇”组成的sentence:
同以上词汇的RNN的train的过程,image的generate的过程如下:
如果产生pixel的过程如下图,那就没有考虑pixel和pixel之间的几何关系:
考虑pixel和pixel之间的几何关系的过程如下图:
怎么实现这个几何关系?input3组数据,output3组数据,详情可看原视频:
光是使用RNN来generate是不够的,machine产生句子必须根据某些condition。
举例来说,我们怎么让machine看一个image就说一句话来说明这个image,即希望这个image可以影响RNN所产生的句子,做法:把image通过一个实现train好的CNN,然后把它变成一个vector,然后把这个vector当作RNN的input,这样RNN产生output时就会被image影响。如果担心,只是在第一个时间点把vector丢进去影响不够大,所以就在所有时间点都丢这个vector,RNN就可以反复复习。
同样的方法可以做很多其它的事情,比如机器翻译:现在有一个generator,它可以拿来产生英文的句子,但是现在的中文“机器学习”和这个generator是没有关系的,要把中文的input和这个generator牵扯在一起,做法:把中文的“机器学习”表示成一个vector,然后就可以和之前的图片处理一样。变成vector的方法:把中文的character一个一个丢到一个RNN里面,把RNN最后一个时间点的output抽出来,这个output可能就包含了这个句子的所有的information。
前面把input变成一个vector,然后丢给generator这个事情叫做Encoder(编码器);后面根据code产生句子的事情称为Decoder(译码器)。
Encoder和Decoder可以Jointly train(联合训练)这件事情称为Sequence-to-sequence learning。
(二)Attention
attention:动态的conditional generation。
刚才说过encoder的output在每一个时间点都接给decoder,但是可以做得更好,我们可以让这个decoder在每一个时间点看到的information都不一样,这样的好处是encoder可能没办法把input整个sentence变成一个code,如果input的information没办法用一个vector来表示,每次decoder看到的都是一样的,那就没办法得到好的结果。另一个好处是可以让decoder考虑需要的information。
拿机器翻译作为例子实现Attention:
1、
Attention-based model
input一个句子,这个句子会用RNN做一番处理,每个时间点每个词汇都可以用一个vector来表示,接下来有一个初始的vector
z
0
z_0
z0,把它当作network的参数,把
h
1
h^1
h1(如下图)和
z
0
z_0
z0丢进match函数得到
α
0
1
\alpha ^1_0
α01(上标1是指跟
h
1
h^1
h1算它们有多match,下标0是指在时间等于0,也就是初始的时候去计算match的程度):
match可以自己设计:
使用
z
0
z^0
z0对每一个
h
h
h算一个match的程度的分数,再做一个softmax,得到四个值,将这四个值分别乘上
h
1
h^1
h1到
h
4
h^4
h4得到
c
0
c^0
c0:
接下来将
c
0
c^0
c0当作decoder的input,通过RNN得到
z
1
z^1
z1,再用
z
1
z^1
z1再去算一次match的分数:
这个process一直下去直到machine generator句点的时候才停止:
也可以用在speech recognition上。
2、
Image Caption Generation:怎么加上attention-based model–用一组vector描述image,把每一个filter的output取出来得到一组vector,a vector for each region:
把6个vector做weighted sum,得到一个新的vector再把这个vector丢尽RNN的decoder产生第一个word:
其它步骤如上机器翻译的例子:
也可以从一段影片里面产生一段说明。
3、
memory network:
举例:有一个document,一个query和一个answer,document是由很多句子组成的,每个句子用一个vector来描述,query也可以用一个vector
q
q
q来描述,接下来用
q
q
q对document的每一个句子去算match分数,然后把得到的match分数与每个
x
x
x做weighted sum,然后把结果丢到DNN里,最后得到你的answer。
memory network的另一个版本,算match的部分和抽information的部分不一定需要一样。所以可以把document里面的句子变成两组不同的vector:
hopping:一个document用两组vector来表示,现在有一个query丢进来,对下面的vector做compute attention,对上面的vector做extract information,接下来把抽出来的information和query加起来;接下来document会再用两组vector表示,再去算一次compute attention和extract information,再加起来,丢到DNN中得到最后的答案。
4、
Neural Turing Machine:首先有一组memory,这些memory就是一个vector sequence,然后会有一组初始的attention的weight,根据这个memory vector和初始的weight可以train出一个information
r
0
r^0
r0,然后把
r
0
r^0
r0丢给另外一个network,再加上第一个时间点的input,你会output几个vector,这几个vector就是去操控这些memory,它们会决定新的attention长什么样子:
产生attention:以上得到的output
k
1
k^1
k1的作用就是产生attention,
k
k
k和原来的
m
m
m做预先计算得到四个match分数,再经过softmax,得到新的attention的distribution:
以上得到的output
e
1
e^1
e1
a
1
a^1
a1,
e
1
e^1
e1的作用是把原来memory里的值清空,
a
1
a^1
a1的作用是把新的值写到memory里面去。
把原来的memory里的vector通过以下转换以后得到新的memory vector:
接下来根据以上得到的memory vector得到
r
1
r^1
r1,再加上新的input
x
2
x^2
x2输入network中,就可以得到新的output,新的output会去操控 match distribution和memory…如果network
f
f
f是RNN,那么前一个时间点的
f
f
f不止会output那些操控memory的vector,还会output另外一个vector
h
1
h^1
h1,丢到下一个
f
f
f里去:
(三)Tips for Generation
举例:假设要做video的caption generation(字幕生成),给你的machine看一段如下图所示的video,如果用的是attention-based model,machine会在每个时间点会给这个video里面的每张image一个attention,
α
t
i
\alpha _t^i
αti代表attention,上标代表component,下标代表时间点,一开始会在第一个时间点对以下四个画面产生一个attention,然后产生word 1,然后同一个时间点反复进行下去,第二个时间点在产生attention,在产生word 2 ,…
不好的attention:
一个好的attention应该要每个input component的attention weight大致相同。比如,Regularization term:
1、mismatch between Train and Test
Training:
Generation:
training和testing的不同:testing是你的input是model前一个时间点自己的output;training时你每个时间点的input是真正的答案。–这件事情叫做Exposure Bias。
Exposure Bias会产生什么样的影响?
修改training的process:
使用Scheduled Sampling(定时采样)的方法:到底下一个时间点的input应该是从model的output来,还是reference来?这个方法是说给一个几率,决定哪个是input,所以有时候是model的output,有时候是reference的。
2、Beam Search(波束搜索)
在每一个时间点,都只keep分数最高的某几条path:
对比以下不能check所有可能paths的情况(greedy search),Beam Search能保证找出分数最高的路径:
Beam Search的实例:
3、Object level v.s. Component level
现在要generate是一个sentence而不是单一的word,考量generate的结果好不好的时候应该看一整个句子。
举例:
会发现文法不对的句子和文法正确的句子的差距很小,只能拼死硬train,那是因为在training的时候minimize的对象是一个word cross-entropy。
根据整个句子来评分:
但是R可以做gradient descent吗?不可以。
解决:用Reinforcement learning(强化学习)的方法来train generator。
本文是对blibli上李宏毅机器学习2020的总结,如有侵权会立马删除。