L9 Policy Gradient Method (一)

目录

核心思想:从"间接"到"直接"

第一步:策略如何参数化?

第二步:优化什么目标?(Metrics)

[Metric 1: Average Value(平均状态价值)](#Metric 1: Average Value(平均状态价值))

[Metric 2: Average Reward(平均即时奖励)](#Metric 2: Average Reward(平均即时奖励))

第三步:怎么算梯度?(最难的部分)

[第四步:梯度上升算法 → REINFORCE](#第四步:梯度上升算法 → REINFORCE)

举例

[网格世界下的 REINFORCE](#网格世界下的 REINFORCE)

[β_t 的解读:自动平衡探索与利用](#β_t 的解读:自动平衡探索与利用)

整体总结


核心思想:从"间接"到"直接"

复制代码
┌──────────────────────────────────────────────────────────────────┐
│                                                                    
│  之前 (Value-based):                                               
│    先学 Q 值表/函数 → 再从 Q 值推出策略(ε-greedy)                  
│    间接方法:学的是"打分",策略是附带产物                             
│                                                                    
│  现在 (Policy Gradient):                                            
│    直接学策略函数 π(a|s, θ)                                        
│    θ 是参数,直接输出"在状态 s 选动作 a 的概率"                      
│    通过梯度上升优化 θ,让某个目标 J(θ) 最大化                       
│                                                                    
└──────────────────────────────────────────────────────────────────┘

第一步:策略如何参数化?

复制代码
之前(表格策略):
┌────────┬───────┬───────┬───────┬────────┐
│        │  ↑Up  │ ↓Down │ ←Left │ →Right │
├────────┼───────┼───────┼───────┼────────┤
│  s₁    │  0.1  │  0.7  │  0.1  │  0.1   │  ← 直接存在表里
│  s₂    │  0.2  │  0.2  │  0.5  │  0.1   │
│  ...   │  ...  │  ...  │  ...  │  ...   │
└────────┴───────┴───────┴───────┴────────┘
状态多了存不下!


现在(参数化策略):

                    ┌──────────────┐
   状态 s ─────────→ │  神经网络     │──→ π(Up|s)    = 10%
                    │  参数 θ       │──→ π(Down|s)  = 70%
                    │              │──→ π(Left|s)  = 15%
                    │  (softmax    │──→ π(Right|s) = 5%
                    │   输出层)     │
                    └──────────────┘
                         ↑
                    调整 θ 就改变了所有状态的策略!

Softmax 策略:保证输出是合法概率(都>0,加起来=1)

复制代码
π(a|s, θ) = exp(h(s,a,θ)) / Σ_{a'} exp(h(s,a',θ))

例子:h 是线性函数,h(s,a,θ) = θ^T · φ(s,a)

在 s₁ 状态,假设 θ = [2.0, 1.0],各动作的特征:
  φ(s₁, Up)    = [0.1, -0.5]  → h = 2×0.1 + 1×(-0.5) = -0.3  → exp(-0.3) = 0.74
  φ(s₁, Down)  = [0.8,  0.3]  → h = 2×0.8 + 1×0.3    =  1.9  → exp(1.9)  = 6.69
  φ(s₁, Left)  = [0.2,  0.1]  → h = 2×0.2 + 1×0.1    =  0.5  → exp(0.5)  = 1.65
  φ(s₁, Right) = [-0.1, 0.0]  → h = 2×(-0.1)+1×0     = -0.2  → exp(-0.2) = 0.82

  总和 = 0.74 + 6.69 + 1.65 + 0.82 = 9.90

  π(Up|s₁)    = 0.74/9.90 =  7.5%
  π(Down|s₁)  = 6.69/9.90 = 67.6%   ← 最大概率
  π(Left|s₁)  = 1.65/9.90 = 16.7%
  π(Right|s₁) = 0.82/9.90 =  8.3%

第二步:优化什么目标?(Metrics)

策略好不好,需要一个标量来衡量。这里给出两个指标:

Metric 1: Average Value(平均状态价值)

复制代码
v̄_π = Σ_s d(s) · v_π(s)
       ────      ──────
       权重      该状态的价值

含义:"按照策略 π 行动,从各状态出发的平均长期回报"

例子:3×3 网格,G=(2,2),γ=0.9

假设策略 π₁(比较笨,经常绕路):
  v_π₁(s₁) = 2.0,  v_π₁(s₂) = 3.0,  ... v_π₁(s₉) = 0

  如果 d(s) = 1/9(均匀分布):
  v̄_π₁ = (2.0 + 3.0 + ... + 0) / 9 = 1.8

假设策略 π₂(比较聪明,走最短路):
  v_π₂(s₁) = 5.0,  v_π₂(s₂) = 6.0,  ... v_π₂(s₉) = 0

  v̄_π₂ = (5.0 + 6.0 + ... + 0) / 9 = 4.2

  v̄_π₂ > v̄_π₁  →  π₂ 更优!

d(s) 的选择

复制代码
┌─────────────────────────────────────────────────────────────┐
│ Case 1: d 与策略无关                                          
│   - d₀(s) = 1/|S|  所有状态等权                                
│   - d₀(s₀) = 1, 其余 = 0  只关心从 s₀ 出发                    
│   此时 v̄_π = v_π(s₀)                                       
│                                                               
│ Case 2: d = d_π(平稳分布,依赖策略)                           
│   - 经常去的状态权重大,很少去的权重小                            
│   - 好策略让智能体经常待在高价值区域                              
└─────────────────────────────────────────────────────────────┘

Metric 2: Average Reward(平均即时奖励)

复制代码
r̄_π = Σ_s d_π(s) · r_π(s)

含义:"长期来看,每一步平均能获得多少即时奖励"

例子:
  策略 π₁ 经常在低奖励区域晃悠 → r̄_π₁ = 0.5/步
  策略 π₂ 经常在高奖励区域活动 → r̄_π₂ = 2.0/步

重要关系:
  r̄_π = (1 - γ) · v̄_π
  两者等价,最大化一个就等于最大化另一个!

第三步:怎么算梯度?(最难的部分)

核心公式 Policy Gradient Theorem

复制代码
┌──────────────────────────────────────────────────────────────────┐
│                                                                    
│  ∇_θ J(θ) = Σ_s η(s) Σ_a ∇_θ π(a|s,θ) · q_π(s,a)              
│                                                                    
│  等价形式(用 log-trick):                                         
│                                                                    
│  ∇_θ J(θ) = E_{S~η, A~π} [ ∇_θ ln π(A|S,θ) · q_π(S,A) ]        
│                              ──────────────  ─────────           
│                              "得分函数"         "权重"              
│                              (往哪个方向调θ)    (调多大力度)          
│                                                                    
└──────────────────────────────────────────────────────────────────┘

Log-trick 推导:

复制代码
关键等式:∇_θ π = π · ∇_θ ln π

所以:
  Σ_a ∇_θ π(a|s,θ) · q_π(s,a)
= Σ_a π(a|s,θ) · ∇_θ ln π(a|s,θ) · q_π(s,a)
= E_{A~π} [ ∇_θ ln π(A|s,θ) · q_π(s,A) ]

这样就可以用采样来近似梯度了!

第四步:梯度上升算法 → REINFORCE

复制代码
Step 1: 标准梯度上升
  θ_{t+1} = θ_t + α · ∇_θ J(θ_t)
          = θ_t + α · E[ ∇_θ ln π(A|S,θ_t) · q_π(S,A) ]

              ↓ 真实梯度(期望)算不出来,用单个样本代替

Step 2: 随机梯度上升
  θ_{t+1} = θ_t + α · ∇_θ ln π(a_t|s_t, θ_t) · q_π(s_t, a_t)

              ↓ 真实 q_π 也不知道,用 Monte Carlo 回报估计

Step 3: REINFORCE
  θ_{t+1} = θ_t + α · ∇_θ ln π(a_t|s_t, θ_t) · q_t(s_t, a_t)
                                               ───────────────
                                                  MC 回报估计

举例

网格世界下的 REINFORCE

复制代码
场景:
+------+------+------+
| S    |      |      |   S=(0,0), G=(2,2)
+------+------+------+   每步 r=-1,到G r=+10
|      |      |      |   γ=0.9, α=0.01
+------+------+------+   θ = [0.5, 0.3](初始参数)
|      |      | G    |
+------+------+------+

回合 1:生成轨迹

复制代码
按当前 π(θ) 采样一整个回合:

t=0: s₀=(0,0), π→a₀=Right, r₁=-1
t=1: s₁=(0,1), π→a₁=Down,  r₂=-1
t=2: s₂=(1,1), π→a₂=Right, r₃=-1
t=3: s₃=(1,2), π→a₃=Down,  r₄=+10  → 到达 G!

算每一步的 Monte Carlo 回报 q_t

复制代码
t=0: q₀ = -1 + 0.9×(-1) + 0.81×(-1) + 0.729×10 = 4.58
t=1: q₁ = -1 + 0.9×(-1) + 0.81×10              = 6.20
t=2: q₂ = -1 + 0.9×10                          = 8.00
t=3: q₃ = 10                                   = 10.0

更新每一步的 θ

复制代码
对 t=0: s₀=(0,0), a₀=Right, q₀=4.58

  当前 π(Right|s₀, θ) = 0.35(假设 softmax 算出)

  ∇_θ ln π(Right|s₀, θ) = [0.4, -0.2](假设算出的梯度)

  θ ← [0.5, 0.3] + 0.01 × [0.4, -0.2] × 4.58
    = [0.5, 0.3] + [0.0183, -0.0092]
    = [0.518, 0.291]

  含义:q₀=4.58 > 0 → 这回合从(0,0)选Right最终赚了
        → 增大 π(Right|s₀) 的概率!


对 t=2: s₂=(1,1), a₂=Right, q₂=8.00

  ∇_θ ln π(Right|s₂, θ) = [0.6, 0.1]

  θ ← θ + 0.01 × [0.6, 0.1] × 8.00
    = θ + [0.048, 0.008]

  含义:q₂=8.00 更大 → 更新幅度更大!
        这步离终点近,信号更强

β_t 的解读:自动平衡探索与利用

复制代码
┌────────────────────────────────────────────────────────────────┐
│                                                                  
│  利用: β_t ∝ q_t                                                 
│    q 大 → β 大 → 增大该动作概率 → "多做赚钱的事"                 
│    q 负 → β 负 → 减小该动作概率 → "少做亏钱的事"                 
│                                                                  
│  探索: β_t ∝ 1/π                                                 
│    π 小(很少选的动作)→ β 大 → 给它更多机会                      
│    π 大(经常选的动作)→ β 小 → 已经够多了,少加一点               
│                                                                  
│  两者自动平衡!不需要手动设 ε                                      
│                                                                  
└────────────────────────────────────────────────────────────────┘

举例子:

复制代码
假设在 s₁ 状态:

动作      π(a|s₁)   q(s₁,a)   β = q/π      效果
────────────────────────────────────────────────────
↑ Up       0.05       6.0     120.0    ← 很少选但回报高 → 大幅提升!
↓ Down     0.70       5.0       7.1    ← 经常选且回报高 → 小幅提升
← Left     0.15       2.0      13.3    ← 偶尔选回报一般 → 中等提升
→ Right    0.10      -3.0     -30.0    ← 很少选且亏钱   → 大幅降低!

整体总结

复制代码
Policy Gradient 的完整逻辑链:

  ┌───────────────┐
  │ 定义目标 J(θ)      v̄_π 或 r̄_π
  └───────┬───────┘
          ↓
  ┌───────────────────────┐
  │ 推导梯度 ∇_θ J(θ)          Policy Gradient Theorem
  │ = E[∇ln π · q_π]          (最核心的公式)
  └───────┬───────────────┘
          ↓
  ┌───────────────────────┐
  │ 用样本近似梯度               随机梯度上升
  │ ∇J ≈ ∇ln π · q_t      
  └───────┬───────────────┘
          ↓
  ┌───────────────────────┐
  │ θ ← θ + α∇ln π · q_t      REINFORCE 算法
  │ (q_t 用 MC 回报估计)    
  └───────────────────────┘
特性 说明
学什么 直接学策略 π(a|s,θ),不学 Q 值
输出 动作的概率分布(softmax)
目标函数 J(θ) = v̄_π 或 r̄_π
更新方式 梯度上升:θ += α · ∇ln π · q
采样要求 On-policy(必须用当前策略采样)
更新时机 回合结束后(Monte Carlo)
探索机制 softmax 天然保证 π(a) > 0,自动探索
下一步扩展 Actor-Critic(下一讲,用 TD 代替 MC 估计 q)
相关推荐
盼小辉丶3 天前
PyTorch强化学习实战——使用交叉熵方法解决 FrozenLake 环境
人工智能·pytorch·python·强化学习
Luca_kill3 天前
深度解构 Hermes Agent:从“中央调度”到“自我进化”的架构哲学
大模型·强化学习·agent框架·ai架构·hermes agent
盼小辉丶4 天前
PyTorch强化学习实战(6)——交叉熵方法详解与实现
人工智能·pytorch·python·强化学习
盼小辉丶5 天前
PyTorch强化学习实战(5)——PyTorch Ignite 事件驱动机制与实践
人工智能·pytorch·python·强化学习
joshchen2155 天前
强化学习基础(赵世钰)第一章
人工智能·深度学习·算法·机器学习·强化学习
joshchen2156 天前
强化学习基础(赵世钰)第二章 贝尔曼方程
人工智能·python·机器学习·强化学习
星马梦缘8 天前
强化学习实战8.3——用PPO打赢星际争霸【编写自定义环境GYM】
人工智能·强化学习·gymnasium·星际争霸·sc2·starcraft2·sb3
盼小辉丶9 天前
PyTorch强化学习实战(4)——PyTorch基础
人工智能·pytorch·python·强化学习
星马梦缘9 天前
强化学习实战8——用PPO打赢星际争霸【整合版】
强化学习·ppo·星际争霸·sc2·starcraft2·sb3
Narrastory10 天前
Note:强化学习(六)
人工智能·深度学习·强化学习