10.10.3. 束搜索

上一节介绍了如何训练输入和输出均为不定长序列的编码器—解码器。本节我们介绍如何使用编码器—解码器来预测不定长的序列。

上一节里已经提到,在准备训练数据集时,我们通常会在样本的输入序列和输出序列后面分别附上一个特殊符号“<eos>”表示序列的终止。我们在接下来的讨论中也将沿用上一节的全部数学符号。为了便于讨论,假设解码器的输出是一段文本序列。设输出文本词典

10.10. 束搜索 - 图1 (包含特殊符号“<eos>”)的大小为 10.10. 束搜索 - 图2 ,输出序列的最大长度为 10.10. 束搜索 - 图3 。所有可能的输出序列一共有 10.10. 束搜索 - 图4 种。这些输出序列中所有特殊符号“<eos>”后面的子序列将被舍弃。

10.10.1. 贪婪搜索

让我们先来看一个简单的解决方案:贪婪搜索(greedysearch)。对于输出序列任一时间步

10.10. 束搜索 - 图5 ,我们从 10.10. 束搜索 - 图6 个词中搜索出条件概率最大的词

10.10. 束搜索 - 图7

作为输出。一旦搜索出“<eos>”符号,或者输出序列长度已经达到了最大长度

10.10. 束搜索 - 图8 ,便完成输出。

我们在描述解码器时提到,基于输入序列生成输出序列的条件概率是

10.10. 束搜索 - 图9 。我们将该条件概率最大的输出序列称为最优输出序列。而贪婪搜索的主要问题是不能保证得到最优输出序列。

下面来看一个例子。假设输出词典里面有“A”“B”“C”和“<eos>”这4个词。图10.9中每个时间步下的4个数字分别代表了该时间步生成“A”“B”“C”和“<eos>”这4个词的条件概率。在每个时间步,贪婪搜索选取条件概率最大的词。因此,图10.9中将生成输出序列“A”“B”“C”“<eos>”。该输出序列的条件概率是

10.10. 束搜索 - 图10

在每个时间步,贪婪搜索选取条件概率最大的词 图 10.9 在每个时间步,贪婪搜索选取条件概率最大的词

接下来,观察图10.10演示的例子。与图10.9中不同,图10.10在时间步2中选取了条件概率第二大的词“C”。由于时间步3所基于的时间步1和2的输出子序列由图10.9中的“A”“B”变为了图10.10中的“A”“C”,图10.10中时间步3生成各个词的条件概率发生了变化。我们选取条件概率最大的词“B”。此时时间步4所基于的前3个时间步的输出子序列为“A”“C”“B”,与图10.9中的“A”“B”“C”不同。因此,图10.10中时间步4生成各个词的条件概率也与图10.9中的不同。我们发现,此时的输出序列“A”“C”“B”“<eos>”的条件概率是

10.10. 束搜索 - 图12 ,大于贪婪搜索得到的输出序列的条件概率。因此,贪婪搜索得到的输出序列“A”“B”“C”“<eos>”并非最优输出序列。

在时间步2选取条件概率第二大的词“C” 图 10.10 在时间步2选取条件概率第二大的词“C”

10.10.2. 穷举搜索

如果目标是得到最优输出序列,我们可以考虑穷举搜索(exhaustivesearch):穷举所有可能的输出序列,输出条件概率最大的序列。

虽然穷举搜索可以得到最优输出序列,但它的计算开销

10.10. 束搜索 - 图14 很容易过大。例如,当 10.10. 束搜索 - 图1510.10. 束搜索 - 图16 时,我们将评估 10.10. 束搜索 - 图17 个序列:这几乎不可能完成。而贪婪搜索的计算开销是 10.10. 束搜索 - 图18 ,通常显著小于穷举搜索的计算开销。例如,当 10.10. 束搜索 - 图1910.10. 束搜索 - 图20 时,我们只需评估 10.10. 束搜索 - 图21 个序列。

10.10.3. 束搜索

束搜索(beam search)是对贪婪搜索的一个改进算法。它有一个束宽(beamsize)超参数。我们将它设为

10.10. 束搜索 - 图22 。在时间步1时,选取当前时间步条件概率最大的 10.10. 束搜索 - 图23 个词,分别组成 10.10. 束搜索 - 图24 个候选输出序列的首词。在之后的每个时间步,基于上个时间步的 10.10. 束搜索 - 图25 个候选输出序列,从 10.10. 束搜索 - 图26 个可能的输出序列中选取条件概率最大的 10.10. 束搜索 - 图27 个,作为该时间步的候选输出序列。最终,我们从各个时间步的候选输出序列中筛选出包含特殊符号“<eos>”的序列,并将它们中所有特殊符号“<eos>”后面的子序列舍弃,得到最终候选输出序列的集合。

束搜索的过程。束宽为2,输出序列最大长度为3。候选输出序列有\ :math:`A`\ 、\ :math:`C`\ 、\ :math:`AB`\ 、\ :math:`CE`\ 、\ :math:`ABD`\ 和\ :math:`CED` 图 10.11 束搜索的过程。束宽为2,输出序列最大长度为3。候选输出序列有

10.10. 束搜索 - 图2910.10. 束搜索 - 图3010.10. 束搜索 - 图3110.10. 束搜索 - 图3210.10. 束搜索 - 图3310.10. 束搜索 - 图34

图10.11通过一个例子演示了束搜索的过程。假设输出序列的词典中只包含5个元素,即

10.10. 束搜索 - 图35 ,且其中一个为特殊符号“<eos>”。设束搜索的束宽等于2,输出序列最大长度为3。在输出序列的时间步1时,假设条件概率 10.10. 束搜索 - 图36 最大的2个词为 10.10. 束搜索 - 图3710.10. 束搜索 - 图38 。我们在时间步2时将对所有的 10.10. 束搜索 - 图39 都分别计算 10.10. 束搜索 - 图4010.10. 束搜索 - 图41 ,并从计算出的10个条件概率中取最大的2个,假设为 10.10. 束搜索 - 图4210.10. 束搜索 - 图43 。那么,我们在时间步3时将对所有的 10.10. 束搜索 - 图44 都分别计算 10.10. 束搜索 - 图4510.10. 束搜索 - 图46 ,并从计算出的10个条件概率中取最大的2个,假设为 10.10. 束搜索 - 图4710.10. 束搜索 - 图48 。如此一来,我们得到6个候选输出序列:(1) 10.10. 束搜索 - 图49 ;(2) 10.10. 束搜索 - 图50 ;(3) 10.10. 束搜索 - 图5110.10. 束搜索 - 图52 ;(4) 10.10. 束搜索 - 图5310.10. 束搜索 - 图54 ;(5) 10.10. 束搜索 - 图5510.10. 束搜索 - 图5610.10. 束搜索 - 图57 和(6) 10.10. 束搜索 - 图5810.10. 束搜索 - 图5910.10. 束搜索 - 图60 。接下来,我们将根据这6个序列得出最终候选输出序列的集合。

在最终候选输出序列的集合中,我们取以下分数最高的序列作为输出序列:

10.10. 束搜索 - 图61

其中

10.10. 束搜索 - 图62 为最终候选序列长度, 10.10. 束搜索 - 图63 一般可选为0.75。分母上的 10.10. 束搜索 - 图64 是为了惩罚较长序列在以上分数中较多的对数相加项。分析可知,束搜索的计算开销为 10.10. 束搜索 - 图65 。这介于贪婪搜索和穷举搜索的计算开销之间。此外,贪婪搜索可看作是束宽为1的束搜索。束搜索通过灵活的束宽 10.10. 束搜索 - 图66 来权衡计算开销和搜索质量。

10.10.4. 小结

  • 预测不定长序列的方法包括贪婪搜索、穷举搜索和束搜索。
  • 束搜索通过灵活的束宽来权衡计算开销和搜索质量。

10.10.5. 练习