news 2026/5/29 3:53:14

从OpenAI Gym的CliffWalking实战出发:手把手教你用Python代码区分Model-based与Model-free算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从OpenAI Gym的CliffWalking实战出发:手把手教你用Python代码区分Model-based与Model-free算法

从CliffWalking实战看强化学习:Model-based与Model-free算法代码对比

在强化学习领域,Model-based和Model-free是两种截然不同的技术路径。很多初学者在理解这两种方法时容易陷入理论迷雾,而实际上,最好的学习方式莫过于亲手实现它们。本文将带您使用Python和OpenAI Gym的CliffWalking环境,通过可运行的代码实例直观感受两种方法的差异。

1. 环境准备与问题定义

CliffWalking-v0是OpenAI Gym中一个经典的网格世界环境,它模拟了一个4x12的网格,其中底部一行(除起点和终点外)是悬崖。智能体需要从起点(左下角)安全移动到终点(右下角),每走一步获得-1的奖励,掉下悬崖获得-100奖励并回到起点。

首先安装必要的库:

pip install gym numpy matplotlib

然后初始化环境:

import gym import numpy as np import matplotlib.pyplot as plt env = gym.make('CliffWalking-v0') print("动作空间:", env.action_space) print("状态空间:", env.observation_space)

CliffWalking环境有4个动作(上、右、下、左)和48个状态(4x12网格)。与原始文章提到的不同,这里的状态转移是确定的——执行一个动作必然会到达预期状态,除非碰到边界。

2. Model-based方法实现:动态规划

Model-based方法的核心是构建环境模型,即状态转移概率T和奖励函数R。在CliffWalking中,我们可以利用环境的确定性特性简化实现。

2.1 构建环境模型

def build_model(env): nS = env.observation_space.n nA = env.action_space.n T = np.zeros((nS, nA, nS)) # 转移概率 R = np.zeros((nS, nA, nS)) # 即时奖励 for s in range(nS): for a in range(nA): env.env.s = s # 设置当前状态 next_s, r, done, _ = env.step(a) T[s, a, next_s] = 1.0 R[s, a, next_s] = r env.reset() # 重置环境 return T, R T, R = build_model(env)

这个模型准确记录了每个状态-动作对的下一个状态和对应奖励。有了完整模型后,我们可以使用策略迭代算法求解最优策略。

2.2 策略迭代算法

def policy_iteration(env, T, R, gamma=0.9, max_iter=1000): nS = env.observation_space.n nA = env.action_space.n # 初始化随机策略和价值函数 policy = np.ones((nS, nA)) / nA V = np.zeros(nS) for _ in range(max_iter): # 策略评估 while True: delta = 0 for s in range(nS): v = V[s] V[s] = sum([policy[s, a] * sum([T[s, a, s1] * (R[s, a, s1] + gamma * V[s1]) for s1 in range(nS)]) for a in range(nA)]) delta = max(delta, abs(v - V[s])) if delta < 1e-4: break # 策略改进 policy_stable = True for s in range(nS): old_action = np.argmax(policy[s]) q_values = [sum([T[s, a, s1] * (R[s, a, s1] + gamma * V[s1]) for s1 in range(nS)]) for a in range(nA)] best_action = np.argmax(q_values) policy[s] = np.eye(nA)[best_action] if old_action != best_action: policy_stable = False if policy_stable: break return policy, V policy, V = policy_iteration(env, T, R)

2.3 可视化结果

def plot_policy(policy): policy_grid = np.argmax(policy, axis=1).reshape(4, 12) plt.figure(figsize=(12, 4)) plt.imshow(policy_grid, cmap='cool') for i in range(4): for j in range(12): action = policy_grid[i, j] arrow = ['↑', '→', '↓', '←'][action] plt.text(j, i, arrow, ha='center', va='center') plt.title('Model-based策略') plt.axis('off') plt.show() plot_policy(policy)

Model-based方法找到了沿悬崖边缘的安全路径,这与人类直觉一致。它需要存储整个环境模型(T和R矩阵),在状态空间较大时会占用较多内存。

3. Model-free方法实现:Q-Learning

Model-free方法不构建环境模型,而是直接学习状态-动作值函数Q(s,a)。Q-Learning是一种经典的Model-free算法。

3.1 Q-Learning实现

def q_learning(env, episodes=1000, alpha=0.1, gamma=0.9, epsilon=0.1): nS = env.observation_space.n nA = env.action_space.n Q = np.zeros((nS, nA)) for _ in range(episodes): s = env.reset() done = False while not done: # ε-贪婪策略选择动作 if np.random.random() < epsilon: a = env.action_space.sample() else: a = np.argmax(Q[s]) # 执行动作 next_s, r, done, _ = env.step(a) # Q值更新 Q[s, a] = Q[s, a] + alpha * (r + gamma * np.max(Q[next_s]) - Q[s, a]) s = next_s return Q Q = q_learning(env)

3.2 从Q值提取策略

def q_to_policy(Q): policy = np.zeros_like(Q) policy[np.arange(len(Q)), np.argmax(Q, axis=1)] = 1 return policy policy_q = q_to_policy(Q) plot_policy(policy_q)

Q-Learning同样找到了安全路径,但训练过程中需要大量探索。它只存储Q表格,内存效率更高,但需要更多训练样本。

4. 两种方法对比分析

4.1 代码结构差异

特性Model-basedModel-free (Q-Learning)
环境知识依赖需要构建完整模型仅需与环境交互
存储需求存储T和R矩阵 (O(nS²nA))存储Q表格 (O(nSnA))
训练数据效率数据效率高需要更多样本
适用场景状态空间小、模型易构建的环境状态空间大或模型复杂的环境

4.2 性能对比

我们在相同环境下运行两种方法,比较它们的表现:

def evaluate_policy(env, policy, episodes=100): total_rewards = 0 for _ in range(episodes): s = env.reset() done = False episode_reward = 0 while not done: a = np.argmax(policy[s]) s, r, done, _ = env.step(a) episode_reward += r total_rewards += episode_reward return total_rewards / episodes mb_score = evaluate_policy(env, policy) mf_score = evaluate_policy(env, policy_q) print(f"Model-based平均得分: {mb_score:.1f}") print(f"Model-free平均得分: {mf_score:.1f}")

4.3 实际应用选择建议

  • 选择Model-based当

    • 环境模型容易构建且状态空间不大
    • 需要高样本效率(如真实机器人训练)
    • 需要预测环境行为(如安全关键应用)
  • 选择Model-free当

    • 环境复杂难以建模
    • 状态空间非常大
    • 可以承受大量试错(如游戏AI)

5. 高级技巧与优化

5.1 Model-based的模型不确定性处理

在实际环境中,状态转移往往不是完全确定的。我们可以修改模型构建部分来处理不确定性:

def build_probabilistic_model(env, samples=100): nS = env.observation_space.n nA = env.action_space.n T_counts = np.zeros((nS, nA, nS)) R_sum = np.zeros((nS, nA, nS)) for s in range(nS): for a in range(nA): for _ in range(samples): env.env.s = s next_s, r, done, _ = env.step(a) T_counts[s, a, next_s] += 1 R_sum[s, a, next_s] += r env.reset() # 归一化转移概率 T = T_counts / T_counts.sum(axis=2, keepdims=True) # 计算平均奖励 R = np.divide(R_sum, T_counts, where=T_counts!=0) return T, R

5.2 Model-free的探索优化

Q-Learning的性能很大程度上取决于探索策略。我们可以实现更智能的探索方法:

def decaying_epsilon_q_learning(env, episodes=1000, initial_epsilon=1.0, final_epsilon=0.01, alpha=0.1, gamma=0.9): nS = env.observation_space.n nA = env.action_space.n Q = np.zeros((nS, nA)) epsilon = initial_epsilon decay = (initial_epsilon - final_epsilon) / episodes for episode in range(episodes): s = env.reset() done = False while not done: if np.random.random() < epsilon: a = env.action_space.sample() else: a = np.argmax(Q[s]) next_s, r, done, _ = env.step(a) # Q值更新 Q[s, a] += alpha * (r + gamma * np.max(Q[next_s]) - Q[s, a]) s = next_s # 线性衰减ε epsilon = max(final_epsilon, epsilon - decay) return Q

6. 扩展思考:从CliffWalking到现实问题

虽然CliffWalking是一个简化环境,但它很好地展示了强化学习的关键概念。在实际项目中:

  1. 状态表示:真实问题往往需要设计合适的状态表示,可能涉及特征工程或神经网络
  2. 奖励设计:奖励函数的设计直接影响智能体行为,需要谨慎设计
  3. 超参数调优:学习率、折扣因子等参数需要根据具体问题调整
  4. 评估指标:除了累计奖励,还需考虑安全性、稳定性等指标
# 示例:使用神经网络近似Q函数 import torch import torch.nn as nn class QNetwork(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.fc = nn.Sequential( nn.Linear(input_dim, 64), nn.ReLU(), nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, output_dim) ) def forward(self, x): return self.fc(x)

在实际项目中,Model-free方法常与深度结合(如DQN),而Model-based方法则可用于规划或与Model-free方法结合(如Dyna-Q)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 3:45:10

Windows电脑也能玩转AI大模型!6G显存就能本地部署,免费无限用!

本文介绍了如何在Windows电脑上部署Qwen3.6-35B-A3B大模型&#xff0c;使其支持看图、充当AI Agent&#xff0c;且无需联网、无token限制。文章详细阐述了模型选择、量化版本下载、环境配置及启动步骤&#xff0c;并指导读者接入Hermes Agent实现本地AI应用。特别指出MoE模型架…

作者头像 李华
网站建设 2026/5/29 3:30:07

大气层整合包实战指南:Switch自定义固件深度解析与系统优化

大气层整合包实战指南&#xff1a;Switch自定义固件深度解析与系统优化 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层整合包为Nintendo Switch提供了完整的自定义固件解决方案&…

作者头像 李华