目录
[REINFORCE 算法详解](#REINFORCE 算法详解)
[策略 π(a|s, θ) 长什么样?](#策略 π(a|s, θ) 长什么样?)
[Step 1: 跑完一整个回合](#Step 1: 跑完一整个回合)
[Step 2: 算每一步的回报 q_t(s_t, a_t)](#Step 2: 算每一步的回报 q_t(s_t, a_t))
[Step 3: 更新策略参数 θ(核心)](#Step 3: 更新策略参数 θ(核心))
[为什么叫 REINFORCE?](#为什么叫 REINFORCE?)
前面学习了 value-based 方法找最优策略 , 以及 function-based的方法找最优策略,这一节学习policy-based的function化方法
REINFORCE 算法详解
┌──────────────────────────────────────────────────────────────────
│
│ 之前所有算法(Sarsa, Q-learning, DQN):
│ 学的是 value function q̂(s, a, w),策略从Q值间接推导(ε-greedy)
│
│ REINFORCE:
│ 直接学策略本身 π(a|s, θ),用参数 θ 表示"在s状态选a的概率"
│ 不需要Q表,不需要ε-greedy,直接输出概率!
│
│ Value-based: 学Q值 → 推出策略
│ Policy-based: 直接学策略 ← REINFORCE 属于这类
└──────────────────────────────────────────────────────────────────
伪代码

策略 π(a|s, θ) 长什么样?
例子: 用 softmax 策略
在状态 s 时,对每个动作算一个偏好分数 h(s,a,θ),
然后用 softmax 转成概率:
π(a|s, θ) = exp(h(s,a,θ)) / Σ_a' exp(h(s,a',θ))
┌────────────────────────────────────────────────────┐
│ 假设 θ = [θ₁, θ₂, θ₃]
│ 特征 φ(s,a)
│ h(s, a, θ) = θ^T · φ(s, a)
│
│ 在 s=(1,2) 状态:
│
│ 动作 h(s,a,θ) exp(h) π(a|s,θ)
│ ──────────────────────────────────────
│ ↑ Up 0.5 1.65 1.65/8.37 = 19.7%
│ ↓ Down 1.8 6.05 6.05/8.37 = 72.3% ← 高概率
│ ← Left -0.8 0.45 0.45/8.37 = 5.4%
│ → Right -1.5 0.22 0.22/8.37 = 2.6%
│ ─────
│ Σ = 8.37
│
│ 直接输出概率,不需要 ε-greedy!
└────────────────────────────────────────────────────┘
算法逐步拆解
Step 1: 跑完一整个回合
按当前策略 π(θ) 走完一整个 episode:
t=0 t=1 t=2 t=3
+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+
|🤖| | | | |🤖| | | | | | | | | |
+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+
| | | | | | | | | |🤖| | | | | |
+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+
| | |G | | | |G | | | |G | | | |🤖|
+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+
s₀=(0,0) s₁=(0,1) s₂=(1,1) 到达 G!
a₀=Right a₁=Down a₂=Right
r₁=-1 r₂=-1 r₃=+10
整个轨迹: {s₀, a₀, r₁, s₁, a₁, r₂, s₂, a₂, r₃}
注意:必须走完整个回合才能更新!(Monte Carlo 特性)
Step 2: 算每一步的回报 q_t(s_t, a_t)
就是"从 t 时刻开始到结束,所有折扣奖励之和"
┌─────────────────────────────────────────────────────────┐
│
│ t=0: q₀ = γ⁰·r₁ + γ¹·r₂ + γ²·r₃
│ = 1×(-1) + 0.9×(-1) + 0.81×(+10)
│ = -1 - 0.9 + 8.1
│ = 6.2 ← "从起点出发,这回合总共赚6.2"
│
│ t=1: q₁ = γ⁰·r₂ + γ¹·r₃
│ = 1×(-1) + 0.9×(+10)
│ = 8.0 ← "从t=1出发,赚了8.0"
│
│ t=2: q₂ = γ⁰·r₃
│ = 10.0 ← "最后一步直接拿到+10"
│
└─────────────────────────────────────────────────────────┘
Step 3: 更新策略参数 θ(核心)
对每个时刻 t,更新:
θ ← θ + α · ∇_θ ln π(a_t|s_t, θ) · q_t(s_t, a_t)
───────────────────── ──────────────
"得分函数"(方向) "权重"(多大力度)
直觉理解:
┌─────────────────────────────────────────────────────────────┐
│
│ ∇_θ ln π(a_t|s_t, θ): "让动作 a_t 概率增大"的方向
│
│ q_t(s_t, a_t): 这个动作最终赚了多少
│
│ 两者相乘的含义:
│
│ 赚得多 (q大) → 大幅增加这个动作的概率 "多做赚钱的事"
│ 赚得少 (q小) → 微微增加这个动作的概率
│ 亏钱 (q<0) → 减少这个动作的概率 "少做亏钱的事"
│
└─────────────────────────────────────────────────────────────┘
具体计算:
t=0: s₀=(0,0), a₀=Right, q₀=6.2
当前 π(Right|(0,0), θ) = 0.4
∇_θ ln π = ∇_θ ln(0.4) = φ(s₀,Right) - Σ_a π(a|s₀)φ(s₀,a)
(对 softmax 策略的梯度公式)
假设算出 ∇_θ ln π = [0.3, -0.1, 0.2]
θ ← θ + 0.01 × [0.3, -0.1, 0.2] × 6.2
= θ + [0.0186, -0.0062, 0.0124]
效果: Right 的概率会增大!因为 q₀=6.2 > 0,这步走对了
t=2: s₂=(1,1), a₂=Right, q₂=10.0
∇_θ ln π = [0.5, 0.1, -0.3]
θ ← θ + 0.01 × [0.5, 0.1, -0.3] × 10.0
= θ + [0.05, 0.01, -0.03]
效果: Right 的概率增大更多!因为 q₂=10.0 更大,信号更强
为什么叫 REINFORCE?
字面意思:"强化"
好的动作 → q大 → 增大概率 → 以后更常选它 ← "正强化"
差的动作 → q小/负 → 减小概率 → 以后少选它 ← "负强化"
┌───────────────────────────────────────────────────┐
│
│ 回合1: 走了一条长路到终点, 总回报 q = 2.0
│ → 稍微增加这些动作的概率
│
│ 回合2: 走了一条捷径到终点, 总回报 q = 8.0
│ → 大幅增加这些动作的概率
│
│ 经过很多回合 → 捷径的概率远大于弯路 → 学到好策略
│
└───────────────────────────────────────────────────┘
与 DQN 的对比
| 对比项 | DQN (Value-based) | REINFORCE (Policy-based) |
|---|---|---|
| 学什么 | Q 值函数 q̂(s,a,w) | 策略 π(a|s,θ) |
| 选动作 | 从Q值间接推导 (ε-greedy) | 直接输出概率 |
| 更新时机 | 每步都能更新 | 必须走完整个回合 |
| 数据利用 | Experience Replay 可重用 | 用完即弃(on-policy) |
| 方差 | 较低 | 高(Monte Carlo) |
| 连续动作空间 | 不行(需要max) | 可以!(用函数拟合了动作空间) |
| 收敛性 | 不保证(非线性近似) | 保证收敛到局部最优 |