蒙特卡洛 vs 时序差分:强化学习无模型方法的核心抉择

发布时间:2026/10/26 15:59:20

蒙特卡洛 vs 时序差分:强化学习无模型方法的核心抉择 1. 先聊个直觉不背地图的人怎么找路如果你跟着强化学习简史这个系列一路读到这里应该还记得动态规划那一套只要给出完整的转移概率和奖励函数就能用贝尔曼方程一层层迭代出最优策略。问题在于绝大多数真实场景根本不会把地图交到你手上。机器人不知道自己关节的摩擦系数棋手不知道对手脑子里的算路交易系统拿不到市场的完整状态转移。你手里只有一段接一段的观测序列状态、动作、奖励、下一个状态。这就是不依赖模型model-free的由来——不尝试拟合环境的物理规则直接拿经验数据说话。在强化学习的历史里最早站出来的两个 model-free 方法就是 MC蒙特卡洛和 TD时序差分。它们都做同一件事——从经验里估计状态值函数——但思路几乎是两个极端。如果把每个回合episode比作一段人生MC 活一种回头看的人生把一辈子过完拿到最终结果再回头给过程中的每个时刻打分TD 活一种当下修的人生每迈一步都根据这一步的实际结果和脑中已有的预期立刻修正自己的判断。这两种人生态度贯穿了强化学习之后几十年的发展。今天你看到的深度强化学习DQN 那一脉核心技巧本质上全是 TD 的逻辑而策略梯度那一脉又大量借用 MC 式的完整回报。所以我一直觉得MC 和 TD 这道选择题是所有想搞懂强化学习的人必须迈过去的第一道坎。这篇不是教科书我想用比较直白的方式把这两个方法拆开讲清楚它们各自怎么算、为什么这么算、坑在哪、为什么最后 TD 成了主流而 MC 也没有退休。1.1 为什么没有模型反而成了常态很多人一开始会困惑既然有模型就能用动态规划精算为什么非要搞 model-free答案是建模本身就是极难的事而且经常是白费功夫。围棋有明确规则但分支因子大到根本没法用动态规划直接展开机器人抓取时接触力学模型比真实做实验还难写更别提现实环境往往非平稳模型刚建好世界已经变了。而且有时候你根本不需要模型。想象你天天走同一条路上班你已经形成见到那个红绿灯要提早变道的经验但你并不知道路口车流的完整概率分布。你只需要知道这么做然后通常会有好结果。MC 和 TD 就是把这层逻辑数学化。它们共同的假设是经验足够多统计规律会自动浮现。1.2 两者的共同点与分歧点相同点很清楚都用样本回报来更新价值估计都不依赖环境转移概率。分歧点更清楚一个要等回合结束才知道答案另一个每一步都在猜测答案而且用猜测去更新猜测。这个差异看起来只是更新时机问题但后面你会看到它引出了偏差、方差、收敛性、批次更新等一系列连锁反应直接决定了现代强化学习算法的走向。2. MC跑完整局才肯打分的爆发式人生2.1 MC 的记账逻辑只看真实回报MC 的想法简单得近乎朴素你想知道一个状态好不好那就从该状态出发跑一整条轨迹记录实际收到的总回报多跑几条取平均。这就是大数定律在强化学习里的直接搬用。更新公式长这样G_t R_{t1} γR_{t2} γ²R_{t3} ... γ^{T-1}R_TV(s) ← V(s) α[G_t - V(s)]这里G_t是这一整段人生最终的清算单α是学习率。值得强调的是G_t是真实发生的、不加任何猜测的回报所以 MC 对价值函数的估计是无偏的——给它无穷多条完整轨迹它能收敛到真值而且不会因为别的什么估计误差污染结果。2.2 首次访问与每次访问的两个变体MC 有两个经典变体需要注意。首次访问 MC一条轨迹里同一个状态出现多次只用第一次遇到的回报做更新。每次访问 MC每次出现都参与平均。理论上两者最终都收敛到真实值但首次访问的方差性质更好分析起来也更干净大部分教材和工程实现默认用首次访问。原因很直观同一条轨迹里的回报高度相关如果同一个状态的每一次出现都拿去平均相当于把强相关的样本重复用了几遍样本的有效性是被虚增的。这就像你在一家餐厅连吃三道菜把三次感受当成三个独立顾客的评价来统计数据量看着上去了信息量并没有。2.3 MC 评估策略的代码骨架写一段最朴素的 MC 策略评估帮助建立直觉。这里的关键是先攒完整条轨迹再倒着算出每一步的回报最后做平均。from collections import defaultdict def mc_policy_evaluation(env, policy, episodes5000, gamma0.95): # 记录每个状态累计回报和出现次数 returns_sum defaultdict(float) returns_count defaultdict(float) for _ in range(episodes): trajectory [] state env.reset() done False while not done: action policy[state] next_state, reward, done env.step(action) trajectory.append((state, reward)) state next_state # 倒着算完整回报 G首次访问才更新 G 0 visited set() for state, reward in reversed(trajectory): G reward gamma * G if state not in visited: visited.add(state) returns_sum[state] G returns_count[state] 1 return {s: returns_sum[s] / returns_count[s] for s in returns_sum}注意那个reversed它是 MC 的命根子只有倒着走才能用递推式G reward gamma * G把整段回报算出来。visited集合则是首次访问的开关。2.4 MC 的代价必须等打完才知道结果MC 最大的局限是只能在有终止回合的任务里用。连续任务比如恒温器控制、股票持仓管理根本没有结局的那一天里G_t连定义都没有MC 直接瞎了。另一个问题是慢且脆。每更新一次价值估计要先等一整条轨迹跑完。评价基金经理至少要等一个完整牛熊周期——MC 就是这个理念。但现实中往往等不起而且单条轨迹的回报方差很大一次偶然的坏动作可能把整段回报带偏让这次更新变成一次无效教育。提示如果你只是在做小规模的 grid world 或 CartPole 实验MC 完全够用代码也最容易调试。它的坑要到连续控制、探索奖励稀疏这类场景里才真正暴露。3. TD边走边改的渐进式人生3.1 TD 的核心拿估计去更新估计TD 只改了一处不等回报全部到账走一步就更新。公式V(s) ← V(s) α[r γV(s) - V(s)]这种操作叫 bootstrap自助因为我们在用自己对下一个状态的估计去修正对当前状态的估计。新信息其实只有两个这一步实际拿到的奖励r以及下一步落在哪个状态s。如果r γV(s)比原来对V(s)的预期高说明这个状态比想象中好就往上调反之往下调。这就是当下修的人生不等到盖棺定论每一小步都即时反馈、即时纠偏。它不需要知道环境模型也不需要等回合结束因此天然适用于连续任务。代价是V(s)本身是个估计值用它做基准等于在流沙上盖房子——每一步都有点自作聪明的嫌疑但你架不住它快。3.2 TD(0) 的代码实现对比上面 MC 的代码TD 的实现简洁得多也不需要reversed不需要visited走一步更新一步from collections import defaultdict def td0_policy_evaluation(env, policy, episodes5000, gamma0.95, alpha0.1): V defaultdict(float) for _ in range(episodes): state env.reset() done False while not done: action policy[state] next_state, reward, done env.step(action) # TD 目标一步真实奖励 对下一步的已有估计 td_target reward gamma * V[next_state] td_error td_target - V[state] V[state] alpha * td_error state next_state return Vtd_error这个名字值得记住它叫时序差分误差是整个 TD 家族的核心信号。你后面看 Q-learning、DQN看到的都是它的变形。3.3 与动物心理学、多巴胺的暗合这里有个值得聊的历史故事。Sutton 在 1980 年代做 TD 的动机之一是心理学里的 Rescorla-Wagner 模型——上世纪 70 年代提出的动物学习理论。这个模型认为动物对某个刺激的反应强度更新正比于实际结果与预期之差。你看td_error r γV(s) - V(s)本质上就是这个预期与现实的落差。这条线后来又和神经科学接上了。研究发现大脑多巴胺神经元的活动大约就编码这个预测误差被生活的意外惊喜砸中多巴胺就分泌多一点一切如预期就没什么波澜。TD 不是凭空发明的数学技巧它本身就是对人类和动物学习机制的粗糙建模。这也是为什么当时做动物学习研究的人反而比做 AI 的人更容易接受 TD——听过巴甫洛夫的狗实验的人对预测误差驱动学习这个观念并不陌生。4. 两者交锋偏差、方差与那道经典的选择题4.1 偏差和方差的互换把这俩放一起最核心的对比就是偏差与方差的对调。MC 的G_t是真实回报无偏但方差大——一条轨迹的偶然性太强终点一哆嗦整段分数都跟着抖。TD 的r γV(s)只用了一步随机性方差小得多但V(s)本身带着估计误差所以有偏。这就像评价一家餐厅。MC 只看整顿饭吃完的总体感受一次被一道菜毁了整体评分就崩了TD 是每上一道菜记录一次印象单道菜的失误影响小但你对这家店应该是什么水准的先入为主会一直带偏后续判断。实践里这个权衡直接决定收敛速度数据少、噪声大的环境TD 通常快得多回合极长、终端奖励稀疏的场景MC 的真信号又有不可替代的价值。4.2 随机游走实验TD 为什么收敛得更快Sutton 和 Barto 的书里有个著名的随机游走例子。一维线上排着几个状态最左边是终止并给 0 分最右边是终止并给 1 分中间状态按均匀随机策略左右移动。两种方法做策略评估把均方误差画出来TD(0) 的曲线肉眼可见地压在 MC 下面尤其是前几十次迭代差距大得惊人。原因在于信号传播的方式不同。TD 每一步都在利用相邻状态的关联把终点附近的信号逐步蹭回起点信息是连续扩散的MC 则必须等一条轨迹走完信号才从终点一次性倒灌。用传播的比喻TD 像口口相传的邻里消息每步扩散一点MC 像等最终审计报告出来再给全公司发群邮。后者信息准但就是慢。4.3 批量训练下的分道扬镳更精彩的例子在批量batch更新下两者算出来的答案会直接不一样。假设我们采集到 6 条片段第一条是A - 0 - B - 0 终止后五条都是B - 1 终止。用 MC 做批量统计A 只出现了一次那条轨迹的回报是 0所以V(A) 0B 的平均回报是(0 1 1 1 1 1) / 6 ≈ 0.83。用 TD先算出V(B) ≈ 0.83再利用A 一定转移到 B这个结构关系得到V(A) 0 V(B) ≈ 0.83。谁更合理从数据蕴含的结构看TD 的答案更对A 必然通向 B那么 A 的价值就理应继承 B 的价值。这正是 TD 被称为确定性等价更新的原因——它在默认经验中隐含的结构关系。MC 是纯经验的囚徒只认自己亲眼看过的数字反而被单条样本的偶然性困住了。这个例子我建议每个学强化学习的人都亲手跑一遍它比任何长篇大论都更能说明问题。5. 为什么 TD 最终胜出从 Q-learning 到 DQN 的血缘5.1 一条清晰的传承线把时间线拉直你会发现现代深度强化学习的血脉就是从 TD 这条线下来的1988 年Sutton 发表 TD(0) 的理论论文解决了收敛性证明。1989 年Watkins 提出 Q-learning把 TD 逻辑从评估给定策略推进到直接学最优动作值函数。它的更新是Q(s,a) ← Q(s,a) α[r γ·max_{a} Q(s,a) - Q(s,a)]这是 off-policy 的行为策略随便怎么走学的都是最优策略。1994 年前后SARSA 作为 on-policy 的对应物出现行为策略和更新目标绑在一起。2015 年Mnih 等人的 DQN 发表在 Nature 上把神经网络当成 Q 函数的近似器配合经验回放和独立的目标网络在 Atari 游戏上打出超人类水平。DQN 的更新公式就是上面那行 Q-learning 公式最多加上了目标网络和冻结参数。可以说你手上任何一个深度强化学习项目只要用了 Q 值更新骨子里都是 TD 的走一步修一步逻辑。5.2 MC 并未消失策略梯度里的回归但 MC 没有死。REINFORCE 算法的更新里用的就是从当前时刻到回合结束的完整回报作为这次动作好坏的度量。在稀疏奖励、结局决定一切的场景里这种无偏性格外珍贵。后来 GAE广义优势估计出现本质上是把 MC 式的完整回报和 TD 式的单步差分按权重 λ 融合在一起。λ 取 0退化成纯 TDλ 取 1趋近 MC。这已经不是二选一而是找到了一个连续的光谱来调节多相信真实回报还是多相信即时修正。5.3 TD(λ)两者之间的完整连续谱顺带提一下 TD(λ)。它用资格迹eligibility trace记录哪些状态最近被访问过然后把 1 步、2 步、3 步……直到完整回报全部按 λ 折现加权。λ0 退化成 TD(0)λ1 趋近 MC中间是各种 n 步回报的混合。这套机制在当年解决了MC 方差大、TD 有偏的僵局——你想要什么就调 λ。今天你看 PPO、TRPO 这些现代算法里的优势估计依然藏着这个谱系的思想。提示如果只看工程落地λ 往往取 0.95 左右就能获得不错的折中新手纠结 λ 之前建议先把 TD(0) 和完整回报各自的极限行为摸清楚。6. 一些实操体会与踩坑记录6.1 初学者应该怎么看待这两种人生我的建议是别急着二选一。先把更新 目标 − 当前估计这个通用框架记住MC 的目标是整段真实回报G_tTD 的目标是一步奖励 下一步的估计值r γV(s)。两者的差别只在目标里面有没有掺入估计值。然后去看 TD 的 bootstrap 如何把方差压下来、如何牺牲一点偏差再看 MC 的无偏性如何守住底线。最后去理解 λ 这个旋钮。等你亲手在同一个环境里跑出两条不同的误差曲线你会突然发现它们其实是同一枚硬币的两面争论谁优谁劣没有意义搞清楚你的任务吃哪一套才重要。6.2 我踩过的坑与常见误区这几条都是我在实际实验里摔过跟头的地方列出来供参考折扣因子 γ 设成 1 还浑然不觉。在连续任务里 γ1 会让 TD 的误差永不衰减V(s)的影响被无限放大很容易发散。小任务里 0.9 到 0.99 之间通常比较稳。MC 硬套连续任务。没有终止G_t无定义代码跑起来看着有输出实际语义已经错了。学习率 α 不看轨迹长度。回合越长MC 回报的方差越大α 要相应调小TD 的 α 可以稍大但太大照样震荡。我习惯先用随机游走环境把 α 扫一遍再上正式实验。首次访问和每次访问混用。新手图省事直接用每次访问结果同一个状态在同一条轨迹里反复更新方差被低估收敛曲线看着比实际漂亮。TD 家族的高估病。Q-learning 里的max操作会系统性高估价值DQN 用目标网络缓解但它治标不治本——只要你拿着估计去更新估计误差就会累积。做实验时看到 Q 值一路膨胀但策略没变好先怀疑这里。6.3 个人体会说点我自己的感受。我最早看这两套方法时总觉得 MC 更诚恳——人家是真刀真枪跑完一局才下结论不像 TD 处处带着猜测。但做着做着就发现现实中大部分任务根本不允许你等那么久而且你千辛万苦等来的结论往往就建立在几次偶然的轨迹上。TD 那种边走边改的策略虽然每一步都有点自作聪明但在复杂环境里反而更稳健。这个教训放到生活里也成立先接受不完美的反馈持续修正比攒一个大样本再一次性判断往往更接近真实世界的生存法则。今天再回头看 MC 和 TD它们不该被当成两种对立算法而应该被理解成采样效率和估计偏差之间的两种摆法。理解了这一点后面看 Q-learning、DQN、PPO 都会顺畅很多。这个系列下一期打算接着聊时序差分的误差传播或者直接进入 Q-learning 的细节到时候再会。
延伸阅读

更多相关文章

2026/10/26 15:59:20

C++20概念(Concepts)解析与应用实践

1. C标准库预定义概念解析在C20标准中,概念(Concepts)作为一项重大革新被引入,它彻底改变了我们编写模板代码的方式。作为一名长期奋战在C一线的开发者,我深刻体会到概念机制带来的变革——它让模板编程从"黑魔法…

2026/10/26 15:54:19

PyQt5多线程与CNN:树莓派垃圾分类识别实战全解析

简介:基于PyQt5多线程神经网络识别的智能垃圾分类项目,被打包为源码与数据集合一的完整资源,适合具备Python与深度学习基础、希望系统学习图像识别与GUI集成开发的初学者和开发者。整个项目使用PyQt5构建界面,并借助多线程把神经网…

2026/10/26 15:54:19

Windows 11音效系统架构与自定义实战指南

1. Windows 11音效系统深度解析1.1 系统音效架构变革Windows 11对音频子系统进行了全面重构,采用全新的"分层音频架构"(Layered Audio Architecture)。这个架构最显著的特点是实现了系统音效与应用音频的完全隔离。在任务管理器中&…

2026/10/26 16:59:45

POJ 3530(A Modular Arithmetic Challenge-类欧几里得)

Given four positive integers M, D, L, R, your task is to find the minimal non-negative integer x which satisfies L ≤ ( D x mod M ) ≤ R, where mod is the remainder operation 类欧几里得&#xff0c;复杂度log #include<cstdio> #include<cstring> #…

2026/10/26 16:59:45

PyTorch实现gPINN求解Allen-Cahn方程的梯度增强技术

1. 项目背景与核心挑战Allen-Cahn方程作为描述相变过程的经典非线性偏微分方程&#xff0c;在材料科学、生物膜动力学等领域有广泛应用。传统数值方法在处理具有多非常陡峭区域的Allen-Cahn方程时&#xff0c;往往面临网格划分困难、计算量爆炸等问题。我们团队在PyTorch框架下…

2026/10/26 16:59:45

C语言中前置++与后置++的底层原理与最佳实践

1. 前置与后置的本质区别 在C语言中&#xff0c;运算符的前置&#xff08;i&#xff09;和后置&#xff08;i&#xff09;形式虽然都能实现变量自增1的效果&#xff0c;但它们的底层机制和编译行为存在本质差异。理解这个差异是正确使用它们的关键。 1.1 运算符的返回值差异 …

2026/10/26 16:59:45

Python爬虫实战:安居客租房数据抓取、清洗与分析全链路

简介&#xff1a;这份资源围绕安居客武汉地区出租房信息展开&#xff0c;完整覆盖从数据爬取、清洗到分析可视化的全流程&#xff0c;适合正在学习Python爬虫、需要完成课程设计或毕业设计的学生&#xff0c;以及想了解真实数据采集项目如何落地的人群。压缩包共14个文件&#…

2026/10/26 16:59:45

马尾扎法进阶指南:从高颅顶到发际线守护的实用技巧

1. 马尾贴头皮的真相&#xff1a;为什么别人扎的是氛围感&#xff0c;你扎的是紧箍咒1.1 时间差、手感差和“反光发缝”先说不客气的大实话&#xff1a;马尾人人会扎&#xff0c;但扎得好看是另一门手艺。我翻自己过去一年的照片&#xff0c;发现十个造型里至少有六个是马尾出镜…

2026/10/26 16:54:45

cc-safety-net:前端运行时风险的CLI守门员

1. 这不是又一个 CLI 工具介绍——cc-safety-net 是什么&#xff0c;为什么它值得你花 5 分钟认真读完“cc-safety-net”这个名字乍看像某个内部代号&#xff0c;甚至容易被误读成“CC 安全网”或“Code Coverage Safety Net”。但实际它是一个轻量、专注、不依赖全局环境的前端…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介&#xff1a;这份PDF是全国计算机二级C语言考试的试题与答案解析&#xff0c;专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介&#xff1a;一份以实战为导向的Python爬虫入门资源&#xff0c;面向具备基本编程基础、希望快速掌握网络数据抓取的初学者&#xff0c;可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档&#xff0c;完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介&#xff1a;这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档&#xff0c;压缩包大小七十八KB&#xff0c;内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开&#xff1a;先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力&#xff1f;在传统深度学习模型中&#xff0c;我们常遇到一个根本性问题&#xff1a;模型在处理新任务时&#xff0c;往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”&#xff0c;而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里&#xff0c;但绝大多数人点进去后看到的&#xff0c;是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑