在强化学习领域,策略迭代(Policy Iteration)和值迭代(Value Iteration)是两类基于动态规划(Dynamic Programming, DP)的核心算法。它们都用于求解马尔可夫决策过程(MDP)的最优策略,但在实现方式和适用场景上存在显著差异。
动态规划方法要求环境模型完全已知,即MDP五元组(状态空间S、动作空间A、状态转移概率P、奖励函数R、折扣因子γ)必须预先确定。这类方法属于基于模型(Model-based)的学习方法,虽然计算复杂度较高,但为理解强化学习提供了坚实的理论基础。
关键区别:策略迭代交替进行完整的策略评估和策略改进,而值迭代则在每次更新中直接嵌入最大化操作,不进行完整的策略评估。
策略迭代包含三个核心步骤:
初始化阶段:
策略评估(Policy Evaluation):
code复制V_{k+1}(s) = Σπ(a|s)ΣP(s'|s,a)[R(s,a,s') + γV_k(s')]
策略改进(Policy Improvement):
code复制Q^π(s,a) = ΣP(s'|s,a)[R(s,a,s') + γV^π(s')]
code复制π'(s) = argmax_a Q^π(s,a)
策略迭代的收敛性基于以下两个定理:
定理1(策略改进):对于任意策略π,通过贪心更新得到的π'满足V^π'(s) ≥ V^π(s)对所有s∈S成立。
定理2(最优性):当策略不再改变时(即π'=π),该策略即为最优策略π*,其值函数V^π*满足贝尔曼最优方程。
考虑4×4网格世界:
初始随机策略(各方向概率均等)的评估过程:
| 迭代次数 | V(s1) | V(s2) | V(s3) | V(s4) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | -1 | -1 | -1 | -1 |
| 2 | -1.9 | -1.9 | -1.9 | -1.9 |
| ... | ... | ... | ... | ... |
| 收敛值 | -14.2 | -13.3 | -13.3 | -14.2 |
值迭代的核心思想是直接优化值函数,其更新规则为:
code复制V_{k+1}(s) = max_a ΣP(s'|s,a)[R(s,a,s') + γV_k(s')]
与策略迭代的关键区别在于:
伪代码实现:
python复制def value_iteration(S, A, P, R, γ, ε):
V = {s:0 for s in S}
while True:
Δ = 0
for s in S:
v = V[s]
V[s] = max(ΣP(s'|s,a)[R(s,a,s') + γV[s']] for a in A)
Δ = max(Δ, |v - V[s]|)
if Δ < ε:
break
# 策略提取
π = {}
for s in S:
π[s] = argmax_a ΣP(s'|s,a)[R(s,a,s') + γV[s']]
return π
| 算法 | 每次迭代复杂度 | 收敛速度 | 内存需求 |
|---|---|---|---|
| 策略迭代 | O( | S | ² |
| 值迭代 | O( | S | ² |
实际应用中选择建议:
更新方式:
收敛特性:
实现差异:
mermaid复制graph LR
A[策略迭代] --> B[策略评估]
B --> C[策略改进]
C -->|未收敛| B
D[值迭代] --> E[值更新含max]
E -->|未收敛| E
策略迭代优化技巧:
值迭代加速方法:
通用优化手段:
当状态空间很大时,精确DP方法不可行,可采用:
现代强化学习常结合两类方法:
典型案例:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 值函数振荡 | 学习率过高 | 减小γ或调整更新步长 |
| 收敛速度极慢 | 状态空间划分不合理 | 重构状态表示 |
| 策略性能下降 | 策略改进实现错误 | 检查argmax操作实现 |
python复制import numpy as np
def policy_iteration(env, γ=0.9, ε=1e-6):
# 初始化
V = np.zeros(env.nS)
π = np.random.choice(env.nA, size=env.nS)
while True:
# 策略评估
while True:
Δ = 0
for s in range(env.nS):
v = V[s]
a = π[s]
V[s] = sum(p*(r + γ*V[s_]) for p, s_, r, _ in env.P[s][a])
Δ = max(Δ, abs(v - V[s]))
if Δ < ε:
break
# 策略改进
policy_stable = True
for s in range(env.nS):
old_a = π[s]
q_values = [sum(p*(r + γ*V[s_]) for p, s_, r, _ in env.P[s][a])
for a in range(env.nA)]
π[s] = np.argmax(q_values)
if old_a != π[s]:
policy_stable = False
if policy_stable:
return π, V
动态规划方法起源于Bellman在1950年代的工作,其核心贡献包括:
现代强化学习中的许多算法(如Q-learning、SARSA)都可以看作是基于动态规划的近似方法。
在实际项目中,我发现值迭代在状态空间超过1万时仍能有效工作,但需要配合适当的稀疏矩阵表示。而策略迭代更适合需要精确策略的小规模问题,特别是在策略本身比值函数更重要的场景。