【Transformer 与注意力机制】48|从 logits 到文本:解码策略是决策层,不是收尾细节

💡 原文中文,约13200字,阅读约需32分钟。
📝

内容提要

本文探讨大语言模型解码策略,指出在相同模型权重下,贪心、Beam Search、temperature、top-k/top-p/min-p及重复惩罚等参数显著影响输出质量、风格与幻觉风险。文章分析各策略的几何直觉、失效条件及组合陷阱,强调高似然不等于高质量,并讨论重复惩罚对专有名词和代码的副作用,以及解码算法评测缺乏统一标准的问题。

🔎

延伸解读

解码策略是产品决策,不是默认参数

文章强调,在模型权重固定后,解码策略的选择直接决定了同一个模型在不同任务上的表现。生产系统中,代码生成、JSON输出等任务通常采用低随机性甚至贪心解码,而创意写作、闲聊则需要采样或调高temperature。这意味着解码参数不是可以随意调整的默认值,而是需要根据任务目标和失败模式(如重复、幻觉、格式跑飞)进行针对性配置的决策层。

高似然不等于高质量:似然陷阱的启示

文章指出,贪心和Beam Search在开放生成中常导致重复、乏味的文本,即使其困惑度低于人类文本。这被称为“似然陷阱”:高似然序列并不一定符合人类对高质量的判断。因此,在评估解码策略时,不能仅依赖困惑度等自动指标,而应结合人类评测,并意识到训练目标与真实需求之间可能存在缺口。

重复惩罚的副作用:专有名词与代码

重复惩罚(如repetition penalty、frequency penalty)虽能缓解重复,但会无差别地惩罚所有重复出现的token,包括专有名词、术语和代码中必要的重复结构。这可能导致指代不清、编造替代表述,甚至破坏代码可运行性。因此,在代码生成或专有名词密集的任务中,应谨慎使用或调低这些惩罚系数,或改用只作用于连续片段的机制(如no-repeat-ngram)。

框架差异:同参数不同结果

文章指出,不同推理框架对temperature缩放和top-k/top-p截断的应用顺序可能不同,导致相同的参数值在不同框架下产生不同的采样分布。例如,vLLM先缩放后截断,而Hugging Face Transformers先截断后缩放。这意味着在切换服务框架时,即使参数相同,生成行为也可能不一致,排查风格变化时需先确认解码库的处理顺序。

Q&A

为什么贪心解码在开放生成中容易产生重复文本?

贪心解码每一步选择当前概率最高的token,将局部最优当作全局目标。由于训练数据中存在少量真实重复,模型对连续重复的条件概率并不总是很低,一旦某步选中某个词,后续重复的概率会被抬高,形成正反馈回路,最终导致重复、枯燥的文本。

Beam Search 在机器翻译中表现良好,但在开放生成中为何显得枯燥?

Beam Search 在机器翻译中有效是因为翻译任务有明确的源句约束,高概率路径通常对应好翻译。但在开放生成中,好文本的概率分散在多种合理表达中,Beam Search 倾向于找到高似然但重复、信息密度均匀的序列,导致枯燥。Meister 等人指出 Beam Search 隐式优化均匀信息密度(UID),这种偏好翻译中有利,但开放生成中无益。

top-p 采样和 top-k 采样有什么区别?为什么 top-p 更适合自然语言生成?

top-k 固定保留概率最高的 k 个 token,不随分布形状变化;top-p 保留累计概率达到阈值 p 的最小 token 集合,集合大小随分布自动伸缩。自然语言中不同上下文的合理候选数量不同,top-p 能适应这种变化,分布尖锐时接近贪心,平坦时接近均匀采样,因此更适合自然语言生成。

min-p 采样是如何工作的?它解决了 top-p 的什么问题?

min-p 采样设置阈值为最高概率 token 概率的 p_base 倍,只保留概率不低于该阈值的 token。它根据模型置信度动态调整候选集合大小:置信度高时集合收紧,置信度低时放宽。这解决了 top-p 在高温下分布被拉平后可能纳入过多长尾 token 的问题,在高 temperature 下能同时改善质量和多样性。

同时使用 temperature 和 top-p 时,不同推理框架的处理顺序不同会带来什么影响?

不同框架对 temperature 缩放和 top-p 截断的应用顺序可能不同,导致相同参数下实际采样分布不同。例如 vLLM 先做 temperature 缩放再截断,而 Hugging Face Transformers 先截断再缩放。先截断再升温会在原始分布上选候选,范围较窄;先升温再截断会在拉平后的分布上选,范围更宽,纳入更多长尾 token。因此同一套参数在不同框架下行为不等价,排查风格变化时需检查解码库顺序。

重复惩罚(repetition penalty)和 presence/frequency penalty 分别如何工作?它们有什么副作用?

重复惩罚通过将已出现 token 的 logit 除以系数 θ 来降低其概率;presence penalty 对出现过的 token 一次性扣分,frequency penalty 按出现次数线性扣分。它们能缓解重复,但会伤害专有名词和代码中必要的重复,导致指代不清或代码错误。OpenAI 文档也指出系数过大会显著损害样本质量,建议代码任务中调低或关闭。

为什么高似然序列不一定高质量?有哪些解释?

高似然序列不一定高质量,因为模型训练目标(最大似然)与人类偏好存在差距。有三种解释:一是序列级分布扩散,模型将概率分散在大量假设上;二是隐藏的搜索偏好,如 Beam Search 隐式优化 UID;三是训练目标本身有问题,标准似然训练给重复和高频词过高概率。这些解释指向不同的修复路径。

目前解码算法的评测存在哪些困难?

目前缺乏统一指标来比较解码算法,困惑度、BLEU 和人类评分在不同区间排名不一致。困惑度衡量模型自身打分,与人类偏好关系存疑;人类评测成本高、主观性强,难以复现。开放生成中“好文本”没有唯一定义,导致评测协议仍在演化。

🏷️

标签

➡️

继续阅读