束搜索

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

1 Like

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

我觉得束搜索和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是在预测的时候使用,而且不需要进行训练;训练的时候有真实的标签并且可以计算损失函数。

谢谢大家的回复,如果我们beam search 的score 函数不是训练来的,如何计算每条路径呢的转移概率呢

可以通过将序列的softmax输出相乘得到转移概率

2 Likes

some questions:
q1: 作者在介绍greedy search时的反例与 beam search的实现策略并非一致,后者只是从root节点分支,分支后各自独立。所以说beam search并不能解决反例
q2: greedy search的反例是多数情况吗?毕竟训练时也是按照概率大的来选择的,而且RNN本身有state context机制,难道‘名师出高徒’可能性不大于‘庸师出高徒’?

明显是漏了exp,与bleu类似的。。。