第 280 题:实现序列模型的Beam Search,长度惩罚与重复抑制。
题目
实现序列模型的Beam Search,长度惩罚与重复抑制。
完整讲解
一、Beam Search
- 自回归生成中,每步在词表上选 token;贪心只保留当前最优 1 个序列,易陷入局部最优。Beam Search 每步保留得分最高的 K 个序列(beam),下一步对每个扩展词表得到 K×V 个候选,再从中选全局 top-K 个序列,重复直至结束或达到最大长度。
二、长度惩罚(Length Penalty)
- 未加长度惩罚时,短序列总概率(乘积)往往大于长序列,Beam Search 会偏向短输出。长度惩罚:对长度为 $l$ 的序列,将得分改为 $\text{score} / l^\alpha$ 或 $\text{score} / \text{lp}(l)$(如 $\text{lp}(l) = ((5+l)^\alpha - 5^\alpha)$),$\alpha$ 通常 0.6~1.0。惩罚后长序列不会被不公平压低,生成长度更合理。
- 实现:每步扩展时,新序列的得分 = 原得分 + log P(token) 再除以长度惩罚因子;比较与排序时用带惩罚的得分。
三、重复抑制(Repetition Suppression)
- 生成易出现重复 n-gram 或整句。重复抑制:对已出现过的 n-gram,在下一步的 logits 上对对应 token 减一个大常数(或置为 $-\infty$),降低再生成的概率;可只禁 2-gram/3-gram 或按阈值禁。
- 其他:no_repeat_ngram_size(Hugging Face)、temperature 与 top-p 也可减轻重复;可组合使用。
- 实现:维护已生成 n-gram 集合,每步在 logits 上 mask 或减去 penalty;注意不要过度抑制导致无法生成合理重复(如「非常非常」)。
面试要点
- 能说清 Beam Search 的流程(每步保留 top-K 序列、扩展、再选 top-K)及与贪心的区别。
- 能说明长度惩罚的动机与常见形式(除以 $l^\alpha$ 或 lp(l));能说明重复抑制的做法(n-gram mask 或 logits 惩罚)。
记忆要点
- Beam Search:每步保留 K 个最优序列并扩展,再选 top-K;长度惩罚=得分/长度因子,避免过短。
- 重复抑制:对已出现 n-gram 在 logits 上减权或 mask;可结合 no_repeat_ngram、temperature。