1.Beam search
在文本生成任务中,为了寻找最好的结果可采用greedy search贪心搜索,即每一个时间步都取出一个条件概率最大的输出,再将从开始到当前步的结果作为输入去获得下一个时间步的输出,直到模型给出生成结束的标志。
但是贪心搜索的方式可能会进入局部最优解,甚至找不到较好的结果。因此在计算资源有限的情况下采取Beam search的方式,在每次运算结果中寻找Top k个结果,不断进行迭代。如下图,每一步计算完成后会得到三个最优的结果。在进行某一步计算时,选出当前最优的三个可能,并且与前一步的结果即最优的三个组合进行两两组合,选择出最优的三个组合。然后不断迭代至 < e n d > <end> <end>。该方法应用在模型的测试生成阶段。
![](https://i-blog.csdnimg.cn/blog_migrate/91c93d686c201ef1aeb9fbb93809ffe7.png)
当Beam serch size =1时,退化为greedy search。
# greedy search
for t in range(params['max_dec_len']):
# 单步预测
_, pred, dec_hidden = model.decoder(dec_input, dec_hidden, enc_output, context_vector)
context_vector, _ = model.attention(dec_hidden, enc_output)
# 选择出现概率最大的词
predicted_ids = tf.argmax(pred, axis=1).numpy()
for index, predicted_id in enumerate(predicted_ids):
predicts[index] += vocab.id_to_word(predicted_id) + ' '
dec_input = tf.expand_dims(predicted_ids, 1)
2.Scheduled Sampling
A method for avoiding the problem of exposure bias.
Scheduled Sampling是⼀种解决训练和生成时输⼊数据分布不⼀致的方法,能够有效提升模型的泛化能力。在训练早期该⽅法主要使用目标序列中的真实元素作为解码器输⼊,可以将模型从随机初始化的状态快速引导⾄⼀个合理的状态。随着训练的进行,该⽅法会逐渐更多地使用生成的元素作为解码器输⼊,以解决数据分布不⼀致的问题。该方法应用在模型的训练阶段,生成阶段不可使用。公式如下:
x t = ε x t − 1 + ( 1 − ε ) x ^ t − 1 x_t = \varepsilon x_{t-1} +(1-\varepsilon) \hat x_{t-1} xt=εxt−1+(1−ε)x^t−1
![](https://i-blog.csdnimg.cn/blog_migrate/e1966c3959c79fcfe93294fe7d29d262.png)
![](https://i-blog.csdnimg.cn/blog_migrate/35d67f5f78fa4f6fe48324a3eab47c50.png)
1)线性
ε i = m a x ( ε , k − c i ) \varepsilon_i = max(\varepsilon, k-ci) εi=max(ε,k−ci),其中 ε \varepsilon ε为最小阈值
0