专栏名称: 架构师
架构师云集,三高架构(高可用、高性能、高稳定)、大数据、机器学习、Java架构、系统架构、大规模分布式架构、人工智能等的架构讨论交流,以及结合互联网技术的架构调整,大规模架构实战分享。欢迎有想法、乐于分享的架构师交流学习。
目录
相关文章推荐
51好读  ›  专栏  ›  架构师

RL居然让7B小模型学会玩数独?

架构师  · 公众号  ·  · 2025-03-17 22:28

正文

架构师(JiaGouX)
我们都是架构师!
架构未来,你来不来?




没有任何冷启动数据,7B 参数模型能单纯通过强化学习学会玩数独吗?

近日,技术博主 Hrishbh Dalal 的实践表明,这个问题的答案是肯定的。并且他在这个过程中用到了 DeepSeek 开发的 GRPO 算法,最终他「成功在一个小型数独数据集上实现了高奖励和解答」。

下面我们就来具体看看他的博客文章,了解一番他的开发思路。

原文地址:

https://hrishbh.com/teaching-language-models-to-solve-sudoku-through-reinforcement-learning/

现在的语言模型已经能完成很多任务了,包括写论文、生成代码和解答复杂问题。但是,如何让它们学会解答需要结构化思维、空间推理和逻辑推理的难题呢?这就是我最近的实验的切入点 —— 通过强化学习教语言模型解决数独问题。




教语言模型玩数独的难点


对语言模型来说,数独有自己独特的难点。不同于开放式的文本生成,玩数独需要:

  • • 遵循严格的规则(每行、每列和每框必须包含数字 1-9,且不能重复)
  • • 保持一致的网格格式
  • • 应用逐步的逻辑推理
  • • 理解网格元素之间的空间关系
  • • 得出一个正确的解答

有趣的是,语言模型并不是为结构化问题设计的。它们的训练目标是预测文本,而不是遵循逻辑规则或维持网格结构。然而,通过正确的方法,它们可以学会这些技能。

准备数据:




从数值到网格


本实验使用了来自 Kaggle 的包含 400 万数独的数据集,其中有非常简单的,也有非常困难的。准备数据集的过程包含几大关键步骤:

1、加载和过滤:使用 kagglehub 库下载数据集并根据难度级别过滤数独。

2、难度分类:根据线索数量,将数独分为四个难度级别:

  • • Level 1(非常简单):50-81 条线索
  • • Level 2(简单):40-49 条线索
  • • Level 3(中等):30-39 条线索
  • • Level 4(困难):17-29 条线索

3、每个数独一开始都被表示成了 81 个字符的字符串。这里将其转换为具有适当行、列和框分隔符的网格格式:

4、提示词工程:每个数独都会被封装在一个精心设计的提示词中,而该提示词的作用是指示模型:

  • • 在 标签中逐步思考解决方案
  • • 在 标签中提供具有适当网格格式的最终答案

对于初始实验,我创建了一个包含 400 个训练样本的聚焦数据集,这主要是使用更简单的数独来为学习构建一个基线。这个数据集被刻意选得较小,目的是测试模型使用有限样本学习的效率。加上我的资源有限:如果使用 unsloth grpo 训练,24GB RTX 4090 大约最多只能放入 3000 上下文长度。因此我只能选择更简单的问题以避免内存溢出(OOM),因为困难的问题及其推理链更长。




实验方法


我决定探索强化学习(尤其是 GRPO)能否让语言模型变成数独求解器。我实验了两种不同的模型大小:

  • • Qwen 2.5 7B Instruct:使用了秩为 16 的 LoRA 进行微调
  • • Qwen 2.5 3B Instruct:使用了秩为 32 的 LoRA 进行微调

重要的是,我没有使用冷启动数据或从 DeepSeek R1 等较大模型中蒸馏的数据。这里会从基础指令微调版模型开始,单纯使用强化学习。训练配置包括:

  • • 批量大小:1
  • • 梯度累积步骤:8
  • • 学习率:3e-4(Karpathy 常数)
  • • 最大部署:500
  • • 每 10 步评估一次
  • • 最大序列长度:3000 token

Andrej Karpathy 曾表示 3e-4 是 Adam 的最佳学习率

奖励系统:




通过反馈进行教学


强化学习的核心是奖励函数 —— 可以告诉模型它何时表现良好。我设计了一个多分量奖励系统,它具有几个专门的功能:

1. 格式合规性奖励

为了实现良好的解析,模型应该始终记得使用正确的思考和答案标签(分别是 标签)。这些标签有两个关键目的:

  • • 将推理过程与最终答案分开
  • • 使提取与评估模型的解答变得容易

为了强制实施这种结构,我实现了两个互补的奖励函数:

第一个函数(tags_presence_reward_func)为出现的每个标签提供部分 credit,其作用是鼓励模型包含所有必需的标签。第二个函数(tags_order_reward_func)则用于确保这些标签以正确的顺序出现 —— 先思考再回答。它们一起可教会模型保持将推理与解答分开的一致结构。

2. 网格架构奖励

为了让我们读懂数独的解答,必须以特定的网格格式呈现它。该奖励函数的作用便是评估模型维持正确网格结构的能力:

该函数会将网格格式分解为多个部分 —— 正确的行数、正确的分隔符位置、适当使用分隔符。模型每个方面正确了都会获得一些奖励。这种细粒度的方法有助于模型学习数独网格的特定空间结构。

  1. 3. 解答准确度奖励

当然,最终目标是让模型正确解答数独。这里使用了两个奖励函数来评估解答的准确度:

第一个函数 (exact_answer_reward_func) 会为完全正确的解答提供大奖励 (5.0),从而为模型提供正确解答数独的强大动力。

第二个函数 (simple_robust_partial_reward_function) 会更微妙一些,会为部分正确的解答提供部分 credit。它有两个关键特性:

  • • 严格强制模型保留原始线索(如果任何线索发生变化,则给予零奖励);
  • • 对于模型正确填充的每个空单元格,都按比例给予奖励。

这种部分奖励对于学习至关重要,因为它能为模型在训练期间提供更平滑的梯度。




4. 规则合规奖励


最后,数独解答必须遵守游戏规则 —— 任何行、列或 3×3 框中都没有重复数字:

该函数会检查每行、每列和每 3×3 框是否有重复项,模型满足每个约束时都能获得一些奖励。这能让模型学会数独的基本规则,鼓励它生成有效的解答,即使它们与预期答案不完全匹配。

出人意料的结果:尺寸很重要

实际训练结果揭示了一些有趣的事情:模型大小对学习稳定性和性能具有巨大的影响。

7B 模型(使用了秩为 16 的 LoRA)结果优良:

  • • 保持了稳定的完成长度,约为 1000 token
  • • 能生成格式一致的解答
  • • 奖励指标稳步提升
  • • 在整个训练过程中保持了策略稳定性

与之形成鲜明对比的是,3B 模型(使用了秩为 32 的 LoRA )表现不佳:

  • • 训练期间出现灾难性的不稳定性
  • • 出现巨大的策略分歧(KL 飙升至 80!)
  • • 未能保持一致的性能
  • • 最终崩溃,无法恢复

图表清楚地说明了这一点:7B 模型(粉色线)保持了稳定的性能,而 3B 模型(绿色线)则出现了剧烈波动,并且最终完全失败。

训练和测试的完成长度情况:

训练和测试的净奖励:

答案格式奖励:

最重要的:最终答案奖励(模型生成完全正确的响应网格并完全匹配):

对于 7B 模型,精确答案奖励增长意味着模型能给出完全匹配的答案,但 3B 则出现崩溃情况。这证明 7B 模型学会了用很少的数据解决数独问题,并且学习速度很快!

部分奖励:







请到「今天看啥」查看全文