NLP语言模型,机器翻译任务中的贪心搜索 Greedy search 和集束搜索 Beam search(学习心得)

Picking the most likely sentence

可以把机器翻译,想像成建立一个条件语言模型 a conditional language model
1.jpg

语言模型,可以用来估计一个语句的概率
也可以根据第一个输入,来产生后续的输出

机器翻译模型,有两个网络,分别是编码网络和解码网络,对应上面的绿色和紫色
可以发现,后面的解码网络,和语言模型非常类似
所以这两个模型的区别在于,语言模型是从零向量 vector of zeros 开始
而机器翻译模型是输入的句子编码

所以机器翻译模型又被叫做:条件语言模型 conditional language model
输出 the probability of the output English translation(前提条件:conditions on some input French sentence)
之前的语言模型:输出 the probability of any sentence
2.jpg

我们得到的其实是一个概率分布,然后模型会有对应于这个概率分布的输出
但是问题在于:
虽然最大概率的输出是最优的翻译,但是不能保证每次都采用到最大的概率

我们希望得到的,不是随机采用,而是使得条件概率最大化的那个句子
所以针对机器翻译,要设计一个算法,来找出最合适的 y 值,使得条件概率最大化
解决这一问题最常用的是:集束搜索 Beam Search
3.jpg

那为什么不用贪心搜索 Greedy Search 呢?
贪心搜索:

  1. 生成第一个词的分布
  2. 选择可能性最高的词(条件概率下),输入机器翻译模型
  3. 然后同样选择第二个词,第三个词,直到最后

但是我们真正想要的,是一次性选出整个单词序列 pick the entire sequence of words(最高可能性)
可以想象的是,有的时候虽然每个词是最高可能性的,但是组成的句子未必让人满意,因为没有一个好的全局观
所以我们要最大化的是 整体概率 joint probability

比如上面的结果中,第一句我们更喜欢,因为简洁明了
第二句虽然正确,但是有点啰嗦
由于 going 跟在 is 后面的概率会更高,所以单词最优会出现第二句的结果
这就是单词最优和整句最优的区别

由于句子的组合是非常多的,比如 10000 个词的词典,构成一个 10 个字的句子,那粗略算来就是 10000^10 这么多的可能性,所以我们没办法直接做全局最优的搜索
需要用一个 近似搜索算法 approximate search algorithm
这个算法会尝试选到一个概率最大的句子(虽然不能保证找到的 y 一定使得概率最大化,但常常足够用了)

Beam search

4.jpg

  1. 尝试选择第一个要输出的词 try to pick the first words ,比如 10000 词的词表(这里忽略了大小写)

  2. 使用编码和解码网络,输入句子后,衡量第一个词的概率(softmax 层输出 10000 个词对应的概率)

  3. 这里多了一个参数 B,假设定为 3(beam width),即一次考虑 3 个概率最高的词,暂存结果

  4. 针对 3 个词,分别考虑第二个单词(3 次,每次生成 10000 个词的概率)

  5. 这里的 3 个词,都是在 y_hat<1> 的地方转为下一个序列的输入,计算得到 y_hat<2>

  6. 这里我们得到的条件概率结果的前提条件是:输入的法语句子 + 第一个词
    44.jpg

  7. 然后,我们要计算 “第一个词 + 第二个词” 的条件概率,前提条件是:输入的法语句子
    45.jpg

  8. 根据条件概率公式,可以拆解为两个概率的乘积
    46.jpg

  9. 其中前面一项,已经在第一个词的计算中,对应保留了 3 个词的概率
    47.jpg

  10. 第二项,是在第二个词的计算中得到
    48.jpg

  11. 所以第二个词计算完毕后,我们得到了 3✖️ 10000 = 30000 种可能性,在其中选出 3 中概率最高的,存储最为下一个词的输入

值得注意的是,如果第二个词计算的时候发现,第一个词的 3 个候选中,有 1 个没有排进前 3,那相当于这个候选就被淘汰了
然后我们每次,要根据前面的词,做 30000 次的 概率评估,选择前 3
相当于我们每一步,都复制了 3 个完全一样的网络副本

5.jpg

然后到了集束搜索的下一步,继续下一个词,直到最后一个词(结尾标记)
如果我们设定 B=1,那就是贪心搜索算法了