资讯动态

model-free控制算法详解:从蒙特卡洛、时序差分到SARSA与Q-learning

发布时间:2026/10/14 23:40:57 来源:尧图企业网站定制
1. 先搞清楚一件容易被忽略的事model-free 控制到底在解决什么问题学强化学习的路上很多人卡在同一个地方看完动态规划那一章策略迭代、价值迭代都懂了公式也能默写但是一转身发现环境根本不给转移概率和奖励函数这时候手里拿的招式一下就全部哑火了。我当年就是这样啃完理论信心满满地准备写代码结果面对一个只有一个step()接口的模拟环境愣了整整一下午——这就是 model-based 和 model-free 的分水岭也是 model-free 控制这个主题存在的根本意义。model-free免模型控制指的是在完全不知道环境动力学模型的前提下直接通过与环境交互采样到的状态、动作、奖励序列去逼近最优策略的方法。我们手里没有 ( P(s|s,a) ) 和 ( R(s,a) ) 这两张底牌唯一的武器就是“试错”和“对试错结果的利用”。整个 MC 控制、TD 控制、SARSA、Q-learning本质上都是在回答同一个问题如何在只能抽样、不能查表的情况下把策略一步步推向最优。这篇文章就是要把这条线完整地捋一遍适合正在学强化学习的本科生、准备面试的算法工程师、还有那些“理论看明白了但代码跑不出效果”的自我怀疑者。我不会从头科普强化学习的全部基础但会把 model-free 控制这条线上的关键逻辑拆到骨头里。1.1 控制与预测的分野你需要一个策略而不是一个价值判断如果只让你估计“当前状态有多好”那是预测prediction问题。但如果让你回答“现在应该选哪个动作”那就是控制control问题。这个区分听着简单实际编码的时候非常容易混。预测问题的输出是一个数值控制问题的输出是一个策略——也就是一个从状态到动作的映射或者一个动作分布。model-free 控制与 model-free 预测之间最核心的差异在于控制问题必须显式处理“探索与利用”的矛盾。你如果只沿着当前自认为最好的路径走就永远没有机会发现更好的路径你如果一直乱走学到的东西又用不上。后面提到的所有控制算法本质上都是在探索exploration和利用exploitation之间找平衡点。我见过不少初学的朋友把动态规划时代的贪心策略迭代思路硬搬到 model-free 场景结果价值估计还没收敛策略却已经困死在局部最优里。1.2 广义策略迭代model-free 控制背后的那把尺子如果你读过动态规划章节就会知道策略迭代由两个交替的过程组成策略评估计算当前策略的价值函数和策略改进基于价值函数做贪心选择。这两个过程交替进行最终收敛到最优策略。这套框架被称为广义策略迭代Generalized Policy IterationGPI。Model-free 控制并没有跳出这个框架它只是把“策略评估”这一步从“解析计算”换成了“采样估计”。所以你会看到SARSA 和 Q-learning 的每次更新都包含两个动作一是用新采样的数据修正 Q 值策略评估二是根据当前 Q 值调整行为选择策略改进。这两步纠缠在一起、迭代推进。理解这一点非常重要——很多调参失败的场景本质上是 GPI 的两个步骤节奏失衡评估还没跟上改进就已经跑偏了。2. 蒙特卡洛控制先打完一整场再回头复盘蒙特卡洛MC控制是理解 model-free 控制最直观的入口。它的思路非常简单粗暴把一局完整的交互从头跑到尾拿到完整的轨迹回报 ( G_t )再用这个回报去更新价值估计。在控制场景下我们通常更新的是状态-动作价值 ( Q(s,a) )而不是状态价值 ( V(s) )原因后面马上说。用生活类比的话MC 控制像是一个学生每次考试结束之后对着整张试卷逐题订正把每道题的正确解法抄进错题本。好处是信息量大、反馈真实坏处是必须等考试结束才知道成绩学习节奏慢而且方差大——一次考试的偶然失误会被当成真实水平记录在案。2.1 为什么控制场景要估计 Q 值而不是 V 值理论上有了 V 值再加上环境模型你照样能推出策略。但在 model-free 场景下我们没有模型光知道状态的价值无法判断哪个动作能带来这个价值。因此控制问题里我们需要的对象是 Q 函数给定状态和动作期望的累积回报是多少。只要 Q 函数够准策略就是简单的贪心取 argmax。这个转换看着很小却是从“预测”跨到“控制”的实质一步。有了 ( Q(s,a) )策略改进就不再需要任何环境信息直接对动作空间做最大化即可。这也解释了为什么几乎所有经典的 model-free 控制算法——从 MC control 到 DQN——都在估计 Q 函数而不是 V 函数。2.2 探索与初始化的死结从“探索开始”到 ε-greedyMC 控制有个绕不开的问题价值更新只覆盖轨迹中出现过的 ( (s,a) ) 对。如果一个动作在某个状态下从未被尝试过系统就永远不知道它好还是差甚至可能因为从未被选中而永远得不到修正。这个问题叫“探索不足”。早期解决办法是探索初始化exploring starts每一局开始时人为随机选择起点状态和动作保证每个 ( (s,a) ) 对都有非零概率被访问。这个假设在迷宫之类的仿真环境里还能跑但真实场景几乎无法满足——你没法让一个机器人每次从完全随机的姿势和位置开始运动。所以实际中大家普遍采用 ε-greedy 策略以 ( 1-\varepsilon ) 的概率选择当前 Q 值最大的动作以 ( \varepsilon ) 的概率随机选择其他动作。这个 ( \varepsilon ) 就是探索预算。MC 控制可以证明在“每个 ( (s,a) ) 对都被无限次访问”和“策略最终收敛到贪心策略”两个条件下能收敛到最优而 ε-greedy 加上逐步衰减的 ( \varepsilon ) 正是为了同时逼近这两个条件。2.3 MC 控制的几个原生缺陷高方差与低效率我实际用 MC 控制跑过模拟环境的实验感受最深的不是它能不能收敛而是它收敛得有多痛苦。首先是方差问题。一次完整回合中的累计回报受到后续所有随机性的影响路径越长方差越大。如果奖励延迟到轨迹末尾才出现比如走到终点才给1早期状态的价值估计基本淹没在噪声里。其次是效率问题。每更新一次 Q 值必须跑完整条轨迹。在长轨迹任务里这意味着海量的时间步被消耗在“获取一个更新信号”上。第三MC 控制无法用于非终止型任务——回合不结束( G_t ) 就永远算不出来。这些缺陷推动了一个自然而然的想法能不能不等回合结束走一步就更新一次这个想法直接催生了时间差分Temporal DifferenceTD控制。3. TD 控制把“等考试结束”改成“边做题边对答案”TD 方法的核心思想是用“当前即时奖励 下一步价值的估计”作为更新目标而不是用整条轨迹的累计回报。这个更新目标写作[ G_{t}^{(TD)} R_{t1} \gamma V(S_{t1}) ]它只依赖下一步的采样结果然后立刻更新。这个改变带来了三个直接收益方差显著降低因为不需要累加一整条轨迹的随机性可以处理非终止任务只要估价函数持续更新循环结构也能学学习速度大幅提升每走一步都能产生学习信号。类比来看MC 是考完试统一对答案TD 是每做完一道选择题就立刻翻答案。虽然单次信息量小但反馈频率高、噪声低实际收敛速度往往更快。3.1 从 TD(0) 到 SARSA给 TD 加上动作维度单步 TD 预测解决的是对 ( V(s) ) 的估计但控制问题需要 Q 函数。给 TD 预测加上动作维度的最直接产物就是 SARSA 算法。它的名字就是它每次更新用到的数据元组(S, A, R, S, A)也就是当前状态、当前动作、获得的奖励、下一个状态、下一个动作。SARSA 的更新公式是[ Q(S,A) \leftarrow Q(S,A) \alpha \left[ R \gamma Q(S,A) - Q(S,A) \right] ]这里的关键在于更新目标里的 ( Q(S,A) ) 是“下一个动作确实被执行之后”的 Q 值而这个动作 ( A ) 是由当前策略通常是 ε-greedy采样出来的。换句话说SARSA 学的是“当我在这个状态、按照当前策略做出这个动作”的期望回报。3.2 一个完整的 SARSA 训练循环很多初学者背得住公式却写不对循环。这里给出一个最简洁的算法骨架对应 python 风格的伪代码初始化 Q(s, a) 为任意值 对每一回合 初始化状态 S # 关键先选好本回合的第一个动作 A epsilon_greedy(Q, S) 当 S 不是终止状态 执行 A观察 R 和 S # 关键在下一个状态也要先选好动作 if S 是终止状态: Q(S,A) alpha * (R - Q(S,A)) else: A epsilon_greedy(Q, S) Q(S,A) alpha * (R gamma * Q(S,A) - Q(S,A)) A A S S有两个地方特别容易写错。一是很多人习惯在每一步临时算 ( A )更新完就丢到下个循环又重算。这会让更新目标里的 ( A ) 和实际执行的下一步动作不一致破坏算法的数学语义。二是终止状态的 Q 值必须显式设为 0 或直接特殊处理否则终止状态的下一步价值会引入错误偏差。我初学的时候在这两个细节上各踩过一次坑都在实验里表现成“Q 值震荡不收敛”或“收敛到次优策略”排查了很长时间才发现是这种不起眼的实现偏差。3.3 TD 控制是 MC 控制的一般化吗严格讲TD 和 MC 是两种不同的估计方法它们的偏差-方差特性不同MC 无偏但高方差TD 有偏但低方差。实践中 TD 往往收敛更快特别是在奖励稀疏或者轨迹很长的任务里。另一方面TD 的偏差来自 bootstrap——它用“对未来的估计”去更新“对当下的估计”如果初始估计是错的这种错误会传播。这个特性在控制算法里会演变成更微妙的问题也就是下一节要讲的 SARSA 和 Q-learning 的核心分歧。4. SARSA 与 Q-learning一步之差两个世界如果你只看更新公式SARSA 和 Q-learning 的差别小得可笑。Q-learning 的更新是[ Q(S,A) \leftarrow Q(S,A) \alpha \left[ R \gamma \max_{a} Q(S,a) - Q(S,A) \right] ]SARSA 用的是 ( \gamma Q(S,A) )Q-learning 用的是 ( \gamma \max_{a} Q(S,a) )。就差一个“取最大”但这一字之差把两种算法推向了完全不同的哲学。4.1 On-policy 和 off-policy表兄弟不是亲兄弟SARSA 更新时使用的 ( A ) 是行为策略behavior policy实际选择并执行的动作所以它评估的始终是“当前正在执行的那个策略”的价值。这种“学到什么就用什么、用什么就学什么”的方式叫同策略on-policy学习。Q-learning 更新时使用的 ( \max_{a} Q(S,a) ) 不依赖于行为策略实际选的动作它直接取下一状态所有动作中 Q 值最大的那个仿佛有一个“完美的决策者”在旁边做示范。这意味着 Q-learning 学的是“最优策略”的价值而不是“当前策略”的价值。这种评估目标与行为策略分离的方式叫离策略off-policy学习。可以这样理解SARSA 是一个人在路上边开车边学习学的是“如果我按我现在的开车习惯开会怎样”Q-learning 是旁边坐了一位虚拟教练学的是“如果每一步都做最优操作会怎样”哪怕当前司机经常选错动作。4.2 悬崖行走实验为什么 SARSA 和 Q-learning 会走出完全不同的轨迹经典的 Cliff Walking 环境能把这个差异放大到肉眼可见。在一个网格世界里起点在下左终点在下右中间紧贴悬崖的格子会有巨大负奖励。Q-learning 在训练过程中因为不断尝试 ( \max ) 会频繁“看到”贴着悬崖的最优路径但实际行为策略是 ε-greedy有一定概率把 agent 推进悬崖。SARSA 则因为更新目标来自实际策略会把“贴着悬崖走容易被 ε 探进悬崖”的风险计入价值所以更倾向于选择稍微绕远但更安全的路径。我复现这个实验时的结果和教材高度一致Q-learning 学到的最终策略在 ε 衰减到接近 0 时的贪心策略是贴着悬崖的最短路但这套策略在训练期间的平均回报反而更差SARSA 学到的策略略绕远但它在线表现interim performance明显更好。这个对比给实际应用一个重要启示如果你的 agent 要在训练过程中“边学边干活”比如在线学习场景SARSA 这种保守性格更靠谱如果你的重点是训练结束后的最终策略质量并且训练过程可以承受一定的“试错受伤”Q-learning 的离策略特性更能逼近最优解。4.3 双算法对比一组常用参考维度对比维度SARSAQ-learning学习范式同策略 on-policy离策略 off-policy更新目标( R \gamma Q(S,A) )( R \gamma \max_a Q(S,a) )是否受行为策略影响是直接受限否目标与行为分离风险敏感度高会避开“探索途中被坑”的风险低直接追求最优路径典型应用场景在线控制、安全性敏感任务离线训练、仿真环境、深度强化学习基础这里需要特别说明off-policy 这个属性在后续深度强化学习里极其关键。因为样本可以来自任意旧策略的历史缓存Q-learning 天然支持经验回放experience replay而 SARSA 这类 on-policy 算法用回放数据时会引入严重的策略不匹配偏差。这也是 DQN 选择 Q-learning 作为理论基座的原因之一。5. 代码层面与控制实验里的那些坑学习率、折扣因子和奖励设计写到这里很多读者应该已经能在模拟环境里跑通 SARSA 和 Q-learning 了。但“能跑通”和“跑得好”之间隔着一条由各种细节填平的鸿沟。这一节是我在多次实验中最想分享的部分。5.1 学习率到底怎么调学习率 ( \alpha ) 控制着每次更新对旧估计的修正幅度。太大会导致 Q 值剧烈震荡太小则收敛慢到让人怀疑人生。我常用的经验值是离散状态空间的小规模任务从 0.1 起步状态空间大或者奖励尺度大就降到 0.01 左右。更好的做法是让 ( \alpha ) 随时间衰减。理论上有收敛性保证的一组常用衰减是[ \alpha_t(s,a) \frac{1}{N_t(s,a)} ]其中 ( N_t(s,a) ) 是 ( (s,a) ) 被访问的次数。这个衰减的直觉是访问次数越多估计置信度越高新样本应该对估计的影响越小。不过这个方案在非平稳任务里反而会坏事因为环境如果会变旧经验就应该被逐步遗忘而不是被固化。工程上我更推荐分段衰减训练初期用偏大的 ( \alpha ) 快速探索价值空间的粗轮廓中期逐步降低后期用很小的 ( \alpha ) 做精细修正。你也可以在线监控 Q 值更新的平均幅度如果连续多个回合的更新幅度都非常小说明 ( \alpha ) 已经过小再继续也只是磨洋工。5.2 折扣因子的选择和任务长度的关系( \gamma ) 的选择经常被当成一个顺手填的数值其实它对策略形态的影响非常大。( \gamma 0.9 ) 意味着 agent 只关心大约未来 10 步内的回报( \gamma 0.99 ) 则是大约 100 步的视野。我有一次在一个需要长距离规划的任务里用 ( \gamma 0.9 ) 跑 Q-learning结果 agent 永远学不会先走远离奖励的绕路再回头拿大奖因为绕路半径超过了几步的决策视野。后来把 ( \gamma ) 提到 0.99行为立马改观。一个实操判断法则估计一下任务从任意状态到最优目标需要的平均步数 ( L )然后让 ( \gamma^L ) 不要接近 0。比如 ( L50 ) 时( \gamma^{50} \approx 0.005 )当 ( \gamma0.9 )远期奖励几乎被抹平而 ( \gamma0.99 ) 时 ( 0.99^{50} \approx 0.6 )远期奖励还能有效传导。5.3 稀疏奖励与“学习率不够”的错觉Grid World 这类任务里每个动作都有 -1 的小惩罚奖励信号密集Q-learning 跑起来顺风顺水。但换到只有终点才有 1 奖励的稀疏奖励环境你会发现 Q 值长时间不动于是本能反应是调大 ( \alpha )。这其实是治标不治本。稀疏奖励问题的本质是“探索到正奖励的概率太低”。调大 ( \alpha ) 只是让“偶遇奖励”时的传播更快但偶遇本身没有变化。真正有效的思路是缩小问题用奖励塑形reward shaping增加中间信号或者设计课程学习curriculum learning让 agent 从简单变体任务开始学。其中比较经典的奖励塑形是势能函数塑形potential-based shaping在原始奖励上叠加一项 ( \gamma \Phi(s) - \Phi(s) )其中 ( \Phi ) 是某个启发式函数比如距离终点的负倒数。理论已经证明这类塑形不会改变最优策略工程上却能大幅加速前期探索。我在一个黑暗房间寻物任务里就把收敛回合数从两千多降到了三百以内。5.4 Q 表的初始化一个被忽视的杠杆绝大多数教材默认 Q 表初始化为 0这其实是一个值得商榷的默认值。Q-learning 在早期会系统性地悲观或乐观取决于初始化值相对真实价值的偏差方向。如果初始 Q 值偏高乐观初始化agent 会倾向于尝试那些“尚未被否定”的动作天然具备强探索性但代价是早期会走大量弯路。如果初始 Q 值偏低agent 会快速锁死当前看起来最好的动作探索严重不足。实践中有一个参考做法把 Q 值初始化为“对每个动作所能获得回报的乐观估计”然后配合衰减的 ( \varepsilon )在早期就能高效覆盖有潜力的动作空间。另外提醒一句Q 表初始化方式对 SARSA 的影响小于对 Q-learning 的影响因为 SARSA 的更新目标受行为策略约束探索不足的问题会以另一种路径表现出来行为策略不变学到的价值也就是保守策略的价值。这一点在对比实验里容易让初学者困惑。6. model-free 控制的现实边界从 Q 表到函数近似再到深度强化学习小规模的网格世界用 Q 表可以轻松搞定但真实场景的状态空间往往是连续的、高维的Q 表的方式立刻暴露两个致命问题一是存储爆炸二是泛化缺失。触过某个状态的 Q 值对邻近未见过的状态提供不了任何信息。解决方向是引入函数近似用一个参数化函数 ( Q(s,a;\theta) ) 代替 Q 表。如果函数本身具有良好的泛化能力比如神经网络那么 agent 就能从见过的状态推及未见过的状态。这一小步改动正是从经典强化学习迈入深度强化学习的门槛。6.1 DQN 到底是 Q-learning 的什么变体DQN 最核心的三个改动全部围绕“让 Q-learning 在神经网络上稳定跑起来”这一目标展开。第一个是经验回放把交互数据存进一个缓冲区训练时随机抽样。这个机制能打破样本间的时序相关性——否则神经网络会像背书一样记住最近几帧的局部经验灾难性遗忘不断重演。第二个是目标网络用一份延迟更新的网络参数计算 TD 目标 ( R \gamma \max_{a} Q(S,a;\theta^-) )稳定的优化目标能防止 Q 值发散。第三个是关于 reward 的 clip 或缩放压缩奖励幅度能避免梯度爆炸这在很多实现中都是默认操作。这三者与 off-policy 属性的关系需要点明经验回放要求行为策略与评估策略分离而 Q-learning 的更新目标根本不关心行为策略是什么因此天然适合回放机制。理论上你也能硬做一个“带经验回放的 SARSA”但标准做法里极少有人这么干因为回放数据里的动作多来自旧策略用它去更新当前策略的价值会引入系统性偏差。6.2 我们在用 model-free 控制时到底在“逼近”什么从 MC 到 TD从 SARSA 到 Q-learning从 Q 表到神经网络表面上看算法换了又换内核却始终是同一件事在不知道环境模型的情况下用采样的方式做 GPI 的评估与改进。深度模型带来的额外挑战在于Q 值不再有天然的上下界保证神经网络优化又依赖海量梯度更新所以 DQN 在实际工程中的表现对超参数极其敏感。我个人的经验是如果你在小规模任务里能把 Q-learning 的机制和收敛行为吃透再去理解 DQN 里那些工程技巧回放缓冲区大小、目标网络更新频率、ε 衰减曲线就会顺畅得多。反之直接上手 DQN 遇到发散问题往往只能盲猜原因因为你不知道经典算法在更小尺度下原本该表现成什么样子。6.3 后续常见扩展的简要地图再往前走双 Q 网络Double DQN解决的是 Q-learning 系列“最大化偏差”问题——即 ( \max ) 的估计天然偏大导致 agent 对不确定的动作过于乐观。优先经验回放Prioritized Experience Replay则是改进了回放样本的抽取权重让对 TD 误差影响更大的样本被更频繁地抽到。这些扩展并没有偏离 model-free 控制的初衷它们都是为了对抗函数近似引入的新偏差来源。如果你现在觉得 SARSA 与 Q-learning 的区别已经足够微妙等到碰见 Dueling DQN 的 ( V(s) ) 与 ( A(s,a) ) 拆分时你会怀念 Q 表时代的纯粹。我自己的体会是学习 model-free 控制不要急着上深度模型。先把 MC 与 TD 的偏差-方差差异吃透再把 SARSA 与 Q-learning 在同一个小 Grid World 上的行为差异亲手复现一遍最后再看 DQN 时你会觉得它的每个设计——回放、目标网络、奖励缩放——都像老熟人一样有迹可循。这条路看上去绕了远实际上是通往深度强化学习最短的路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑