🥰 Thank you,李宏毅老师!🥰
本文最后更新于 2026年8月20日 凌晨
以下内容来自于 NTU 李宏毅 2026 Spring 的课程 [传送门] 主要是 Lec 02 Reasoning 的延伸。
背景来自 XHS 理力小李学长(如有问题,请在下方评论区留言,侵删)
所谓 self-correction 能力:LLM 在没有人类介入的情况下,能够发觉自己是错的并自我更正
如何让模型具有自我修正的能力?
- 修改 inference 过程
- 修改 harness(workflow)
- 修改 model 的参数(Reasoning)
修改 Inference 过程
LLM 的生成过程示意图
- 可能的思路:LLM 在生成过程中会产生一些 representation 和 logit
- 能否从这里看出模型可能要输出 error?
- 能否根据 Error Detection 的结果进行 Error Correction?
Error Detection + Error Correction
检测错误与修正错误是有可能自动进行的
- 从 representation 直接判断正误是有可能的(2023)
- 收集正确回答和错误回答的 representation
- 用以上数据训练一个二元分类器 Error Detection,用于分辨答案到底是对是错
- 把错误答案修改正确是有可能的(2024)
- 假设已经收集到一堆答对的 representation、答错的 representation 以及答错的状态
- 对 True 状态的 representation 做平均,对 False 状态的 representation 做平均,二者相减得到一个“True 与 False 之间的差距”(黄色向量)
- 将黄色向量加到错误问题的 representation 上,模型会输出正确答案
- 缺点:过于麻烦,需要收集额外资料才能指导修正!
Contrastive Decoding 系列
error detection + error correction:无需收集额外资料
- 主要思路:对每一个 token 按下面方式操作
- 假设模型在正常情况下会输出蓝紫色向量,此时我们不知道这是对是错
- 可以提取一个 representation
- 对模型的输入进行某些修改,让模型输出错误的回答
- 于是可以提取答错情况下的 representation
- 正常状态 representation - false representation = 黄色向量
- 注:这一步通常会在前面乘上一个参数
- 令
黄色向量 + 正常 representation,这就有可能让回答远离错误答案- 这实质上也可以视作是 正常 错误
- 假设模型在正常情况下会输出蓝紫色向量,此时我们不知道这是对是错
- 优点:没有改变模型参数,只在 inference 阶段进行修改
- 缺点:需要多做额外的 inference 操作
常见的做法:用得到的 logit 当作 representation
- 上图右侧:用聪明模型和笨模型一起回答,默认笨模型说错误答案。
- 因为两个模型架构就不一样,所以无法直接使用 layer 中的 representation 做运算。
- 但是二者都会输出 logit!因此可以直接用 logit 做运算。
DoLa 方法
- Logit lens:用最后一层 LLM head 分别接到中间的每一个 Layer,由此得到一串 输出
- 想法:
- 中间的 Layer 比较有可能会输出错误的答案
- 让靠后的 Layer 减去靠前的 Layer 就能得到正确的答案
- 优点:因为没有引入额外的模型,在只增加很少的计算量的情况下(本身前面的 Layer 就要做计算),有不错的效果
在视觉上的应用
给模型一个降智咒语,让模型说出一些错误的答案
- 比如:你是一个很笨的模型,你给的都是错误的答案。
- 这样就能得到错误的答案,让错误答案和正确答案相减……和前面类似
CAD 最早应用于 RAG 上
- 想法:
- 在做 RAG 的时候,LLM 有时候会认为自己完全不需要 RAG
- 此时将直接输出的结果作为 false 样本
- 用 RAG 输出的结果作为 正常样本
- 然后类似之前的方法,得到绿色 output
- 在做 RAG 的时候,LLM 有时候会认为自己完全不需要 RAG
在影像上也可以使用 CAD 技术
- 对于黑色香蕉,LLM 可能会先入为主说是黄色
- 为了去除这一点,可以给图片加上很大噪声,然后再次提问 LLM,将得到的答案作为错误答案。
左图:加噪声是有效的
右图:尽量用特别让 LLM 误会的图片作为“噪声”输入,将图片切块打乱比单纯加噪声效果更好
这样的技术还可以用在语音上
MTI
之前的方法相当于是用更多的算力资源来换取比较好的表现,是否存在一种不那么需要算力且具有 Contrastive Decoding 优势的方法?
在该 CD 的地方再 CD
- 前提假设:模型在做 decode 的时候,可能只有某几个 token 是特别关键的,但是其他路径可能差不多
- 只对几个特别重要的 token 做 contrastive decoding
- 如何衡量是否特别?
- 几个输出的 logit 都比较平均
- 但这并没有减少多少计算量!
- 为了得到错误答案,我需要将错误的 sequence 全部跑过
可以利用跨对话的 KV cache 的特性
- 如果想要利用 KV cache 的特性,我们必须保证输入的头几个 token 是一致的,所以此时我们选择在尾部扰乱
- 在正常输出后面加上 “output error”,这样前面的全部可以 cache hit
实验说明上述方法确实有效;用“output error”效果相对好
contrastive 过程也可以放到 latent space/attetion weights 上
- :没有使用 Contrastive Decoding
- 越大:表示距离坏输出越远
小结
| 方法 | 怎么拿到错误结果 | 改哪里 |
|---|---|---|
| Contrastive Decoding (CD) | 小模型 | output |
| Decoding by Contrasting Layers (DoLa) | 浅层用 logit lens 生成的结果 | output |
| Layer Contrastive Decoding (LayerCD) | 用浅层的 Image encoder layer (图像) | output |
| Instruction Contrastive Decoding (ICD) | 降智咒语 | output |
| Context-aware Decoding (CAD) | 拿掉 Context (e.g., RAG 中的 Retrieved documents) | output |
| Visual Contrastive Decoding (VCD) | 图像加噪声、打乱 Patch、盖住重要部分 | output |
| Audio-aware Decoding (AAD) | 移除声音 | output |
| Minimal Test-Time Intervention (MTI) | 降智咒语,目标:减少算力消耗 | output |
| Visual Information Steering with Token-logit Augmentation (VISTA) | 移除图像 | hidden representation |
| Attention-space Contrastive Guidance (ACG) | 计算 Attention 时不考虑图像 | attention |
修改 workflow(Harness)
- 对于一个标准的 harness,通常会有 Generation - Verification 的步骤。对于改善 Generation - Verification 步骤,有以下两个直觉:
- 批判比生成容易
- 生成的过程无法回头,即使有错也无法修正。
- 随机插入的 reflection instruction 会给模型修正答案的机会
实验:模型的自我反思到底效果如何
- 左图实验说明:
- internal:采用直接说“自我反省”
- external:采用外部 feedback 的方式
- 右图:
- 对 Claude Sonnet 4,自我反思并没有带来多大的提升
- 对 Gemini 2.5 pro
- 自我反思带来的进步非常少
- 给模型提供一部分 feedback(最浅色线),就能带来很大进步
- 给模型完整的 checklist、告诉模型会检查哪些东西(第二条),会带来更大的进步
- 给模型提供全部 feedback(橙色),能带来最大的进步。
模型也有可能把正确的回答改错
从指标上来衡量模型的自我反思能力
- 设定指标
- CL:模型对自己的信心
- CS:模型的反思能力
- 结果
- 模型对自己的信心普遍比较强
- 模型对答案的纠正能力较为一般
- CL 和 CS 之间是有些 trade-off 的
让 LLM 自我反思的指令也很重要
- 如果插入了肯定模型的指令,它就会对自己有信心;
- 反之,如果插入了质疑模型的指令,它就会倾向于修改答案。
反思过程需要额外的算力消耗,如果将其分到其他部分是否会更划算?
Majority Vote 在中小预算下更有性价比
- 实验结果:
- 以 FLOPs 为横坐标,达到 55% 的正确率,Majority Vote 的算力开销只有 Verification 的 1/8
参数更新(Reasoning)
自我修正能力不见得与模型的知识水平相关
自我修正 = 错误检测 + 错误修正,分开来学效果较好
- 之前做法:二阶段训练
- 先教模型检测错误
- 收集数据在接收输入后得到的答案
- 若见到错误答案,则输出
[REFINE] - 若见到正确答案,则输出
[END]
- 若见到错误答案,则输出
- 收集数据在接收输入后得到的答案
- 再教模型修正错误
- 接收到
[REFINE]后,模型输出修正后的答案- 我们手上已有正确答案,因此可以进行训练
- 接收到
- 先教模型检测错误
- 上面做法的问题:
- 模型被 fine-tuning 后,已经不再是原来的模型,它会犯的错已经和原来不一样了!
- 模型只见过 input+output(绿),没见过 input+output(红),所以直接教模型自我修正可能会有问题
- 解决方法:让整个 pipeline 综合到一起进行训练!
RLVR 在训练时不在意中间的 Reasoning 过程,只在意最后的 reward
但经过训练后,模型自然产生了系统的 Reasoning 过程(Propose + Verification + Refine)
思考的代价:LLM 解任务的 token 和人类解题消耗的 time 呈一定的正比关系
如果模型想一步答对,那么变化会指数级增长,对训练资料的需求就相对较多;如果让模型拆分步骤回答,则只会线性增长,对训练资料的需求就相对较少
RL 到底带来了什么?
目前有人主张:Reflection 和 Reasoning 是模型本具的能力,RL 的作用是提高走正确路径的概率
左图:横轴为 sample 的次数;纵轴为正确率(pass@k)
右图:(从浅到深)没做RL、做了RL、改变sampling算法(Training-Free)
- 从左图可以看出,RL 并没有提升模型的极限能力
另一派主张 RL 可以让模型学到本来不具备的新思路
改用 CoT-Pass@k 作为指标,发现 RL 是会提升模型能力的
- 实验思想:之前用 Pass@k 作为指标衡量存在漏洞!
- 会不会是因为答案只能从若干个数中选取,所以 base model 多蒙几次就一定能蒙到?
- 实验做法:改用 CoT-Pass@k 作为指标,不仅检查答案,还检查思考过程,如果全对才算对。
- 缺点:对 CoT 过程正确性的评判是自动化的(让另一个 LLM 来评判对错),因此可能不准确。
领域现状
- 模型在 RL 的不同训练阶段可以学到不同的东西
- 在训练初期,RL 侧重于提升模型输出正确路径的概率
- 在训练后期,RL 侧重于提升模型的能力
- 领域内热点:怎样给 reward signal 能让模型更好地学到新的能力
AI Agent Lec 05
http://dbqdss.github.io/2026/08/19/个人学习笔记/AI Notes/Agent/AI Agent 入门/AI Agent-Lec05/