NLP语言模型,机器翻译任务中的贪心搜索 Greedy search 和集束搜索 Beam search(学习心得)
Picking the most likely sentence
可以把机器翻译,想像成建立一个条件语言模型 a conditional language model
语言模型,可以用来估计一个语句的概率
也可以根据第一个输入,来产生后续的输出
机器翻译模型,有两个网络,分别是编码网络和解码网络,对应上面的绿色和紫色
可以发现,后面的解码网络,和语言模型非常类似
所以这两个模型的区别在于,语言模型是从零向量 vector of zeros 开始
而机器翻译模型是输入的句子编码
所以机器翻译模型又被叫做:条件语言模型 conditional language model
输出 the probability of the output English translation(前提条件:conditions on some input French sentence)
之前的语言模型:输出 the probability of any sentence
我们得到的其实是一个概率分布,然后模型会有对应于这个概率分布的输出
但是问题在于:
虽然最大概率的输出是最优的翻译,但是不能保证每次都采用到最大的概率
我们希望得到的,不是随机采用,而是使得条件概率最大化的那个句子
所以针对机器翻译,要设计一个算法,来找出最合适的 y 值,使得条件概率最大化
解决这一问题最常用的是:集束搜索 Beam Search
那为什么不用贪心搜索 Greedy Search 呢?
贪心搜索:
- 生成第一个词的分布
- 选择可能性最高的词(条件概率下),输入机器翻译模型
- 然后同样选择第二个词,第三个词,直到最后
但是我们真正想要的,是一次性选出整个单词序列 pick the entire sequence of words(最高可能性)
可以想象的是,有的时候虽然每个词是最高可能性的,但是组成的句子未必让人满意,因为没有一个好的全局观
所以我们要最大化的是 整体概率 joint probability
比如上面的结果中,第一句我们更喜欢,因为简洁明了
第二句虽然正确,但是有点啰嗦
由于 going 跟在 is 后面的概率会更高,所以单词最优会出现第二句的结果
这就是单词最优和整句最优的区别
由于句子的组合是非常多的,比如 10000 个词的词典,构成一个 10 个字的句子,那粗略算来就是 10000^10 这么多的可能性,所以我们没办法直接做全局最优的搜索
需要用一个 近似搜索算法 approximate search algorithm
这个算法会尝试选到一个概率最大的句子(虽然不能保证找到的 y 一定使得概率最大化,但常常足够用了)
Beam search
-
尝试选择第一个要输出的词 try to pick the first words ,比如 10000 词的词表(这里忽略了大小写)
-
使用编码和解码网络,输入句子后,衡量第一个词的概率(softmax 层输出 10000 个词对应的概率)
-
这里多了一个参数 B,假设定为 3(beam width),即一次考虑 3 个概率最高的词,暂存结果
-
针对 3 个词,分别考虑第二个单词(3 次,每次生成 10000 个词的概率)
-
这里的 3 个词,都是在 y_hat<1> 的地方转为下一个序列的输入,计算得到 y_hat<2>
-
这里我们得到的条件概率结果的前提条件是:输入的法语句子 + 第一个词
-
然后,我们要计算 “第一个词 + 第二个词” 的条件概率,前提条件是:输入的法语句子
-
根据条件概率公式,可以拆解为两个概率的乘积
-
其中前面一项,已经在第一个词的计算中,对应保留了 3 个词的概率
-
第二项,是在第二个词的计算中得到
-
所以第二个词计算完毕后,我们得到了 3
10000 = 30000 种可能性,在其中选出 3 中概率最高的,存储最为下一个词的输入
值得注意的是,如果第二个词计算的时候发现,第一个词的 3 个候选中,有 1 个没有排进前 3,那相当于这个候选就被淘汰了
然后我们每次,要根据前面的词,做 30000 次的 概率评估,选择前 3
相当于我们每一步,都复制了 3 个完全一样的网络副本
然后到了集束搜索的下一步,继续下一个词,直到最后一个词(结尾标记)
如果我们设定 B=1,那就是贪心搜索算法了