Liquid AI 发布 Antidoom:修复推理模型的「死循环」问题,只改一个 token 即可,已开源

只微调死循环起点的那一个 token,两款模型的死循环率都被压到了 1% 左右。
作者:Liquid AI07-08 · 8 分钟⚑ 研究论文
🎧 听播客版0:00 / --:--
0:00 / --:--
研究解读 · 小互解读
速览
  • 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)。
⚑立场提示:本文解读的是 Liquid AI 官方发布的博客与开源项目。文中的死循环率、评测提升等数字均为厂商自评,目前尚无第三方独立复现。
1什么是死循环

AI 也会卡成复读机

Liquid AI 于 2026 年 7 月 7 日发布了 Antidoom,一套专门修复 AI 推理模型「死循环」的训练方法,并在 GitHub 开源了全部代码。

死循环(doom loop)是推理模型很常见的一种翻车方式:模型先吐出一小段话,比如「Wait, let me reconsider...」,然后把这段话一遍又一遍地重复,直到把上下文窗口填满,答案却始终没能出现。越小的推理模型越容易犯,尤其是在长思考链和难题上。

reasoning trace · 难题推理中

让我重新检查一下这道题第二步的推导。

Wait, let me reconsider...

Wait, let me reconsider...

Wait, let me reconsider...

Wait, let me reconsider...

Wait, let me recons

(上下文窗口被填满,答案再也没能出现)

在一道数学题或一段代码上卡住时,模型就这样反复念同一句话停不下来,宝贵的上下文全耗在原地打转。Antidoom 要修的就是这个毛病。
📊官方数据:LFM2.5-2.6B 早期检查点在难题上的死循环率从 10.2% 降到 1.4%;Qwen3.5-4B 在贪婪采样下从 22.9% 降到 1%。Liquid AI 称这套方法最高能把死循环率砍掉 九成。
2现有方案

旧办法为什么治标不治本

在 Antidoom 之前,对付死循环通常走两条路,各有各的短板。

第一条是推理时加 repetition_penalty,临时压低已经出现过的词的概率。它像一块创可贴,不用重新训练,但压得不分青红皂白,可能连正常输出的质量也一起拖下去。第二条是强化学习(RL),能针对性地治循环,代价是要精心设计奖励信号,还要跑昂贵的在线 rollout 采样,成本高。

方法怎么做成本副作用
repetition_penalty推理时临时给重复词降权低,不用训练可能拖累正常输出质量
强化学习(RL)用奖励信号重新训练模型高,要调奖励加在线采样奖励设计不好会跑偏
Antidoom只训练死循环起点那一个 token低,LoRA 加单卡几小时对其余输出几乎无扰动
3核心思路

只改一个 token,其余原封不动

Antidoom 把修复范围收到了极致。

它先找到死循环开始的那一个 token,只在这个位置训练模型改选更连贯的替代词,词表里其余部分的概率分布几乎保持原样。整个模型的输出习惯不动,只在那个引发循环的接缝上打一个精确的补丁。

核心创新

这是一种外科手术式的单点修复。给整个模型重新调参,好比把一整张试卷推倒重批;Antidoom 只在学生反复写错的那一道题旁边做个记号,其余答对的题一个都不碰。改动越小,对模型原有能力的伤害就越小。

只重新训练这一格
一整条代表模型对下一个词的概率分布。Antidoom 只重新训练高亮的这一格(引发死循环的 token),其余几十格原样不动。
4成因拆解

死循环哪来的:三股力量叠加

死循环的背后,是三种机制在同时起作用。

机制一:过训练的高频词,撞上模型的不确定

有些词天生就更容易被选中。业界见过的例子有 delve、testament,一种可能是训练里用了合成数据,把这些词的出现频率抬得比人写作时更高。在推理模型里,这类高频词常常是 Wait、Alternatively 这种承上启下、自我反思的词。它们本身不坏,可以标记一次策略转向或一步验证;可一旦模型卡住、拿不准下一步,它们就成了顺手的保底选项,把同一段推理又从头启动一遍。

在 LFM2.5-2.6B 早期检查点上,引发死循环最多的起点词(占全部死循环起点的比例):

' the'
11.39%
' So'
4.51%
'Alternatively'
3.22%
'Wait'
2.56%
' But'
2.46%

机制二:上文会自我强化

前面出现过的序列,会让同样的序列在后面更容易再次出现。每重复一次,这段话里每个 token 被再次选中的概率就往 1 靠近一点,像滚雪球一样越滚越停不下来。Duan 等人的研究把这个现象和一种「V 形」注意力模式联系起来,并发现语义上的重复(模型卡在同一个想法上)会先于字面上的重复出现。

循环里每个 token 的概率随重复次数逼近 1
循环里每个 token 被再次选中的概率,随重复次数一路爬向 1,形成自我强化。图源:Liquid AI

机制三:低温采样没有退出口

推理模型一般用很低的采样温度跑,好让推理过程稳定、可复现。(采样温度控制模型选词时有多敢挑冷门词:温度低,几乎每次都选概率最高的那个词;温度高,更愿意试低概率的词。)温度为 0 时永远选概率最高的词,一个已经被强化的循环就没了出口。理论上调高温度能帮忙,但机制二一旦把循环词的概率顶到接近 1,剩下的词几乎分不到概率,高温也照样卡住,官方数据里 temp=0.67 时仍有明显的循环。温度越低,死循环越严重。

5数据与训练

怎么揪出问题 token、又怎么训练它

要治死循环,得先把它变成能训练的数据。

做法是:用一套专门设计来诱发循环的提示集(LiquidAI/antidoom-mix-v1.0),在低温下大量生成模型的输出,再从里面把翻车样本挖出来。一段话重复至少 4 次、且长度至少 60 个字符,才算一个死循环,这两个门槛用来同时避开误判和漏判。找到循环后,锁定第一次重复的第一个 token,把它标成 rejected(不该选的那个)。在这个位置,取模型自己给出的 top-k 候选,滤掉太短或非字母数字的噪声,留最多 20 个合理的替代词当作 chosen(更好的选项)。每一条训练数据就是这样一个三元组:前文、一个 rejected token、一个或多个 chosen token。

低温大量生成
→
检测循环
≥4 次 / ≥60 字符
→
标记起点 token
rejected
→
挑替代候选
≤20 个 chosen
→
正则化分布
→
FTPO 训练 LoRA
→
视情况再跑一轮
死循环训练数据样例
死循环训练数据的样例:从翻车的输出里定位到第一次重复的起点 token,标为 rejected。图源:Liquid AI

训练前还要给 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 可以动得开,词表其余部分管得更紧
6训练规模

练多久、什么时候该收手

这套训练的规模,小得出人意料。

它用 LoRA 做微调(一种给大模型打补丁式的微调,不重训全部参数,只训练一小部分新插入的参数,成本低、对原模型扰动也小),通常只跑一个 epoch。经验上,LoRA 秩设 128 到 256 效果最好:学得更动,副作用更小;训练覆盖全部注意力层、MLP 层,外加 lm_head;学习率大约在 4e-6 到 2e-5 之间。

怎么判断该停?用 chosen_win 做早停判据,它衡量的是在死循环起点位置,模型现在有多大比例更愿意选那些「更好的替代词」,而不是原来那个爱触发循环的词。停在 chosen_win=0.35 左右,通常就能把死循环率从 20-30% 压到 1-2%。练过头反而会在别处制造出新的死循环。

128-256
效果最好的 LoRA 秩区间
0.35
早停判据 chosen_win,到这就收手
≤20
每个起点最多保留的替代候选词
1-2 小时
单张 MI325 GPU 上的 FTPO 训练耗时
超参建议值作用
LoRA rank128 到 256秩越高学得越动、副作用越小
学习率4e-6 到 2e-5配合早停防过训
早停 chosen_win0.35 左右到这个值就收手
chosen 候选数最多 20 个把概率分散给一组替代词
训练轮数通常 1 个 epoch练过头会制造新循环
训练模块全部注意力 / MLP 层 + lm_head全层训练效果更好

成本有多低?以 LFM2.5-2.6B 早期检查点为例,生成训练集约 1 小时(8 张 MI325 GPU),训练本身约 1 到 2 小时(1 张 MI325 GPU)。生成阶段攒够 2 万对样本就停手。

7开源复现

代码已经开源,你可以自己跑一遍

这套方法完全开源,谁都能照着复现。

生成、检测、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 上很难伺候)。

8效果数据

结果:两款模型死循环率都摁到 1% 左右

两款模型训练后,死循环率都被压到了 1% 上下。

LFM2.5-2.6B 早期检查点从 10.2% 降到 1.4%,评测分数全面提升。这个提升完全来自死循环的减少,训练集本身不教任何新的数学或代码知识,它只是搬走了那个一直挡在模型和答案之间的障碍,让它够到自己本来就答得出的题。Qwen3.5-4B 的效果更大,在贪婪采样下从 22.9% 降到 1%,评测分数大幅上扬。

LFM2.5-2.6B 早期检查点
训练前
10.2%
训练后
1.4%
Qwen3.5-4B(贪婪采样)
训练前
22.9%
训练后
1%
死循环率,越低越好。四根柱子按同一比例尺缩放。
训练前后的死循环率对比
训练前后的死循环率对比。图源:Liquid AI
9反直觉发现

一个意外发现:温度不是越高越聪明

训练还顺带翻出一个反直觉的结果。

业界一直有个说法:推理模型该用较高的采样温度,好让它更大范围地试各种解法。但 Antidoom 训练后的模型,在 temp=1.0 反而表现下降。道理其实不难:训练前,低温区的分数一直被死循环拖着;一旦死循环被清掉,接近贪婪采样的低温区反而分数最高。过去「高温度更好」的经验,很可能只是把死循环在高温下被部分掩盖的效果,误当成了温度本身的好处。

低温(接近贪婪) temp=1.0 采样温度 → 评测分数 → 训练前 训练后
示意图:评测分数随采样温度的变化。训练前(灰虚线)低温区被死循环拖低,随温度升高而改善;训练后(实线)低温区最优,逼近 temp=1 时回落。

两款模型画出来是同一个模式:训练前,分数在低温区被死循环拉低;训练后,低温区最优,逼近 temp=1 时略有回落。

LFM2.5-2.6B 评测分数随温度变化
LFM2.5-2.6B 早期检查点:评测分数随采样温度的变化,训练前后对比。图源:Liquid AI
Qwen3.5-4B 评测分数随温度变化
Qwen3.5-4B:同样的模式,低温区收益最大,接近 temp=1 时训练后略降。图源:Liquid AI

实践中还可以做多轮 Antidoom。第一轮把爱循环的词压下去后,可能暴露出新的问题:别处的一些 token 现在成了新的循环起点。再跑一轮,专门针对这些新冒头的循环,死循环率还能进一步往下压。

训练集没有教模型任何新的数学或代码知识,它只是移除了那个一直挡着模型、让它够不到自己本就能给出的答案的翻车模式。Liquid AI · Antidoom 博客
本文解读的是 Liquid AI 官方博客《Reducing Doom Loops with Final Token Preference Optimization》(2026 年 7 月 7 日,作者 Sam Paech 等)及其开源仓库 Liquid4All/antidoom。文中的死循环率、评测提升等数据均来自官方,死循环率降幅为厂商自评,尚无第三方复现。图表除自绘者外均来自官方博客。
来源
Liquid AILiquid AI·查看主材料
↑ 正文结束
✓ 本篇全文免费开放

会员可复制、下载全文 Markdown,还能让你的 AI 订阅和提问。

阅读原文 ↗
📮 新解读第一时间进邮箱

读完觉得有用?留个邮箱,每篇新解读发布就送达,随时退订。