集束搜索(beam search)

版权声明: https://blog.csdn.net/qq_40722284/article/details/89481105

基本的集束搜索算法

解决的问题

寻找一个最接近原意的结果

过程

第一步,找到第一个输出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)

之前的束搜索算法就是最大化这个概率P\left(y^{<1>} \ldots y^{<T_{y}> } | X\right)= P\left(y^{<1>} | X\right) P\left(y^{<2>} | X, y^{<1>}\right) P\left(y^{<3>} | X, y^{<1>}, y^{<2}\right) \ldots P\left(y^{<T_{y}>} | X, y^{<1>}, y^{<2>} \ldots y^{<T_{y}-1>}\right)

但是,这些概率值都是远小于1的,乘起来会更小,造成数值下溢(数值太小,电脑的浮点数字不能精确储存)。所以实际中,不会取这个乘积最大值,二是加上log,取最大和,会得到一个数值上更稳定的数。

目标函数的缺点

由于概率值小于1,乘起来会得到更小的值,所以会倾向于更短的翻译结果。概率的log值通常小于等于1,在log范围内,加起来项越多,结果越负。

改进方法

归一化,除以翻译结果的单词数,即取每个单词的概率对数值的平均,减少了对输出长的结果的惩罚。

实际使用的方法,在输出句子的单词总数上加上指数a,a = 1,相当于完全长度归一化。a = 0,相当于没有归一化。这里的指数a是一个超参数。

运行步骤

运行束搜索时,会看到很多长度等于 1 的句子,很多长度等于 2 的句子,很多长度等于 3 的句子,等等。可能运行束搜索 30 步,考虑输出的句子可能达到,比如长度 30。因为束宽为 3,你会记录所有这些可能的句子长度,长度为1、 2、 3、 4 等等一直到 30 的三个最可能的选择。

然后针对这些所有的可能的输出句子,用下面的式子给它们打分,取概率最大的几个句子,然后对这些束搜索得到的句子,计算这个目标函数。最后从经过评估的这些句子中,挑选出在归一化的log概率在目标函数上得分最高的一个。

有时也称归一化的对数似然目标函数。

猜你喜欢

转载自blog.csdn.net/qq_40722284/article/details/89481105