模型基础强化学习详解

3070 字
15 分钟
模型基础强化学习详解

引言#

强化学习(Reinforcement Learning, RL)作为机器学习的重要分支,在游戏AI、机器人控制、自动驾驶等领域取得了令人瞩目的成就。而模型基础强化学习(Model-Based Reinforcement Learning)是强化学习的基石,它假设智能体对环境动态有完整或部分的了解。

本文将深入讲解模型基础强化学习的核心概念,包括马尔可夫决策过程(MDP)、值函数、Bellman方程以及经典的动态规划算法。通过理论推导与代码实现相结合的方式,帮助读者建立扎实的强化学习理论基础。

1. 马尔可夫决策过程(MDP)#

1.1 MDP的形式化定义#

马尔可夫决策过程是强化学习问题的数学抽象,由一个五元组定义:

MDP=S,A,P,R,γ\text{MDP} = \langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle

各元素含义:

  • S\mathcal{S}:状态空间(State Space),所有可能状态的集合
  • A\mathcal{A}:动作空间(Action Space),所有可能动作的集合
  • PP:状态转移概率(Transition Probability) P(ss,a)=P[St+1=sSt=s,At=a]P(s'|s, a) = \mathbb{P}[S_{t+1}=s' | S_t=s, A_t=a]
  • RR:奖励函数(Reward Function) R(s,a,s)=E[Rt+1St=s,At=a,St+1=s]R(s, a, s') = \mathbb{E}[R_{t+1} | S_t=s, A_t=a, S_{t+1}=s']
  • γ\gamma:折扣因子(Discount Factor),γ[0,1]\gamma \in [0, 1]

1.2 马尔可夫性质#

马尔可夫性质(Markov Property)是MDP的核心假设:

P[St+1St]=P[St+1S1,S2,,St]\mathbb{P}[S_{t+1} | S_t] = \mathbb{P}[S_{t+1} | S_1, S_2, \ldots, S_t]

含义:未来状态只依赖于当前状态,与历史路径无关。这是一个无记忆性(Memoryless)假设。

数学表达

P[St+1=s,Rt+1=rS0,A0,R1,,St,At]=P[St+1=s,Rt+1=rSt,At]\mathbb{P}[S_{t+1}=s', R_{t+1}=r | S_0, A_0, R_1, \ldots, S_t, A_t] = \mathbb{P}[S_{t+1}=s', R_{t+1}=r | S_t, A_t]

1.3 回报与折扣#

回报(Return)是从时刻tt开始的累积奖励:

Gt=Rt+1+γRt+2+γ2Rt+3+=k=0γkRt+k+1G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}

折扣因子的作用

  1. 数学收敛性:保证无限时间步的回报有界 Gt=k=0γkRt+k+1Rmax1γG_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1} \leq \frac{R_{\max}}{1-\gamma}

  2. 不确定性建模:未来的不确定性越大,折扣越重

  3. 偏好即时奖励:符合经济学中的”时间偏好”

递归形式

Gt=Rt+1+γGt+1G_t = R_{t+1} + \gamma G_{t+1}

1.4 策略(Policy)#

策略π\pi定义了智能体的行为规则:

π(as)=P[At=aSt=s]\pi(a|s) = \mathbb{P}[A_t=a | S_t=s]

策略类型

  • 确定性策略a=π(s)a = \pi(s)
  • 随机性策略π(as)\pi(a|s),动作概率分布

最优策略的目标:

π=argmaxπEπ[GtSt=s],sS\pi^* = \arg\max_{\pi} \mathbb{E}_{\pi}[G_t | S_t=s], \quad \forall s \in \mathcal{S}

2. 值函数理论#

2.1 状态值函数(State-Value Function)#

定义:在策略π\pi下,从状态ss开始的期望回报

Vπ(s)=Eπ[GtSt=s]=Eπ[k=0γkRt+k+1St=s]V^{\pi}(s) = \mathbb{E}_{\pi}[G_t | S_t=s] = \mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^k R_{t+k+1} \Big| S_t=s\right]

展开形式

Vπ(s)=Eπ[Rt+1+γGt+1St=s]=Eπ[Rt+1+γVπ(St+1)St=s]\begin{align} V^{\pi}(s) &= \mathbb{E}_{\pi}[R_{t+1} + \gamma G_{t+1} | S_t=s] \\ &= \mathbb{E}_{\pi}[R_{t+1} + \gamma V^{\pi}(S_{t+1}) | S_t=s] \end{align}

2.2 动作值函数(Action-Value Function)#

定义:在状态ss采取动作aa,然后遵循策略π\pi的期望回报

Qπ(s,a)=Eπ[GtSt=s,At=a]Q^{\pi}(s, a) = \mathbb{E}_{\pi}[G_t | S_t=s, A_t=a]

与状态值函数的关系

Vπ(s)=aAπ(as)Qπ(s,a)V^{\pi}(s) = \sum_{a \in \mathcal{A}} \pi(a|s) Q^{\pi}(s, a)

2.3 Bellman期望方程#

状态值函数的Bellman期望方程

Vπ(s)=aAπ(as)sSP(ss,a)[R(s,a,s)+γVπ(s)]V^{\pi}(s) = \sum_{a \in \mathcal{A}} \pi(a|s) \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma V^{\pi}(s')\right]

推导过程

Vπ(s)=Eπ[GtSt=s]=Eπ[Rt+1+γGt+1St=s]=aπ(as)sP(ss,a)[R(s,a,s)+γEπ[Gt+1St+1=s]]=aπ(as)sP(ss,a)[R(s,a,s)+γVπ(s)]\begin{align} V^{\pi}(s) &= \mathbb{E}_{\pi}[G_t | S_t=s] \\ &= \mathbb{E}_{\pi}[R_{t+1} + \gamma G_{t+1} | S_t=s] \\ &= \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) [R(s,a,s') + \gamma \mathbb{E}_{\pi}[G_{t+1}|S_{t+1}=s']] \\ &= \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) [R(s,a,s') + \gamma V^{\pi}(s')] \end{align}

动作值函数的Bellman期望方程

Qπ(s,a)=sSP(ss,a)[R(s,a,s)+γaAπ(as)Qπ(s,a)]Q^{\pi}(s,a) = \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma \sum_{a' \in \mathcal{A}} \pi(a'|s') Q^{\pi}(s',a')\right]

矩阵形式(用于计算):

Vπ=Rπ+γPπVπ\mathbf{V}^{\pi} = \mathbf{R}^{\pi} + \gamma \mathbf{P}^{\pi} \mathbf{V}^{\pi}

其中:

  • Vπ\mathbf{V}^{\pi}:状态值向量
  • Rπ\mathbf{R}^{\pi}:奖励向量
  • Pπ\mathbf{P}^{\pi}:转移概率矩阵

解析解

Vπ=(IγPπ)1Rπ\mathbf{V}^{\pi} = (\mathbf{I} - \gamma \mathbf{P}^{\pi})^{-1} \mathbf{R}^{\pi}

2.4 Bellman最优方程#

最优状态值函数

V(s)=maxπVπ(s),sSV^*(s) = \max_{\pi} V^{\pi}(s), \quad \forall s \in \mathcal{S}

最优动作值函数

Q(s,a)=maxπQπ(s,a),sS,aAQ^*(s,a) = \max_{\pi} Q^{\pi}(s,a), \quad \forall s \in \mathcal{S}, a \in \mathcal{A}

Bellman最优方程(状态值)

V(s)=maxaAsSP(ss,a)[R(s,a,s)+γV(s)]V^*(s) = \max_{a \in \mathcal{A}} \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma V^*(s')\right]

Bellman最优方程(动作值)

Q(s,a)=sSP(ss,a)[R(s,a,s)+γmaxaAQ(s,a)]Q^*(s,a) = \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma \max_{a' \in \mathcal{A}} Q^*(s',a')\right]

关键性质

  1. 唯一性:最优值函数是唯一的
  2. 多个最优策略:可能存在多个最优策略,但它们共享相同的最优值函数

最优策略的提取

π(s)=argmaxaAQ(s,a)\pi^*(s) = \arg\max_{a \in \mathcal{A}} Q^*(s,a)

3. 动态规划算法#

动态规划(Dynamic Programming, DP)利用MDP的马尔可夫性质和Bellman方程,通过迭代计算值函数。

3.1 策略评估(Policy Evaluation)#

目标:计算给定策略π\pi的值函数VπV^{\pi}

迭代更新规则

Vk+1(s)=aAπ(as)sSP(ss,a)[R(s,a,s)+γVk(s)]V_{k+1}(s) = \sum_{a \in \mathcal{A}} \pi(a|s) \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma V_k(s')\right]

收敛性:当kk \to \infty时,VkVπV_k \to V^{\pi}(压缩映射定理)

算法实现

import numpy as np
def policy_evaluation(env, policy, gamma=0.9, theta=1e-6):
"""
策略评估:迭代计算给定策略的状态值函数
参数:
env: 环境对象,包含状态空间、动作空间、转移概率等
policy: 策略矩阵 [nS, nA],policy[s, a] = π(a|s)
gamma: 折扣因子
theta: 收敛阈值
返回:
V: 状态值函数数组 [nS]
"""
nS = env.nS # 状态数量
V = np.zeros(nS) # 初始化值函数
iteration = 0
while True:
delta = 0 # 最大变化量
V_old = V.copy()
# 对每个状态进行更新
for s in range(nS):
v = 0
# 对所有动作求期望
for a in range(env.nA):
# 对所有可能的下一个状态求期望
for prob, next_state, reward, done in env.P[s][a]:
v += policy[s, a] * prob * (reward + gamma * V_old[next_state])
V[s] = v
delta = max(delta, abs(V[s] - V_old[s]))
iteration += 1
# 检查收敛
if delta < theta:
print(f"策略评估收敛于第 {iteration} 次迭代")
break
return V

3.2 策略改进(Policy Improvement)#

策略改进定理:对于确定性策略π\piπ\pi',如果对所有sSs \in \mathcal{S}有:

Qπ(s,π(s))Vπ(s)Q^{\pi}(s, \pi'(s)) \geq V^{\pi}(s)

ππ\pi' \geq \pi,即Vπ(s)Vπ(s)V^{\pi'}(s) \geq V^{\pi}(s)对所有ss成立。

贪婪策略改进

π(s)=argmaxaAQπ(s,a)=argmaxaAsP(ss,a)[R(s,a,s)+γVπ(s)]\pi'(s) = \arg\max_{a \in \mathcal{A}} Q^{\pi}(s,a) = \arg\max_{a \in \mathcal{A}} \sum_{s'} P(s'|s,a)[R(s,a,s') + \gamma V^{\pi}(s')]

算法实现

def policy_improvement(env, V, gamma=0.9):
"""
策略改进:根据值函数生成贪婪策略
参数:
env: 环境对象
V: 状态值函数 [nS]
gamma: 折扣因子
返回:
policy: 改进后的策略矩阵 [nS, nA]
policy_stable: 布尔值,指示策略是否稳定
"""
nS, nA = env.nS, env.nA
policy = np.zeros([nS, nA])
policy_stable = True
for s in range(nS):
# 计算每个动作的Q值
q_values = np.zeros(nA)
for a in range(nA):
for prob, next_state, reward, done in env.P[s][a]:
q_values[a] += prob * (reward + gamma * V[next_state])
# 选择最优动作(贪婪策略)
best_action = np.argmax(q_values)
# 检查策略是否改变
if policy[s, best_action] != 1.0:
policy_stable = False
# 确定性策略:将概率1分配给最优动作
policy[s] = np.eye(nA)[best_action]
return policy, policy_stable

3.3 策略迭代(Policy Iteration)#

算法流程

  1. 初始化:任意策略π0\pi_0和值函数V0V_0
  2. 策略评估:计算VπkV^{\pi_k}
  3. 策略改进πk+1=greedy(Vπk)\pi_{k+1} = \text{greedy}(V^{\pi_k})
  4. 重复步骤2-3直到策略稳定

收敛性:策略迭代保证收敛到最优策略π\pi^*(有限迭代次数)

完整实现

def policy_iteration(env, gamma=0.9, theta=1e-6, max_iterations=1000):
"""
策略迭代算法
参数:
env: 环境对象
gamma: 折扣因子
theta: 策略评估收敛阈值
max_iterations: 最大迭代次数
返回:
policy: 最优策略
V: 最优值函数
iterations: 迭代次数
"""
nS, nA = env.nS, env.nA
# 初始化随机策略(均匀分布)
policy = np.ones([nS, nA]) / nA
for i in range(max_iterations):
# 策略评估
V = policy_evaluation(env, policy, gamma, theta)
# 策略改进
new_policy, policy_stable = policy_improvement(env, V, gamma)
if policy_stable:
print(f"策略迭代收敛于第 {i+1} 次迭代")
return new_policy, V, i+1
policy = new_policy
print("达到最大迭代次数")
return policy, V, max_iterations

3.4 值迭代(Value Iteration)#

核心思想:直接迭代Bellman最优方程,跳过显式的策略评估步骤

迭代更新规则

Vk+1(s)=maxaAsSP(ss,a)[R(s,a,s)+γVk(s)]V_{k+1}(s) = \max_{a \in \mathcal{A}} \sum_{s' \in \mathcal{S}} P(s'|s,a) \left[R(s,a,s') + \gamma V_k(s')\right]

算法实现

def value_iteration(env, gamma=0.9, theta=1e-6, max_iterations=10000):
"""
值迭代算法
参数:
env: 环境对象
gamma: 折扣因子
theta: 收敛阈值
max_iterations: 最大迭代次数
返回:
policy: 最优策略
V: 最优值函数
iterations: 迭代次数
"""
nS, nA = env.nS, env.nA
V = np.zeros(nS)
for i in range(max_iterations):
delta = 0
V_old = V.copy()
# 对每个状态更新值函数
for s in range(nS):
q_values = np.zeros(nA)
# 计算所有动作的Q值
for a in range(nA):
for prob, next_state, reward, done in env.P[s][a]:
q_values[a] += prob * (reward + gamma * V_old[next_state])
# 取最大Q值
V[s] = np.max(q_values)
delta = max(delta, abs(V[s] - V_old[s]))
# 检查收敛
if delta < theta:
print(f"值迭代收敛于第 {i+1} 次迭代")
break
# 提取最优策略
policy = np.zeros([nS, nA])
for s in range(nS):
q_values = np.zeros(nA)
for a in range(nA):
for prob, next_state, reward, done in env.P[s][a]:
q_values[a] += prob * (reward + gamma * V[next_state])
best_action = np.argmax(q_values)
policy[s, best_action] = 1.0
return policy, V, i+1

3.5 算法对比#

特性策略迭代值迭代
更新方式策略评估 + 策略改进直接更新值函数
每次迭代计算量高(需完全评估策略)低(单次扫描)
收敛速度迭代次数少迭代次数多
总计算时间取决于策略评估的精度通常更快
适用场景小规模MDP大规模MDP

复杂度分析

  • 策略迭代O(n2m+n3)O(n^2 m + n^3) 每次迭代

    • nn:状态数
    • mm:动作数
  • 值迭代O(n2m)O(n^2 m) 每次迭代

4. 实战案例:冰湖环境(FrozenLake)#

4.1 环境介绍#

FrozenLake 是OpenAI Gym中的经典网格世界环境:

  • 目标:从起点(S)到达终点(G),避开冰洞(H)
  • 状态空间:4x4网格(16个状态)
  • 动作空间:4个方向(上、下、左、右)
  • 转移动态:有1/3概率滑向侧面方向(冰面滑动)
  • 奖励:到达终点 +1,其他 0
SFFF
FHFH
FFFH
HFFG

4.2 环境实现#

import gym
# 创建环境
env = gym.make('FrozenLake-v1', is_slippery=True)
# 环境信息
print(f"状态空间大小: {env.observation_space.n}")
print(f"动作空间大小: {env.action_space.n}")
# 查看转移概率
state = 6
action = 2 # 向右
print(f"\n状态 {state} 采取动作 {action} 的转移:")
for prob, next_state, reward, done in env.P[state][action]:
print(f" 概率={prob:.2f}, 下一状态={next_state}, 奖励={reward}, 终止={done}")

4.3 策略迭代求解#

# 运行策略迭代
policy_pi, V_pi, iters_pi = policy_iteration(env.unwrapped, gamma=0.99)
# 可视化值函数
import matplotlib.pyplot as plt
def visualize_value_function(V, shape=(4, 4)):
"""可视化值函数热力图"""
plt.figure(figsize=(6, 6))
V_grid = V.reshape(shape)
im = plt.imshow(V_grid, cmap='viridis', interpolation='nearest')
plt.colorbar(im)
# 添加数值标注
for i in range(shape[0]):
for j in range(shape[1]):
text = plt.text(j, i, f'{V_grid[i, j]:.3f}',
ha="center", va="center", color="w", fontsize=12)
plt.title('状态值函数热力图')
plt.xlabel('列')
plt.ylabel('行')
plt.tight_layout()
plt.show()
visualize_value_function(V_pi)
# 可视化策略
def visualize_policy(policy, shape=(4, 4)):
"""可视化策略(箭头表示)"""
action_symbols = ['↑', '↓', '←', '→']
policy_grid = np.argmax(policy, axis=1).reshape(shape)
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(np.zeros(shape), cmap='gray', vmin=0, vmax=1)
for i in range(shape[0]):
for j in range(shape[1]):
action = policy_grid[i, j]
ax.text(j, i, action_symbols[action],
ha='center', va='center', fontsize=30, color='red')
ax.set_xticks(range(shape[1]))
ax.set_yticks(range(shape[0]))
ax.grid(True, color='black', linewidth=2)
plt.title('最优策略可视化')
plt.tight_layout()
plt.show()
visualize_policy(policy_pi)

4.4 值迭代求解#

# 运行值迭代
policy_vi, V_vi, iters_vi = value_iteration(env.unwrapped, gamma=0.99)
print(f"\n策略迭代:{iters_pi} 次迭代")
print(f"值迭代:{iters_vi} 次迭代")
# 对比两种算法的值函数
print("\n值函数差异:")
print(f"最大差异: {np.max(np.abs(V_pi - V_vi))}")
print(f"平均差异: {np.mean(np.abs(V_pi - V_vi))}")

4.5 测试最优策略#

def test_policy(env, policy, episodes=100, max_steps=100):
"""测试策略的性能"""
success_count = 0
total_rewards = []
for ep in range(episodes):
state, _ = env.reset()
episode_reward = 0
for step in range(max_steps):
# 根据策略选择动作
action = np.argmax(policy[state])
state, reward, terminated, truncated, _ = env.step(action)
episode_reward += reward
if terminated or truncated:
if reward > 0: # 到达终点
success_count += 1
break
total_rewards.append(episode_reward)
print(f"\n测试结果({episodes}局):")
print(f"成功率: {success_count/episodes*100:.2f}%")
print(f"平均奖励: {np.mean(total_rewards):.3f}")
print(f"奖励标准差: {np.std(total_rewards):.3f}")
test_policy(env, policy_vi)

5. 实践建议与总结#

5.1 算法选择指南#

使用动态规划的条件

  1. ✅ 环境模型已知(PPRR
  2. ✅ 状态空间较小(<106<10^6
  3. ✅ 需要精确解

选择策略迭代 vs 值迭代

  • 策略迭代:当动作空间大于状态空间时
  • 值迭代:当状态空间远大于动作空间时

5.2 关键要点回顾#

  1. MDP五要素S,A,P,R,γ\langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle

  2. Bellman方程

    • 期望方程:评估给定策略
    • 最优方程:求解最优策略
  3. 动态规划算法

    • 策略迭代:评估 → 改进循环
    • 值迭代:直接迭代最优方程
  4. 广义策略迭代:几乎所有RL算法的框架

5.3 从模型基础到无模型#

模型基础强化学习为理解RL提供了坚实的理论基础,但在实际应用中,我们往往无法获得完美的环境模型。下一步学习方向:

  • 无模型方法:Q-Learning、SARSA、策略梯度
  • 函数逼近:处理大规模状态空间
  • 深度强化学习:DQN、A3C、PPO等

参考资源#

  1. 经典教材

    • Sutton & Barto (2018) “Reinforcement Learning: An Introduction”
    • Bertsekas (2019) “Reinforcement Learning and Optimal Control”
  2. 在线课程

    • David Silver的强化学习课程
    • CS285: Deep Reinforcement Learning (UC Berkeley)
  3. 代码库


通过本文的学习,你应该已经掌握了强化学习的数学基础和经典算法。模型基础强化学习虽然在实际应用中受到环境模型获取的限制,但它提供的理论框架和分析工具对理解所有RL算法都至关重要。掌握这些基础知识后,你将能够更深入地理解现代深度强化学习算法的设计原理。

🧠 文章思维导图

mindmap
引言#
1. 马尔可夫决策过程(MDP)#
  1.1 MDP的形式化定义#
  1.2 马尔可夫性质#
  1.3 回报与折扣#
  1.4 策略(Policy)#
2. 值函数理论#
  2.1 状态值函数(State-Value Function)#
  2.2 动作值函数(Action-Value Function)#
  2.3 Bellman期望方程#
  2.4 Bellman最优方程#
3. 动态规划算法#
  3.1 策略评估(Policy Evaluation)#
  3.2 策略改进(Policy Improvement)#
  3.3 策略迭代(Policy Iteration)#
  3.4 值迭代(Value Iteration)#
  3.5 算法对比#
4. 实战案例:冰湖环境(FrozenLake)#
  4.1 环境介绍#
  4.2 环境实现#
  4.3 策略迭代求解#
  4.4 值迭代求解#
  4.5 测试最优策略#
5. 实践建议与总结#
  5.1 算法选择指南#
  5.2 关键要点回顾#
  5.3 从模型基础到无模型#
参考资源#

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
模型基础强化学习详解
https://meiluosi.github.io/posts/2024-07-28-模型基础强化学习/
作者
枫语
发布于
2024-07-28
许可协议
CC BY-NC-SA 4.0

引用本文

@article{2024-07-28-模型基础强化学习,
  author  = {枫语},
  title   = {模型基础强化学习详解},
  journal = {枫语},
  year    = {2024},
  month   = {jul},
  url     = {https://meiluosi.github.io/posts/2024-07-28-%E6%A8%A1%E5%9E%8B%E5%9F%BA%E7%A1%80%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/}
}

评论区

Profile Image of the Author
枫语
LLM 训练/推理 · 分布式系统 · RLHF
公告
LLM 训练/推理 · 分布式系统 · RLHF — 用 RL 的方法让大模型更聪明
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
33
分类
9
标签
15
总字数
75,837
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录