zoukankan      html  css  js  c++  java
  • Beam Search(集束搜索/束搜索)

     

    首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_search

    1.简介

    Beam Search(集束搜索)是一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。这样减少了空间消耗,并提高了时间效率,但缺点就是有可能存在潜在的最佳方案被丢弃,因此Beam Search算法是不完全的,一般用于解空间较大的系统中。

    2.流程

    Beam Search(集束搜索)使用广度优先策略建立搜索树,在树的每一层,按照启发代价对节点进行排序,然后仅留下预先确定的个数(Beam Width-集束宽度)的节点,仅这些节点在下一层次继续扩展,其他节点就被剪掉了。如果集束宽度无穷大,那该搜索就是宽度优先搜索。

    • 将初始节点插入到list中,
    • 将给节点出堆,如果该节点是目标节点,则算法结束;
    • 否则扩展该节点,取集束宽度的节点入堆。然后到第二步继续循环。
    • 算法结束的条件是找到最优解或者堆为空。

    集束宽度可以是预先定好的,也可以是变动的,可以先按照一个最小的集束宽度进行搜索,如果没有找到合适的解,再扩大集束宽度再找一遍。

    Ps. 个人认为集束搜索方法其实提供了一种找最优解的思路,就是说在适当的情况下,可以剪掉一些可信度低的路径,在实际使用中,可以每一层的集束宽度不一致,比如在初始的一些层次中多保留一些结果,在后边就可以放心大胆的进行剪枝。当然也可以活学活用,可以结合深度优先算法,通过回溯,可以找到最优解。

    3.应用

    Beam Search(集束搜索)多用在一些大型系统中,比如机器翻译系统,语音识别系统等,因为这些系统中的数据集可能非常大,而且结果也没有唯一正确的解,系统用最快的方式找到最接近正确的解才是系统的目标。


    解码是seq2seq模型的常见问题,常用方法有贪心搜索(Greedy Search)集束搜索(Beam Search)。

    简单贪心搜索

    From [1]
    如图,Decoder根据Encoder的中间语义编码向量cc和<s>标签得到第一个输出的概率分布[0.1,0.1,0.3,0.4,0.1][0.1,0.1,0.3,0.4,0.1],选择概率最大的0.4,即moi。

    根据隐向量h1h1和moi得到第二个输出的概率分布[0.1,0.1,0.1,0.1,0.6][0.1,0.1,0.1,0.1,0.6],选择概率最大的0.6,即suis。

    以此类推,直到遇到<s>标签,得到最终的序列moi suis étudiant。

    集束搜索
    上面的贪心搜索只选择了概率最大的一个,而集束搜索则选择了概率最大的前k个。这个k值也叫做集束宽度(Beam Width)。

    还是以上面的例子作为说明,k值等于2,则集束搜索的过程如下图:

     

    得到第一个输出的概率分布[0.1,0.1,0.3,0.4,0.1][0.1,0.1,0.3,0.4,0.1],选择概率最大的前两个,0.3和0.4,即Je和moi。

    然后Je和moi分别作为Decoder的输入,得到两个概率分布,然后再选择概率和最大的前两个序列,0.3+0.8和0.4+0.6,即Je suis和moi suis。

    以此类推,最终可以得到两个序列,即Je suis étudiant和moi suis étudiant,很明显前者的概率和最大,为2.2,所以这个序列是最终得到的结果。

    集束搜索本质上也是贪心的思想,只不过它考虑了更多的候选搜索空间,因此可以得到更多的翻译结果。

    References
    [1] https://www.tensorflow.org/tutorials/seq2seq
    ---------------------
    作者:加勒比海鲜
    来源:CSDN
    原文:https://blog.csdn.net/guolindonggld/article/details/79938567
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    一卡通应用系统解决方案
    2013524 项目一
    射频RFID系统
    SIM操作系统
    python中eval, exec, execfile,和compile [转载]
    FastJSON学习
    坑爹的UICollectionView
    8位单片机编程的一些坑
    Android DownloadThread.run()学习
    蓝牙接收苹果手机通知 ANCS协议分析
  • 原文地址:https://www.cnblogs.com/sddai/p/10552592.html
Copyright © 2011-2022 走看看