用过 ChatGPT、Claude 或本地部署开源模型的人,多半见过:模型忽然把同一个词或同一句话无限循环;或者突然吐出控制字符、乱码、纯数字串;更糟时输出空掉、截断,像「死」在某一步。这些现象常被笼统叫成退化(degeneration)、文本循环或模型崩溃。若只当成「模型质量差」或「prompt 写坏了」,线上排查就会走偏——三种常见形态往往不是同一种 bug,触发条件、观测信号和止血手段都不一样。
本篇讨论的是推理阶段:权重已固定,只做前向。训练时的 loss spike / NaN 见 36|训练稳定性。解码旋钮本身(temperature、top-p、重复惩罚如何改分布)见 48|从 logits 到文本;KV 显存与驱逐见 49|KV Cache。本篇钉住故障机制:注意力与自回归如何把小偏差锁死,数值路径如何把半崩变成乱码,以及生产上如何分层防御。
本篇能让你学会三件事:
- 如何用输出形态与中间信号区分死循环、乱码、无意义数字三类退化;
- Softmax 马太效应、Attention Sink、Causal Mask、KV Cache 污染各自扮演什么角色;
- 架构 / 数值 / 解码 / 运行时四层防线分别挡住哪一类事故,以及仍未解决的开放问题。
一、先分清三种形态:不是同一种 bug
线上排障第一件事不是调 temperature,而是分类。混用止血手段会互相打架:抬高温度可能打断循环,却抬高误入词表边缘的概率。
| 形态 | 用户可见症状 | 常见触发 | 更贴近的机制层 | 优先止血 |
|---|---|---|---|---|
| 死循环 / 短语重复 | 同一 token、同一句、同一 n-gram 反复出现 | 贪心或极低温度;长生成;已出现过重复片段 | 条件概率偏置 + 注意力对重复 K/V 的正反馈 | 重复惩罚 / no-repeat-ngram;换采样;截断最近污染段 |
| 乱码 / 控制字符 | 不可打印字符、怪异 Unicode、空输出 | FP16 长上下文;激进量化;logits 已含 Inf/NaN | 数值溢出扩散 → 无效分布 → 误入词表边缘 | FP32 保护敏感算子;降量化强度;黑名单过滤;必要时重启请求 |
| 无意义数字 / 碎片串 | 长数字、碎片 token、语义真空却仍「像在说话」 | 误入训练中极少作为连贯文本出现的 token 区;污染 cache 后无法自拔 | 边缘 token 的 embedding / K、V 缺乏有用结构 | Early stop;裁剪上下文;强制 EOS;检查词表过滤 |
Holtzman 等人(The Curious Case of Neural Text Degeneration, ICLR 2020)系统刻画的是开放生成下似然最大化带来的重复与乏味——主要对应上表第一行,以及「语义兜圈」这种软退化。乱码与 NaN 路径更多是数值工程与实现细节,不在他们的主实验里,但生产里必须和第一类并列处理。
二、注意力坍塌:Softmax 马太效应、Sink 与 Causal Mask
正常时:
\[ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}+M\right)V \]
\(M\) 为 Causal Mask(未来位置为 \(-\infty\))。退化时,这条链上的每一步都可以把微弱偏差放大。
Softmax 的赢家通吃
设两个 logit 差为 \(\Delta\)。\(\Delta\) 稍大时,softmax 几乎把质量集中在最大值上——这是指数函数的性质,不是实现 bug。单步里「注意力略集中」往往无害;危险在于自回归把本步输出写进下一步上下文,偏差被循环使用。
Attention Sink:泄洪区如何变成锁点
Xiao 等人(StreamingLLM,ICLR 2024,arXiv:2309.17453)表明:模型常把不成比例的注意力质量分给序列开头少数 token(如 BOS),即使语义上对当前预测贡献很小——这些位置充当注意力泄洪区(attention sink)。长上下文下有效语义权重被稀释时,模型更依赖 sink 与最近若干 token。若最近片段已进入重复模式,注意力更容易被钉在该模式上。这与 49|KV Cache 里驱逐策略「必须保留 sink」的工程事实是同一现象的两面:sink 对稳定性有用,也对「一旦污染就难脱困」负责。
Causal Mask 切断退路
Causal Mask 禁止看未来。过去一旦被重复或乱码污染,当前 \(Q\) 只能对着已经坏掉的历史 \(K\) 打分,无法靠「向前看」纠错。它不是退化的唯一原因,却是正反馈得以锁死的结构条件——退路在架构上被关掉了。细节见 17|Causal Mask。
三、死循环:概率偏置如何变成注意力雪崩
解码层:贪心把偏差锁成路径
Holtzman et al.(ICLR 2020)指出:自然语言中真实连续重复并不常见,但模型条件分布仍可能给「再来一个相同 token」不低的质量;贪心只要它是 \(\arg\max\) 就会选中。选中后上下文变成「……\(w\ w\)」,继续重复的概率往往更高。采样有机会绕开,贪心没有回头路。策略层旋钮与组合陷阱见 48;这里只钉故障面:贪心是放大器,不是根因的全部。
注意力层:重复 K/V 的自我加速
\(w\) 被反复写入后,KV Cache 里堆积高度相似的 \(K_w\)。下一步 \(Q\) 与这些 \(K\) 的点积集中,softmax 后最近重复位置占压倒权重,其他语义被淹没——于是继续输出 \(w\)。经验上,从「还像人话」到「不可逆循环」可以发生在很少几个 token 内,因为有效信息占比在指数下降。
重复惩罚为何有效、又为何伤代码
Keskar 等人在 CTRL(arXiv:1909.05858, 2019)引入 repetition penalty:对已出现 token 的 logit 按 \(\theta>1\) 缩放,打断「重复仍是 \(\arg\max\)」的条件。\(\theta\) 过大则专有名词、变量名、JSON key 等应该重复的内容也被打压——这是 48 已写清的副作用;排障时不要把「禁重复」当成万能开关。
四、乱码:数值溢出如何把半崩变成词表真空
死循环至少还在可读字符集里打转。乱码通常意味着数值路径已经失守:Inf/NaN 沿 residual 与后续层扩散,最终 logits 无效,采样掉进训练中极少作为连贯文本出现的区域(控制字符、碎片字节、怪异 Unicode)。
FP16 上的高发路径
- 长序列下 \(QK^\top\) 累积(\(\sqrt{d_k}\) 缩放在极端值下仍可能不够);
- softmax 前指数:即便有减 max 技巧,中间态仍可能触顶;
- 残差流尺度失控(见 24|残差连接);
- Cache 中已接近边界的 \(K/V\) 被反复点积。
FlashAttention(Dao et al., NeurIPS 2022)的 online softmax 在 I/O 优化之外也改善了分块路径上的数值习性,但它不消灭架构层的正反馈,也不能替代「敏感算子保 FP32」这类工程护栏。见 42|FlashAttention。
量化为何更脆
INT4/INT8 在正常请求上往往可用,但量化噪声进 KV Cache 后与注意力正反馈叠加,会更快逼近阈值——尤其是长上下文与开放域闲聊。这不是「量化一定坏」,而是安全边界变窄:同一套解码参数,全精度能撑住的长度,量化可能先崩。压缩与评测陷阱见 51|量化、蒸馏、剪枝。
为何「刷新 KV Cache / 裁掉最近一段」常常有效
污染一旦写入 cache,后续每一步都在读脏历史。裁剪疑似污染后缀、丢弃对应 block、必要时整段请求重来,等于切断正反馈的状态载体——这不是玄学,而是状态机复位。与 49 篇驱逐/分页管理互补:那里讲怎么省显存,这里讲脏了怎么扔。
五、无意义数字与语义兜圈:软退化
还有一类输出「看起来像在生成」,但信息增量接近零:长数字串、模板化废话、同一语义换皮循环。它可能尚未触发 Inf,也未形成严格 token 级死循环,却已经掉进似然陷阱(Holtzman;以及 Zhang et al., HumEval 2021 对质量–多样性的讨论,见 48 篇)。排障上要单独建信号:重复率、窗口内熵、n-gram 新颖度、工具调用场景下的 schema 违反率——只盯「有没有乱码」会漏掉这类事故。
六、分层防线:每一层挡哪一类
| 层级 | 手段 | 主要挡住 |
|---|---|---|
| 架构 | 显式 sink、滑动窗口 / 局部注意力、RoPE 外推修正(见 41、43) | 远历史污染、长窗口外推失稳 |
| 数值 | Softmax/Norm 走 FP32;激活裁剪;避免无保护的激进低精度 | 乱码 / NaN 扩散 |
| 解码 | 重复惩罚、no-repeat-ngram、logits 黑名单、动态 early stop、按任务分温度 | 死循环;边缘 token 泄漏 |
| 运行时 | 监控重复率/熵;裁剪污染段;摘要压缩历史;请求级熔断 | Cache 污染后的持续恶化 |
没有一层能单独「根治」。自回归 + causal 可见性决定了这是概率事故,系统要做的是降低到达不可恢复吸引子的速率,并在到达后可检测、可中止、可恢复。
七、争论与开放问题
争论:退化主要是解码问题,还是表示/注意力问题?
Holtzman 路线强调似然目标与解码规则(贪心 /
beam)如何把偏差锁死;StreamingLLM / H2O
路线强调注意力质量分配与历史状态管理。两边证据都成立,但适用形态不同:死循环往往两边同时点火;乱码则经常是数值层先破防。把全部责任推给「调采样」或全部推给「换架构」,都会漏诊。
开放问题一:能否在 token
级给出可校准的「即将死循环」预警?
重复率与熵是事后或滞后信号。是否存在稳定的中间激活指标(例如对
sink 的质量占比、对最近重复 token 的注意力质量)能在锁死前
2–3 步告警,并在跨模型族上可迁移,仍缺系统公开基准。
开放问题二:量化 + 长上下文 +
连续批处理下的联合失效面。
三条分别有文献与工程经验,但「低精度 KV + 高并发 paging +
开放采样」的联合误差界几乎只靠逐场景试错。这直接决定默认服务配置能否激进。
开放问题三:非 Transformer
主干是否只是推迟退化?
SSM / 线性注意力改变状态更新方式(见 56、57),可能减弱「对全部历史
K 做 softmax」式的雪崩,但若仍是自回归 token
生成,似然偏置与采样锁死是否以新形式出现,公开对照仍不完整。不宜把「换骨干」宣传成退化消失。
八、关键概念回顾
- 三种形态:死循环、乱码/控制字符、无意义数字或语义兜圈——机制与止血不同。
- Attention Sink:开头少数位置吸收过量注意力;稳流式需要它,也被污染时难脱困。
- Softmax 马太效应:微小 logit 优势被指数放大。
- KV Cache 污染:坏 token 的 K/V 持续毒化后续步。
- 数值破防:Inf/NaN → 无效分布 → 词表边缘。
- 分层防线:架构 / 数值 / 解码 / 运行时,缺一不可。
九、常见误解
9.1 「退化说明模型没训好」
推理退化可在训练曲线漂亮的 checkpoint 上触发。它是自回归结构与数值路径的脆弱性,不是「没训够」的同义词。
9.2 「调高 temperature 就能解决循环」
可能打断循环,也可能推高乱码概率。形态不同,旋钮方向可能相反。
9.3 「换更大模型就不会退化」
规模往往推迟触发点,不取消机制。量化、超长上下文、极端解码参数下,大模型一样崩。
9.4 「刷新 cache 是玄学运维」
裁剪污染后缀等于复位被正反馈使用的状态;与 49 篇的显存管理是同一状态对象的两面操作。
十、下一步
本篇从单次推理故障收束了系列后半的质量事故面。若要从系统边界看架构会如何演化,回到 58|后 Transformer 时代;若要从头建立注意力与训练主线,回到 系列首页。
十一、参考文献
- Holtzman, A. et al. “The Curious Case of Neural Text Degeneration.” ICLR 2020. 开放生成退化与 nucleus sampling。
- Xiao, G. et al. “Efficient Streaming Language Models with Attention Sinks.” ICLR 2024(arXiv:2309.17453). Attention sink 与 StreamingLLM。
- Keskar, N. S. et al. “CTRL: A Conditional Transformer Language Model for Controllable Generation.” arXiv:1909.05858, 2019. Repetition penalty;预印本。
- Zhang, H. et al. “Trading Off Diversity and Quality in Natural Language Generation.” HumEval 2021. 质量–多样性与似然陷阱相关讨论。
- Zhang, Z. et al. “H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models.” NeurIPS 2023. KV 驱逐与 heavy hitter。
- Dao, T. et al. “FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness.” NeurIPS 2022. Online softmax 与数值路径。
- Beltagy, I. et al. “Longformer: The Long-Document Transformer.” arXiv:2004.05150, 2020. 滑动窗口注意力;预印本。
- Vaswani, A. et al. “Attention Is All You Need.” NeurIPS 2017.
← 上一篇:58|后 Transformer 时代 | 系列首页:Transformer 与注意力机制 系列总览 →
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Transformer 与注意力机制】系列总览
从《Attention Is All You Need》出发把 Transformer 注意力机制、Q/K/V、多头注意力、位置编码、Causal Mask、Softmax、FFN、训练范式、模型变体、推理工程、可解释性、未来架构以及推理退化防御串成 59 篇深度博客。
【Transformer 与注意力机制】17|Causal Mask:让模型只看过去不看未来
自回归语言模型的核心约束是:预测 t 时刻只能用 t 之前的信息。Causal Mask 用一个上三角的 -∞ 矩阵让 softmax 之后未来位置的权重恒为零,使得模型在训练时能并行计算所有时间步、推理时严格自回归。本文从 teacher forcing 到 attention sink,把 causal mask 在训练、推理、长上下文中的所有面相讲清楚。
【Transformer 与注意力机制】42|FlashAttention:注意力计算的硬件级重写
FlashAttention 的关键不是近似注意力,也不是把公式改掉,而是重新安排标准 attention 在 GPU 内存层级里的计算路径。本文解释为什么标准 attention 的瓶颈常常是 HBM 读写,FlashAttention 如何用 tiling 和 online softmax 避免物化完整注意力矩阵,以及它为什么省显存、提吞吐,却没有消除 O(n²) 的根本复杂度。
【Transformer 与注意力机制】48|从 logits 到文本:解码策略是决策层,不是收尾细节
语言模型每一步只输出一组 logits,真正决定输出哪个 token 的是解码策略。本文从 softmax 与 temperature 的几何直觉出发,讲清贪心、Beam Search 为何在开放生成中显得枯燥重复,top-k/top-p/min-p 叠加时的组合陷阱,以及重复惩罚、presence/frequency penalty 对专有名词和代码的副作用,并给出采样是否掩盖模型校准问题的学界争论。