大家好,我是小飞,今天讲解下机器学习中常用到的一种搜索算法beam search(束搜索)。为了方便大家理解,这里先假设一个非常简单的搜索任务。

假设一个搜索任务

假设现在有一个简化版的中文翻译英文任务,输入和输出如下,为了方便描述搜索算法,限制输出词典只有{"I", "H", "U"} 这3个候选词,限制1个时间步长翻译1个汉字,1个汉字对应1个英文单词,这里总共3个汉字,所以只有3个时间步长。

中文输入:"我" "恨" "你"
英文输出:"I" "H" "U"

目标:得到最优的翻译序列 I-H-U

exhaustive search(穷举搜索)

最直观的方法就是穷举所有可能的输出序列,3个时间步长,每个步长3种选择,共计  种排列组合。

I-I-I
I-I-H
I-I-U
I-H-I
I-H-H
I-H-U
I-U-I
I-U-H
I-U-UH-I-I
H-I-H
H-I-U
H-H-I
H-H-H
H-H-U
H-U-I
H-U-H
H-U-UU-I-I
U-I-H
U-I-U
U-H-I
U-H-H
U-H-U
U-U-I
U-U-H
U-U-U

从所有的排列组合中找到输出条件概率最大的序列。穷举搜索能保证全局最优,但计算复杂度太高,当输出词典稍微大一点根本无法使用。

greedy search(贪心搜索)

贪心算法在翻译每个字的时候,直接选择条件概率最大的候选值作为当前最优。如下图所以,

  • 第1个时间步长:首先翻译"我",发现候选"I"的条件概率最大为0.6,所以第一个步长直接翻译成了"I"。
  • 第2个时间步长:翻译"我恨",发现II概率0.2,IH概率0.7,IU概率0.1,所以选择IH作为当前步长最优翻译结果。
  • 第3个时间步长:翻译"我恨你",发现IHI概率0.05,IHH概率0.05,IHU概率0.9,所以选择IHU作为最终的翻译结果。

PS:图中的概率如何得来的?不同的模型有不同的算法,我自己随便填的。

greedy search

贪心算法每一步选择中都采取在当前状态下最好或最优的选择,通过这种局部最优策略期望产生全局最优解。但是期望是好的,能不能实现是另外一回事了。贪心算法本质上没有从整体最优上加以考虑,并不能保证最终的结果一定是全局最优的。但是相对穷举搜索,搜索效率大大提升。

beam search(束搜索)

beam search是对greedy search的一个改进算法。相对greedy search扩大了搜索空间,但远远不及穷举搜索指数级的搜索空间,是二者的一个折中方案。

beam search有一个超参数beam size(束宽),设为k。第一个时间步长,选取当前条件概率最大的k个词,当做候选输出序列的第一个词。之后的每个时间步长,基于上个步长的输出序列,挑选出所有组合中条件概率最大的k个,作为该时间步长下的候选输出序列。始终保持k个候选。最后从k个候选中挑出最优的。

还是以上面的任务为例,假设k=2,我们走一遍这个搜索流程。

  • 第一个时间步长:如下图所示,I和H的概率是top2,所以第一个时间步长的输出的候选是I和H,将I和H加入到候选输出序列中。

beam search 第一个时间步长

  • 第2个时间步长:如下图所示,以I开头有三种候选{II, IH, IU},以H开头有三种候选{HI, HH, HU}。从这6个候选中挑出条件概率最大的2个,即IH和HI,作为候选输出序列。

beam search 第二个时间步长

  • 第3个时间步长:同理,以IH开头有三种候选{IHI, IHH, IHU},以HI开头有三种候选{HII, HIH, HIU}。从这6个候选中挑出条件概率最大的2个,即IHH和HIU,作为候选输出序列。因为3个步长就结束了,直接从IHH和IHU中挑选出最优值IHU作为最终的输出序列。

beam search 第三个时间步长

  • beam search不保证全局最优,但是比greedy search搜索空间更大,一般结果比greedy search要好。
  • greedy search 可以看做是 beam size = 1时的 beam search。

如何通俗的理解beam search?相关推荐

  1. Teacher Forcing机制及Beam search详解

    RNN在训练过程中的问题 训练迭代过程早期的RNN预测能力非常弱,几乎不能给出好的生成结果.如果某一个unit产生了垃圾结果,必然会影响后面一片unit的学习.teacher forcing最初的mo ...

  2. Beam search 算法的通俗理解

    Beam search 算法在文本生成中用得比较多,用于选择较优的结果(可能并不是最优的).接下来将以seq2seq机器翻译为例来说明这个Beam search的算法思想. 在机器翻译中,beam s ...

  3. Beam Search源码理解

    本文的beam search源码来自:CodeBERT/model.py at master · microsoft/CodeBERT (github.com)https://github.com/m ...

  4. Beam Search与Prefix Beam Search的理解与python实现

    引言 Beam search是一种动态规划算法,能够极大的减少搜索空间,增加搜索效率,并且其误差在可接受范围内,常被用于Sequence to Sequence模型,CTC解码等应用中 时间复杂度 对 ...

  5. Beam Search还能更快?结合优先队列的最佳优先化Beam Search

    论文标题:Best-First Beam Search 论文作者:Clara Meister, Tim Vieira, Ryan Cotterell 论文链接:https://arxiv.org/pd ...

  6. beam search算法

    转载 https://blog.csdn.net/xyz1584172808/article/details/89220906 https://blog.csdn.net/batuwuhanpei/a ...

  7. 集束搜索(Beam Search Algorithm )

    看计算机科学中最重要的32个算法,其中有个是集束搜索(又名定向搜索,Beam Search)--最佳优先搜索算法的优化.使用启发式函数评估它检查的每个节点的能力.不过,集束搜索只能在每个深度中发现前m ...

  8. 集束搜索(beam search)和贪心搜索(greedy search)

    最近读论文的时候看到文中经常用到集束搜索(beam search),可能很多人不懂这到底是个什么算法,其实很简单,顺便把贪心搜索(greedy search)也介绍一下. 贪心搜索(greedy se ...

  9. 人工智能之集束搜索Beam Search Algorithm

      集束搜索是属于人工智能基础知识中的知情搜索,知情搜索是基于启发法的一种搜索方法,由爬山法-->最陡爬坡法-->最佳优先搜索法-->集束搜索,逐步优化算法 通过爬山简单来说下这几种 ...

最新文章

  1. 小巧的日志记录组件 - 开源研究系列文章
  2. tensorflow 多输入 多输出 模型
  3. linux自动备份db2数据库备份,db2 自动备份(linux 、windows)总结
  4. 洛谷——P1258 小车问题
  5. Socket编程(C语言实现)—— 为什么流式传输类似于管道?不区分边界?
  6. Git图文教程:从零到上传GitHub项目
  7. google gperf tool【cpu】
  8. java web 笔试 题_JavaWeb综合笔试题(带答案).doc
  9. [CTF][Web][PHP][JavaScript]弱类型问题
  10. VSCode 如何调出代码比照界面(前后对比)
  11. 剑指Offer_47_求1+2+3+...+n
  12. mysql报错ERROR 1045 (28000)
  13. 以下文件中的行尾不一致,要将行尾标准化吗?+乱码
  14. UIControl详解
  15. 《第五项修炼》读后感
  16. Spring源码编译问题--xml-apis:xml-apis引入
  17. 网站如何做引流推广?SEO引流效果好吗?
  18. Java_单继承和多继承
  19. android 7.0关机动画,Android 修改系统关机动画的实现
  20. 拖延症究竟是个什么东西?

热门文章

  1. 机器学习:从决策树到xgboost
  2. 【Linux-操作系统】
  3. 梦幻西游手游服务器维护时间,梦幻西游手游5.11维护公告
  4. 【Linux】Supervisor使用详解
  5. 中兴技面+综面+面试技巧
  6. 常用计算机字长,计算机字长是什么意思
  7. Oracle不完全恢复
  8. PCIe扫盲——热插拔简要介绍
  9. image、border-image、background-image的区别
  10. github工具之OA综合利用python