Decoding Strategy

Transformer 的 decoder 在生成文本时,并非一次性输出完整的句子,而是自回归逐个生成 token。在生成每个 token 时,模型会基于已经生成的 token 和编码器对输入信息的理解,计算出词汇表中所有可能 token 的概率分布。

如何从这个概率分布中选择下一个 token?

  • 每次选择概率最高的 token——恭喜你,发明了 Greedy Search

  • 每次保留概率最高的几个 token,再选择一条总概率最高的路径——恭喜你,发明了 Beam Search

  • 如果不想要每次都走选最正确的路,希望有一点随机性——恭喜你,发明了 Sampling

Greedy Search 有时也称作启发式搜索,在 LLM 中,通常指在每个 t 时刻选择下一个词时,根据 wt=argmaxwP(w|w1:t−1) 选择概率最高的词。

Greedy Search 是一种合理的策略,但也有一些缺点,例如:

  • 输出可能会卡在重复循环中。就像智能输入法给出的下一词建议,当你不断选择建议最高的单词时,它可能会变成重复的句子。

与 Greedy Search 不同,Beam Search 为了避免错过隐藏的高概率词,通过参数 num_beams 的配置,可以在每个时刻,记录概率最高的前 num_beams 个路径,在下一个时刻可以有多个基础路径同时搜索。

如上图,当 t=1 时,最大概率的路径是(“The”、“nice”),Beam Search 同时也会记录概率排第二的路径(“The”、“dog”);当t=2时,集束搜索也会发现路径(“The”、“dog”、“has”)有0.36的概率超过了路径(“The”、“nice”、“women”)的概率0.2。因此,两条路径中,找到了概率最高的路径,得到了更为合理的答案。 不过,在开放领域生成任务的时候,Greedy Search 和 Beam Search 都不是很好的解码方式,因为可能会导致缺乏创造性、趣味性、多样性。

2.1 Beam Search 代码实现

3 Sampling

3.1 Top-K 固态采样

Beam Search 每次会选择在 Beam 中最大概率的词汇,Top-k 采样是对 Greedy Search 的优化,它从排名前 k 的 token 中进行抽样,允许其他概率较高的 token 也有机会被选中,也就是有一定机率不选最大概率的词,而其引入的随机性有助于在许多情况下提高生成质量。

3.1.1 代码实现

3.2 Top-P 动态采样

Top-P方法可以动态设置token候选列表的大小。这种方法也称为 Nucleus Sampling(核采样),通过选择可能性总和不超过特定值的高概率token来创建候选名单。可以看下面的示意图:

3.2.1 代码实现

3.3 Temperature 强化采样

如上面的代码所示,Temperature 在模型计算出最终的词汇表概率分布(通过 Softmax 函数)之前,对原始的 logits进行缩放。

公式为:

Probabilities=softmax(logitstemperature)Probabilities=softmax( \frac{logits}{temperature})

高 Temperature 意味着更多的随机性。这可以帮助模型提供更多创造性的输出。

通常我们是将 top-k、top-p、Temperature 联合起来使用。使用的先后顺序是top-k->top-p->Temperature

总结

  1. 有哪些采样策略

  2. 手撕

  3. topp, topk, temperature是如何协同工作的

参考

Last updated