土法炼钢兴趣小组的算法知识备份

【Transformer 与注意力机制】59|推理退化:乱码、死循环与无意义文本为何不是同一种 bug

文章导航

分类入口
transformer
标签入口
#transformer#attention#degeneration#decoding#causal-mask#kv-cache#numerical-stability#repetition

Transformer系列导航

按系列顺序继续阅读,而不是停在单篇。

系列目录上一篇:【Transformer 与注意力机制】58|后 Transformer 时代:架构会消失还是会进化

目录

用过 ChatGPT、Claude 或本地部署开源模型的人,多半见过:模型忽然把同一个词或同一句话无限循环;或者突然吐出控制字符、乱码、纯数字串;更糟时输出空掉、截断,像「死」在某一步。这些现象常被笼统叫成退化(degeneration)、文本循环或模型崩溃。若只当成「模型质量差」或「prompt 写坏了」,线上排查就会走偏——三种常见形态往往不是同一种 bug,触发条件、观测信号和止血手段都不一样。

本篇讨论的是推理阶段:权重已固定,只做前向。训练时的 loss spike / NaN 见 36|训练稳定性。解码旋钮本身(temperature、top-p、重复惩罚如何改分布)见 48|从 logits 到文本;KV 显存与驱逐见 49|KV Cache。本篇钉住故障机制:注意力与自回归如何把小偏差锁死,数值路径如何把半崩变成乱码,以及生产上如何分层防御。

本篇能让你学会三件事:

  1. 如何用输出形态与中间信号区分死循环、乱码、无意义数字三类退化;
  2. Softmax 马太效应、Attention Sink、Causal Mask、KV Cache 污染各自扮演什么角色;
  3. 架构 / 数值 / 解码 / 运行时四层防线分别挡住哪一类事故,以及仍未解决的开放问题。

一、先分清三种形态:不是同一种 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 上的高发路径

  1. 长序列下 \(QK^\top\) 累积(\(\sqrt{d_k}\) 缩放在极端值下仍可能不够);
  2. softmax 前指数:即便有减 max 技巧,中间态仍可能触顶;
  3. 残差流尺度失控(见 24|残差连接);
  4. 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 外推修正(见 4143 远历史污染、长窗口外推失稳
数值 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 / 线性注意力改变状态更新方式(见 5657),可能减弱「对全部历史 K 做 softmax」式的雪崩,但若仍是自回归 token 生成,似然偏置与采样锁死是否以新形式出现,公开对照仍不完整。不宜把「换骨干」宣传成退化消失。


八、关键概念回顾


九、常见误解

9.1 「退化说明模型没训好」

推理退化可在训练曲线漂亮的 checkpoint 上触发。它是自回归结构与数值路径的脆弱性,不是「没训够」的同义词。

9.2 「调高 temperature 就能解决循环」

可能打断循环,也可能推高乱码概率。形态不同,旋钮方向可能相反。

9.3 「换更大模型就不会退化」

规模往往推迟触发点,不取消机制。量化、超长上下文、极端解码参数下,大模型一样崩。

9.4 「刷新 cache 是玄学运维」

裁剪污染后缀等于复位被正反馈使用的状态;与 49 篇的显存管理是同一状态对象的两面操作。


十、下一步

本篇从单次推理故障收束了系列后半的质量事故面。若要从系统边界看架构会如何演化,回到 58|后 Transformer 时代;若要从头建立注意力与训练主线,回到 系列首页


十一、参考文献

  1. Holtzman, A. et al. “The Curious Case of Neural Text Degeneration.” ICLR 2020. 开放生成退化与 nucleus sampling。
  2. Xiao, G. et al. “Efficient Streaming Language Models with Attention Sinks.” ICLR 2024(arXiv:2309.17453). Attention sink 与 StreamingLLM。
  3. Keskar, N. S. et al. “CTRL: A Conditional Transformer Language Model for Controllable Generation.” arXiv:1909.05858, 2019. Repetition penalty;预印本。
  4. Zhang, H. et al. “Trading Off Diversity and Quality in Natural Language Generation.” HumEval 2021. 质量–多样性与似然陷阱相关讨论。
  5. Zhang, Z. et al. “H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models.” NeurIPS 2023. KV 驱逐与 heavy hitter。
  6. Dao, T. et al. “FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness.” NeurIPS 2022. Online softmax 与数值路径。
  7. Beltagy, I. et al. “Longformer: The Long-Document Transformer.” arXiv:2004.05150, 2020. 滑动窗口注意力;预印本。
  8. Vaswani, A. et al. “Attention Is All You Need.” NeurIPS 2017.

← 上一篇:58|后 Transformer 时代 | 系列首页:Transformer 与注意力机制 系列总览

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-15 · transformer

【Transformer 与注意力机制】系列总览

从《Attention Is All You Need》出发把 Transformer 注意力机制、Q/K/V、多头注意力、位置编码、Causal Mask、Softmax、FFN、训练范式、模型变体、推理工程、可解释性、未来架构以及推理退化防御串成 59 篇深度博客。

2026-04-15 · transformer

【Transformer 与注意力机制】17|Causal Mask:让模型只看过去不看未来

自回归语言模型的核心约束是:预测 t 时刻只能用 t 之前的信息。Causal Mask 用一个上三角的 -∞ 矩阵让 softmax 之后未来位置的权重恒为零,使得模型在训练时能并行计算所有时间步、推理时严格自回归。本文从 teacher forcing 到 attention sink,把 causal mask 在训练、推理、长上下文中的所有面相讲清楚。

2026-08-08 · transformer

【Transformer 与注意力机制】42|FlashAttention:注意力计算的硬件级重写

FlashAttention 的关键不是近似注意力,也不是把公式改掉,而是重新安排标准 attention 在 GPU 内存层级里的计算路径。本文解释为什么标准 attention 的瓶颈常常是 HBM 读写,FlashAttention 如何用 tiling 和 online softmax 避免物化完整注意力矩阵,以及它为什么省显存、提吞吐,却没有消除 O(n²) 的根本复杂度。

2026-08-06 · transformer

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

语言模型每一步只输出一组 logits,真正决定输出哪个 token 的是解码策略。本文从 softmax 与 temperature 的几何直觉出发,讲清贪心、Beam Search 为何在开放生成中显得枯燥重复,top-k/top-p/min-p 叠加时的组合陷阱,以及重复惩罚、presence/frequency penalty 对专有名词和代码的副作用,并给出采样是否掩盖模型校准问题的学界争论。


By .