Exhaustive search 和 Beam search 详解(图文并茂)

tech2022-08-25  124

1.Exhaustive search decoding

Exhaustive search :也称为穷举法 我们理想的翻译序列 y 能够使如下条件概率最大 Exhaustive search 方法是如何找到这个最佳的翻译序列呢? 它试图计算所有可能的翻译序列!!!,也就是说它在每一个时刻 t 都会计算 |V|^t 种可能的翻译,|V|是词库大小。在所有 |V|^t 种可能的翻译中,选择概率连乘最大的。

其他博客讲的,每步选择最大值就行了,如下图。他这样说似乎不能表达穷举的含义,因为每步只考虑输出的最大概率的话,整个翻译序列就是最大概率连乘的结果,如 y = (moi, suis, etudianrt,-),这个时间复杂度就是 O(T)。而我们是要在 (etudiant, -, je, moi,suis) , (-, je, etudiant, mosi, suis) …等共 5^4 种中选择最好的。(不知道理解得对不对~~~)

这个算法的时间复杂度就是:O(|V|^T), T为翻译序列的长度。

2. Beam search decoding

Beam search 也是贪心算法,不能保证全局最优Beam search 比 exhaustive search 更高效Beam size: k表示每个时间步只选择 TOP k 个单词,在实际应用中,k 通常取 5 ~ 10之间定义score(看不懂公式不要紧,看下面图就行了)

假设我们要解码的序列是这样的, k=2 只看Deoder RNN 部分: 1) 对于第1 个时间步,输入为< START >, 输出为 一个|V| 维的向量,向量中每个元素是词库V中每个单词的条件概率如 [ p(he|< START >), p(hit |< START >), p(me |< START >), p(with | < START >), p(a | < START >), p(pie | < START >),…]注意:词库中不止这些单词 在Beam Search 中,我们通常把条件概率取对数,这样连乘的时候就可以变成累加了 假设在第一步中:最大的对数条件概率对应的单词是 hit 和 I。 score(he) = -0.7, score(I) = -0.9 2) 在第 2 个时间步,我们先以(< START >, he )作为输入,输出同样为 一个|V| 维的向量,向量中每个元素是词库V中每个单词的条件概率,对条件概率取对数,然后加上前一个时间步的 score,选择第二个时间步score 最大的两个单词如 hit 和 struck score(hit) = -1.7, score(struck) = -2.9

再以(< START >, I )作为输入,输出同样为 一个|V| 维的向量,向量中每个元素是词库V中每个单词的条件概率。对条件概率取对数,然后加上之前时间步的 score,选择score 最大的两个单词如 was 和 got,如图 socre(was) = -1.6, score(got) = -1.8 选择第二步 score 最大的两个单词,如图 绿色单词 3) 在第3 个时间步中,我们先以(< START >, he, hit) 作为输入,输出同样为 一个|V| 维的向量,向量中每个元素是词库V中每个单词的条件概率,对条件概率取对数,然后加上前一个时间步的 score,选择第三个时间步score 最大的两个单词如 a 和 me。score(a) = -2.8, score(me) = -2.5,…

再以(< START >, I, was )作为输入,输出同样为 一个|V| 维的向量,向量中每个元素是词库V中每个单词的条件概率。对条件概率取对数,然后加上前一个时间步的 score,选择score 最大的两个单词如 hit 和 struck,如图 选择第三步 score 最大的两个单词,如图 绿色单词 4)依次延伸 选择第四步 score 最大的两个单词,如图 绿色单词 5)依次延伸 选择第五步 score 最大的两个单词,如图 绿色单词 6) 依次延伸 选择第六步 score 最大的两个单词,如图 绿色单词 7) 停止,当遇到 < END > 时就不在延伸了 要使序列的score总分最大,每个时间步选择score最大的一个单词就行,得到最后的解码结果: < START > he hit me with a pie < END >

2. beam search 的一个爱好

beam search 喜欢较短的句子。 就是说每个时间步都有可能出现 < END >, 那么Beam search 会选择那个较短的序列 解决方法:

方法1:即使出现了 < END >, 我们仍然继续延伸,直到我们定义的时间步 T 为止方法2 :我们就保留 n 个以 < END > 结尾的序列,选择score最大的那个?? 如何选择最大的那个呢? 我们知道 score 都是负值,序列越长,整个序列的总score也就越低, 序列越短score越大,beam search 目标是选择最大score的序列,那么它是不是就偏爱较短序列了呢? 所以我们要做个平均: 把每个 < END > 的 score 除以 到 < END >时的时常。如上图的< END > ,做平均的话就是 ( -2.1 / 7 ) 用公式表示就是:

3. beam search 的时间复杂度

O(K^2 • T) 如上图:一个时间步我们考虑了 4 个单词,总共有 T 个时间步。

最新回复(0)