CC's

Back

我没想到第二个暴搜 tag 居然会给一篇深度学习的文章。

一般的暴搜题目没必要记,有奇妙特性和剪枝的暴搜重点往往便不再是暴搜了。以及,以前不爱写题解。结果就是占据暴搜 tag 的第二篇文章居然是深度学习……

彻头彻尾的暴搜。

Beam Search 一般使用在 seq2seq 任务上。由于输入输出不定长,所以往往是让模型采取一种循环的方式来输出 seq。

简单来讲,

  1. 我们有一个字典 D\mathcal D,模型根据输入 SS 先输出句子 TT 中第一个单词为字典中每个单词的置信。
  2. 现在按照置信度高低采纳第一个词为 T1T_1。然后,我们会把 TT 再次输入模型,模型依照 SSTT 计算 TT 的下一个单词的置信。
  3. 我们再采纳一个词加入到 TT 的最后。
  4. 如此循环往复,直到模型输出终结符。

那么现在问题就在于,我们其实是想让模型给一个最大化 P(TS)P(T \mid S)TT。但是我们无法证明概率最大的 TT 前缀也总是概率最大的,上述步骤就无法保证正确。

为了得到最优解,理论上我们要遍历所有的解空间,枚举 TT 的长度和每一个单词。但这显然无法接受。所以最后就有了一个折中的办法:选置信度最大的前 kk 个作为备选答案的前缀来扩展。

这就是 Beam Search 了。

代码#

这东西的思想实在太简单,太粗暴,一句话就能讲明白。它的难度其实主要是怎么充分地并行化。

下面给出一段 Pytorch 实现,不是我写的,只是我感觉细节处理得挺好。

我在必要的位置做了注释。

Beam Search 算法及代码解读
https://astro-pure.js.org/blog/beam-search-note
Author Cheng Chen
Published at 2022年12月7日
Comment seems to stuck. Try to refresh?✨