束搜索

http://zh.d2l.ai/chapter_recurrent-modern/beam-search.html

请问下beam search 是如何训练的,作为整个模型的一部分。还是先训练lstm,再训练beam search?

我认为这里不能使用维比特算法来优化是因为预测的概率受序列的影响而不仅仅由输入决定。
假设当前概率只受输入影响,即只受前一阶段输出影响,则:
对下图,第3阶段预测为a的概率为第2阶段a和b的最大值,第2阶段a又来自第1阶段a和b的最大值,此时第3阶段预测为a的路径就可以用维比特算法求出来。假设实线比虚线更大,则路径为(a, a, a),但实际上(b, a, a)的概率不一定比(a, a, a)小,只是(b, a, .) < (a, a, .)而已。
概率受整个序列的影响而不仅仅是前一个字符。
image

这个数值是否是负值, 概率恒小于1大于0, 取log以后是负数。

image

是的, 在视频里面有说明:

我觉得束搜索和Viterbi其实都是可以的。
这里没有采用Viterbi的原因主要是每一步可能的选项太多了,使用Viterbi的开销依然很大。

  • Viterbi:O(T*|Y|^2), 这里T是时间步的长度, |Y| 是vocab_size, |Y| 是很大的
  • BS: O(T*|Y|*K), 这里K << |Y|, K是人为选定的 束宽(beam size).
1 Like

在我的理解里面, Beam Search只是一种选择序列的方法, 并没有需要学习的参数叭?

但是你使用束搜索一样会有这种情况呀,可能还是维比特算法计算量比较大

1 Like

确实,束搜索也没有解决问题,相比维特比算法,计算量小,效率高。

beam search是在预测的时候使用,而且不需要进行训练;训练的时候有真实的标签并且可以计算损失函数。