强化学习入门:蒙特卡洛与时序差分算法原理与Python实现 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在生物信息学、计算生物学乃至神经科学的研究中我们常常需要让计算机学会如何在一个复杂、不确定的环境中做出最优决策。例如预测蛋白质结构、设计药物分子、优化实验流程这些都可以看作是一个“智能体”在与环境互动通过试错来学习最佳策略的过程。这正是强化学习的核心魅力所在。然而对于习惯了湿实验和统计分析的生科同学来说强化学习中的诸多算法概念如“价值函数”、“策略梯度”等往往令人望而生畏。本系列教程旨在为生物背景的学习者打开强化学习的大门用最直观的生物学类比来理解抽象概念。在前两篇中我们建立了强化学习的基本框架状态、动作、奖励并介绍了在已知环境模型Model-Based下的动态规划方法。但现实世界无论是细胞内的生化反应网络还是生态系统的种间竞争其完整模型往往是未知或极其复杂的。这就是Model-Free的领域我们无法预先知道在某个状态下采取某个动作后会百分之百转移到哪个状态获得多少奖励。本文将深入探讨 Model-Free 强化学习中两大基石算法蒙特卡洛方法和时序差分算法。我们会像设计一个“行为学实验”一样一步步拆解它们如何在不依赖环境模型的情况下仅通过与环境互动产生的“实验数据”即状态、动作、奖励序列来评估策略的好坏。我们将用Python代码实现一个简单的游戏环境如“21点”或方格世界让你亲眼看到智能体如何从零开始通过反复“玩”这个游戏来学会制胜策略。无论你是想用RL优化实验设计还是单纯对类脑计算感兴趣掌握这两种方法都是通向更高级算法如Q-Learning、DQN乃至PPO的必经之路。1. 背景与核心概念从“已知世界”到“探索未知”在开始之前让我们先快速回顾并建立几个关键认知。1.1 Model-Based vs. Model-Free全知与实验者的区别想象两种研究生物系统的方式Model-Based基于模型你拥有一个完整的、精确的计算机模型例如一个已知所有参数Km, Vmax的酶动力学方程。你可以直接在计算机上模拟任何操作如改变底物浓度的结果无需进行真实的实验。上一篇介绍的动态规划DP就属于此类它要求智能体完全知晓环境的转移概率和奖励函数。Model-Free免模型你对系统内部机制知之甚少。比如你想知道一种新药对细胞生长的影响。你没有精确的数学模型只能通过设计实验给药动作观察细胞状态变化状态转移和生长指标奖励记录数据然后从这些实验数据中分析规律。蒙特卡洛MC和时序差分TD就是这样的“实验数据分析法”。对于生物研究者而言Model-Free 的场景更为常见因为我们面对的生物系统多是高维、非线性、充满噪声的“黑箱”。1.2 核心目标策略评估与优化无论是MC还是TD我们现阶段的核心任务依然是策略评估给定一个策略 π在某个状态下选择某个动作的概率分布我们如何计算该策略下每个状态或状态-动作对的价值 V(s) 或 Q(s, a)回忆一下状态价值 V(s) 代表了从状态 s 出发一直遵循策略 π 所能获得的累计奖励的期望。知道V(s)或Q(s, a)我们才能判断策略的好坏进而改进它策略优化。1.3 蒙特卡洛方法完整的实验报告分析蒙特卡洛方法的思想非常直接类似于完成一个完整的实验周期后做总结分析。执行实验让智能体使用策略 π 与环境交互从起始状态开始一直进行到实验终止例如游戏结束、细胞死亡、达到最大步数。这会产生一条完整的轨迹TrajectoryS0, A0, R1, S1, A1, R2, ..., ST。计算回报从轨迹中的每个状态点St开始计算其到结束所获得的实际累计奖励Gt Rt1 γ*Rt2 γ²*Rt3 ...。这就像记录下从实验中期某个时间点开始到最后的所有观测结果。更新价值用这次实验计算出的实际回报Gt来更新对应状态St的价值估计。因为Gt是真实发生的累计奖励它就是 V(St) 的一个无偏估计样本。通过多次独立实验用样本均值来逼近真实的期望价值。特点必须等到实验完全结束才能进行分析离线学习分析基于完整的、真实的实验数据。方差可能较大因为一次实验的随机性很大但偏差为零。1.4 时序差分算法实时调整的实验笔记时序差分方法则更像一个边做实验边记录的科研人员随时根据最新观察修正自己的假设。单步交互与预测在状态St根据策略采取动作At环境返回奖励Rt1并转移到新状态St1。构建TD目标此时我们有两个价值估计对当前状态St的旧估计V(St)对新状态St1的估计V(St1)根据现有知识 我们利用即时奖励和新状态的估计构建一个更优的估计目标TD_target Rt1 γ * V(St1)。这个目标结合了已知的真实奖励和基于现有知识的对未来回报的预测。计算误差并更新计算TD目标与旧估计的差值即TD误差δ TD_target - V(St)。这个误差衡量了当前预测的“意外”程度。然后立即用这个误差来更新V(St)V(St) ← V(St) α * δ。其中 α 是学习率类似于调整假设的步长。特点每一步交互后都可以立即学习在线学习无需等待实验结束。它融合了蒙特卡洛的“实际采样”思想和动态规划的“自举法”用自身估计来更新自身。通常比蒙特卡洛学习更快方差更小但会引入一些偏差。2. 环境准备与版本说明我们将通过Python代码来具体实现和对比这两种算法。为了聚焦于算法本身我们选择一个简单且易于可视化的环境GridWorld方格世界。环境描述一个4x4的网格共有16个状态格子。智能体从随机格子出发。动作空间上、下、左、右。如果移动会走出网格则停在原地。奖励大多数格子每走一步获得-1的奖励鼓励尽快到达终点。有两个特殊格子终点A(0,0)到达后获得奖励10并立即结束本轮。终点B(3,3)到达后获得奖励5并立即结束本轮。折扣因子 γ0.9这个环境类似于让一个动物在迷宫中寻找食物高奖励位置每多耗一秒多走一步都有轻微惩罚。所需环境与库Python 3.8本文示例在Python 3.9下测试核心库numpy(用于数值计算)matplotlib(用于可视化)无需安装复杂的强化学习库如Gym我们完全自建环境以理解底层逻辑。你可以使用以下命令创建环境并安装依赖# 创建并激活虚拟环境推荐 python -m venv rl_env source rl_env/bin/activate # Linux/Mac # rl_env\Scripts\activate # Windows # 安装依赖 pip install numpy matplotlib项目结构rl_biology_tutorial/ ├── grid_world.py # 网格世界环境定义 ├── mc_agent.py # 蒙特卡洛智能体 ├── td_agent.py # 时序差分智能体 └── compare_plots.py # 主程序运行并对比算法3. 核心原理与算法拆解3.1 蒙特卡洛MC算法详解蒙特卡洛策略评估有两种主要方式首次访问型MC对于一条轨迹只使用每个状态第一次出现时的回报Gt来更新该状态的价值。每次访问型MC对于一条轨迹每次出现某个状态都使用对应的回报Gt来更新。我们实现更常见的首次访问型MC。算法步骤伪代码初始化策略 π状态价值表 V(s)全零空列表 Returns(s) 用于记录每个状态的历史回报 循环每一轮 Episode 根据策略 π 生成一条轨迹S0, A0, R1, S1, A1, R2, ..., ST 初始化回报 G 0 从后往前遍历轨迹中的每一步 t T-1, T-2, ..., 0 G γ * G R_{t1} # 从后往前累计计算回报 如果 S_t 在本轮轨迹中是第一次出现 将 G 加入到 Returns(S_t) 中 V(S_t) average(Returns(S_t)) # 更新为历史回报的平均值关键点离线更新必须等整条轨迹一个Episode结束后才能从后往前计算G并更新V(s)。增量式均值更新实际上我们不需要保存所有历史Returns(s)。可以用一个计数器 N(s) 和以下公式在线更新均值V(S_t) ← V(S_t) (G - V(S_t)) / N(S_t)这等价于V(S_t) ← V(S_t) α * (G - V(S_t))其中 α 1/N(S_t) 是逐渐减小的学习率。3.2 时序差分TD算法详解TD(0)TD算法家族中最基础的是TD(0)也称为一步TD。算法步骤伪代码初始化策略 π状态价值表 V(s)全零 循环每一轮 Episode 初始化状态 S 当 S 不是终止状态时 根据策略 π 选择动作 A 执行 A观察奖励 R 和下一个状态 S‘ # TD核心更新步骤 TD_target R γ * V(S‘) TD_error TD_target - V(S) V(S) ← V(S) α * TD_error # α是固定的学习率 S ← S‘ # 转移到下一个状态关键点在线更新每走一步立即用获得的奖励R和下一个状态的估计值V(S)来更新当前状态V(S)。自举更新中使用了当前的估计值V(S)这意味着我们在用自己的“猜测”来改进自己的“猜测”。TD误差 δδ R γV(S) - V(S)它代表了“新观察与旧预测的差异”是驱动学习的关键信号。这非常类似于生物学习中的“奖赏预测误差”理论。3.3 MC vs. TD一个生物学比喻假设你在训练小鼠走迷宫获取食物。蒙特卡洛你让小鼠完整跑完一次迷宫无论成功与否等它回到起点后再根据它整个过程中的表现最终是否得到食物、花了多少时间来重新评估迷宫各个位置的价值。小鼠需要多次完整尝试才能慢慢建立起对迷宫的整体认知。时序差分小鼠在迷宫中每前进一个岔路口就立即根据刚刚走过的路段的体验比如这条路很窄不舒服奖励-1和它对前方路径价值的现有估计来调整对刚刚离开的那个岔路口的价值判断。它边探索边实时更新自己的“认知地图”。TD方法通常学习效率更高因为它能更快地利用局部信息更新全局估计。4. 完整实战案例在GridWorld中实现与对比现在让我们把理论转化为代码。4.1 创建网格世界环境 (grid_world.py)首先我们定义环境它负责提供状态转移、奖励和判断终止条件。# grid_world.py import numpy as np class GridWorld: 一个简单的4x4 GridWorld环境 def __init__(self): self.size 4 self.terminal_states [(0, 0), (3, 3)] # 两个终止状态 self.state None self.reset() def reset(self): 重置环境到随机起始状态非终止状态 while True: self.state (np.random.randint(self.size), np.random.randint(self.size)) if self.state not in self.terminal_states: break return self.state def step(self, action): 执行动作返回 (next_state, reward, done) 动作: 0:上, 1:下, 2:左, 3:右 x, y self.state if action 0: # 上 x max(x - 1, 0) elif action 1: # 下 x min(x 1, self.size - 1) elif action 2: # 左 y max(y - 1, 0) elif action 3: # 右 y min(y 1, self.size - 1) next_state (x, y) # 计算奖励 if next_state (0, 0): reward 10 done True elif next_state (3, 3): reward 5 done True else: reward -1 done False self.state next_state return next_state, reward, done def get_all_states(self): 返回所有可能的状态列表 states [] for i in range(self.size): for j in range(self.size): states.append((i, j)) return states4.2 实现蒙特卡洛智能体 (mc_agent.py)# mc_agent.py import numpy as np from grid_world import GridWorld class MCAgent: 首次访问型蒙特卡洛策略评估智能体 def __init__(self, env, gamma0.9, epsilon0.1): self.env env self.gamma gamma # 折扣因子 self.epsilon epsilon # 用于ε-贪婪策略 self.state_values {} # V(s) 字典 self.returns {} # 记录每个状态的历史回报列表 self._init_values() def _init_values(self): 初始化所有状态的价值为0并创建空的回报列表 for state in self.env.get_all_states(): self.state_values[state] 0.0 self.returns[state] [] def get_action(self, state): 使用ε-贪婪策略选择动作简单随机策略 # 为了简化我们假设一个均匀随机策略 # 在实际策略评估中我们评估的是给定的策略π这里我们固定π为均匀随机 return np.random.choice(4) # 随机选择0-3的动作 def train_one_episode(self): 运行一个回合并进行蒙特卡洛更新 # 生成轨迹 trajectory [] state self.env.reset() done False while not done: action self.get_action(state) next_state, reward, done self.env.step(action) trajectory.append((state, action, reward)) state next_state # 轨迹结束最后一个状态是终止状态没有后续动作 # 首次访问型MC更新 G 0 # 累计回报 visited_states set() # 记录本轮首次访问的状态 # 从后往前遍历轨迹 for t in range(len(trajectory) - 1, -1, -1): state, action, reward trajectory[t] # 注意轨迹中存储的reward是执行action后立即获得的R_{t1} G self.gamma * G reward # 如果是首次访问该状态 if state not in visited_states: visited_states.add(state) self.returns[state].append(G) # 记录回报 # 更新价值为历史回报的平均值 self.state_values[state] np.mean(self.returns[state]) def get_values(self): 返回状态价值表4x4矩阵形式 values np.zeros((self.env.size, self.env.size)) for (i, j), v in self.state_values.items(): values[i, j] v return values4.3 实现时序差分智能体 (td_agent.py)# td_agent.py import numpy as np from grid_world import GridWorld class TDAgent: TD(0)策略评估智能体 def __init__(self, env, gamma0.9, alpha0.1, epsilon0.1): self.env env self.gamma gamma # 折扣因子 self.alpha alpha # 学习率固定值 self.epsilon epsilon self.state_values {} self._init_values() def _init_values(self): for state in self.env.get_all_states(): self.state_values[state] 0.0 def get_action(self, state): 同样使用均匀随机策略 return np.random.choice(4) def train_one_episode(self): 运行一个回合并进行TD(0)在线更新 state self.env.reset() done False total_reward 0 while not done: action self.get_action(state) next_state, reward, done self.env.step(action) # TD(0) 核心更新公式 td_target reward self.gamma * self.state_values[next_state] td_error td_target - self.state_values[state] self.state_values[state] self.alpha * td_error total_reward reward state next_state return total_reward def get_values(self): values np.zeros((self.env.size, self.env.size)) for (i, j), v in self.state_values.items(): values[i, j] v return values4.4 运行与对比分析 (compare_plots.py)现在我们编写主程序来训练两个智能体并可视化它们学习到的状态价值函数。# compare_plots.py import numpy as np import matplotlib.pyplot as plt from grid_world import GridWorld from mc_agent import MCAgent from td_agent import TDAgent def run_experiment(num_episodes500): 运行蒙特卡洛和时序差分实验 env GridWorld() # 创建智能体 mc_agent MCAgent(env, gamma0.9) td_agent TDAgent(env, gamma0.9, alpha0.1) # 用于记录学习过程 mc_values_history [] td_values_history [] mc_episode_rewards [] td_episode_rewards [] for episode in range(num_episodes): # 训练一个回合 mc_agent.train_one_episode() td_reward td_agent.train_one_episode() td_episode_rewards.append(td_reward) # MC没有单回合奖励记录我们简单记录为0 mc_episode_rewards.append(0) # 每50回合记录一次价值函数 if (episode 1) % 50 0: mc_values_history.append(mc_agent.get_values().copy()) td_values_history.append(td_agent.get_values().copy()) print(fEpisode {episode1}: MC Value at start state ~ {mc_agent.state_values[(1,1)]:.2f}, fTD Value at start state ~ {td_agent.state_values[(1,1)]:.2f}) return mc_agent, td_agent, mc_values_history, td_values_history, mc_episode_rewards, td_episode_rewards def plot_learning_curve(td_rewards): 绘制TD智能体的单回合奖励曲线学习曲线 plt.figure(figsize(10, 5)) # 使用滑动平均平滑曲线 window_size 10 smoothed_rewards np.convolve(td_rewards, np.ones(window_size)/window_size, modevalid) plt.plot(range(len(smoothed_rewards)), smoothed_rewards, linewidth2) plt.xlabel(Episode) plt.ylabel(Total Reward (Smoothed)) plt.title(TD(0) Learning Curve (Smoothed over 10 episodes)) plt.grid(True, alpha0.3) plt.show() def plot_value_heatmaps(mc_values, td_values, episode_num): 并排显示MC和TD学习到的价值函数热图 fig, axes plt.subplots(1, 2, figsize(12, 5)) episodes [50, 200, 500] # 选择几个关键点展示 if episode_num not in episodes: return idx episodes.index(episode_num) titles [Monte Carlo, Temporal Difference] for i, (ax, title, values) in enumerate(zip(axes, titles, [mc_values, td_values])): # 选择第idx个历史记录 value_grid values[idx] if idx len(values) else values[-1] im ax.imshow(value_grid, cmapviridis, interpolationnearest) ax.set_title(f{title} - After {episode_num} Episodes) ax.set_xticks(np.arange(4)) ax.set_yticks(np.arange(4)) ax.grid(whichboth, colorgray, linestyle-, linewidth0.5, alpha0.5) # 在格子中显示数值 for x in range(4): for y in range(4): text ax.text(y, x, f{value_grid[x, y]:.1f}, hacenter, vacenter, colorw if value_grid[x, y] 2 else black) fig.colorbar(im, axax, fraction0.046, pad0.04) plt.tight_layout() plt.show() def print_optimal_path(agent, env, start_state(1,1)): 根据学到的价值函数贪心地走出一条路径 state start_state path [state] total_reward 0 gamma 0.9 env_copy GridWorld() env_copy.state state for step in range(20): # 防止无限循环 if state in env.terminal_states: print(fReached terminal state {state}.) break # 选择价值最高的动作贪心 best_action None best_value -float(inf) x, y state # 简单模拟四个方向 for action, (dx, dy) in enumerate([(-1,0),(1,0),(0,-1),(0,1)]): nx, ny xdx, ydy if 0 nx 4 and 0 ny 4: next_state (nx, ny) else: next_state state # 这里我们简化了实际应该用Q值。我们用V(s)预估奖励来近似。 # 奖励需要根据环境规则判断这里仅为演示。 if next_state (0,0): reward 10 elif next_state (3,3): reward 5 else: reward -1 # 评估动作价值即时奖励 下一状态折扣价值 action_value reward gamma * agent.state_values.get(next_state, 0) if action_value best_value: best_value action_value best_action action if best_action is None: break # 执行动作 next_state, reward, done env_copy.step(best_action) total_reward reward state next_state path.append(state) if done: break print(fPath from {start_state}: {path}) print(fTotal discounted reward (estimated): {total_reward}) if __name__ __main__: print(开始训练MC和TD智能体...) mc_agent, td_agent, mc_vals, td_vals, mc_rewards, td_rewards run_experiment(num_episodes500) print(\n--- 最终状态价值表 (部分) ---) print(MC Agent (蒙特卡洛):) print(mc_agent.get_values()) print(\nTD Agent (时序差分):) print(td_agent.get_values()) # 可视化 plot_learning_curve(td_rewards) plot_value_heatmaps(mc_vals, td_vals, episode_num500) print(\n--- 基于学到的价值函数规划路径 (从状态(1,1)出发) ---) print(MC Agent 建议路径:) print_optimal_path(mc_agent, GridWorld(), (1,1)) print(\nTD Agent 建议路径:) print_optimal_path(td_agent, GridWorld(), (1,1))4.5 运行结果说明运行python compare_plots.py你会看到类似以下的输出和图表控制台输出你会看到随着训练进行起始状态(1,1)的价值估计在逐渐上升从负值向正值变化说明智能体学会了如何更快地走向高奖励的终点。学习曲线图TD智能体的单回合总奖励会随着训练逐渐增加并趋于稳定表明其策略在改进尽管我们评估的是随机策略但价值函数本身能指导更好的决策。价值热图最终MC和TD学习到的状态价值函数会非常相似。靠近终点(0,0)奖励10的格子价值最高靠近(3,3)奖励5的格子次之远离终点的格子价值为负。这形成了一个合理的“价值梯度”智能体可以沿着价值增长的方向移动。路径规划根据学到的价值函数贪心算法会规划出一条走向最近或最高奖励终点的路径。关键观察TD学习更快你可能发现TD方法在更少的回合内就让价值函数收敛到一个合理的形状。这是因为它的在线更新能更快地传播奖励信息。MC估计更准在足够多的回合后MC方法给出的价值估计通常是无偏的但方差较大。TD的估计可能略有偏差但方差小。两者都是有效的它们都在没有环境模型的情况下成功地通过“实验”评估了随机策略的价值。5. 常见问题与排查思路在实现和运行上述代码时你可能会遇到以下问题问题现象可能原因解决思路价值函数不收敛全是0或NaN1. 学习率α过大或过小。2. 折扣因子γ1且没有终止状态导致回报无限大。3. 代码中更新公式写错。1. 调整αTD或检查均值更新MC。TD的α通常设为0.01~0.5。2. 确保γ1或环境有明确的终止状态。3. 仔细核对td_target和td_error的计算以及MC中G的累计方向。MC智能体学习速度极慢1. 探索策略过于随机很少访问某些状态。2. Episode太长导致回报G的方差极大。1. 可以尝试更多回合的训练如10000。2. 考虑使用增量式均值更新见3.1节关键点而不是存储所有历史回报。TD智能体价值震荡1. 学习率α太大。2. 策略或环境随机性大。1. 逐步减小α或使用衰减的学习率 schedule。2. 这是TD的正常特性可以通过多回合平均来观察趋势。规划出的路径不是最优1. 价值函数尚未完全收敛。2. 贪心路径规划忽略了探索。3. 环境动态如障碍物未在价值中体现。1. 增加训练回合数。2. 路径规划仅作演示实际决策应使用ε-贪婪等策略平衡探索与利用。3. 检查环境奖励设置是否正确。代码报错KeyError访问了state_values或returns字典中不存在的状态。确保在_init_values函数中初始化了所有可能的状态。使用env.get_all_states()。6. 最佳实践与工程建议将MC和TD应用于更复杂的生物问题时以下几点至关重要状态表示是关键对于生物问题如蛋白质序列、基因表达量如何将高维、连续的数据转化为强化学习能处理的状态是成功的第一步。考虑使用特征工程、降维或神经网络编码。奖励函数设计奖励函数是引导智能体学习的“指挥棒”。在设计奖励时需确保它与你最终的生物学目标一致如结合能越高奖励越大毒性越大惩罚越大同时要避免奖励稀疏和欺骗性问题。选择MC还是TD使用MC的场景任务有明确的终止点如一轮实验、一次分子动力学模拟并且你可以轻松完成大量独立回合。MC对初始值不敏感最终估计无偏。使用TD的场景任务可能是持续性的或者你需要在线学习、快速适应。TD(0)是Q-Learning、SARSA、DQN等高级算法的基础学习效率高。折中方案TD(λ)和Eligibility Traces提供了介于MC和TD(0)之间的算法通过调整λ参数来控制回溯多远的历史信息。超参数调优折扣因子γ决定了未来奖励的重要性。γ接近1表示智能体很有远见γ接近0表示它只关心即时奖励。在生物实验中如果远期结果更重要如长期细胞活性应设置较高的γ。学习率α控制更新步长。太大会震荡太小会学习缓慢。可以考虑使用衰减策略如α 1 / sqrt(N(s))其中N(s)是状态访问次数。探索与利用的平衡本文示例使用了简单的随机策略进行评估。在实际优化策略时必须使用如ε-贪婪、Softmax、上置信界等方法让智能体在探索新动作和利用当前知识之间取得平衡。过早地停止探索会陷入局部最优。从预测到控制本文重点在策略评估。完整的强化学习目标是策略优化控制。一旦我们能评估一个策略的价值就可以改进它。最基本的方法是策略迭代评估当前策略 → 根据价值函数贪婪地改进策略 → 评估新策略 → ... 直到收敛。这为后续学习Q-Learning、策略梯度等控制算法打下了基础。7. 总结与学习路线通过本文你应该已经理解了Model-Free强化学习的核心思想并亲手实现了蒙特卡洛和时序差分算法。我们用一个简单的GridWorld模拟了生物智能体在未知环境中通过试错学习价值地图的过程。核心收获蒙特卡洛方法像分析完整实验报告基于整个回合的真实回报进行离线、无偏但高方差的学习。时序差分方法像边实验边记录基于即时奖励和现有估计进行在线、有偏但低方差的学习。两者联系TD(0)可以看作是MC的一种特殊情况只看一步而MC可以看作是TD(λ)当λ1时的特例看整个回合。下一步学习路线深入TD学习SARSA和Q-Learning它们是TD思想在动作价值函数Q(s,a)上的直接应用是真正用于策略控制的算法。结合深度学习了解Deep Q-Network (DQN)它将Q-Learning与深度神经网络结合用于处理像图像、序列这样的高维状态输入。策略优化学习策略梯度方法如REINFORCE可视为MC的策略优化版和PPO它们直接参数化并优化策略在连续动作空间和复杂任务中表现卓越。应用于生物问题寻找将RL应用于你研究领域的机会。可以从简单的模拟环境开始例如用RL优化PCR的退火温度梯度或设计具有特定性质的短肽序列。强化学习是一个从交互中学习的强大范式它与生物体通过试错适应环境的过程有着深刻的相似性。掌握MC和TD这两个基础工具就如同掌握了显微镜和PCR仪一样为你用计算手段探索和优化复杂的生物系统打开了新的大门。建议你反复运行代码修改GridWorld的奖励和布局观察算法行为的变化这是理解其内在机理的最佳方式。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度