Wetts's blog

Stay Hungry, Stay Foolish.

0%

BeanSearch.md

使用一个模型来进行机器翻译时,并不是从得到的分布中进行随机取样,而是你要找到一个句子,使得条件概率最大化。

贪心搜索是一种来自计算机科学的算法,生成第一个词的分布以后,它将会根据你的条件语言模型挑选出最有可能的第一个词进入你的机器翻译模型中,在挑选出第一个词之后它将会继续挑选出最有可能的第二个词,然后继续挑选第三个最有可能的词,这种算法就叫做贪心搜索。这种方法得到的有可能是局部最优解,而不是全局最优解。

然而全排列所有组合,由于排列数量过于巨大,也没有可行性。

集束搜索(beam search)算法可以应用到寻找全局最优解上。

集束搜索(Beam Search)

贪婪算法只会挑出最可能的那一个单词,然后继续。而集束搜索则会考虑多个选择,集束搜索算法会有一个参数 B,叫做集束宽(beam width)。例如:把这个集束宽设成 3,这样就意味着集束搜索不会只考虑一个可能结果,而是一次会考虑 3 个。

BeamSearch1

BeamSearch2

BeamSearch3

BeamSearch4

Beam Search 改进

概率公式可表示为:$P(y^{<1>}|X)$ $P(y^{< 2 >}|X,y^{< 1 >})$ $P(y^{< 3 >}|X,y^{< 1 >},y^{< 2>})$…$P(y^{< T_{y} >}|X,y^{<1 >},y^{<2 >}\ldots y^{< T_{y} - 1 >})$。

这些概率值都是小于 1 的,通常远小于 1。很多小于 1 的数乘起来,会得到很小很小的数字,会造成数值下溢(numerical underflow)。数值下溢就是数值太小了,导致电脑的浮点表示不能精确地储存,因此在实践中,我们不会最大化这个乘积,而是取 $log$ 值。如果在这加上一个 $log$,最大化这个 $log$ 求和的概率值,在选择最可能的句子 $y$ 时,你会得到同样的结果。

如果参照原来的目标函数(this original objective),如果有一个很长的句子,那么这个句子的概率会很低,因为乘了很多项小于 1 的数字来估计句子的概率。所以如果乘起来很多小于 1 的数字,那么就会得到一个更小的概率值,所以这个目标函数有一个缺点,它可能不自然地倾向于简短的翻译结果,它更偏向短的输出,因为短句子的概率是由更少数量的小于 1 的数字乘积得到的,所以这个乘积不会那么小。顺便说一下,这里也有同样的问题,概率的 $log$ 值通常小于等于 1,实际上在 $log$ 的这个范围内,所以加起来的项越多,得到的结果越负,所以对这个算法另一个改变也可以使它表现的更好,也就是我们不再最大化这个目标函数了,我们可以把它归一化,通过除以翻译结果的单词数量(normalize this by the number of words in your translation)。这样就是取每个单词的概率对数值的平均了,这样很明显地减少了对输出长的结果的惩罚(**this significantly reduces the penalty for outputting longer translations.**)。

在实践中,有个探索性的方法,相比于直接除 $T_{y}$,也就是输出句子的单词总数,我们有时会用一个更柔和的方法(a softer approach),在 $T_{y}$ 上加上指数 $a$,$a$ 可以等于 0.7。如果 $a$ 等于 1,就相当于完全用长度来归一化,如果 $a$ 等于 0,$T_{y}$ 的 0 次幂就是 1,就相当于完全没有归一化,这就是在完全归一化和没有归一化之间。$a$ 就是算法另一个超参数(hyper parameter),需要调整大小来得到最好的结果。

Beam Search 误差分析

BeamSearch误差分析1