训一条狗,和训出会"思考"的 DeepSeek,用的是同一套办法
你在家训狗用的那套"做对给零食、做错不给",和 OpenAI、DeepSeek 训练大模型学会"思考"的办法,是同一台发动机。
本文不堆术语,用一条狗、一只会玩游戏的像素小鸟、和一个真跑通的大模型数学项目(MathGPT),把这件事讲透——顺便解释一个 2025 年最让人后背发凉的现象:DeepSeek-R1 的"顿悟时刻",没有一个人教过它。
引子:你早就是一位"强化学习工程师"了
先想象一个再普通不过的场景。
你想教狗握手。你不会给它写一本《握手操作手册》,因为狗看不懂。你能做的只有一件事:它偶然抬起了爪子,你立刻塞给它一块零食;它没抬,你什么都不给。 几十次之后,狗自己"悟"了——原来抬爪子能换来零食。你从头到尾没教它"该怎么抬",你只是在它做对的时候给了个好评。
记住这个画面。因为 OpenAI 训练 ChatGPT、DeepSeek 训练 R1 学会解数学题和推理,用的是一模一样的办法:
没有标准答案手册告诉模型"每一步该怎么想",只有一个最终的"好/坏"信号——答对给分,答错不给。模型靠一遍遍试错,自己把"什么样的思路更容易做对"刻进了神经网络里。
这就是强化学习(Reinforcement Learning, RL)。它和我们熟悉的"填鸭式学习"有本质区别:填鸭式是有老师手把手教(这是猫、那句话该这么翻译),强化学习是没有老师,只有一个最后打分的考官。训狗的你,就是那个考官。
第一幕:把"训狗"翻译成代码,你会发现它和大模型一个样
光说类比不够,我们看两段真实跑过的代码,你会发现它们的内核一个字都不差。
第一段,让一只像素小鸟自己学会穿管道(Flappy Bird 的 DQN,本质和训狗完全一致——撞管道扣分、活着加分):
# 小鸟看到画面,网络输出"扇翅膀"和"不动"两个动作的价值
current_q = self.model(states).gather(1, actions.unsqueeze(1))
next_q = self.model(next_states).max(1)[0]
target_q = rewards + (1 - dones) * self.gamma * next_q # 奖励在这里进来
loss = self.criterion(current_q, target_q)
第二段,让一个大语言模型学会做数学应用题(MathGPT 的 GRPO):
# 模型对同一道题生成一组答案,答对给 1 分、答错给 0 分
advantages = rewards - rewards.mean() # 比这组的平均分高多少
logp = -model(inputs, targets, loss_reduction='none')
pg_obj = (logp * advantages.unsqueeze(-1)).sum() # 提高"高分答案"的概率
loss = -pg_obj
一个在玩游戏、一个在解数学题;一个处理像素、一个处理文字。但它们和训狗做的是同一件事:
在没有"每一步该怎么做"的标准答案时,仅凭一个最终的"好/坏"信号,让 AI 自己摸索出一套行为习惯。
有一个特别好用的类比,能把大模型和这只狗、这只鸟一秒打通——
狗:看到你手势,决定"抬爪还是不动",图的是零食。 小鸟:看着画面,一帧帧决定"扇翅还是不动",图的是活得久。 大模型:看着上文,一个字一个字决定"下一个字写啥",图的是最后答得对。
写一段话,本质上就是一局"一步步做选择"的游戏——每蹦出一个字,就相当于走了一步棋。狗在现实里选动作,小鸟在像素里选动作,大模型在文字里选词,玩法一模一样:看情况 → 做选择 → 拿反馈 → 变得更会选。 同一台发动机,装在了三个不同的身体里。
第二幕:为什么大模型的"思考",只能"训"、不能"教"?
这里是全文最关键的一步,也是很多人想不通的地方:既然有海量优质文本,直接喂给模型"照着学"(这一步叫 SFT,监督微调)不就行了吗?为什么非要绕这么大弯来"训"?
因为模仿有天花板。
SFT 的本质是让模型背下人类写好的示范——你给它看一万道题的标准解法,它学会了"长得像"标准解法。但它并不"理解"为什么对,它只是在复刻套路。碰到数学这种要求每一步都精确的任务,模仿就露馅了:只要中间有一个字蹦错,整个答案就崩了。而且,"正确的推理路径"根本无法穷举地写给它看——一道题有无数种想对的方式,你没法把它们全列成教材。
这就跟训狗一模一样:你没法用一本手册教会狗握手,因为"握手"这个动作没法拆成文字步骤喂给它。 你只能让它自己试,试对了给奖励。
大模型的"推理能力"也是同理。没人能写出一本《如何思考》的教科书,所以只能让模型自己生成一堆思路、自己被打分、自己强化那些做对的——这正是训狗那套"试错 + 奖励"。这就是 RL 在大模型时代无法被替代的根本原因。
第三幕:那个让人后背发凉的证据——DeepSeek 的"顿悟时刻"
如果说前面还是道理,那 2025 年初 DeepSeek-R1 给了世界一个活的证据。
DeepSeek 在训练 R1 时做了件很"狠"的事:几乎不做人工示范,直接用强化学习(GRPO)让模型对着数学题自己试、自己被规则判分。结果模型在训练途中,自己长出了一种没人教过的行为——它会在解题解到一半时突然停下来,写出类似"等等,让我重新检查一下前面这步"的句子,然后推翻重来。
这在 DeepSeek 的论文里被称为 "aha moment"(顿悟时刻)。
请注意:没有任何一条训练数据教它"要学会反思"。 就像你从没教过狗"抬爪子"这个具体动作,你只是在它做对时给了零食,它自己琢磨出了这个动作。R1 也一样——你只是在它答对时给了分,它自己琢磨出了"反思一下能提高答对率"这件事,于是把"反思"这个习惯刻进了权重里。
这就是操作性条件反射(做对给奖励 → 行为被强化)在语言模型上的极致演绎。 一条狗能学会握手,一个模型能"学会"停下来质疑自己——同一套机制,只是奖励从零食换成了"答案对不对"。
第四幕:拆开引擎——它到底怎么"给零食"的?
DeepSeek 用的方法叫 GRPO(组相对策略优化),名字唬人,其实就是把"训狗"这套做到了极简。我们的 MathGPT 项目跑的就是它,四步,干净得像教科书:
第一步:对同一道题,让模型自己答一组。 同一道题让它答 8 遍、16 遍,有的对有的错——这"一组"就像让狗把同一个动作试 8 次。
seqs, masks = engine.generate_batch(
tokens, num_samples=8, temperature=args.temperature)
第二步:对答案,用规则自动打分(不需要另一个 AI 当裁判)。 数学题的好处是答案能自动判对错:对照标准答案,答对 1 分、答错 0 分。这就是"给不给零食"。
for ans in generated:
rewards.append(train_task.reward(conversation, ans)) # 对=1.0,错=0.0
第三步:算"优势"——比这组的平均分高多少。
advantages = rewards - rewards.mean() # 优势 = 自己的分 - 这组的平均分
这个"优势 = 回报 − 平均回报"是整个强化学习的灵魂。一道题答 8 次对了 2 次,那 2 个正确答案高于平均、优势为正,会被鼓励;6 个错的低于平均、优势为负,会被压制。跟训狗完全同构:这次比平时做得好,就多给点正反馈。
第四步:拧一下"决策大脑",让高分答案下次更容易出现。
logp = -model(inputs, targets, loss_reduction='none')
loss = -(logp * advantages.unsqueeze(-1)).sum() # 提高高优势答案的概率
loss.backward()
就这么四步。省掉了额外的裁判模型、省掉了复杂的价值网络,只用"同一道题这一组答案的平均分"当基线——这就是"组相对(Group Relative)"三个字的由来,也是它比 ChatGPT 当年那套 RLHF(要同时装四个模型、又重又贵)聪明的地方。
MathGPT 在 A800 上跑通了从零预训练 → SFT → GRPO 的完整链路:一个约 700M 参数的小模型,经 GRPO 在 GSM8K 上训练后,数学推理从"基本全错"提升到能解出复杂应用题。它甚至自己学会了在该算的地方调用计算器工具做精确计算——又一个"没人明确教、却被奖励逼出来"的行为。
一条线:从狗,到小鸟,到会思考的大模型
这套"试错 + 奖励"的思想,走了六十年,但骨架从没变过:
心理学:动物靠"试错 + 奖惩"学习(训狗的你,就站在这条线的源头)
│
贝尔曼方程(1950s):价值 = 即时回报 + 未来价值的折扣(代码里的 rewards + gamma * next_q)
│
Q-Learning(1989):学"每个动作值多少分",但状态一多就爆炸
│
DQN(2013) ★那只像素小鸟:用神经网络逼近,仅凭画面玩游戏超越人类
│
AlphaGo(2016):策略 + 价值 + 自我对弈,"先模仿人类、再自己跟自己下棋超越人类"
│ —— 注意这条:先模仿(SFT)、再 RL 超越,正是今天大模型走的路
│
PPO / RLHF(ChatGPT):能训了,但要同时装四个模型,太重
│
GRPO(2024, DeepSeek) ★MathGPT:规则打分 + 组内平均当基线,瘦身成一个模型
本质 = 带组内基线的策略梯度 + "自我对弈"精神
看最后两步最值得回味:GRPO 不是更复杂了,而是更简单了。 它把 AlphaGo 那套堆到顶峰的复杂系统,精炼回一条干净的"试错 + 奖励"——却继承了最珍贵的那个思想:让 AI 自己生成、自己评判、自己变强。 从棋盘上的自我对弈,到数学题上"一组答案里挑出对的强化它",是同一种智慧的两次绽放。而它们共同的祖师爷,就是你家那条为了零食学会握手的狗。
结语:同一团火,从狗窝烧进了大模型
回到开头。
你训狗握手(操作性条件反射)、那只学飞的像素小鸟(DQN)、和那个学会"顿悟"的 DeepSeek(GRPO),相隔百年、处理的东西天差地别,却共享着完全相同的灵魂:
没有人手把手教每一步,只有一个最终的好坏信号;它通过一遍遍试错,自己把"什么行为能带来好结果"刻进了脑子里(或神经网络的权重里)。
这就是为什么 DeepSeek 会"顿悟"——不是因为它更聪明,而是因为它被"训"的方式,逼它自己长出了聪明。而理解这团火最好的方式,永远是亲手跑一遍:先让那只小鸟飞起来,再让大模型算对一道数学题。
一条狗,一只鸟,一个大模型,一条主线,一团从未熄灭的火。
本文基于两个开源实践项目写成:
- Flappy Bird DQN:rl_games/flappy_bird_app(PyTorch 实现的经典深度 Q 网络)
- MathGPT GRPO:从零预训练 → SFT → GRPO 的完整大模型强化学习链路(基于 nanochat)