RL基础与策略梯度:看懂大模型强化学习的必备知识
强化学习在LLM中不是在教模型"算对答案",而是在教模型"选对答案"——在多个合理输出中,按偏好排序,让好回答的概率压过坏回答。
📍 本文适合有ML基础但未接触过RL的工程师阅读,预计阅读 18 分钟。
---
1. 技术概述:为什么LLM需要强化学习?
1.1 强化学习是什么?——先理解"试错学习"
在讲"大模型的强化学习"之前,先把"强化学习"本身是什么说清楚。不然一上来就讲MDP、策略梯度,就像教人游泳时先讲流体力学——方向没错,但对初学者不友好。
一个谁都能懂的类比:训狗
你想教狗学会"坐下"。每次它坐下,你给一块零食;每次它站着或乱跑,你就不给。
这就是强化学习的本质:通过"尝试→得到反馈→调整行为"的循环,从零学会做最优决策。
把这个过程抽象成规范的语言,就是强化学习的经典框架——智能体-环境交互循环(Agent-Environment Loop):
把"训狗"填进这个框架里,顺便预览一下LLM怎么对应:
RL跟监督学习有什么本质不同?
监督学习需要"标准答案"——每道题旁边标好了正确答案。RL不需要标准答案,只需要一个打分机制。你不知道"坐下"和"趴下"哪个才是你要的,你只知道"坐下给了零食,趴下没给"。RL通过反复尝试,自己找出哪个行为得分最高。
这正是LLM需要RL的原因:对于"怎么回答才算好",我们往往写不出标准答案(否则直接用SFT就行),但我们能说清楚"A比B好"。RL就是让模型在A和B之间反复比较,学会"为什么A比B好"。
💡 关键要点:强化学习 = Agent在环境中试错 → 按奖励信号调整策略 → 最终学会最优决策。LLM的RL = 模型生成回答 → 打分 → 调整参数,循环往复。
1.2 策略梯度是什么?——用数学方法调整"决策偏好"
现在你有了RL的直觉概念。下一个问题:怎么用数学方法,实质性地更新一个策略?
策略就是"决策规则"
先从"策略"(Policy)说起。策略本质上就是从"我看到什么"到"我该做什么"的映射,用数学表示就是:
策略 π:状态 s → 动作 a 的概率分布
即:
RL训练的目标,就是把策略从"瞎猜"调成"精准决策"——让对的动作概率尽可能高。
一个致命难题:离散采样不可导
如果你是用深度学习(反向传播)训练模型的老手,你可能下意识想:"奖励就是损失函数,梯度反传不就完了?"
问题出在采这一步:
输入 → 模型 → 概率分布(好:60%, 坏:40%) → 🎲采样得到"坏" → 奖励 = -1,此处不可导!(没法对"投骰子投出了几"求梯度)
常规深度学习中,模型输出一个连续值,直接和标签对比求loss反向传播——整个链条连续可导。但在RL中,模型输出的是概率分布,然后从分布中随机采样一个离散动作——这个"随机选一个"的操作打断了梯度链条。
这就是RL和普通深度学习最根本的分歧:我们要优化的对象(奖励)不能直接对动作求导,因为动作是离散采样得到的。
策略梯度的破局思路:绕过采样,直接调概率分布
既然"动作→奖励"这条路不通(采样挡中间),那就换个思路——不求"奖励对动作的导数",而是求"期望奖励对策略参数的导数"。
策略梯度的核心是"对数导数技巧"(log-derivative trick):
不用纠结它的推导,重点在于:∇log π(a|s) 不需要知道"选了这个动作后奖励是多少"——它只跟模型自己的输出有关,完全可以在模型内部计算。这就绕过了采样的不可导问题。
一个极其直观的类比:调骰子
想象你有一个内部权重可调的骰子。初始每个面概率 1/6。每次投骰子按结果给钱:
你的目标:调整骰子内部权重,争取长期赚钱最多。
你没法直接算出"最佳权重"——因为骰子是随机的,投出什么不完全归你管。但你可以这样做:
几十轮后,这个骰子会越来越偏向投出6——不是"必定投出6",而是6的概率从1/6涨到远高于1/6。
这个过程的数学表达就是策略梯度定理:
逐词翻译:
∇J(θ):期望奖励关于策略参数θ的梯度(我们想要的更新方向)E_{τ~π_θ}:对当前策略生成的各种行为轨迹取平均∇log π_θ(a_t | s_t):每个动作的概率梯度——"增大这个动作的概率,会往什么方向调参数"R(τ):整个轨迹的奖励——"这个动作干得好不好"翻译成一句话:用奖励信号当权重,对对数概率求梯度——好动作放大,坏动作压缩。
第2节会把这个公式的推导一步步拆开展示,这里你只需要记住核心直觉:
策略梯度 = 试(按当前策略采样生成)→ 评(打奖励分)→ 调(好动作↑,坏动作↓),循环往复。
1.3 SFT的边界在哪里?
先搞清楚一个问题:既然SFT(监督微调)已经能让模型回答问题了,为什么还需要RL?
SFT的本质是"模仿"——给模型看"问题-标准答案"对,让它学会按格式输出。但SFT有一个根本缺陷:它无法区分多个正确答案之间的好坏。
举个例子:你问模型"解释一下什么是梯度下降"。
SFT模型可能生成三种回答:
对SFT来说,这三个都是训练数据里出现过的模式,都是"正确"的——它会随机选一个。SFT没有"偏好"。RL的作用就是告诉模型:在你的场景下,A比B好,B比C好——按这个偏好重新分配概率。
💡 关键要点:SFT让模型"会回答",RL让模型"回答得好"。
1.4 RL在LLM技术栈中的位置
预训练给了模型"知识",SFT给了模型"格式",RL给了模型"品味"。三个环节缺一个,模型都不好用——预训练不够模型就"无知",SFT不够模型就"不会说话",RL不够模型就"不讨人喜欢"。
---
2. 核心原理:把LLM输出建模成强化学习问题
2.1 先理解MDP:从"试错循环"到"数学框架"
在1.1中我们用"训狗"类比和"智能体-环境循环"图建立了RL的运行直觉。但要从直觉升级到可编程的算法,需要一个数学模型来精确描述决策过程。
马尔可夫决策过程(Markov Decision Process, MDP) 就是这个数学框架。它把Agent-Env循环中的每个概念都精确化,定义了一组数学对象:
MDP还有一个核心假设——马尔可夫性质(Markov Property):下个状态只取决于当前状态和当前动作,和历史怎么走过来没关系。LLM天然满足这个性质:下一个token的选择只取决于"截至目前生成的文本",与"上个月生成过什么"完全无关。
现在把1.1中"训狗→LLM"对照表升级为MDP的正式映射:
这个映射是理解LLM强化学习的关键:LLM每生成一个token,就是做一次MDP"动作";生成完整个回答后,获得一个"奖励"——这个奖励可能是人类标注的偏好分数,也可能是"数学答案对不对"这样的规则判断。
LLM的MDP有两个独特的简化特征:
(1)转移确定性:选择token y_t后,新状态就是旧状态拼上y_t——没有任何随机性。这让状态转移变得极其简单。
(2)回合制(Episodic)+ 稀疏奖励:一个prompt-answer对就是一个完整的episode,episode结束时才获得奖励。中途没有即时奖励信号。
2.2 策略梯度的数学原理——从直觉到公式
在1.2中我们用"调骰子"建立了策略梯度的直觉。现在把直觉翻译成精确的数学——每一步都有明确的由来。
第一步:定义优化目标
LLM的策略就是模型参数θ。给定一个prompt,模型按策略 π_θ 逐token生成回答。这一整条生成路径叫轨迹(trajectory)τ:
从初始状态(prompt)出发,一路选token直到生成结束符(EOS)。
生成完成后,我们给这条轨迹打一个总奖励 R(τ)。我们的目标是:
找到最优参数 θ,使得按策略 π_θ 采样得到的轨迹,期望奖励最大。
写成数学:
J(θ) 就是"给定策略参数θ,平均能拿多少奖励"——我们希望它越大越好。
第二步:对期望求梯度——对数导数技巧
要让 J(θ) 变大,需要求它的梯度 ∇J(θ)——"期望奖励随参数θ变化的斜率"。问题来了:J(θ)里有一个期望运算(对采样轨迹取平均),还有一个采样过程(π_θ 随机生成轨迹),怎么求导?
先把期望展开成积分形式:
交换梯度和积分(数学上温和条件下成立):
这里出现了 ∇π_θ(τ)——"轨迹概率对参数的梯度"。这个东西不好直接算。但有一个关键的数学恒等式来救场:
把 π_θ(τ) 当成 f(x):
把积分写回期望形式:
这一步是整个策略梯度的灵魂——我们把"采样轨迹概率的梯度"转化成了"轨迹对数概率的梯度"。而 ∇log π_θ(τ) 只跟模型自己输出的对数概率有关,完全不涉及不可导的采样步骤。对数导数技巧在这里的作用就是"绕开那个堵在路中间的离散采样"。
第三步:把轨迹分解为token序列
一个轨迹τ是由T个token组成的序列:a_1, a_2, ..., a_T。根据概率链式法则,轨迹的联合概率 = 每个条件概率的乘积:
两边取对数:
两边取梯度:
代入第二步的结果,得到策略梯度定理的最终形式:
这个公式在说什么?逐层翻译
内层:轨迹中每个token,计算它的log概率关于参数的梯度方向,乘以整个轨迹的总奖励。
外层:用当前策略采样很多条轨迹,取平均——消除单次采样的随机性。
翻译成人话:
对于每个生成的token,计算它的log概率对参数的梯度方向,然后乘以整个回答获得的奖励。奖励越高,梯度幅度越大,该token的概率就被"拉"得越狠。采样多条轨迹取平均,让更新信号稳定。
核心公式拆解:
∇log π_θ(a_t|s_t) ——"如果我稍微调一下参数,这个token的概率会往什么方向变化?"R(τ) ——"这个回答整体得了多少分?"一个微型数值例子:让公式"活"起来
用一个2-token的例子来感受公式实际怎么工作。
假设词表只有 {"好", "坏"} 两个token,对prompt "今天天气" 模型最多生成2个token就结束。
当前策略 π_θ 下的概率分布:
模型采样一次,生成了 τ = "好" + "坏",整个回答的奖励 R(τ) = +0.5。
计算梯度贡献:
- 本次贡献 = ∇log π(好) × 0.5 → 正向更新,幅度由+0.5缩放
- 本次贡献 = ∇log π(坏) × 0.5 → 也是正向,因为总奖励+0.5 > 0
注意这里的反直觉后果:明明是"坏"token,但因为整体奖励是正的,梯度还是在增大"坏"的概率! 这是REINFORCE的朴素缺陷——它不会区分"哪个token贡献了大奖励,哪个token只是搭便车"。这就是第3节要讨论的信用分配问题和优势函数的由来。
这个微型例子让你直观看清策略梯度的学习信号本质:它不关心"这个token本身好不好",它只关心"生成了这个token的那条完整轨迹好不好"。好轨迹里的所有token都受益,坏轨迹里的所有token都受罚。
💡 关键要点:策略梯度 = 采样轨迹 → 打总分 → 每个token按总分加权更新。核心突破是用对数导数技巧把"对采样的梯度"转化成"对log概率的梯度",绕过了离散采样不可导的障碍。
2.3 REINFORCE:最原始的策略梯度
REINFORCE算法是1992年提出的,虽然简单得朴素,但它包含了所有现代LLM RL算法的DNA。流程只有三步:
(1) 采样:用当前策略生成一个完整的回答(一个episode)
(2) 打分:给这个回答一个奖励值 R
(3) 更新:对回答中每个token,loss = -log_prob × R,反向传播
用代码表达最直观:
def reinforce_step(model, prompt, reward_fn):
# 1. 采样:生成一个完整回答
log_probs = []
tokens = []
state = prompt
for _ in range(max_len):
logits = model(state)
probs = torch.softmax(logits, dim=-1)
token = torch.multinomial(probs, 1) # 按概率采样,保证探索性
log_probs.append(torch.log(probs[token]))
tokens.append(token)
state = torch.cat([state, token])
if token == eos_token:
break
# 2. 打分:整个回答的质量
response = decode(tokens)
reward = reward_fn(response) # 比如:数学题答案检查,对=1,错=-1
# 3. 更新:好回答增大log_prob,坏回答减小log_prob
loss = -sum(log_probs) * reward # 核心!log_prob × reward
loss.backward()
optimizer.step()教学生做题的类比:REINFORCE就像让学生做一套卷子,做完后老师只给一个总分,然后说"这套卷子所有题目都按这个总分来调整你的解题习惯"。很明显,这个方式很粗糙——一道10分的题答错了,一道2分的题也答错了,但都按同一个总分来"惩罚"。这就是信用分配问题。
💡 关键要点:REINFORCE=采样→全序列打分→log_prob×reward反向传播。简单但方差大。
---
3. 深入理解:从REINFORCE到实用算法的三座桥
REINFORCE虽然原理简洁,但直接用在LLM上有三个致命问题,而现代算法(PPO、GRPO等)本质上就是为了解决这三个问题而生的:
3.1 方差问题 → 优势函数
REINFORCE的问题是:每次采样和打分都有很大的随机性。同一个prompt,模型可能这次运气好生成了好回答、下次运气差生成了差回答——梯度信号波动剧烈,训练不稳定。
解决方案:不直接用原始奖励,而是用"优势"(Advantage)——这个回答比平均水平好还是差。
baseline最简单的形式就是所有采样回答的平均奖励。回答了80分,平均是70分,那优势就是+10——这个回答"还行,可以学"。如果真的优秀得了95分,优势就是+25,梯度信号会更强。
一个具体例子来感受方差问题:
假设你让模型回答同一道数学题两次(同一个prompt),两次都碰巧答对了,但因为奖励函数里有些随机噪声——比如打分时微小的格式差异、或者RM本身就是概率性的——第一次得了85分,第二次得了75分。
如果直接用原始奖励 R 更新:
两次回答本质相同,更新幅度却差了10个单位——这就是方差。
如果用优势 A = R - baseline(baseline取两次平均=80):
优势函数的本质:去掉奖励的"绝对水平",只保留"相对好坏"的差异。 这大幅降低了随机噪声对训练的影响——两次一样的表现不该有截然不同的更新力度。
这就是优势函数(Advantage Function)的直觉,也是为什么PPO需要Value Model来精确估计baseline、GRPO用组内平均来近似baseline。
3.2 信用分配问题
前面REINFORCE的例子中,整套卷子的所有题目都按同一个总分来调整——信用分配(Credit Assignment)问题:一个回答里有100个token,但可能只有其中10个对"回答质量好"有贡献。凭什么全部token都按同一个奖励来更新?
这个问题的解法是GAE(Generalized Advantage Estimation,广义优势估计),它是PPO的核心组件之一。简单来说,GAE给每个token分配不同的"贡献权重"——离奖励信号越近的token,被认为贡献越大。第2篇会详细展开。
3.3 步子太大问题 → Clipping
策略梯度是按"梯度的方向"走的,但如果一次更新步子太大,策略可能会变得面目全非——原来会说的话突然不会说了。
解决方案:限制每次更新的幅度,这就是PPO名字里"Proximal"的含义——保持"近端"、不要跑太远。第2篇重点展开。
💡 关键要点:REINFORCE的三个问题(方差、信用分配、步子太大)正好对应PPO的三个核心组件。
---
4. 常见误区
误区一:"RL就是让模型随机探索"
RL不等于随机。LLM RL始终有KL散度约束在拉住模型,不让它偏离SFT模型太远。纯粹放开探索的后果是模型会退化成"胡言乱语的奖励黑客"——专挑奖励函数的漏洞而没有实际意义。这也是为什么2025年前后的RLHF实践中,KL系数的调优往往是花费时间最多的环节。
误区二:"奖励函数可以像loss一样直接反向传播求导"
不行。奖励函数作用于离散的token选择过程,而离散采样不可导——你选"好"还是"坏"是一个离散决策,没法求梯度。这就是为什么RL需要用策略梯度(采样+期望梯度)而不是直接的反向传播。这个区别是RL和普通深度学习最根本的差异之一。
误区三:"PPO和GRPO是全新的东西"
本质上,PPO = REINFORCE + Clipping + Advantage,GRPO = PPO - Critic + 组内归一化。所有LLM RL算法都是REINFORCE的后裔,核心的"log_prob × reward"骨架没变过。理解了REINFORCE,你就理解了所有LLM RL算法的基因。
---
5. 本篇总结
这一篇我们建立了三个核心认知:
🔗 下一篇预告:REINFORCE方差大、训练不稳定。PPO如何通过裁剪机制和GAE优势估计,让RL训练变得"像定速巡航一样稳"?而且为什么PPO需要同时维护4个模型(Actor、Reference、Reward Model、Critic),显存直接翻倍?
---
参考资源
- 《Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning》(Williams, 1992) — REINFORCE原始论文,策略梯度的起点
- 《Proximal Policy Optimization Algorithms》(Schulman et al., 2017) — PPO论文,下一篇文章的核心
- HuggingFace Deep RL Course — 免费的在线RL教程,有配套代码
- 《Reinforcement Learning: An Introduction》(Sutton & Barto, 2018) — RL圣经,第13章讲策略梯度