L9 Policy Gradient Method (二)

目录

[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) 可以!(用函数拟合了动作空间)
收敛性 不保证(非线性近似) 保证收敛到局部最优
相关推荐
WolfGang0073212 小时前
代码随想录算法训练营 Day21 | 回溯算法 part03
数据结构·算法
tankeven2 小时前
HJ152 取数游戏
c++·算法
程序员Shawn2 小时前
【机器学习 | 第六篇】- 机器学习
人工智能·算法·机器学习·集成学习
深邃-2 小时前
数据结构-队列
c语言·数据结构·c++·算法·html5
Rhystt2 小时前
代码随想录算法训练营第六十天|多余的边?从基础到进阶!
开发语言·c++·算法·图论
2301_810160952 小时前
C++中的策略模式进阶
开发语言·c++·算法
keep intensify2 小时前
二叉树的直径
数据结构·算法·深度优先
keep intensify2 小时前
单源最短路径
数据结构·c++·算法
2401_873544922 小时前
分布式缓存一致性
开发语言·c++·算法