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

    简介

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

    步骤

    Beam Search的一般步骤为:
    1、初始化beam_size个序列,序列均为空,这些序列称之为beam paths;
    2、取下一个Frame的前N个候选值(N一般为beam size或者更大,Frame内部侯选值已按照概率倒序排列),与已存在的beam paths组合形成N * beam_size条路径,称之为prob_paths;
    3、对prob_paths进行打分,取前beam_size个prob_path作为新的beam paths;
    4、若解码结束则完成算法,否则回到步骤2。

    总结

    经典的beam search算法以最大后验概率作为优化目标函数,每一个time step只保留B个最优的状态(B表示集束宽度),是一种典型的贪心算法。
    beam search可以看做是做了约束优化的广度优先搜索,首先使用广度优先策略建立搜索树,树的每层,按照启发代价对节点进行排序,然后仅留下预先确定的个数(Beam width,集束宽度)的节点,仅这些节点在下一层次继续扩展,其他节点被剪切掉。
    BS尝试在广度优先基础上进行进行搜索空间的优化(类似于剪枝)达到减少内存消耗的目的。
    其中,集束宽度B可以是预先定好的,也可以是变动的,可以先按照一个最小的集束宽度进行搜索,如果没有找到合适的解,再扩大集束宽度再找一遍。
    当集束宽度B=1时,该算法退化为传统的贪心算法。
    当集束宽度B无穷大,该算法就是广度优先搜索。

    应用

    这个算法常常被用于解码可选状态数量多的情形,比如生成对话、生成图片描述、机器翻译等,每一步都有词表大小的可选状态集。
    多适用于机器翻译,语音识别,当系统的数据集比较大,计算资源受限,而且没有唯一最优解时,该算法能够较快的找到接近最正确的解。
    在sequence2sequence模型中,beam search的方法只用在测试的情况,因为在训练过程中,每一个decoder的输出是有正确答案的,也就不需要beam search去加大输出的准确率。

  • 相关阅读:
    'try(A a = new A())' VS 'try finally'
    pom中更换阿里云仓库时不要忽略了pluginRepositories
    dubbo-spring-boot的auto-configure示例报Not found exported service的解决办法
    前后端分离部署时如何保护前端代码不被匿名访问
    拒绝一次性买卖:MyBatis的mapper和repository可重复生成工具
    关于el-dialog,我更推荐的用法
    SqlServer导入数据到MySql
    ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
    如何优化游标--使用只读游标
    多台路由器上网配置
  • 原文地址:https://www.cnblogs.com/ytxwzqin/p/12604868.html
Copyright © 2011-2022 走看看