假设词表大小为3,内容为a,b,c。beam size是2 decoder解码的时候: 1: 生成第1个词的时候,选择概率最大的2个词,假设为a,c,概率分别为log(p(1_a)) log(p(1_c)) 那么当前序列就是a,c,对应的概率是 log(p1_0)=log(p(1_a)) log(p1_1)= log(p(1_c)) 2:生成第2个词的时候,假如当前对三个词的概率预测为 log(p(2_a)) log(p(2_b)) log(p(2_c)) 我们将当前序列a和c,分别与词表中的所有词进行组合,得到新的6个序列aa ab ac ca cb cc, 计算他们的概率。 aa:log(p1_0)+log(p(2_a)) ab:log(p1_0)+log(p(2_b)) ac:log(p1_0)+log(p(2_c)) ca:log(p1_1)+log(p(2_a)) cb:log(p1_1)+log(p(2_a)) cc:log(p1_1)+log(p(2_a)) 然后从其中选择2个概率最高的组合,作为当前序列,假如为aa cb , 那么 log(p2_0)=log(p1_0)+log(p(2_a)) log(p2_1)=log(p1_1)+log(p(2_a)) 3:后面会不断重复这个过程,直到遇到结束符为止。最终输出2个概率最高的序列。
配图如下:
大箭头的方向,即为按照累加概率选择出最后的beam_size个caption的过程。
为什么在计算概率的时候,我们把概率p用log的形式来表示?
在beam search的时候,对于每个时刻我们都计算当前时刻beam size个候选序列的概率。每一个候选序列的概率是前面所有时刻的概率的累乘。
因为如果概率很小,几个概率做累乘,结果就会变得可以忽略不计。而采用log的形式来表示概率,就把乘法转化为了加法。
不会存在这个问题。