集束搜索(Beam Search)

来源:Coursera吴恩达深度学习课程

我们来看看集束搜索(beam search)算法,上篇文章选择最可能的句子讲了对于机器翻译来说,给定输入(法语句子),我们并不想要一个随机的英语翻译结果,而是想要一个最好的,最可能的英语翻译结果。对于语音识别也一样,给定一个输入的语音片段,我们不会想要一个随机的文本翻译结果,而是想要最接近原意的翻译结果,集束搜索就是解决这个最常用的算法。让我们用法语句子的例子来试一下集束搜索吧。

“Jane visite l'Afrique en Septembre.”(法语句子),把它翻译成英语,"Jane is visiting Africa in September."(英语句子),(1)集束搜索算法首先做的就是挑选要输出的英语翻译中的第一个(first)单词。这里Andrew使用10,000个词的词汇表,为了简化问题,这里忽略大小写,所有的单词都以小写列出来。在集束搜索的第一步中用的这个网络部分,绿色是编码部分(encoder),紫色是解码部分(decoder),来评估第一个单词的概率值,给定输入序列x,即法语作为输入,第一个输出y的概率值是多少。

贪婪算法只会挑出最可能的那一个单词,然后继续。而集束搜索则会考虑多个选择,集束搜索算法会有一个参数B,叫做集束宽(beam width)。在这个例子中B=3,这样就意味着集束搜索不会只考虑一个可能结果,而是一次会考虑3个,比如对第一个单词有不同选择的可能性,最后找到in、jane、september,是英语输出的第一个单词的最可能的三个选项,然后集束搜索算法会把结果存到计算机内存里以便后面尝试用这三个词。如果集束宽设的不一样,如果集束宽这个参数是10的话,那么我们跟踪的不仅仅3个,而是10个第一个单词的最可能的选择。所以要明白,为了执行集束搜索的第一步,你需要输入法语句子到编码网络,然后会解码这个网络,这个softmax层(紫色网络的蓝框)会输出10,000个概率值,得到这10,000个输出的概率值,取前三个存起来。

如上图,(2)让我们看看集束搜索算法的第二步,已经选出了第一个单词三个最可能的选择为in、jane、september,集束算法接下来会针对每个第一个单词考虑第二个单词分别是什么,如上图蓝色标记,单词in后面的第二个单词可能是a或者aaron,从词汇表里把这些词列了出来,也可能是september、 visit和z,最后一个单词是zulu。

为了评估第二个词的概率值,我们用这个神经网络,其中绿色是编码部分,紫色是解码部分,当决定单词in后面是什么,别忘了解码器的第一个输出y^<1>是单词in,然后把它喂回来,下一个节点的输入就是单词in,输出是y^<2>,有了这个连接,这个网络就可以用来评估在翻译结果的第一个单词in的情况下第二个单词的概率。

注意,在第二步里我们更关心的是要找到最可能的第一个和第二个单词对,即第一个和第二个单词对有最大的概率(P(y^<1>,y^<2>|x))。按照条件概率的准则,这个可以表示成第一个单词的概率乘以第二个单词的概率,第二部分可以从紫色网络部分里得到(上图紫色所示),对于已经选择的in、jane、september这三个单词,你可以先保存P(y^<1>|x)这个概率值,然后再乘以第二个概率值就得到了第一个和第二个单词对的概率(P(y^<1>,y^<2>|x))。

现在我们已经知道在第一个单词是in的情况下如何评估第二个单词的概率,当第一个单词是jane时,如上图第二行所示,同理,句子可能是"jane a"、"jane aaron",...,"jane is"、"jane visits"等等。用这个新的网络部分,y^<1>连接jane(紫色曲线),得到给定输入x和第一个词是jane下,第二个单词的概率,同理,可以乘以P(y^<1>|x)得到P(y^<1>,y^<2>|x)

如上图第三行所示,最后对于单词september也一样,从单词a到单词zulu,计算出相应的概率。总的来说,对于集束搜索的第二步,因为这里集束宽为3,词汇表里有10,000个单词,那么最终我们会有3*10,000=30,000个可能的结果,就是集束宽乘以词汇表大小,我们要做的就是评估这30,000个选择,选出概率大的前三个。假如这30,000个选择里最可能的是“in September”、“jane is”和“jane visits”(上图红色标记),集束搜索算法会保存这些结果,然后用于下一次集束搜索。

在我们进入集束搜索的第三步之前,注意一下集束宽B=3,每一步我们都复制3个,同样用这种网络来评估部分句子和最后的结果,由于集束宽等于3,我们有三个网络副本(上图橘色标记),每个网络的第一个单词不同,而这三个网络可以高效地评估第二个单词所有的30,000个选择。所以不需要初始化30,000个网络副本,只需要这3个网络的副本就可以快速评估softmax的输出,即y^<2>的10,000个结果。

(3)让我们快速解释一下集束搜索的下一步,给定输入x(法语句子),y^<1>和y^<2>的概率值和前面一样,现在我们考虑第三个单词是什么,可以是“in September a”,“in September aaron”,...,“in September zulu”。为了评估第三个单词可能的选择,我们用这个网络部分(上图第一行),第一单词是in,第二个单词是september,所以这个网络部分可以用来评估在给定输入的法语句子x和给定的英语输出的前两个单词“in September”情况下,第三个单词的概率。对于“jane is”和“jane visits”也一样,然后集束搜索还是会挑选出针对前三个词的三个最可能的选择,可能是“in september jane”、“Jane is visiting”或者“Jane visits Africa”(红色标记)。

(4)然后继续进行集束搜索的第四步,过程同上,最终这个过程的输出一次增加一个单词,集束搜索最终会找到“Jane visits africa in september”这个句子,终止在句尾符号(EOS),算法会发现这是最有可能输出的一个英语句子。注意如果集束宽等于1,意味着只考虑1种可能结果,这实际上就变成了贪婪搜索算法。如果同时考虑多个,可能的结果比如3个,10个或者其他的个数,集束搜索通常会找到比贪婪搜索更好的输出结果。

以上就是集束搜索的内容。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
集束搜索是一种启发式搜索算法,用于在大规模搜索空间中快速找到最优解。它通过保留一定数量的最有希望的候选解,来减少搜索空间。下面是一个用Python实现集束搜索的示例代码: ```python import heapq class BeamSearch: def __init__(self, beam_width): self.beam_width = beam_width self.heap = [] def search(self, start_state, goal_fn, successor_fn, heuristic_fn): # Add the start state to the heap with a priority of 0 heapq.heappush(self.heap, (0, [start_state])) while self.heap: # Pop the state with the lowest priority from the heap priority, path = heapq.heappop(self.heap) current_state = path[-1] # Check if the current state is the goal state if goal_fn(current_state): return path # Generate successor states and add them to the heap successor_states = successor_fn(current_state) for successor_state in successor_states: successor_path = path + [successor_state] successor_priority = priority + heuristic_fn(successor_state) heapq.heappush(self.heap, (successor_priority, successor_path)) # Keep only the top beam_width paths in the heap self.heap = heapq.nsmallest(self.beam_width, self.heap) # If the heap is empty, no solution was found return None ``` 这个实现使用了一个最小堆来存储候选解,每次从堆中取出当前最优路径进行扩展。在每次扩展时,生成后继状态,并计算他们的启发式值,然后将它们加入堆中。最后,保留堆中最优的 beam_width 条路径,并继续迭代,直到找到目标状态或者堆为空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值