行业资讯

无模型强化学习实战:蒙特卡洛与TD算法原理与代码实现

发布时间:2026/7/28 22:47:06
无模型强化学习实战:蒙特卡洛与TD算法原理与代码实现 在实际学习强化学习的过程中,很多同学,尤其是非计算机背景的,会发现理论公式和实际代码之间隔着一道鸿沟。理解了马尔可夫决策过程(MDP)和贝尔曼方程后,面对“如何在没有环境模型的情况下,直接从经验中学习价值函数”这个问题,常常感到无从下手。这正是蒙特卡洛方法和时序差分算法要解决的核心问题。它们都属于无模型强化学习方法,不依赖环境的动态转移概率,而是通过与环境的真实交互来学习,这使得它们在机器人控制、游戏AI等复杂场景中极具实用价值。本文面向有一定强化学习基础(了解MDP、价值函数、策略等概念)的读者,特别是希望将理论转化为实践能力的生物信息学、计算生物学等领域的学生和研究者。我们将深入探讨蒙特卡洛方法和时序差分算法的核心思想、实现细节、适用场景以及它们之间的关键差异。通过本文,你将能够理解如何用代码实现这两种经典算法,评估它们的性能,并知道在什么情况下应该选择哪一种。1. 理解无模型强化学习的核心挑战与两类方法在模型已知的动态规划中,我们可以利用贝尔曼方程进行“规划”,通过迭代计算精确求解最优策略。但在绝大多数现实问题中,环境的动态模型(即状态转移概率P(s'|s, a)和奖励函数R(s, a))是未知或过于复杂难以建模的。例如,我们无法预先知道一个蛋白质折叠过程中,施加某个力后其构象会如何精确变化。这时,我们必须转向“无模型”方法,其核心思想是:通过试错,从与环境的交互经验中直接学习价值函数或策略。无模型方法主要分为两大类,它们的根本区别在于价值估计的更新时机:蒙特卡洛方法:必须等到一个完整的“情节”或“回合”结束后,才能根据整个过程中获得的实际回报来更新价值估计。它遵循“完成后再结算”的原则。时序差分算法:可以在每一步交互后立即进行更新。它结合了蒙特卡洛的“采样”思想和动态规划的“自举”思想,通过当前估计和下一步估计的差异来更新。为了直观理解这两种方法,我们可以看一个生物实验的类比。假设你想评估一种新的培养条件对细胞生长的影响(评估一个策略的价值)。蒙特卡洛方法:你需要准备多组细胞,让它们在新的培养条件下完整地生长一个周期(例如7天),然后统一测量最终的细胞密度(获得总回报),再用这个最终结果去更新你对这种培养条件的评价。你必须等整个周期结束。时序差分方法:你可以每天(甚至每小时)取样观察。今天你根据昨天的细胞密度(当前估计)和今天的观测增长(新样本),立即调整你对最终结果的预测。你不需要等到第7天。这个“更新时机”的差异,导致了它们在效率、方差、在线学习能力等方面的巨大不同。理解这一点是掌握后续所有内容的基础。2. 环境准备与问题定义:以“悬崖漫步”为例为了具体地实现和对比这两种算法,我们需要一个标准化的测试环境。OpenAI Gym(及其后续维护版本如gymnasium)提供了大量经典的强化学习环境。这里我们选择CliffWalking-v0(悬崖漫步)环境,因为它状态空间小、易于可视化,但策略学习又非平凡,非常适合教学。2.1 环境安装与初始化首先,确保你的Python环境已安装必要的包。pip install gymnasium numpy matplotlib然后,我们初始化环境并理解其规则。import gymnasium as gym import numpy as np import matplotlib.pyplot as plt # 创建悬崖漫步环境 env = gym.make('CliffWalking-v0', render_mode='rgb_array') print(f"观察空间: {env.observation_space}") # Discrete(48) print(f"动作空间: {env.action_space}") # Discrete(4) # 动作含义:0=上,1=右,2=下,3=左CliffWalking-v0是一个 4x12 的网格世界:起点(S):在左下角(3, 0)。终点(G):在右下角(3, 11)。悬崖(C):第3行(最下面一行)的第1到第10列是悬崖。规则:智能体每走一步获得 -1 的奖励。如果掉下悬崖,获得 -100 奖励并被立刻送回起点。到达终点获得 0 奖励并结束情节。目标:找到一条从起点到终点的最安全(避免掉崖)且最短的路径。2.2 定义我们要解决的问题我们的目标是学习一个最优策略π(a|s),使得从起点到终点的期望累积奖励(价值)最大。由于每步奖励为负,等价于找到一条累积惩罚最小的路径。我们将使用同轨策略控制的方法,即评估和改进的是我们正在执行的那个策略。通常使用 ε-贪婪策略来平衡探索与利用。我们将分别实现:蒙特卡洛控制:每次情节结束后,用该情节的经验更新价值函数和策略。时序差分控制(Sarsa 和 Q-Learning):在每一步交互后立即更新。为了公平比较,我们会使用相同的超参数(如学习率、折扣因子、探索率)和环境。3. 蒙特卡洛控制:从完整经验中学习蒙特卡洛方法的核心是,对于一个状态(或状态-动作对)的价值估计,等于所有访问过该状态(对)的情节中,其后续实际回报的平均值。3.1 首次访问型 MC 控制算法实现我们实现“首次访问型蒙特卡洛控制”,它只在一个情节中第一次访问某个状态-动作对时,才用该情节的回报去更新其 Q 值。def mc_control(env, num_episodes=5000, gamma=0.99, epsilon=0.1): """ 首次访问型蒙特卡洛控制(ε-贪婪策略) 参数: env: 环境 num_episodes: 训练情节数 gamma: 折扣因子 epsilon: 探索概率 返回: Q: 最优动作价值函数 policy: 最终策略(确定性策略) """ nA = env.action_space.n nS = env.obs