Liquid AI 发布 Antidoom:修复推理模型的「死循环」问题,只改一个 token 即可,已开源
- Liquid AI 于 2026 年 7 月 7 日发布 Antidoom,用 Final Token Preference Optimization(FTPO)方法专门修复 AI 推理模型的「死循环」,也就是模型反复输出同一句话(比如「Wait, let me reconsider...」)直到耗尽上下文窗口。
- 在 LFM2.5-2.6B 早期检查点上,难度较高的数学 / 代码题的死循环率从 10.2% 降到 1.4%;在 Qwen3.5-4B 上,贪婪采样下从 22.9% 降到 1%。
- 方法只对「引发死循环的那一个 token」做针对性训练,让模型在这个位置更倾向选连贯的替代词,对其余的输出分布几乎不产生扰动。
- 死循环由三个机制共同造成:过训练的高频词(the、So、Wait 等)在模型不确定时被当成保底选项、上文重复会让循环概率一路逼近 1、低温贪婪采样让循环没有退出通道。
- 训练 / 检测 / 生成全套代码已在 GitHub 开源(Liquid4All/antidoom),README 附完整超参数选择指南,同时支持 NVIDIA/CUDA 和 AMD Instinct MI 系列(ROCm)。
AI 也会卡成复读机
Liquid AI 于 2026 年 7 月 7 日发布了 Antidoom,一套专门修复 AI 推理模型「死循环」的训练方法,并在 GitHub 开源了全部代码。
死循环(doom loop)是推理模型很常见的一种翻车方式:模型先吐出一小段话,比如「Wait, let me reconsider...」,然后把这段话一遍又一遍地重复,直到把上下文窗口填满,答案却始终没能出现。越小的推理模型越容易犯,尤其是在长思考链和难题上。
让我重新检查一下这道题第二步的推导。
Wait, let me reconsider...
Wait, let me reconsider...
Wait, let me reconsider...
Wait, let me reconsider...
Wait, let me recons
(上下文窗口被填满,答案再也没能出现)
旧办法为什么治标不治本
在 Antidoom 之前,对付死循环通常走两条路,各有各的短板。
第一条是推理时加 repetition_penalty,临时压低已经出现过的词的概率。它像一块创可贴,不用重新训练,但压得不分青红皂白,可能连正常输出的质量也一起拖下去。第二条是强化学习(RL),能针对性地治循环,代价是要精心设计奖励信号,还要跑昂贵的在线 rollout 采样,成本高。
| 方法 | 怎么做 | 成本 | 副作用 |
|---|---|---|---|
| repetition_penalty | 推理时临时给重复词降权 | 低,不用训练 | 可能拖累正常输出质量 |
| 强化学习(RL) | 用奖励信号重新训练模型 | 高,要调奖励加在线采样 | 奖励设计不好会跑偏 |
| Antidoom | 只训练死循环起点那一个 token | 低,LoRA 加单卡几小时 | 对其余输出几乎无扰动 |
只改一个 token,其余原封不动
Antidoom 把修复范围收到了极致。
它先找到死循环开始的那一个 token,只在这个位置训练模型改选更连贯的替代词,词表里其余部分的概率分布几乎保持原样。整个模型的输出习惯不动,只在那个引发循环的接缝上打一个精确的补丁。
这是一种外科手术式的单点修复。给整个模型重新调参,好比把一整张试卷推倒重批;Antidoom 只在学生反复写错的那一道题旁边做个记号,其余答对的题一个都不碰。改动越小,对模型原有能力的伤害就越小。
死循环哪来的:三股力量叠加
死循环的背后,是三种机制在同时起作用。
机制一:过训练的高频词,撞上模型的不确定
有些词天生就更容易被选中。业界见过的例子有 delve、testament,一种可能是训练里用了合成数据,把这些词的出现频率抬得比人写作时更高。在推理模型里,这类高频词常常是 Wait、Alternatively 这种承上启下、自我反思的词。它们本身不坏,可以标记一次策略转向或一步验证;可一旦模型卡住、拿不准下一步,它们就成了顺手的保底选项,把同一段推理又从头启动一遍。
在 LFM2.5-2.6B 早期检查点上,引发死循环最多的起点词(占全部死循环起点的比例):
机制二:上文会自我强化
前面出现过的序列,会让同样的序列在后面更容易再次出现。每重复一次,这段话里每个 token 被再次选中的概率就往 1 靠近一点,像滚雪球一样越滚越停不下来。Duan 等人的研究把这个现象和一种「V 形」注意力模式联系起来,并发现语义上的重复(模型卡在同一个想法上)会先于字面上的重复出现。
机制三:低温采样没有退出口
推理模型一般用很低的采样温度跑,好让推理过程稳定、可复现。(采样温度控制模型选词时有多敢挑冷门词:温度低,几乎每次都选概率最高的那个词;温度高,更愿意试低概率的词。)温度为 0 时永远选概率最高的词,一个已经被强化的循环就没了出口。理论上调高温度能帮忙,但机制二一旦把循环词的概率顶到接近 1,剩下的词几乎分不到概率,高温也照样卡住,官方数据里 temp=0.67 时仍有明显的循环。温度越低,死循环越严重。
怎么揪出问题 token、又怎么训练它
要治死循环,得先把它变成能训练的数据。
做法是:用一套专门设计来诱发循环的提示集(LiquidAI/antidoom-mix-v1.0),在低温下大量生成模型的输出,再从里面把翻车样本挖出来。一段话重复至少 4 次、且长度至少 60 个字符,才算一个死循环,这两个门槛用来同时避开误判和漏判。找到循环后,锁定第一次重复的第一个 token,把它标成 rejected(不该选的那个)。在这个位置,取模型自己给出的 top-k 候选,滤掉太短或非字母数字的噪声,留最多 20 个合理的替代词当作 chosen(更好的选项)。每一条训练数据就是这样一个三元组:前文、一个 rejected token、一个或多个 chosen token。
≥4 次 / ≥60 字符
rejected
≤20 个 chosen
训练前还要给 rejected 和 chosen 的分布做一次正则化。否则 Wait、So、the 这几个高频词会主导整个训练,而把它们压得太狠,又会反过来拖累模型的推理能力。
DPO、FTPO 都属于「偏好优化」这一类方法。它的做法很特别:给模型看两类样本,一类是「这个别选」(rejected),一类是「这几个更好」(chosen),模型看多了就调整自己的选择倾向,全程不往里灌新知识。就像批改作业时不重讲一遍知识点,只在反复写错的那道题旁边打叉、写上几个更好的答案。
FTPO 和 DPO 差在哪
FTPO(Final Token Preference Optimization)是一种类似 DPO 的偏好优化算法,但它从设计之初就冲着「只动几个 token、尽量不惊动模型其余部分」去。和 DPO 相比有四点不同:
| FTPO 的做法 | 解决什么 |
|---|---|
| 只训练序列末位的那一个 token(一个正在生成途中的序列) | 把改动死死限制在一个位置 |
| 一个样本配多个 chosen 候选 | 把概率分散给一组替代词,避免只把一个高频词换成另一个高频词 |
| 在 logit 空间做 KL 式约束,跳过 softmax | 不给无关的 token 施加梯度压力,别的能力不被带跑偏 |
| 两段式正则化 | 要训的 chosen / rejected 可以动得开,词表其余部分管得更紧 |
练多久、什么时候该收手
这套训练的规模,小得出人意料。
它用 LoRA 做微调(一种给大模型打补丁式的微调,不重训全部参数,只训练一小部分新插入的参数,成本低、对原模型扰动也小),通常只跑一个 epoch。经验上,LoRA 秩设 128 到 256 效果最好:学得更动,副作用更小;训练覆盖全部注意力层、MLP 层,外加 lm_head;学习率大约在 4e-6 到 2e-5 之间。
怎么判断该停?用 chosen_win 做早停判据,它衡量的是在死循环起点位置,模型现在有多大比例更愿意选那些「更好的替代词」,而不是原来那个爱触发循环的词。停在 chosen_win=0.35 左右,通常就能把死循环率从 20-30% 压到 1-2%。练过头反而会在别处制造出新的死循环。
| 超参 | 建议值 | 作用 |
|---|---|---|
| LoRA rank | 128 到 256 | 秩越高学得越动、副作用越小 |
| 学习率 | 4e-6 到 2e-5 | 配合早停防过训 |
| 早停 chosen_win | 0.35 左右 | 到这个值就收手 |
| chosen 候选数 | 最多 20 个 | 把概率分散给一组替代词 |
| 训练轮数 | 通常 1 个 epoch | 练过头会制造新循环 |
| 训练模块 | 全部注意力 / MLP 层 + lm_head | 全层训练效果更好 |
成本有多低?以 LFM2.5-2.6B 早期检查点为例,生成训练集约 1 小时(8 张 MI325 GPU),训练本身约 1 到 2 小时(1 张 MI325 GPU)。生成阶段攒够 2 万对样本就停手。
代码已经开源,你可以自己跑一遍
这套方法完全开源,谁都能照着复现。
生成、检测、FTPO 训练器全套代码都放在了 GitHub(Liquid4All/antidoom),README 里附带完整的超参数选择指南。它用的提示数据集 LiquidAI/antidoom-mix-v1.0 是纯提示词,特意剔除了标准答案、推理过程、隐藏测试和答案标签,作用只是诱发死循环,不教任何新知识。
这意味着任何手里有推理模型的团队,理论上都能拿自己的模型跑一遍同样的流程,不用重新预训练。装好环境后,一行命令就能跑完整的「生成加训练」:
git clone https://github.com/Liquid4All/antidoom cd antidoom uv sync uv run antidoom -c configs/default.yaml -r runs/antidoom1 \ --temp 0.01 \ --model-name LiquidAI/LFM2.5-1.2B-Base
它也不只绑 NVIDIA。Antidoom 同样能在 AMD Instinct MI 系列 GPU(ROCm 环境)上跑,给缺 N 卡的团队留了一条路。
ROCm 环境的两个特殊改动
在 AMD(验证于 MI325 / gfx942)上跑,要单开一个 ROCm 虚拟环境,用 configs/default_amd.yaml。它把 vLLM 的注意力后端换成 TRITON_ATTN(ROCm 默认的注意力内核在 LFM2 上会内存出错),并把优化器换成 adamw_torch(绕开 bitsandbytes,这个依赖在 ROCm 上很难伺候)。
结果:两款模型死循环率都摁到 1% 左右
两款模型训练后,死循环率都被压到了 1% 上下。
LFM2.5-2.6B 早期检查点从 10.2% 降到 1.4%,评测分数全面提升。这个提升完全来自死循环的减少,训练集本身不教任何新的数学或代码知识,它只是搬走了那个一直挡在模型和答案之间的障碍,让它够到自己本来就答得出的题。Qwen3.5-4B 的效果更大,在贪婪采样下从 22.9% 降到 1%,评测分数大幅上扬。
一个意外发现:温度不是越高越聪明
训练还顺带翻出一个反直觉的结果。
业界一直有个说法:推理模型该用较高的采样温度,好让它更大范围地试各种解法。但 Antidoom 训练后的模型,在 temp=1.0 反而表现下降。道理其实不难:训练前,低温区的分数一直被死循环拖着;一旦死循环被清掉,接近贪婪采样的低温区反而分数最高。过去「高温度更好」的经验,很可能只是把死循环在高温下被部分掩盖的效果,误当成了温度本身的好处。
两款模型画出来是同一个模式:训练前,分数在低温区被死循环拉低;训练后,低温区最优,逼近 temp=1 时略有回落。
实践中还可以做多轮 Antidoom。第一轮把爱循环的词压下去后,可能暴露出新的问题:别处的一些 token 现在成了新的循环起点。再跑一轮,专门针对这些新冒头的循环,死循环率还能进一步往下压。
训练集没有教模型任何新的数学或代码知识,它只是移除了那个一直挡着模型、让它够不到自己本就能给出的答案的翻车模式。Liquid AI · Antidoom 博客
- GitHub · Liquid4All/antidoom:生成、检测、FTPO 训练器全套代码
- Hugging Face · LiquidAI/antidoom-mix-v1.0:训练用提示数据集
- Paech et al., 2026 · Antislop:Antidoom 改编的单 token 偏好训练思路来源论文
- Rafailov et al., 2023 · Direct Preference Optimization:FTPO 所基于的 DPO 原始论文
- Duan et al., 2026 · Circular Reasoning:死循环的「V 形」注意力模式研究
- Holtzman et al., 2020 · The Curious Case of Neural Text Degeneration
- Welleck et al., 2020 · Neural Text Generation with Unlikelihood Training
- Pipis et al., 2025 · Wait, Wait, Wait... Why Do Reasoning Models Loop?
AI 推理模型会卡成复读机,过去要重训整个模型,现在只改一个词就能治好
Liquid AI 开源了 Antidoom:只微调死循环起点的那一个词,两款推理模型的死循环率都压到了 1% 左右。一页带图看完。
↓ 一页读完 · 有一张会动的图
推理模型(会像人做题一样"边想边算"、一步步写推导的 AI)有个很常见的翻车方式,叫"死循环"。
它先吐出一小段话,比如"Wait, let me reconsider(等等,我再想想)",然后一遍又一遍地重复这句,答案却始终没能出现。
✘ 一旦卡住,就反复念同一句话停不下来
直到把上下文窗口(模型一次能处理的文字总量上限)烧光也给不出答案,越小的推理模型、越难的题越容易犯
Liquid AI 在 2026 年 7 月 7 日发布并开源了 Antidoom,一套专门修死循环的训练方法。
在它之前只有两条路:推理时加 repetition_penalty(临时给已出现过的词降权的开关),像贴创可贴,容易连正常输出一起拖累;或者用强化学习(用奖惩信号反复训练模型)重练,又贵又难调。Antidoom 换了思路:不动整个模型,只训练"死循环起点的那一个词"。
压重复词压得不分青红皂白,或者重新训练又贵又要精心调奖励。
只改死循环起点那一个词,一张 GPU、几小时搞定,其余输出几乎不受影响。
可只动一个词,怎么就能把毛病治好?得先看死循环到底是怎么来的。
死循环不是随机故障,是三股力量叠加出来的。
①一些高频词(the、So、Wait 这类)在模型卡壳、拿不准下一步时,成了顺手的"保底选项";②每重复一次,这段话再次被选中的概率就往 1 逼近,自我强化;③推理常用低温采样(几乎每次都挑概率最高的那个词),循环一旦形成就没有退出口。Antidoom 做的,就是找到把整段话带进循环的那第一个词,只把它这一格的概率重新训练,分给几个更连贯的替代词,其余几万个词原样不动。
想象小互让模型解一道难数学题,它已经把"Wait"重复了十几遍、上下文快烧光了:
换成普通人有感的说法:跑 100 道难题,会卡进死循环、白白烧光算力的题数。
Wait, let me reconsider…
Wait, let me reconsider…
Wait, let me recons,
又贵又慢…
- × repetition_penalty:像创可贴,连正常输出一起拖累
- × 强化学习:又贵,还要精心调奖励
只改一个词
就能好?
被顶到接近满格
→ 1%
→1.4%
代码还全开源
"重训整个模型"
降成"改一个词"
