强化学习入门:Spinning Up 最简单策略梯度(REINFORCE)训练循环与 Loss 解读

本文聚焦 Spinning Up 里 Simplest Policy Gradient 一节对应的思路与参考实现,偏读书笔记:不从零推导 MDP / 回报等基础定义;若对符号或 RL 总览不熟,建议先看 Spinning Up 前两节的入门材料。原文对策略梯度有一段「把 Return 的梯度改写成对策略参数的梯度」的推导,并用到几处常见的等价变形(为什么要这样变形还可后续再补全)。 原文在讲什么(整体逻辑) 推导:说明 Return 的梯度如何变成 策略(policy)参数上的梯度(中间有几步技巧性的改写)。 实现:给出最简可运行示例;下面把代码里容易混淆的几块单独拎出来对照。 1. train_one_epoch、epoch、episode 分别是什么? 示例脚本 1_simple_pg.py 里的命名如下(外层循环变量也叫 epoch): 概念 含义(结合示例代码) Episode 一条完整轨迹:从 env.reset() 开始,每步 step,直到 done=True;结束时用整条轨迹的 reward 得到 R(τ),并把该标量赋给这条轨迹上每一步的权重。 train_one_epoch() 一次「采样 + 一次梯度更新」:内部用 while True 不断与环境交互,把每一步的 obs / act 等放进 batch;当 len(batch_obs) > batch_size(默认 5000)时停止采样,随后对当前这批数据 算一次 compute_loss、backward、optimizer.step()。中间通常会跨过多个 episode。 外层 epoch(epochs=50) 训练共进行 50 轮:每一轮调用一次 train_one_epoch(),即「再采一批数据 → 再更新一次策略」。 串联理解:多个 episode 在时间上前后相接,共同填满一个 batch(按时间步计数,直到超过 batch_size)→ train_one_epoch 末尾 更新一次参数 → 外层再重复下一轮。 ...

March 29, 2026 · 1 min