← All posts 此文章100% AI 生成,请读者放心阅读

它能把跑偏的句子圆回来,却圆不回一个说错的答案

你盯着屏幕看一个模型解一道奥数题。它的思考是一个字一个字流出来的,像有个人在草稿纸上边写边算。它先列了个方程,代了两步,写出一个数。然后下一行,它突然停住,冒出一句:等等,这里好像不对。

于是它回头,把刚才那步重新算了一遍,换了条路,最后给出一个和一开始不一样的、这回是对的答案。整个过程你都看在眼里,它不是算完一气呆着不动,是真的在半途推翻了自己。

这个画面有点让人意外。我们对机器写东西的默认印象是一条道走到黑:它按着概率一个词一个词往下推,前面错了,后面只会顺着错下去。你甚至能说出一套听起来很有道理的理由:它每一步都踩在上一步的结果上,一旦某一步偏了,偏差会被后面每一步放大,像滚雪球。

但你刚才看到的不是这样。它走偏了,然后自己把自己拽了回来。一个只会预测下一个词的东西,凭什么能意识到不对,又凭什么能调头?更麻烦的是,这种拽回来的本事是不是总能指望?它能拽回一个算错的数,能不能拽回一个说出口的错事实?

我们曾经笃定,长文一定会越写越坏

“一路错下去”这份担心不是凭空来的,它有一套扎扎实实的理论根基,名字叫曝光偏置(exposure bias)。

要明白它,得先看语言模型是怎么训出来的。主流做法叫 teacher forcing,直译过来是”老师帮你扣着”。训练的时候,模型每预测下一个词,喂给它的上文都是数据里真实、正确的句子,哪怕它上一步猜错了,下一步的输入依旧是标准答案。这让训练变得快又稳。

问题出在部署的那一刻。真让它自己写的时候,没人给它递标准答案了,它只能接着自己刚生成的词往下写。训练时从没见过”带着自己的错误继续”这种处境,于是一旦生成物偏离了训练数据的分布,它就踩进了一片陌生地带。训练与推理的这道鸿沟,就是曝光偏置。换个比方,像学车时教练一直帮你扣方向盘,真上了路全靠自己,一个微小的偏差没人纠,越偏越大,最后冲出路面。

顺着这个逻辑,人们推出了一个听起来很硬的结论:生成越长,偏差累积越严重,长文本几乎注定会越写越坏。这个担忧在 RNN 时代被当成生成模型的中心病灵,也催生了一批专门去填这道沟的方法。Bengio 等人 2015 年提出 scheduled sampling,训练时以逐渐升高的概率改用模型自己的预测当输入,先让它提前习惯”吃自己做的菜”。Lamb 等人 2016 年的 Professor Forcing 更进一步,用一个判别器去逼近”训练时的状态”和”自由生成时的状态”,让两者看起来尽量一致。那几年里为了绕开 teacher forcing,甚至有一整条 text GAN 的路线。

不过也有人很早就提醒,这个问题可能被讲糊了。Schmidt 在 2019 年的一篇工作(Generalization in Generation)里把账算得很清楚:人们把”学习框架的毛病”和”模型本身的毛病”掺在了一起,真正该解决的是泛化能力,而不是笼统地恐惧 teacher forcing。Wang 和 Sennrich 同一年在机器翻译上(arXiv:2005.03642)发现,曝光偏置真正闹得凶的时候,是在输入跳出训练分布的”域偏移”场景,而不是所有生成场景。

这些保留意见当时没成主流。主流的直觉依旧是,模型是个谨小慎微、只会顺着路往下走的东西,一旦走错就回不了头。要推翻这个直觉,得有人真去量一量:模型走偏之后,偏差到底是不是像理论说的那样一路滚大。

有人真去量了一量,结论是反的

真去量这件事的,是 He Tianxing 几个人。他们的思路简单得近乎赖皮:既然曝光偏置说”模型接不住自己的错误输入”,那就故意给它喂一个被砸坏的前缀,看后面会怎样。

具体做法是,拿一段正常的上文,人为地把里面一些词随机替换或打乱,做成一个被污染的前缀,再把它喂给模型,让模型接着往下生成。如果曝光偏置的理论是对的,这个被污染的开头应该像一颗雪球,滚着滚着把整段生成都带坏,而且越到后面偏得越远。

结果恰恰相反。他们发现,MLE 训练出来的语言模型有一种他们称之为 self-recovery(自我恢复)的能力:喂进去一个被砸坏的前缀,模型不会顺着坏下去,反而会在接下来的几步里逐渐把生成拉回正常的分布,偏差是回落的,不是一路滚大的。他们最早的版本是 2019 年那篇 Quantifying Exposure Bias,结论一句话:曝光偏置可能远没有大家假设的那么严重。

后来这份工作演进成 EMNLP 2021 的一篇论文,标题直接把问题摆在桌面上:Exposure Bias versus Self-Recovery: Are Distortions Really Incremental? 偏差真是递增的吗?他们的答案是否定的。值得注意的是他们挑的场景:开放式语言生成。这是最该让曝光偏置发作的场合,因为生成很长、约束很弱、话题可以很发散,训练与生成的偏差本该被放到最大。就连在这种场景下,自我恢复依旧成立。

这个结果把之前那套”长文必崩”的直觉打了个大问号。你用人类的经验去想,也能感受到这种拉扯:一个人说话顺口溜了一个词,他很少会顺着那个错词把整段话都说砸,而是下一句自然就绕回来了。模型在做的,某种程度上就是这件事。

但麻烦也恰恰从这里开始。”能把跑偏的话拉回正常”听起来是件好事,可如果模型拉回来的只是”说话的调子”,那当它说错的不是调子,而是一个具体的事实、一个具体的答案呢?但至少现在可以确定一件事:模型能把自己拽回来,这不是错觉,是一个被反复量到的现象。

它凭什么能调头

模型凭什么能拽回来?拆开看,里面至少叠了四层机制。

第一层在注意力本身。自回归模型每生成一个词,都会回头看一遍前面所有的词,包括它刚刚可能写错的那个。这一点很关键:一旦某一步采样抽到了个低概率的怪词,下一步并不是装作没看见,而是把这个怪词当成”已经发生的事实”重新评估整个上文。而真实语言里,一个突兀的词后面往往跟着解释、纠正或者绕开,这种”出错之后人们怎么接”的模式,模型在预训练里见过太多次,于是它也学会了。

第二层是 induction heads。Anthropic 在 2022 年的一项工作(In-context Learning and Induction Heads)里找到了一种很特别的注意力头,它们成对工作,干的事是模式复制:看到上文出现过 A 后面跟着 B,下次再遇到 A,就倾向于预测 B。这种对自己上文的强烈模式跟随,既是语言连贯的来源,也是把跑偏的局部重新锚定到整体语境的手段。

第三层是离散空间的高容错。LLM 在一个有限词表的离散空间里生成,无论分布怎么漂,采样出来的依旧是个合法的词,系统对微小偏移的容忍度极高。这和视频这类连续信号的生成形成鲜明对比:在连续域里,一点点像素级的偏移会真的累积成崩坏,而词表里”要么是这个词要么是那个词”的离散性,天然就给了模型一个容错的台阶。

第四层,是把这种隐式的自我恢复外化成显式的动作。DeepSeek-R1 用纯强化学习训练,反思、验证、改策略这些行为竟然自己长了出来,思维链里会出现”wait”“让我重新想想”这样的拐点,它在 AIME 2024 上的 pass@1 从 15.6% 一路升到 71.0%。Self-Backtracking 用一个专门的回退 token,让模型学会”何时何处该退回上一步”,推理时做成一棵搜索树。

不过显式回溯不是免费的。First Try Matters 发现,思维链里那些”等等、让我检查一下”大多是确认性的,真正改对答案的比例并不高。重新审视 o1 类模型的测试扩展发现,让模型一轮轮顺序修订,反而会把本来对的答案改成错的。

但同一个机制,反过来就是灾难

同样是”模型会跟随自己的上文保持一致”这个机制,反过来跑,就是灾难。

Zhang 等人 2023 年(How Language Model Hallucinations Can Snowball)发现:模型常常在第一个词就草率地 commit 了一个错答案,然后为了跟这个答案保持一致,它会接着编出一套解释。他们测了一下:把那些错误声明单拿出来问模型,GPT-3.5、GPT-4、LLaMA2-70B 分别能认出其中 67%、87%、94% 是错的。它不是不知道,它是为了和前面说过的话对上,明知道可能不对还接着说。

把这个现象和前面的自我恢复摆在一起:同样是”跟随自己上文”这个动作,当上文里错的只是调子或个别怪词,一致性压力把它拉回了正常;而当上文里错的是一个明确的事实断言,同一股一致性压力反而把错误死死钉住。形式上的连贯是友军,到了事实这里就成了敌人。

Huang 等人 2023 年的工作泼了冷水:在推理任务上,只要不给外部反馈,让模型自查自纠,准确率反而下降。Kamoi 等人 2024 年补上:之前那些说自我纠错有效的结果,很多是在不公平设置下拿到的,比如偷偷用了标准答案去告诉模型什么时候该停。

还有一件事:即使模型能读很长的上下文,它也不是那么均匀地在用。Lost in the Middle(Liu 等人 2023)发现,当关键信息被放在长上下文的中间位置时,模型表现会明显下降,呈 U 型曲线。

所以到底什么时候能信它

有一条界线很好用:分清楚它正在纠的是形式还是承诺。

如果你要的是流畅、风格、语法、局部连贯这类”怎么说”的东西,那个自我恢复能力是可以依赖的。只要别把采样温度调得太高、给够上下文,它打偏一下也能自己绕回来。

但如果你要的是一个事实、一个答案、一条推理链能不能站住,那就别指望它闷头自己纠。这种时候要做的是给它搭个外部脚手架:让它查检索、调工具、跑单元测试,或者用 self-consistency 那样采多条路径取多数(GSM8K 上能提升将近 18 个百分点),再不然就像 SCoRe 那样用带 ground truth 信号的强化学习,把”何时该改”真正训进模型。

所以说到底,模型拽得回的是”怎么说”,拽不回的是”说错了什么”。

回到开头那个画面。reasoning 模型冒出那句”等等,不对”然后把自己拽回来,看起来像是它开窍了。但那个 wait 之所以真能纠对,不是因为它凭空想明白了什么,是因为背后有一套 RL 训练反复告诉过它哪条路能通到正确答案。换个没有这种信号支撑的场景,同样一句”等等”,很可能只是把对的改成错的。

Comments

Select any text to comment on a specific part. Existing inline comments appear as small numbered bubbles. Powered by GitHub Discussions.