Cyan's Blog

Search

Search IconIcon to open search

D2L-63-Beam Search

Last updated Oct 15, 2022 Edit Source

# 束搜索

2022-04-20

Tags: #BeamSearch #DynamicProgramming

我们先来评估一下贪心算法的时间复杂度, 我们需要计算 $T$ 个时间步的 $|\mathcal{Y}|$ 个概率, 总的时间复杂度为: $$\mathcal{O}({T}\cdot\left|\mathcal{Y}\right|)$$

如果搜索空间不大, 我们可以直接穷举所有可能的序列 $y_1, \cdots, y_{t-1}, y_{t}$, 这时的时间复杂度为:$$\mathcal{O}(\left|\mathcal{Y}\right|^{T})$$ 其中$|\mathcal{Y}|$ 表示输出词表的大小(包括<eos>), 由于词表或者时间步常常较大, 所以穷举在计算复杂度上是不可行的

# Viterbi

求解最优序列也是HMM模型里面的一个问题, 而最常用的算法就是 Viterbi Algorithm了. 在这个问题里面, Viterbi的复杂度为:$$\mathcal{O}({T}\cdot\left|\mathcal{Y}\right|^2)$$ 比穷举的指数复杂度好多了, 但是$|\mathcal{Y}|^2$依然是一个很大的项, 我们希望开销更小一点.

束搜索就是开销介于Viterbi和贪心之间的那个算法了: 通过选定一个 束宽(beam size)$k$, 我们在每一个时间步只选择概率最高的 $k$ 条路径, 进一步减少了计算开销: $$\mathcal{O}(k\cdot{T}\cdot\left|\mathcal{Y}\right|)$$ 在时间步$1$,我们选择具有最高条件概率的$k$个词元。这$k$个词元将分别是$k$个候选输出序列的第一个词元。在随后的每个时间步,基于上一时间步的$k$个候选输出序列,我们将继续从$k\left|\mathcal{Y}\right|$个可能的选择中挑出具有最高条件概率的$k$个候选输出序列。

# 平衡序列长度

# 总结


Ref: natural language - What is the difference between the Viterbi algorithm and beam search? - Cross Validated