尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Actor-Critic算法解析:从TD误差到RLHF的核心机制

Actor-Critic算法解析:从TD误差到RLHF的核心机制 在强化学习入门阶段真正让人卡住的往往不是环境怎么写也不是策略网络怎么搭而是下面这个问题环境只给了整段体验一个总分模型却要为其中几十上百个动作分别归因。这个难题在训练生成式模型时尤其明显——一条回复最终拿到一个偏好打分但中间每一个 token 都参与了产出到底该把这份功劳记在哪个 token 上Actor-Critic 算法就是用来解决这个归因问题的典型框架。它把决策过程拆成两个角色Actor 负责生成动作Critic 负责估计状态价值再由 TD 误差把稀疏的整体奖励折算到每一步。理解这套机制不只是强化学习入门的关键也是理解 RLHF 这类大模型对齐训练的一条主线。下面我会先从 Actor-Critic 要解决的问题讲起再回到 TD 误差和优势函数的数学推导最后落到 RLHF 场景里聊聊实际训练时最容易出问题的地方。1. 先搞清楚 Actor-Critic 到底在解决什么问题1.1 单独用策略梯度问题出在方差很多人第一次接触强化学习最先看到的是 Policy Gradient。它的思路非常直接让策略在环境里跑出完整轨迹如果整条轨迹回报高就提高这条轨迹里所有动作的概率如果回报低就降低所有动作的概率。这个思路不难理解但实际使用时会发现一个问题一条轨迹里可能有大量动作其中一部分动作本来是对的只是某个动作导致后续失败最终整条轨迹回报很低。按策略梯度的原始形式所有动作都会被惩罚。反之有些动作本身很糟糕但被后续几个优秀动作拯救了最终回报不错这些烂动作也会被提升概率。这就是高方差问题。轨迹越长动作越多单个动作和最终回报之间的因果关系越模糊。梯度更新看起来方向大致对但每次更新的噪声很大训练常常抖动半天也不收敛。所以策略梯度真正需要的是一个更精细的反馈信号不仅要告诉模型“整条轨迹是好是坏”还要告诉模型“在某个状态下某个动作比平均水平好多少”。这个“好多少”就是优势函数的概念也是 Actor-Critic 的核心信号。1.2 单独用值函数问题出在动作决策另一条经典路线是 Q-learning。它不直接学策略而是学一个价值函数比如状态-动作价值函数 (Q(s,a))用来评估“在状态 (s) 下执行动作 (a)”能带来多少期望回报。Q-learning 在离散动作空间里很好用因为决策过程可以简化成遍历所有动作选 Q 值最大的那一个。但到了连续控制或生成任务里这个“最大化”操作就变得很麻烦。动作空间是连续的你没法用穷举即使用优化器去搜索最优动作每一步都做一次优化计算量和稳定性都是大问题。更本质的问题是Q-learning 不直接给出“如何行动”需要额外策略来吃 Q 值的输出。这就让“评估动作”和“生成动作”变成了两件事而不是一个统一流程。1.3 关键理解不是分工而是闭环Actor-Critic 把两条路线缝合起来。Actor 是策略网络负责生成动作Critic 是价值网络负责评估当前状态或动作的好坏。实际推进过程是这样Actor 在状态 (s_t) 下生成动作 (a_t)环境给出奖励 (r_t)进入下一个状态 (s_{t1})Critic 用当前价值估计计算 TD 误差TD 误差或由它推导出的优势函数被当作 Actor 更新策略时的反馈信号。这里的关键不是它有两个网络而是两个网络通过一个共同信号完成了闭环。Critic 的价值估计越准Actor 拿到的优势函数就越有价值动作归因就越精确Actor 策略变化后Critic 又需要重新拟合新的价值分布。所以我的判断是Actor-Critic 真正解决的不是“一个模型不够所以用两个”而是把“稀疏的、延迟的、来自整体结果的好与坏”折算成“对每个局部决策的反馈”。没有这个折算过程长轨迹决策和生成式任务都很难稳定训练。2. 从 TD 误差开始把最终结果折算到每一步2.1 蒙特卡洛方法看完整轨迹但太慢要理解 TD 误差先要看一个更原始的做法蒙特卡洛。它把整个轨迹的折扣回报表示为[ R(\tau)\sum_{t0}^{T-1}\gamma^t r_t ]训练时算法必须等整条轨迹结束拿到最终回报 (R(\tau))才能更新价值函数。这种做法优点是无偏缺点太慢、方差太大。尤其在实际任务里轨迹可能很长甚至没有固定结束点。你不可能每次都等到游戏结束才开始学。2.2 TD(0)用下一步预测代替完整回报时序差分方法换了一个思路不等完整轨迹结束而是用当前奖励加上下一步状态的价值预测来构造目标值。于是出现了一个很关键的信号——TD 误差[ \delta_t r_t \gamma V(s_{t1}) - V(s_t) ]这个式子的意思是真实奖励 (r_t) 加上“未来价值的预测”应该等于“当前状态价值的预测”。如果两者不一致说明当前估计还有偏差这个偏差就是 (\delta_t)。TD 误差的价值在于它不需要等到轨迹结束就能实时估计“当前这一步的预测出现了多大偏差”。Critic 更新时会用 (\delta_t) 来调整价值网络Actor 更新时也可以把 (\delta_t) 当作动作好坏的近似信号。如果价值网络估计足够准(\delta_t) 的条件期望就接近优势函数。也就是说TD 误差是连接“策略评估”和“策略改进”的枢纽。2.3 从单步 TD 到广义优势估计单步 TD 的问题又来了它只看下一步视野太短。如果奖励很稀疏单步 TD 能承载的信息非常有限。一个更通用的折中方案是广义优势估计也就是 GAE[ A_t^{GAE(\gamma,\lambda)}\sum_{l0}^{\infty}(\gamma\lambda)^l\delta_{tl} ]这里的 (\lambda) 控制视野。(\lambda0) 时GAE 退化成单步 TD(\lambda1) 时它接近蒙特卡洛会累计完整轨迹的 TD 误差。实际训练中通常取 0.9 到 0.99 之间让优势估计既有单步 TD 的低方差又有蒙特卡洛的远见。在 PPO 这类基于 Actor-Critic 的算法里GAE 是标配。它把每一步的 TD 误差按时间衰减累加形成一个更平滑的优势信号。后面讲 RLHF 时你会看到这种“把最终结果逐步回传”的能力恰恰是大语言模型训练最需要的东西。3. Actor-Critic 的数学推导为什么优势函数是真正的沟通语言3.1 从策略梯度到带基线的策略梯度策略梯度定理的标准形式是[ \nabla_\theta J(\theta)\mathbb{E}\left[\sum_{t0}^{T-1}\nabla_\theta\log\pi_\theta(a_t|s_t) R(\tau)\right] ]这个式子的含义是用整条轨迹回报 (R(\tau)) 乘上对数概率的梯度来更新策略参数。方差大就是因为它把每个动作的梯度都和整体回报绑定在一起。为了降低方差可以引入一个基线 (b(s_t))常见选择是状态价值 (V^\pi(s_t))。减去基线后策略梯度变成[ \nabla_\theta J(\theta)\mathbb{E}\left[\sum_{t0}^{T-1}\nabla_\theta\log\pi_\theta(a_t|s_t)\left(Q^\pi(s_t,a_t)-V^\pi(s_t)\right)\right] ]括号里的部分就是优势函数[ A^\pi(s_t,a_t)Q^\pi(s_t,a_t)-V^\pi(s_t) ]优势函数衡量的是在状态 (s_t) 下执行动作 (a_t)比平均水平的策略好多少。如果优势为正这个动作值得提高概率如果优势为负就应该降低概率。这个信号比整条轨迹回报干净得多。3.2 Critic 如何估计优势到这里出现一个实际问题我们并不知道真实的 (Q^\pi(s_t,a_t)) 和 (V^\pi(s_t))。Critic 网络的职责就是用一个参数化价值函数 (V_\phi(s_t)) 去逼近真实状态价值。那优势函数怎么得到一种常见做法是用 GAE 从 TD 误差中累计出优势估计。因为当价值函数接近真实时TD 误差本身就能反映“当前动作带来的意外收益”累计多步后就能逼近优势。所以 Critic 不是直接输出优势而是输出状态价值再通过 TD 误差和 GAE 把优势“算”出来。3.3 Actor 和 Critic 各自更新什么Actor 网络的更新目标是最大化优势。常见写法是最大化期望优势[ \nabla_\theta J(\theta)\mathbb{E}\left[\nabla_\theta\log\pi_\theta(a_t|s_t)\hat{A}_t\right] ]这里 (\hat{A}_t) 是估计出来的优势。Critic 网络的更新目标是让价值预测更准确常见做法是最小化 TD 目标与当前价值之间的平方误差[ L(\phi)\mathbb{E}\left[\left(r_t\gamma V_\phi(s_{t1})-V_\phi(s_t)\right)^2\right] ]实际实现中PPO 会先用当前策略采样一批轨迹计算 GAE 和优势再用这些固定目标来更新 Actor 和 Critic 若干轮。不完全是在线式每一步都更新这样可以减少样本相关性和训练波动。一个最小可运行的训练循环可以这样理解for each iteration: 用当前 Actor 采样一批轨迹 用 Critic 计算每个状态的预测价值 计算 TD 误差或 GAE 更新 Critic让价值预测逼近 TD 目标 更新 Actor提高优势为正的动作概率这个流程看着简单但真正落地时每一步都有很多细节。最典型的问题是Critic 收敛太慢导致优势估计不准或者 Actor 更新太快导致策略瞬间退化。这也是为什么 PPO 要引入 clip 机制限制策略更新的步长。4. RLHF 里的 Actor-Critic环境不是游戏而是人类偏好4.1 RLHF 和标准强化学习的核心差异RLHF也就是基于人类反馈的强化学习现在几乎成了大语言模型对齐训练的通用说法。它和普通强化学习的最大区别是环境不再提供明确奖励而是用一个奖励模型来模拟人类偏好。我们可以把 RLHF 拆成三步来看先做监督微调让模型具备基本的生成能力收集人类对多个生成结果的排序训练一个奖励模型用奖励模型当奖励信号让策略模型继续做强化学习常见实现就是 PPO。在第三步里策略模型是 Actor负责生成 token价值模型是 Critic负责估计“当前生成到这个状态最终能拿到多少奖励”。奖励模型则负责给出单次生成结果的整体奖励。为什么会需要这层结构因为奖励模型往往只在完整序列生成后才能给出一个分数。模型生成了 50 个 token中间没有逐 token 奖励只有最后一个整体打分。如果直接用这个分数更新每一个 token 的概率又会回到策略梯度的高方差问题。价值网络的作用就是把最终的整体奖励折算到生成过程中的每一个 token 上让模型知道“生成到第 10 个 token 时这个状态到底值多少”。4.2 PPO 是 Actor-Critic 在文本生成上的主力实现RLHF 阶段最常用的强化学习算法是 PPO。PPO 本质上就是 Actor-Critic 的一种变体额外加了一个 clip 目标防止策略更新幅度过大。它的核心目标可以写成一个更安全的版本[ L^{CLIP}(\theta)\mathbb{E}_t\left[\min\left(\rho_t(\theta)\hat{A}_t,\ \operatorname{clip}(\rho_t(\theta),1-\epsilon,1\epsilon)\hat{A}_t\right)\right] ]其中[ \rho_t(\theta)\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} ]简单理解如果新策略和旧策略在某个动作上的概率比相差太多就把目标函数截断不让那个动作因为一次偶然的高优势被过度更新。在 RLHF 场景里除了奖励模型的分数通常还会加一个 KL 正则项防止策略模型偏离原始 SFT 模型太远。常见形式是在奖励里减去 KL 散度[ r_{\text{total}}(x,y)r_{\text{reward model}}(x,y)-\beta\log\frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} ]这个 KL 项的作用是约束模型不让它为了刷奖励分数而牺牲语言自然度。你会发现随着 RLHF 训练推进奖励模型会被模型找到捷径也就是所谓 reward hacking。KL 正则不是唯一手段但它是非常关键的一道防线。4.3 评论家、奖励模型、价值模型别搞混很多人在看 RLHF 结构图时会疑惑又是奖励模型又是评论家又是价值模型到底谁是谁这里用一个表格整理一下模型角色输入输出策略模型Actor当前已生成的 token 序列下一个 token 的概率分布价值模型Critic当前已生成的 token 序列标量价值估计奖励模型外部奖励来源完整生成序列整体偏好分数价值模型和奖励模型不一样。奖励模型只在训练前负责打分价值模型则在强化学习训练过程中负责估计中间状态的价值。PPO 训练时会同时跑策略生成、价值估计、奖励模型打分、KL 计算这几条通道然后把它们的输出合成一个优势估计再更新策略模型。实际实现里策略模型和价值模型可以共享同一个底座模型只在顶部加不同的 head。这种工程设计能节省显存但也容易让价值模型和策略模型互相干扰。具体怎么取舍要看你的资源和训练稳定性。5. 实战中最容易踩的坑和排查链路5.1 训练不稳定的第一反应先看优势估计RLHF 训练或者普通 Actor-Critic 训练时最让人头疼的就是 reward 曲线往上走但生成质量肉眼可见地变差或者 reward 和 critic loss 一起震荡。遇到这种情况我的建议是先不要调网络宽度也不要急着加正则优先检查几个信号奖励是否被缩放或标准化过奖励尺度过大会让优势估计不稳定GAE 的 (\lambda) 是否合理(\lambda) 太大优势方差大(\lambda) 太小模型可能只看短期KL 系数是否太小KL 太小模型可以肆意偏离原始策略价值模型是否已经收敛如果价值模型的 loss 还在剧烈波动优势估计基本不可信。在很多开源实现里这些参数默认值不会太差但换到自己的任务后最优区间可能完全不同。不要迷信默认参数。5.2 奖励 hack模型找到了你看不见的捷径奖励 hack 是 RLHF 里最典型的问题。形式上reward 在上升但人工观察生成结果会发现回复空洞、重复、套话甚至利用奖励模型的盲区刷分。排查时要看的不只是总奖励还要拆开看KL 惩罚项是否在上涨如果 KL 上涨说明模型正在偏离原始模型生成样本的多样性是否下降如果重复率变高往往是模型已经钻了空子奖励模型的分数分布是否异常集中如果大部分样本都打同一个高分奖励模型可能已经被策略模型攻破。缓解手段有很多增大 KL 系数、用多个奖励模型做集成、在奖励模型训练时加入更多对抗样本、在策略更新时限制 prompt 分布和响应长度。最有效的手段往往不是某一个参数而是把问题暴露出来持续采样观察生成结果。5.3 一套可以复用的排查顺序如果你在训练中遇到问题可以按下面的顺序排查排查层优先检查项常见手段信号层奖励曲线、KL、价值 loss拆分 reward监控 KL 和生成多样性输入输出层状态、动作、序列长度、termination检查 padding、mask、开始结束符环境层奖励模型是否过拟合、prompt 分布多选 prompt看奖励是否稳定参数层(\gamma)、(\lambda)、clip、学习率先恢复默认值再做小范围搜索工程层日志丢失、显存溢出、数据加载异常加 checkpoint做随机种子对比这个顺序背后的逻辑是先确认信号有没有问题再确认数据链路有没有问题最后才去调算法细节。很多初学者一上来就调 (\gamma) 和 (\lambda)结果发现是奖励模型打分异常导致后面所有信号都是错的。5.4 调参经验先保守再激进如果你准备跑 RLHF我的实际建议是先拿一个小规模 prompt 集跑通流程确认数据流、模型流、奖励流都没有问题使用较小的学习率比如常见区间内的低端值避免策略模型开局就跑飞GAE 的 (\lambda) 可以设在 0.95 附近(\gamma) 设在 0.99 左右这两个值对大多数生成任务都比较温和clip epsilon 通常取 0.1 到 0.2不要一开始就取很大值如果 KL 系数不好定可以先从一个较小值开始然后观察 KL 曲线再逐步调整。这些区间是通用经验不是公式。你需要结合自己的任务、奖励尺度、模型规模和显存情况做实验。6. 适用边界与学习路径6.1 Actor-Critic 适合什么不适合什么Actor-Critic 优点明显但不是万能。对合适的场景它能极大缩短训练时间对不合适的场景它会让简单问题变得很复杂。适合的场景包括连续控制任务动作空间无法穷举轨迹特别长需要把整体回报折算到中间状态生成式任务比如文本生成、对话策略训练策略本身需要随机性而不是简单贪心选动作任务有延迟奖励比如游戏里后期才出现胜负。不太适合的场景包括状态和动作空间都很小离散动作数量不多直接使用 DQN 或更简单的表格式方法可能更容易奖励非常密集且即时每一步都能获得有效反馈策略梯度的高方差问题不明显训练资源和调参预算有限Actor-Critic 类算法对超参数更敏感可能让你花大量时间调参而不是解决问题需要极强稳定性的生产环境Actor-Critic 需要完整的日志、回滚、评估机制否则一次训练事故可能浪费大量算力。6.2 从算法到工程你需要补哪些拼图如果只是学习验证自己写一个简单的 Actor-Critic 在标准环境上跑通就可以理解大部分原理。但如果要把它应用到真实项目尤其是 RLHF 场景你还要补上这些工程能力数据采样与管理轨迹数据如何保存、是否做 replay、sample 效率如何日志监控至少记录 reward、critic loss、KL、grad norm、explained variance模型 checkpoint 与回滚训练跑飞时能恢复到上一个稳定版本奖励模型质量控制奖励模型一旦有偏差强化学习阶段会把偏差放大分布式采样模型足够大时在线采样和策略更新往往会拆成多个角色并行。这也是为什么很多强化学习项目看起来算法简单但工程复杂度很高。算法只是最后一步的“更新公式”前面所有数据流的稳定性和可观测性反而决定了训练能不能跑完。6.3 一个四步检查框架把前面的内容收束成一个可复用的四步检查框架适合你在算法实现、调试和方案选型时反复使用检查奖励信号是否清晰奖励稀疏还是密集是否存在延迟会不会被 hack检查价值估计是否稳定Critic loss 是否收敛GAE 的优势估计是否合理检查策略更新是否保守PPO clip 是否生效KL 约束是否足够检查工程链路是否可靠输入输出、日志、checkpoint、随机种子是否都能复现四步不是线性的而是要循环检查。因为你改了一个参数前面的价值分布、优势估计、策略分布都会跟着变。回到最开始的问题环境只给一个总分模型怎么知道每一步该被奖励还是被惩罚Actor-Critic 给出的答案是用一个价值网络持续预测未来的期望回报再用 TD 误差把现实和预测的差距逐步回传最终形成对每个局部决策的反馈。RLHF 只是把这里的“现实”从游戏奖励换成了人类偏好模型底层机制仍然一致。如果这篇文章只能留一个印象我希望是先把 TD 误差和优势函数吃透再去看各种强化学习算法很多困惑都会自然消失。不要一上来就堆网络结构和分布式框架先在一个简单环境上把 Actor 和 Critic 的更新循环跑通感受一下“预测偏差如何指导动作调整”这个方法会帮你省去大量后面调参的弯路。
返回列表