集束搜索(beam search)
基本的集束搜索算法
解决的问题
寻找一个最接近原意的结果
过程
第一步,找到第一个输出y的概率值。其中考虑一个概念--集束宽(beam width,简称bw),表示在每一步中有多少选择。
执行过程是,将法语句子输入到编码网络,然后解码网络,softmax层会输出10,000个输出概率值,然后 取bw个单词保存起来。(即保存前bw个值)。
第二步,在第一步选出的单词作为第一个,然后考虑第二个单词是什么,这个时候需要将第一个输出重新输入进来,然后考虑最可能的第一个和第二个单词对,不仅仅是第二个单词有最大的概率,而是第一个、第二个单词对有最大的概率。假设集束宽为 3,并且词汇表里有 10,000 个单词,那么最终我们会有 3 乘以 10,000 也就是 30,000 个可能的结果。
按条件概率准则,表示成第一个单词的概率乘以第二个单词的概率。
如果集束搜索找到了第一个和第二个单词对最可能的三个选择是“inSeptember”或者“jane is”或者“jane visits”, 这就意味着我们去掉了 september 作为英语翻译结果的第一个单词的选择,所以我们的第一个单词现在减少到了两个可能结果。根据y1,y2的对待选择前三个最大的概率值,来考虑第三步的选择。依次下去,直到终止句尾符号。
如果集束宽等于 1,只考虑 1 种可能结果,这实际上就变成了贪婪搜索算法。
改进的集束搜索算法
长度归一化(Length normalization)
之前的束搜索算法就是最大化这个概率
但是,这些概率值都是远小于1的,乘起来会更小,造成数值下溢(数值太小,电脑的浮点数字不能精确储存)。所以实际中,不会取这个乘积最大值,二是加上log,取最大和,会得到一个数值上更稳定的数。
目标函数的缺点
由于概率值小于1,乘起来会得到更小的值,所以会倾向于更短的翻译结果。概率的log值通常小于等于1,在log范围内,加起来项越多,结果越负。
改进方法
归一化,除以翻译结果的单词数,即取每个单词的概率对数值的平均,减少了对输出长的结果的惩罚。
实际使用的方法,在输出句子的单词总数上加上指数a,a = 1,相当于完全长度归一化。a = 0,相当于没有归一化。这里的指数a是一个超参数。
运行步骤
运行束搜索时,会看到很多长度等于 1 的句子,很多长度等于 2 的句子,很多长度等于 3 的句子,等等。可能运行束搜索 30 步,考虑输出的句子可能达到,比如长度 30。因为束宽为 3,你会记录所有这些可能的句子长度,长度为1、 2、 3、 4 等等一直到 30 的三个最可能的选择。
然后针对这些所有的可能的输出句子,用下面的式子给它们打分,取概率最大的几个句子,然后对这些束搜索得到的句子,计算这个目标函数。最后从经过评估的这些句子中,挑选出在归一化的log概率在目标函数上得分最高的一个。
有时也称归一化的对数似然目标函数。