1、Generation
生成句子或者文章。
在生成好的RNN模型里,我们输入开头,模型可以输出一系列的输出,如下图,我们根据输出得到了“床”,然后把“床”作为下一个时间点的输入,得到“前”,依次类推。这是测试时的一种做法,并不是唯一做法。在训练RNN模型的时候,并不是拿上一时刻的输出当作下一时刻的输入,而是拿句子真正的序列当作输入的。
2、condition generation
我们希望根据一些情景来生成我们的句子而不是随机生成一些句子,比如对话系统,需要根据问题来生成我们的答案,再比如翻译系统,我们要根据给出的句子得到对应的翻译。
比如下图:input一个image,通过CNN得到image的vector,把vector当做input丢给RNN,丢进去的input(image)不一样的话,它的output也会不一样,可能你的input影响不够大,网络在后面会遗忘之前看到的东西,我们需要在每次RNN output之前的时间点丢一个image(vector),RNN就会反复的复习看到的这张image。就不会让句子忘记自己要说什么了。
再比如下面的机器翻译:
首先,我们把问题或者需要被翻译的句子通过一个RNN或者LSTM进行Encoder,最后一个的输出就包含了这个句子的全部信息,然后把这个句子当作初始输入丢到另一个RNN或者LSTM中,然后通过这个得到对应的输出。encoder和decoder的LSTM或者RNN里的参数可以一样也可以不一样。
3、attention(dynamic(动态) conditional generation)
当使用attention的时候,它只会关注“机器”这一个词的vector,在decoder中能更好地学习到“机器”这一个词的特征,输出会更加准确。
下图中的match是一个function,可以自己设计,“机”,“器”,“学”,“习”通过RNN得到各自的vector,z0是一个parameter。α10,上标1表示z0和h1到底有多match,下标0表示时间是0这个时间点,α表示相匹配程度。
z1可以是c0丢到RNN以后,hidden layer的output,也可以是其他,z1再去算一次match的分数
time为1的时候:
得到的c1就是下一个decoder的input,此时只关注“学”,“习”。
得到的z2再去match得到c2。。。
4、memory network
application:reading comprehension
如下图所示:把一个document用N个句子来表示,每个句子对应一个vector(这里需要用到其它的neural network),question也用一个vector来表示,将每个句子与question进行match,得到对应的α。做∑相当于针对这一个question,跟它有关的句子的集合。接着把 question和相关的部分都丢到DNN里面,最后得到答案。
memory network复杂版本(下图所示):
算match的部分与information的部分不见得是一样的,同一个句子可以分别抽取不同的两组vector,一组是x,一组是h。用两组不同的vector会得到更好的performance。query对x这组vector算attention,但是它是用h表示每一个句子的information。然后将attention得到的α和information相乘,得到extracted information(vector)。这个vector可以放入DNN(deep neural network)得到answer,也可以Hopping,把这个vector和q加在一起得到一个新的q,再去match--->extracted information--->...可以跑好多个循环。
Hopping:
首先:一篇document用两组vector来表示它;接着一个query进来,和蓝色的vector计算attention,橙色的是从document中抽出来的information,将抽出来的information和q 进行∑;得到的结果再去计算attention。。。重复。
下图中的橙色和橙色的vector可以相同也可以不同,蓝色同理。
5、neural turing machine(神经图灵机)
neural turing machine不仅可以从memory中读出information,还可以修改memory。
你有一个memory(m...),是vector sequence,还会有一组初始的attention的weight(α...),根据vector和weight可以extracted information得到r0。r0和第一个时间点的input x1丢到f(f这个function可以自己设计,可以是DNN,LSTM,GRU...)
这个f就会output几个vector,这些vector就是去操控memory。k1就是去产生attention,k1和m计算得出α,再做softmax,就得到新的attention的distribution。新的attention和e1和a1就会去修改memory。e1的作用就是把原来memory里的值清空(e1范围是0-1),a1就是把新的值写到memory中去。经过上述步骤,得到下一个时间点的同一个位置的新的memory。
但其实k和m产生新的attention是很复杂的,有很多步骤。
6、tips for generation
(1)不要让attention过度关注于一个field,可以设置一个regularization term,使attention可以关注到其它的field。相当于加大其它component的权重 。
(2)
把condition和begin of sentence 丢进去,然后output一个distribution,颜色越深表示产生的几率越大,再把产生的作为下一个的input。。。这里有一个注意的是,在training的时候,放入下一个的input其实是reference,但在testing的时候,是没有reference的,并不知道output的是什么,可能输出的完全不同,这就是exposure bias。
在training的时候犯了一个错,可能会导致testing的时候totally wrong(一步错,步步错)。
改进方法:在training的时候,如果output的值与reference不一样,也要把output的值放到下一个时间点的input,这样training和test就会是match的。但是这样在实际操作中是train不起来的。比如下图:在training的时候,与reference不同,假设你的gradient告诉你要使A上升,B上升,如果让A的值上升,它的output就会改变,即第二个时间点的input就会不一样,那它之前学的让B上升就没有意义了,可能反而会得到奇怪的结果。
改进方法plus:schedule sampling
就是用综合的方法来training network,现在我们纠结的点就是,training的时候,下一个时间点的input到底是从reference来还是model的output来,这里就用到了一个schedule sampling,给它们一个几率,随机选择。这样比总是看reference的结果要好。
7、beam search(集束搜索)
beam search是一个介于greedy search(贪心搜索)和暴力搜索之间的方法。
贪心搜索:直接选择每个输出的最大概率;
暴力搜索:枚举当前所有出现的情况,从而得到需要的情况;
beam search:在搜索的时候,设置beam size=2,就是每一次保留分数最高的两条路径,走到最后的时候,哪一条分数最高,就输出哪一条。如下图所示:一开始,可以选择A和B两条路径,左边的第一个A点有两条路径,右边第一个B点有两条路径,此时一共有四条路径,选出分数最高的两条,再依次往下走 。。。
example:beam size=3,假设一个句子丢进去只有三个单词和一个表示句末的符号(共4个),输出分数最高的三个X,Y,W,再分别将三个丢进去,比如将X丢进去得到X,Y。。。将Y丢进去得到W,Y。。。将W丢进去得到。。。这样就得到三组不同的distribution(一共4*3条路径),选出分数最高的三条放入。。。
下图提出另一种idea:不用考虑input的东西到底从哪里来,直接把一整个output的东西放到input中,这样可能会有一个问题:比如下图右边所示:把高兴和难过都input进去,得到的可能就是“高兴想哭”,“难过想笑”,句子杂糅了。
8、object level vs component level
object level是根据整个句子的好坏进行评价,比如下面的句子:the dog is is fast,本来它的loss值应该是很小了,但是实际上它的效果并不好,用object level可以使它的loss值变大。假设下图中的R是衡量两个句子之间的差异,但是不可以做gradient descent,而cross entropy是可以gradient descent的。
如何改进:Reinforcement learning(强化学习)
在reinforcement learning中,一旦你take action了,就会改变你的observation。总而言之就是调整你的参数去maximize你的reward。
这里补充一篇讲的比较通俗易懂的Attention Model:https://blog.csdn.net/malefactor/article/details/50550211