强化学习基石:马尔可夫决策过程与价值函数解析
马尔可夫决策过程是我学强化学习时第一个真正需要“停下来消化”的概念。当时看资料满屏的字母符号和希腊字母公式推来推去表面上每个符号都认识但串在一起就不知道在说什么。直到后来把一个最简单的格子世界彻底算了一遍才算摸到一点门道。这篇笔记先聊聊MDP本身——它到底在描述什么问题为什么强化学习一定要建立在它上面。先说结论马尔可夫决策过程是一个数学框架用来描述“智能体在未知环境里通过试错改进策略”这件事。你的智能体是谁你的环境有什么规则你的目标是什么全部被拆成状态、动作、转移概率、奖励四样东西。学强化学习如果绕开这个框架后面所有算法都只能停留在“套库调用”的层面出了问题也很难定位。这篇内容适合两类人一是刚入门强化学习、想从头建立体系的学习者二是在实际调参时经常对“V值”“Q值”感到模糊的工程开发者。看完之后你至少能把状态、动作、奖励这些术语跟真实问题对应起来知道一个问题的MDP建模到底是在干什么。1. MDP要解决的根本问题1.1 为什么不能说“走一步看一步”很多人的第一反应是那我直接规划不就行了每一步都枚举所有可能的动作选最优的为什么要搞MDP这么个东西问题在于“最优”的涵义不明确。你在走一步之后环境会产生一个反馈但接下来你还会继续走下一步。这意味着当前这一步的影响会在后续很多步里持续扩散。一步的决策连带改变的是整条未来轨迹。所以你不能只看这一步的即时收益你要看的是长期累计收益。而长期累计收益的数学表达需要一套严谨的符号来完成。MDP把这个问题拆成了几个部分状态表示现在的情况动作表示你的决定转移概率表示环境如何回应你的决定奖励表示你希望系统优化什么指标。这四个部分恰好对应了一个决策问题的完整循环观察状态 → 选择动作 → 环境转移 → 获得奖励 → 进入新状态。1.2 马尔可夫性质的通俗理解马尔可夫性质说的是给定当前状态未来与过去独立。翻译成人话——如果你已经知道现在这一刻的完整信息那么没必要再去看历史记录因为掩盖在当前状态里的历史影响已经全部浓缩进了这个状态本身。打游戏是一个很好的例子。你在某一帧能看到的画面、血量、位置、敌方状态如果足够完整那么下一帧的结果就已经由当前帧和你的操作完全决定了。不需要回放上一帧视频去算“现在我该按哪个键”。这就是马尔可夫性质发挥作用。这里有个很容易踩坑的地方很多人会把“当前状态”理解成“当前观测”。这是两个概念。观测是你能拿到的信息状态是环境内部真正决定未来的全部因素。如果观测丢信息比如你只能看到棋盘的一部分那么即使你记住了过去所有的局部观测未来仍然不完全由过去的观测决定。所以严格来说马尔可夫性质是状态的性质不是观测的性质。搞清楚这点后面学到部分可观测环境时就不会绕进死胡同。2. 四元组S、A、P、R2.1 状态集合与动作集合状态集合S是所有可能状态的全体。在围棋里每种棋盘局面是一个状态状态数量远超宇宙原子数。在库存管理里状态可以是当前库存量一个非负整数。在智能驾驶里状态包括车速、位置、相邻车辆信息等这时候状态往往是一个高维向量。动作集合A是你作为智能体可以施加的干预。动作可以离散比如游戏中只有“左、右、上、下、不动”也可以连续比如机器人关节的力矩控制。离散动作的处理相对直观连续动作则往往需要额外的策略网络或近似手段。初期学习建议先从离散动作入手因为每一步的逻辑更清晰不容易被数值细节干扰。2.2 转移概率是“环境的物理法则”转移概率P描述的是你在状态s执行动作a之后环境以什么概率把你带到状态s′写作P(s′|s,a)。它体现的是环境对动作的响应规律不由你来决定你要做的是适应它。可以把它理解成一套规则说明书。在模拟环境里这套规则是人为设定的比如“向左走时有80%概率成功到左边20%概率滑到右边”。在真实系统里这套规则通常未知你只能用采样来估计。注意很多入门资料会直接给P矩阵的实际数值让你“代入公式”。但真实场景里P往往是拿不到的这也正是model-free方法存在的意义——不依赖P的具体数值只靠与环境交互产生的样本更新策略。如果你把注意力全放在矩阵计算上后面读到时序差分类算法时容易产生“为什么没有转移矩阵”的困惑。2.3 奖励你的优化目标奖励R就是每一步环境给你的数值反馈。它不需要是什么高大上的指标它可以是一个偏差量、一个成功标志、一个成本负值。关键是你希望它最大化那么整个智能体就会被训练成“想尽一切办法”让这个数值变大。奖励设计是强化学习工程里最容易被低估的环节。奖励给得太稀疏学习过程会很慢奖励给得太密集智能体容易钻空子找bug式路径来刷分。设计奖励时你始终要问自己一个问题这个奖励被最大化之后我真正想要的目标是否也被最大化如果答案不确定就要调整奖励函数。这是后面所有算法调优的前提。3. 回报与折扣因子3.1 累计回报为什么不能直接相加假设你从第一步到最后一步获得了一串奖励序列r1, r2, r3, ……, rT。如果直接把它们求和作为总回报那意味着今天的1块钱和十年后的1块钱价值相同。但在绝大多数问题里奖励越早获得越好。这是因为早期的奖励可以继续参与后续决策的积累而未来的奖励不确定性更高。折扣因子γ就是用来刻画“未来价值缩水”的一个超参数取值范围在[0, 1]。每一步往后推奖励乘上γ的对应次幂。γ越接近1代表智能体越有耐心愿意为长远利益而放弃眼前γ越接近0智能体越短视只看重短期内能拿到的收益。3.2 折扣因子的实际意义在无限步的任务里γ小于1还有一个数学上的必要性保证累计折扣回报是有限值。因为r有界时无穷级数是收敛的。这点很关键。你要处理的任务如果是持续运营的没有明确的终止时刻那么γ的存在就不只是一个“偏好参数”而是让整个优化目标在数学上站稳脚跟。到底把γ设成多少我的经验是先看你希望智能体考虑多长的未来。拿一个商业决策场景举例如果单位决策周期是一天而你希望智能体大约考虑未来二十天的收益那么γ0.95左右是合理的因为0.95^20大约等于0.36意味着二十天后的收益打折一半还多。如果你希望看更远γ可以调到0.99。但γ接近1时学习方差会变大训练也会变慢这是需要权衡的事情。4. 策略、价值函数和贝尔曼方程4.1 策略与价值函数策略π表示智能体在每个状态下选择动作的规则。它可以是确定性的在状态s动作a是固定的也可以是随机性的在状态s按一定概率分布随机选择动作。随机策略听起来多此一举但在很多博弈和探索问题里随机性恰恰是对抗对手和解决探索困境的必需品。有了策略之后我们想知道“按这个策略走下去我现在到底算不算好”。光看即时奖励不够因为后续的奖励还没发生。于是引入价值函数状态价值函数V_π(s)表示从状态s出发按照策略π持续决策期望的累计折扣回报动作价值函数Q_π(s,a)表示从状态s出发先采取动作a然后按策略π持续决策期望的累计折扣回报。举一个具体场景理解V和Q的区别。你在一个格子迷宫的某个格子里V值衡量的是“此刻站在这个位置有多好”而Q值衡量的是“此刻站在这且我还决定往东走一步有多好”。两者的关系是V_pi(s)可以看作是Q_pi(s,a)在策略π的分布下的期望原则就是策略决定我有多大概率选每个动作我按这个概率把Q值加权平均就得到V值。4.2 贝尔曼方程的递归思想把价值函数展开会发现一个递归关系。你所处状态的V值等于当前状态在策略下所有可能动作的即时奖励的期望加上折扣后的下一状态V值的期望。这就是贝尔曼期望方程。它之所以重要是因为它提供了一条计算路径V值不是凭空得到的而是通过“当前奖励 未来价值”互相套娃解出来的。你可以把贝尔曼方程看作一张蜘蛛网每个节点的数值由它周围的节点送来最终达到一个互相自洽的状态。用最简单的单格环境来说只有一个状态s只有一个动作a奖励恒为1γ0.9。那么V(s) 1 0.9 × V(s)。算出来V(s) 10。这个例子虽然简单到无用但它把递归计算的逻辑展示得很清楚V值不是某一步的数值而是包含整个未来的期望。5. 一个完整的小算例从MDP到V值5.1 环境设定用一个3 × 4的网格来实际算一遍。网格里有四个特殊位置起点在左下角一个奖励点、一个惩罚点还有一堵墙。每一步动作有概率滑动所以动作的结果不是百分之百确定的。这里体现的是概率转移的朴素形态。你打算向右走实际有80%概率成功右移10%概率向下10%概率向上。如果移动方向撞墙或出界就停在原地。这里的细节是撞墙后不从环境中付出额外代价只是位置不变。5.2 手工推演第一步只看终点前的倒数第二行。那个能从奖励点走一步就到达的位置它的V值初算时等于这一步的即时奖励加上γ乘下一状态的V值。下一状态的V值如果是0初始条件当前状态的初估V值就约等于即时奖励这一项。接下来要把这些初估值往四周扩散。左下角起点邻接的格子开始会从上方和右方收到数值。如此反复扫过整个网格若干次每次更新都代入上一轮的V值直到两次更新之间的差异小于阈值。你手动扫两轮就能感受到V值是如何传播的奖励点的数值先感染它相邻的格子然后一格一格向外扩散每传一格乘以一个γ。这也是为什么γ越大远处格子分得的“余温”越高——因为奖励信息能传得更远。5.3 你从中能读到什么这个手工过程本身就揭示了当前主流强化学习算法的一个重要思想利用当前估计值去更新其他状态的价值。哪怕现在给的估计是错的只要不断用现有估计去逼近更准确的估计最终能收敛到真值这就是动态规划思想在价值计算中的落地。所以MDP并不是孤立的数学玩具它就是后面时序差分、Q学习这些算法共同的母体。你对MDP的理解每深一层后面看算法的眼光就会完全不同。6. 常见困惑与学习建议6.1 为什么有些环境没有明确的P矩阵很多人学完MDP后会产生一个疑问那MDP是不是必须要求P已知并不是。P描述的是环境规则知道P则是有了明确的环境模型这种情形适合用动态规划而真实场景里P未知只能靠采样那么就要走无模型的路线比如后面会学到的时序差分和Q学习。两种路线建立在同一个MDP框架上区别只在于你是否能直接拿到P的数值。6.2 回报与奖励傻傻分不清奖励是每一步获得的即时数值回报是一整段轨迹上折扣奖励的总和。很多人说起“某个动作的奖励”时其实指的是“该动作后续所有奖励的折扣累积”这在术语上是混淆的。认识这个区分再看“奖励最大化”这个表述时就会意识到它指的是整个回报最大化不只是下一步那一个数。6.3 哪些细节在看论文时特别重要看论文里的MDP符号时先区分三件事状态空间是离散还是连续动作空间是离散还是连续任务是有限步还是无限步。这三个基本属性直接决定你该选择哪一类算法。如果论文里提到“奖励折扣”但没有说明γ你需要回头找或者按经验补齐假设否则复现时很容易莫名其妙地不收敛。6.4 入门阶段的几条实操建议第一不要一上来就啃带证明的厚书先把“状态、动作、转移、奖励、价值、策略”这六个词在具体例子里对应清楚。第二找一个小规模的网格世界或者任何你能穷举的环境亲自动手迭代一轮价值更新你马上会直觉性地明白V值怎么“长”出来。第三控制环境复杂度最好刚开始状态数在几十以内这样才能在纸上或简单的程序里追踪每一步数值变化。我踩过的一个很深坑是早期我直接跳进深度强化学习的代码里调网络、调超参数结果训练出来的智能体表现忽好忽坏根本不知道问题出在环境建模上还是网络结构上。后来回头把MDP的价值迭代重新算了一次才意识到问题出在我没把折扣因子和每步的奖励范围对齐。这类问题不回到MDP层面几乎不可能定位到。这篇笔记就写到这。下一章可以接着写动态规划与价值迭代的具体实现如果你在读MDP时有哪些卡住的概念也值得先自己画几个小环境算一算通常比翻十遍书都管用。