谁能解释下seq2seq中的beam search算法过程?

seq2seq中的beam search是每一步确定前k个概率最大的单词加入列表中么?beam search 是用在 test的decode的过程中么,还是train 和test都会用到,不解,求大神告知。


谢邀。beam search只在test的时候需要。训练的时候知道正确答案,并不需要再进行这个搜索。

test的时候,假设词表大小为3,内容为a,b,c。beam size是2

decoder解码的时候:

1: 生成第1个词的时候,选择概率最大的2个词,假设为a,c,那么当前序列就是a,c

2:生成第2个词的时候,我们将当前序列a和c,分别与词表中的所有词进行组合,得到新的6个序列aa ab ac ca cb cc,然后从其中选择2个得分最高的,作为当前序列,假如为aa cb

3:后面会不断重复这个过程,直到遇到结束符为止。最终输出2个得分最高的序列。


这是我新写的一篇博客,seq2seq源码解析,是基于theano的框架。欢迎大家有空去阅读,然后一块沟通,一块交流。

seq2seq源码解析 : http://blog.csdn.net/yezhenxu1992/article/details/72156233

seq2seq源码中具体的Beam Search 算法操作是在gen_sample()函数完成的,Decoder的时候从一个词到下一个词的产生方式,是由stochastic变量控制,当stochastic=False时,才是真正地执行Beam Search操作,其中,k的值为Beam Size的大小(eg, k=5);当stochastic=True时,采用的是随机采样选中下一个词。

至于提问者会有这样的困惑:" beam search 是用在 test的decode的过程中么,还是train 和test都会用到 ?" 因为在Train和Test的时候都调用了gen_sample()函数,源代码中Train的时候根本没有用到Beam Search(因为stochastic默认为True,即是用随机采样的方式选择Decoder的下一个单词,当然你也可以手动设置stochastic=False 和k的值,选用beam search),之所以Train的时候要调用gen_sample()函数,目的是为了让你看一下从Train集挑5个case,Decoder后的效果如何(主要是为了看看训的效果大体如何),这一步其实是多余的,因为从valid集看cost,才是最终确定best model参数的关键,因为valid集在train的时候是不可见的,valid集的cost低,才能保证test的效果好。

beam search (取k=5)具体过程分为如下几步:

1,初始的时候,next_w=[-1],调用f_next(具体操作定义在build_sample()函数),返回 |V|个词的概率(为了简单测试,我取|v|=1000),取Top5概率值最低的索引(因为对概率值做了log运算,越接近1,值越小),argsort()返回的是索引,不是具体的概率值。

2、有一点值得注意的是,并不是每次都取Top k个, 由这句代码可知ranks_flat = cand_flat.argsort()[:(k-dead_k)] ,每次是取Top (k-dead_k),假设第一次我取到Top 5( k=5,dead_k=0) ,例如 4 9 0 8 6 ,那么下一次next_w更新为[4 9 8 6],dead_k更新为1,遇到0(EOS)就添加到变量 sample (类型:list),反之添加到变量new_hyp_sample中(代表每次新添加到列表的元素)。

3、最终迭代结束,sample里面的元素就是我们要的候选句子。

score = score / numpy.array([len(s) for s in sample]) ss = sample[score.argmin()]

选择平均概率最低的句子,就是我们最终Decoder要的结果。即,ss就是最终产生的句子。

4、下图展示了迭代的过程。

希望对你能有一点点帮助


这里采用台湾大学深度学习课程老师的解释,课程链接:106 Fall - ADL x MLDS, NTU。Lecture 5 Gated RNN and Sequence Generation 大概在1小时40分后面一点。

首先需要确定一个`Beam Size`,这里设置为2,意思是每个`word`后面的分支考虑概率最大的那两个`words`。比如下面的例子,从下往上首先分成A、B两个words,然后继续往上传播,句子变成是AA/AB/BA/BB这四种情况(绿色虚线)。考虑到`Beam Size=2`,选择概率最大的两个,假设是AB/BA(橙色大箭头)。然后以选择的AB/BA继续向上传播,又出现了四种情况ABA/ABB/BAA/BBB,依然是选择综合概率最大的两个ABB/BBB。以此类推,直至句子结束。只要可以调整好`Beam Size`,就能够使用最小的计算量,得到最优的结果。


以前我也不太懂这个问题,这个问题下的答主我都私信了个遍,有些回复我了,有些没有,但都没有让当时的我明白,其实还是怪自己太懒惰,总想让别人给自己讲懂,后来自己晚上睡觉之前独立思考了会儿,很快就明白了,其实无非就是一个decode的扩展过程,生成的序列有很多条,找前K条概率最大或者给定一个概率找到之上的即可。类似hmm解码过程,都是DP算法解决

所以从问题本质出发,独立思考是非常重要的。


beam search只是一个搜索策略,对于语言生成的模型中,你给定语言模型,它可以搜索出更差异化、更合理的结果。beam search功能上等价于最简单的单步最大概率,或者viterbi算法等等。所以没有什么时候用的问题,只是一种搜索策略而已。


推薦閱讀:

機器學習中SVD和PCA一直沒有搞的特別清楚,應該如何理解呢?
遊戲行業,大數據該如何應用?
如果有第谷的數據,現在的機器學習,深度學習有辦法學出開普勒三定律嗎?
怎樣才能在NIPS 上面發論文?
如何看待攜程舉辦的大數據比賽?

TAG:数据挖掘 | 自然语言处理 | 深度学习DeepLearning |