李宏毅genai笔记:推理
0 思考越多效果越好
- 可以把算力投入在training的时候,也可以投入在testing上面
- 连起来的线表示表现是差不多的,越高分(越右上方)越好
- 同样-1000分,可以训练时候用力较少,test的时候多用点算力
- 但是training的数量级比testing大多了
1 Chain of thought
- reasoning先列出解题过程再给答案
- 这件事和CoT是非常相似的
- 只不过reasoning的更长,可以看作“long CoT"
- CoT最早是few shot CoT,需要给CoT范例
- 后来直接给一句let's think step by step即可
- 过去需要给LLM更精确的prmopt,让他思考
- 把思考的方式的流程完整给他
- 如果只让模型think step by step,模型可能不会
- 需要用人类的知识和语言告诉模型怎么think step by step
2 给模型推理工作流程
- 强迫语言模型回答一个问题回答几千几万次
- 让语言模不断解同一问题
- 横轴是解题次数
- 纵轴是只要有正确答案就当作对的
- 强的语言模型,在尝试比较少的情况下就能得到正确答案
Self-Consistency Improves Chain of Thought Reasoning in Language Models
Chain-of-Thought Reasoning Without Prompting
- 怎么知道哪一次是正确的呢?
- 第一种:看哪一种答案生成的次数最多
- 第二种,让模型计算产生答案的信息
- 当然,需要在prompt里说明, 把答案写在<answer></answer>里面
2.1 Best of N
Training Verifiers to Solve Math Word Problems
- 训练一个verifier模型
- 给答案和输入问题,判断答案是否正确
- 也可以直接用一个语言模型当作verifier
- 更好的方法给verifier其加以训练
- 问题丢给语言模型,知道什么时候答对什么时候输出错误,训练一个专门验证的模型
另外一种方法是串行:先解第一次,根据第一次的解法解第二次。。。
- 两种可以结合先并行解三次,然后根据第一次的解法分别再解一次
2.2 中间步骤进行验证
之前都是得到正确答案以后再验证
现在往往不是正确答案再验证,因为如果要到最后一步,模型需要花很多时间计算到最后一步才发现自己错了
现在的方法在进行到某一阶段的时候就开始验证,防止一步错步步错
先不接完,先只生成第一步
process verifier不需要看到完整的计算过程和答案才来验证是不是对的
根据一整个回答的一部分来验证,就可以验证这一步是不是对的,对的继续
给定prompt的方式,让模型分不同步骤,每个步骤以</step?结尾
就知道产生</step>的时候就是一步
- 把剩下的步骤完成
- 多次sample,同时从第一步开始解,每次都得到答案
- 得到正确答案的几率,这个就是step1的分数
- step2也是开始多次解题,得到正确答案的几率作为其分数
Self-Evaluation Guided Beam Search for Reasoning
得到数值,阈值应该怎么定义呢?
- 每一次保留最好的n条路经,比较差的不再考虑
3 模仿学习 imitation learning
训练资料:问题+推论过程+和答案
输入问题,后面的都是要学的
让语言模型自己推理+给出答案,如果有答对的,那么过程+答案是traning data
用树状搜寻的方法一步一步验证,对的步骤继续,直到得到答案
答案正确的作为训练样本
第三类的方法可以是RL——鼓励对的步骤,惩罚错的步骤
- 真应该这么教模型嘛?需要每一步推理都是对的么
- 就算中间过程有错也没事,只要语言模型自己找到错误并改正,最终答案正确也行
-
如果每一步都是对的,那么他自始至终都只看过对的,没看过错的步骤
-
以为每一步推理都是对的,不知道从自己的推论过程中找有可能犯错的推理,并改正之
-
- 制造一些错误的step,让语言模型有知错能改的能力
- 从树状结构里找到包括错误答案的推理过程
- 深搜,把错误的搜寻过程也加到答案里面
- 橙色的step 2错了,接下来产生蓝色的step 2
- 直接从橙色step2切到蓝色step2过去可能前言不对后语——>可以加上verifer的回馈(也即这个橙色step 2是错误的这些对应的文字)
——>语言模型就会学到一开始学到歪路,但是能更正回来
O1 Replication Journey: A Strategic Progress Report -- Part 1
shortcut learning就是只看过对的推理过程;journey learning就是先看到错误的推理过程再转到正确的推理过程
可以看到,后者train完后准确率高很多
3.1 对已有推理模型直接知识蒸馏
让这些有推理能力的模型产生reasoning的过程和答案,直接学习
DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
数值越高越好
后面是post training 的源模型,前面是蒸馏的部分(也即从谁哪里拿到的训练数据)
4 基于强化学习
有训练资料和结果
要求模型做reasoning
这里中间推理过程不重要,只在意答案
看起来和第三类(模仿学习)类似,但是这一类不管推理的过程,只要最终答案好就行
Deepseek-R1-Zero就是纯RL训练出来的
DeepSeek-R1强调了一个Aha Moment——RL学着学着 开始自己学会改错了
- R1-zero的推理过程的内容非常难懂,他是多语言复杂的
- 因为训练过程只在意答案对不对,不在意结果怎么样
- 真正的r1还有以下几步
- R1-zero产生训练资料
- 耗费人力改reasoning process当作训练资料,再一次训练depseek v3-base
- 此时得到的模型A可以产生人比较看得懂的推理过程
- 从A到B,还需要再进行一次RL,要求回答问题的准确度+需要说同一种语言进行推理
- R1-zero产生训练资料
- 之前R1-zero生成的训练材料主要是数学和程序的问题
- 模型B生成的训练资料就是各式各样的问题了
- 生成问题的推理过程和答案后,用deepseek v3-base作为verifier判断得到的是不是好的答案&推理过程,去掉一些不好的
- 重新训练deepseek v3-base得到模型C
- 模型C进行safety和helpfulness的RL微调,得到最终的deepseek R1
4.1Foundation Model 很重要
强化正确答案的几率的前提是能够产生正确答案,如果模型本身就不够强,那就无法激发他的能力
deepseek v3 base 本身就会aha和自我check,RL只是强化了他的能力
5 推理长度和正确率的关系
Revisiting the Test-Time Scaling of o1-like Models: Do they Truly Possess Test-Time Scaling Capabilities?
同样的问题问5次,根据长度分类
实验结果:每次推理长度有很大的区别
gorup1到gorup5 越来越长(最短的也已经很长了)
越长并没有越好
而长的推理过程代价是额外的计算资源
5.1 CoT避免想太多的方法
5.1.1 Chain of Draft
- think step by step的时候reasoning的部分似乎太长了
- 这里改写了think step by step的 prompt
- 每一个都是一个草稿(draft),每个草稿最多五个token
- CoD的reasoning 长度 短了很多,性能区别不大,有时候甚至结果更好
5.2 给模型推理流程& imitatin learning的解决办法
Towards Thinking-Optimal Scaling of Test-Time Compute for LLM Reasoning
推理的模型作为老师,根据输入产生推理过程和答案
学习过程并没有考虑长度
问一个问题问很多次,选一个最短的推理过程作为训练资料
5.3 RL如何避免长推理过程
- 对LLM来说,可以反复验证推理过程,只要最后答案是对的就行
- 第一种解法是把长度的限制加到reward里面
- 但多数没有采用这个方法
- 因为不适用于所有问题,不同问题思考的长度是不一样的
Kimi k1.5: Scaling Reinforcement Learning with LLMs
- 不要定义硬标准,定义相对标准
- 同一个问题丢给语言模型很多次
- 答对的收集起来,看平均需要多长的推理长度