深度解读 Kimi-K1.5,真正了解 RL 数据是怎么筛选的
0. 背景
OpenAI O系列(reasoning)模型发布后(2024-09-12),全世界都在尝试解决 OpenAI 设置的谜题,而在同一时间(2025-01-20),Kimi-k1.5 和 deepseek-r1 都发布了自己的推理模型。并且都达到 openai-o1 模型的效果。这是两个出色的解题人,值得敬佩。
尽管 Kimi K1.5 效果很好,而且还是多模态的模型,但从网络声量上看,完全被 DeepSeek-R1 盖过去了,只能说时也命也。但事实上,对于科员人员以及算法工程是从业人员,以及想找算法工作的学生来说,Kimi k1.5 的技术报告确实更值得 follow 的,核心是里面有更多算法处理的细节,这些细节是我们可以在工作中直接 follow 使用的,而 DeepSeek R1 的 paper 中还有很多细节没有透露,从我的上一篇文章《自顶向下方式深度解读 DeepSeek-R1》中就提到几个我们想知道却没说的关键点,Kimi k1.5 给了我们答案,让我们继续看下去,怎么处理数据能够让模型可以有更强的 Reasoning 能力。
1. 整体架构
Kimi K1.5 整体采用了和 chatGPT 一样的流程,先 pre-training,然后做 SFT,然后是强化学习。可以用知乎大佬木尧画的一张图讲清楚。
本文不会按照原始 Paper 的流程解读,而是按照自己的理解,讲解每一个步骤中重要的细节,方便我们在工作和学习中 follow。
2. 预训练
kimi k1.5 基础模型,也就是我们常说的 base 模型,是在多样化、高质量的多模态语料库上进行训练的。语言数据涵盖五个领域:英语、中文、代码、数学推理和知识。多模态数据,包括图像描述、图文交错[1]、OCR数据、知识以及问答数据集,使我们的模型能够获得视觉 - 语言能力。严格的质量控制确保了整个预训练数据集的相关性、多样性和平衡性。
预训练分三个阶段进行
- 第一阶段是视觉 - 语言预训练,在此阶段先训练语言基础(LLM),随后逐步进行多模态整合;
- 数据处理方面很重要,一般来说就是规则过滤、去重、FastText 分类等,细节可以查看原始论文附录B,和其他论文说的预训练处理数据方式比较类似。
- 训练的方式也可以看一下
- 先训练语言模型,得到一个 LLM,然后再加入图文数据让模型获得 vison-language 的能力。其中 vison tower 是独立训练的,训练过程中不会更新 LLM 部分的参数。
- 然后慢慢的增加图文交织数据,从 0 -> 30%,这个时候是需要更新 LLM 部分的参数。
- 第二阶段是冷却阶段,利用精心挑选的和合成的数据巩固模型能力,尤其针对推理和基于知识的任务;(注意这个时候也是有 vison-language 数据的)
- 数据来自于两部分,精选的预训练子集,合成生成的内容。
- 具体做法是利用现有的数学、知识和代码语料库作为源材料,通过一个专有语言模型生成问答对,并采用拒绝采样技术来维持质量标准。
- 所以这也是为什么现在很多的 base 模型就已经有了基础的指令遵循能力。
- 第三阶段是长上下文激活阶段,将序列处理能力扩展到 131,072 个 Token。
- 我们都知道,很早之前,kimi 就以长上下文能力著称,这里也是揭示了它们是怎么训练的,一共两个要点。
- 过采样 long-context 数据,其中 40% 采用全注意力,60% 采用 partial attention。(这个算法似乎没有讲是啥,没有引用我不太清楚具体是什么算法)
- 逐步训练,先 4k -> 32k -> 128k,这个倒是属于常规操作了。RoPE 中的频率设置为 1,000,000(上下文越长,一般设置会更大一些)。
- 我们都知道,很早之前,kimi 就以长上下文能力著称,这里也是揭示了它们是怎么训练的,一共两个要点。
基于上面的方式,我们得到了 kimi-k1.5-base
模型。
3. SFT 训练
3.1 常规的 SFT
3.1.1 数据构建
数据集包含多个领域的基础监督微调(SFT)语料库。
- 对于非推理任务,包括问答、写作和文本处理,首先通过人工标注构建一个种子数据集。这个种子数据集用于训练一个种子模型。随后收集各种各样的提示,并使用种子模型针对每个提示生成多个回复。接着,标注人员对这些回复进行排序,并对排名最高的回复进行优化,以得出最终版本。
- 对于诸如数学和编码问题这类推理任务,基于规则和基于奖励建模的验证比人工判断更准确、更高效,这里也同样利用了拒绝采样来扩充监督微调数据集。
3.1.2 数据分布
SFT 数据集包含大约 100 万个样本。
- 50万个示例用于一般性问答
- 20万个用于编码
- 20万个用于数学和科学领域
- 5000个用于创意写作
- 2万个用于长上下文任务,比如总结、文档问答、翻译以及写作等。
- 100万个文本-视觉示例,涵盖了各类范畴,包括图表解读、光学字符识别(OCR)、基于图像的对话、视觉编码、视觉推理,以及借助视觉辅助的数学/科学问题。
3.1.3 训练细节
- epoch 1,序列长度设置为 32k,learning rate 从 2e-5 -> 2e-6
- epoch 2,序列长度设置为 128k,这里 lr 重新升高到 1e-5,然后再降到 1e-6。
- 为了训练效率,不同的 QA pair 是 pack 在一起的。
- 我有一个疑问:按理说不同的 sample 的 Attention 是分开的,具体可以看 Github issue,但如果 Attention 是分开的,那么这里的 Sequence length 设置这么长的意义是什么?
- 如果有好的解释,欢迎留言讨论。
3.2. Long-CoT SFT(重点1)
假设我们有了一个【精心挑选的数据集(具体见 4.1 小结)】,我们从中挑出一小部分,这些数据集是一些 Question(包含文本和图片),那么我们可以通过 Prompt Engineering 的方式生成答案,这部分数据是为了 Long-CoT 能力获得(其中 DeepSeek-R1 coldstart 数据 也是这么处理的)。
这部分数据需要包含人类的思考过程:规划(生成执行大纲),评估(对中间步骤进行评估),反思(可以重新思考和修正方法/步骤)以及探索(鼓励尝试新的方法和思路),而这一步的 SFT 本质上和 3.1 中 SFT 是一样的,核心差别在于数据不一样,这部分数据是的 answer 部分比较长,并且蕴含了人类的思考过程。
4. 强化学习(重点2)
4.1 RL 数据集构建
我们都知道好的数据对于 RL 提升模型效果具有很重要的帮助,因此 kimi 定义了三个关键属性来衡量数据集的好坏。
- 多样性。数据集应该具有很丰富的来源,包含自然科学、代码、推理等各种任务,这样可以帮助模型掌握各种各样的能力。
- 难度平衡。好的数据集应该平衡好简单、中等以及复杂的问题,并且通过课程学习的方式可以让模型更好地掌握复杂推理的能力,并且减少过拟合。
- 是否可以精确评估。在 DeepSeek-R1 的 paper 解读中也提到了,RL 的数据需要可以精确地评估,这样可以更好地指引模型推理。
这些东西除了第三点精确评估,都是以前(k1.5 和 r1出来之前)就经常提到的,但是具体怎么做的呢?
- 关于多样性。
- 首先当然是数据原来要有不同的领域,尤其是这些数据最好是推理相关的问题并且要易于评估。然后 kimi 会构建一个标签系统给所有的数据打标来保证多样性(但是这里的标签系统是每个公司的核心资产,显然是不会说的)。
- 关于难度平衡。
- 对问题进行难度分级,分级方式为:用一个 high temperature 回复问题,重复十次,计算通过率,通过率越高难度越小,否则难度越高。
- 这里采用课程学习的方式,先学简单的,然后逐步学习难得样本,这样可以更好的激发和对齐模型的能力。
- 但是这里有一个细节
- 对难度进行分级应该不是一次完成的,应该是每次都会用最新的 checkpoint 进行计算一次,这样算出来的难度分级才是有意义的。不然开始用很弱的模型选出来的难样本不能适应最新模型的能力。
- 关于精确评估。
- 我们要保证答案是可以精确评估的,这是核心宪法。
- 但是一些问题很难,可能答案形式很简单,比如选择题,模型很容易猜测,这种问题应该要被移除。最终移除了:多选题、对错题和给出证明的题,包括但不限于这些。
- 此外,Prompt 可能也存在 hack 的情况(模型并没有真正推理而得出了正确答案),我们要移除掉那些比较容易 hack 的 prompt。做法是不使用 CoT 的思考过程,运行 N(8) 次都对了,那么就认为是容易 hack 的 prompt。
4.2 问题定义
在论文的原文(2.3.1)中,写了一大段关于问题的定义,具有很多公式,但这些公式都不重要,核心就是一个点。当模型的 Reasoning 过程足够长的,我们可以假设这个思考过程(reasoning tokens)蕴含着巨大的搜索空间,这个搜索空间可以帮助模型到达最终的正确答案。因此最终变成了一个优化问题,公式为:
其中 是 reward 评估函数,针对有固定答案的问题,用规则进行评估,对了就是 1,错了就是 0。针对于自由形式的问答,就用一个奖励模型预测答案是否和事实匹配。在这个公式中 是问题输入, 是模型预测答案, 是正确答案。 是原始的模型, 是训练数据, 是模型输出的思考过程。
4.3 策略优化
策略优化叫做 policy optimization(policy 就是我们要训练的模型)。这一段比较难写,我就直接截图原文,并且来解释一下这里是什么意思?
首先,公式 2 中,是告诉我们,我们优化的目标是什么,但是这样我们没法做训练。因此慢慢推导出公式 3,也就是说把 RL 期望最大化的东西变成 Loss,这样就可以用梯度上升的方式进行优化。
解释几个关键点: 是最优策略, 表示当前模型输入为 的情况下,具有 的概率。在公式 2 下面第一个公式就是我们要优化的目标,对这个公式取对数就可以得到公式 2 下面的第二个公式,那么其实希望的时候两者尽量接近,因此设计一个平方的损失函数,让它尽量小,得到了公式2 下面的第三个公式,然后针对这个公式求导,就可以得到公式3。更详细的解释见 bilibili 或者 YouTube 视频。
这里还有另外一个重要的点,和 deepseek-r1 的 GRPO 算法一样,移除了 Value Model,核心的思考是这些错误的路径也是有助于模型获得思考的能力。
此外,在这样的训练过程中,我们观测到了模型会有过度思考的现象,因此又设计了一个长度惩罚的奖励给 RL 模型。公式很简单,就是越长奖励越小。
4.4 采样策略
这里用的是 off-policy 的方式做训练,所以采样策略很重要,更好的采样方法可以得到更好的效果。这里有两种采样策略。课程采样和优先采样策略。
- 课程采样。先从较简单的任务开始训练,逐渐过渡到更具挑战性的任务。由于前面构建的prompt set已经有了难易标签,所以课程采样比较容易实现。
- 优先采样策略,让训练专注于模型表现不佳的问题上。这里跟踪每个问题 i 的成功率 si,并按 1 − si 的比例采样问题,这样成功率较低的问题获得更高的采样概率,模型就可以重点学习短板。
4.5 Long2short (重点3)
kimi-k1.5 的 Long2Short,实现了长链推理(Long-CoT)到短链推理(Short-CoT)的高效迁移,既保留深度思考能力,又显著提升响应速度。具体做法有下面几个点
- 模型融合。这里说的是权重融合,long/short 模型的权重直接融合。这种在业界已经用的很多了,可以在业务中尝试起来,而且不用训练。
- 最短拒绝采样。一次生成 x 条样本,把最短的那条选出来,前提是结果要对。
- 长短样本的 DPO。和上面类似(一条正样本),这里是构建的是正负 pair 样本(两条样本),短而正确的作为正样本,错误的是负样本或者1.5长于短样本的作为负样本。
- long2short强化学习。在一阶段 RL 之后,使用长度惩罚来减少模型生成的长度。
4.6 其他细节
4.6.1 代码
由于网络上的许多编程问题没有可用的测试用例,我们设计了一种方法来自动生成测试用例,这些测试用例将作为奖励,用于通过强化学习来训练我们的模型。我们主要关注那些不需要特殊评测程序的问题。我们还假定这些问题有正确的标准答案可用,这样我们就可以利用这些答案来生成更高质量的测试用例。
我们利用了被广泛认可的测试用例生成库 CYaRon1 来改进我们的方法。我们使用我们的基础模型 Kimi k1.5,根据问题描述来生成测试用例。CYaRon 的使用说明和问题描述会作为输入提供给生成器。
对于每个问题,我们首先使用生成器生成 50 个测试用例,并且为每个测试用例随机抽取 10 个正确的提交答案。我们针对这些提交答案运行测试用例。如果 10 个提交答案中至少有 7 个能得出匹配的结果,那么这个测试用例就被认为是有效的。
在这一轮筛选之后,我们得到了一组选定的测试用例。如果 10 个提交答案中至少有 9 个能通过这一整组选定的测试用例,那么这个问题及其相关的选定测试用例就会被添加到我们的训练集中。
从统计数据来看,在 1000 个在线竞赛问题的样本中,大约有 614 个问题不需要特殊评测程序。我们开发了 463 个测试用例生成器,这些生成器至少生成了 40 个有效的测试用例,最终使得 323 个问题被纳入了我们的训练集。
4.6.2 数学
在评估数学问题的解答时,一个挑战在于不同的书写形式可能表示相同的本质答案。例如,a2−4 和 (a+2)(a−2) 可能都是同一道题的正确答案。我们采用了两种方法来提高奖励模型的评分准确性:
- 经典奖励模型(Classic RM):该模型最终将 “问题”、“参考答案” 和 “作答” 作为输入,并输出一个单一的标量,用以表明作答是否正确。
- 思维链奖励模型(Chain-of-Thought RM):整体和上面一样,采样了 800k 的带有 CoT 和 label 的数据,然后训练一个 CoT 模型,会在输出答案之前输出思考过程。当然没有疑问的,CoT 模型效果更好。这里也是 4.2 中提到的 RM。
4.6.3 视觉数据
为了提升模型在现实世界中的图像推理能力,并使视觉输入与大型语言模型(LLMs)更有效地对齐,我们的视觉强化学习(Vision RL)数据主要来源于三个不同的类别:真实世界数据、合成视觉推理数据以及文本渲染数据。
- 真实世界数据:涵盖了一系列不同年级水平的科学问题,这些问题需要具备图形理解和推理能力;还包括需要视觉感知和推断的地点猜测任务,以及涉及理解复杂图表的数据分析等多种类型的数据。这些数据集提升了模型在现实世界场景中进行视觉推理的能力。
- 合成视觉推理数据:是人工生成的,包括通过程序创建的图像和场景,旨在提高特定的视觉推理技能,例如理解空间关系、几何图案以及物体间的相互作用。这些合成数据集为测试模型的视觉推理能力提供了一个可控的环境,并能提供源源不断的训练示例。
- 文本渲染数据:通过将文本内容转换为视觉格式而创建,使模型在处理不同模态下基于文本的查询时能够保持一致性。通过将文本文档、代码片段和结构化数据转换为图像,我们确保无论输入是纯文本还是渲染成图像(如屏幕截图或照片)的文本,模型都能给出一致的回复。这也有助于增强模型处理文字密集型图像的能力。 每一类数据对于构建一个全面的视觉语言模型都至关重要,该模型能够有效地处理广泛的现实世界应用,同时确保在各种输入模态下都能保持稳定的性能。
4.6.4 RL 框架中的优化
由于我对于强化学习和推理相关的优化了解不多,主要是两个策略,一个是框架上的优化,train 和 推理用不同的框架。
第二个 Rollout 采样上的优化,目标是为了更有效的利用数据。
5. 实验结论
一起看一下比较有意思的实验结论。
5.1 主要实验
在各个主要的数据集上都表现的很好,这个基本毫无疑问,并且还是首个追上 openai-o1 的多模态大模型。
第二点,long2short 之后的 Short 模型表现也很好。
5.2 自我进化实验
随着模型训练,模型自发的输出越来越长的 CoT,并且模型效果越好。
模型输出的 CoT 越长,效果越好,并且模型越大,提升的幅度(斜率)越大。
5.3 课程学习效果
采用课程学习的采样策略,可以提升模型的能力。蓝色线很快就饱和了,但是橙色线还在继续提升。
5.4 负样本梯度是否有用
结合 4.3 中的公式的定义,里面有一项 ,其中小于平均值 就是负样本。而 ReFT 是一个只用正样本,也就是只挑选好的样本的一个方法,最终结果是显示负样本也是有好处的。
其他
最后欢迎关注我,基本全网同名 chaofa用代码打点酱油
一张图像后面紧接着一段对该图像内容进行描述的文本,然后再是下一张图像及对应的文本。例如,当文本提到 “一只猫在沙发上睡觉” 时,搭配相应的图像,模型可以更准确地理解 “猫”“沙发” 的具体形态以及 “睡觉” 这一动作的实际表现,从而更深入地理解文本语义。 ↩︎