2.4 预测与搜索 69
2.4.1 搜索问题的建模
基于语言模型的序列生成任务可以被定义为:在无数任意排列的单词序列中找
到概率最高的序列。这里单词序列 w = w
1
w
2
...w
m
的语言模型得分 P (w) 度量了这
个序列的合理性和流畅性。在序列生成任务中,基于语言模型的搜索问题可以被描
述为:
ˆw = arg max
w∈χ
P (w) (2.42)
这里 arg 即 argument(参数),argmax
x
f(x) 表示返回使 f(x) 达到最大的 x。argmax
w∈χ
P (w) 表示找到使语言模型得分 P (w) 达到最大的单词序列 w。χ 是搜索问题的解空
间,它是所有可能的单词序列 w 的集合。 ˆw 可以被看做该搜索问题中的“最优解”,
即概率最大的单词序列。
在序列生成任务中,最简单的策略就是对词表中的单词进行任意组合,通过这
种枚举的方式得到全部可能的序列。但是,很多时候待生成序列的长度是无法预先
知道的。比如,机器翻译中目标语言序列的长度是任意的。那么怎样判断一个序列
何时完成了生成过程呢?这里借用现代人类书写中文和英文的过程:句子的生成首
先从一片空白开始,然后从左到右逐词生成,除了第一个单词,所有单词的生成都
依赖于前面已经生成的单词。为了方便计算机实现,通常定义单词序列从一个特殊
的符号 <sos> 后开始生成。同样地,一个单词序列的结束也用一个特殊的符号 <eos>
来表示。
对于一个序列 <sos> I agree <eos>,图2.12展示语言模型视角下该序列的生成
过程。该过程通过在序列的末尾不断附加词表中的单词来逐渐扩展序列,直到这段
序列结束。这种生成单词序列的过程被称作自左向右生成(Left-to-Right Generation)。
注意,这种序列生成策略与 n-gram 的思想天然契合,因为 n-gram 语言模型中,每个
词的生成概率依赖前面(左侧)若干词,因此 n-gram 语言模型也是一种自左向右的
计算模型。
在这种序列生成策略的基础上,实现搜索通常有两种方法
——
深度优先遍历和
宽度优先遍历
[47]
。在深度优先遍历中,每次从词表中选择一个单词(可重复),然后
从左至右地生成序列,直到 <eos> 被选择,此时一个完整的单词序列被生成出来。然
后从 <eos> 回退到上一个单词,选择之前词表中未被选择到的候选单词代替 <eos>,
并继续挑选下一个单词直到 <eos> 被选到,如果上一个单词的所有可能都被枚举过,
那么回退到上上一个单词继续枚举,直到回退到 <sos>,这时候枚举结束。在宽度优
先遍历中,每次不是只选择一个单词,而是枚举所有单词。
有一个简单的例子。假设词表只含两个单词 {a, b},从 <sos> 开始枚举所有候选,
有三种可能:
{<sos> a,<sos> b,<sos> <eos>}