
1. 从“走一步看一步”到“走一步看十步”为什么我们需要马尔可夫决策过程如果你玩过任何一款策略游戏比如《文明》或者《星际争霸》你肯定有过这样的体验开局时资源有限你是先造农民发展经济还是先造兵营巩固防御这个决策不仅影响你下一分钟的游戏体验更可能决定了整局游戏的走向。在现实世界里类似的决策也无处不在一个机器人如何规划路径以最快到达目的地同时避开障碍一个交易算法如何在瞬息万变的市场中决定买入、持有还是卖出一个推荐系统如何在用户每次点击后决定下一次该推送什么内容以最大化用户的长期满意度这些问题都有一个共同的核心如何在充满不确定性的环境中做出一系列最优的决策以获得最大的长期收益这听起来像是一个哲学问题但数学家们早就把它变成了一个可以精确计算和优化的模型——这就是马尔可夫决策过程。很多人第一次听到“马尔可夫决策过程”这个名字可能会被吓到觉得这是数学系博士才搞得懂的东西。但它的核心思想其实非常朴素甚至可以说是一种“高级常识”。我们日常说的“走一步看一步”就是一种最原始的决策方式它只关注眼前这一步的得失。而马尔可夫决策过程教我们的是“走一步看十步”它要求我们在做当前决策时必须考虑到这个决策对未来所有可能状态的影响并追求整个决策序列从开始到结束的总收益最大化。为什么“看十步”比“看一步”强举个简单的例子下象棋时吃掉对方一个“车”可能让你眼前大优高即时收益但如果你为了吃这个“车”把自己的“王”暴露在对方的攻击范围内导致三步之后被将死那么这个决策就是灾难性的。马尔可夫决策过程就是那个能帮你计算“三步之后被将死”概率和代价的“超级大脑”。所以无论你是计算机科学的学生、运筹学的研究者、量化金融的从业者还是对人工智能决策逻辑感兴趣的任何一个人理解马尔可夫决策过程都像是获得了一把解开“序列决策优化”之谜的万能钥匙。它不仅是强化学习的理论基础更是自动化决策智能的核心。接下来我们就抛开那些让人望而生畏的数学符号用最直白的方式看看这个“超级大脑”到底是怎么工作的。2. 拆解MDP的核心五要素构建决策模型的“乐高积木”要把一个复杂的决策问题塞进马尔可夫决策过程这个数学模型里我们需要用五个基本的“乐高积木”把它搭建起来。这五个要素缺一不可理解它们你就理解了MDP的全部家当。2.1 状态世界的“快照”首先我们需要定义状态。你可以把它理解为在某个特定时刻你所关心的那个世界的“一张完整快照”。对于棋盘游戏状态就是当前棋盘上所有棋子的位置对于机器人状态可能是它的坐标、电量、传感器读数对于股票交易状态可以是当前股价、持仓量、市场波动率等指标。状态集合通常用大写字母S表示。关键要求是一个状态必须包含所有用于做出最优决策的必要信息。这被称为“马尔可夫性”我们稍后会详细讲。状态的设计是建模中最艺术的一环设计得太简单信息不足模型无法做出好决策设计得太复杂维度灾难计算会变得不可能。2.2 动作你能做的“选择”在某个状态下你能做什么这些可做的选择就是动作。动作集合用A表示。动作可以是离散的如前进、后退、左转、右转也可以是连续的如方向盘转动-30度到30度之间的任意角度。在有些模型中并非所有动作在所有状态下都可用比如在棋盘边缘就不能再向左走。2.3 状态转移概率世界的“不确定性”这是体现“马尔可夫”精髓的部分。当你处于状态s并采取了动作a之后世界并不会确定性地进入某个下一个状态s‘。相反存在一个概率分布描述你转移到各个可能状态的概率。这个概率就是状态转移概率记作P(s | s, a)。它的含义是在状态s下执行动作a后转移到状态s‘的概率是多少。例如一个扫地机器人在空旷房间中央执行“前进”动作它有90%的概率成功前进一格到达s1但有10%的概率因为轮子打滑而原地不动停留在s。所有从(s, a)出发可能到达的下一状态的概率之和必须等于1。这个概率模型封装了环境的所有不确定性。2.4 奖励函数好坏的“即时评分”每执行一个动作环境都会给你一个即时反馈这就是奖励。奖励函数R(s, a, s)定义了在状态s下采取动作a并到达状态s‘时所获得的即时收益或惩罚即负收益。奖励函数是引导智能体学习的“指挥棒”。它的设计至关重要你希望智能体做什么就奖励什么。比如让机器人走到目标点那么只有在到达目标点时给予一个大的正奖励如100其他时候可以给一个小的负奖励如每走一步-1以鼓励尽快到达或者撞墙时给一个大的负奖励如-50。奖励函数设计不好智能体可能会学会一些意想不到的“作弊”行为比如为了获取步数负奖励最小化而原地转圈。2.5 折扣因子未来收益的“汇率”这是考虑长期收益的关键。试想今天给你100元和一年后给你100元你更想要哪个大多数人会选择今天因为未来的钱存在不确定性而且即使确定能拿到其“现值”也因时间价值而降低。在MDP中折扣因子 γ就是这个概念它是一个介于0和1之间的数通常如0.9或0.99。它的作用是给未来的奖励打折扣。具体来说如果一步之后获得的奖励是 R1两步之后是 R2那么这个决策序列的总回报从当前时刻看就是R1 γR2 γ²R3 ...。γ 越接近1智能体越“有远见”越重视长期回报γ 越接近0智能体越“短视”只在乎眼前利益。设置γ0MDP就退化成了只追求即时奖励的贪婪算法。把这五个积木拼在一起一个完整的马尔可夫决策过程就定义好了一个智能体在一个由状态S描述的环境中可以从动作集A中选择动作。每当它执行一个动作a环境会根据概率P(s|s,a)转移到下一个状态s并给予智能体一个奖励R(s,a,s)。智能体的目标是找到一套行为准则策略使得从任何初始状态开始所获得的经过γ折扣的长期累积奖励的期望值最大。3. “马尔可夫性”与“策略”决策的灵魂与地图有了模型我们怎么用它来做决策这涉及到MDP里两个更核心的概念马尔可夫性和策略。3.1 马尔可夫性记忆的“黄金分割点”前面提到状态要包含“所有必要信息”这正式的名称叫马尔可夫性。其严格定义是下一状态s‘的分布只依赖于当前状态s和当前动作a而与过去的历史状态和动作无关。用公式表示就是P(s_{t1} | s_t, a_t, s_{t-1}, a_{t-1}, ...) P(s_{t1} | s_t, a_t)这为什么重要因为它极大地简化了问题。如果没有马尔可夫性智能体在做决策时需要回顾整个历史状态空间会随着时间指数级膨胀问题将变得无法计算。马尔可夫性告诉我们只要当前这张“快照”状态拍得足够好包含了所有相关历史信息的精髓我们就可以忘掉过去只基于现在来规划未来。但这在现实中往往是一种理想化的假设。比如在股票市场中股价状态可能并不满足严格的马尔可夫性因为市场的情绪、隐藏的宏观经济因素等并未完全包含在当前股价里。因此在实际应用中我们总是尽力去构造一个满足或近似满足马尔可夫性的状态表示这是建模成功的关键一步。3.2 策略从状态到动作的“导航地图”智能体具体怎么行动它需要一个策略。策略通常用希腊字母π表示它本质上是一个函数告诉智能体在任何一个给定的状态s下应该采取哪个动作。策略分为两类确定性策略像一张清晰的地图在状态s下明确地输出一个动作a。即a π(s)。随机性策略像一张带有概率的建议地图在状态s下它给出一个在所有可能动作上的概率分布。即π(a|s) P(采取动作a | 当前状态为s)。随机性策略在探索未知环境时非常有用。智能体的终极目标就是找到一个最优策略 π*。这个最优策略能使得从任何初始状态开始按照它行动所获得的长期折扣累积奖励的期望值最大。一旦找到了这个π*智能体就拥有了在任何情况下做出最佳决策的“终极导航仪”。4. 价值函数与贝尔曼方程如何给“好状态”和“好动作”打分我们知道了要找最优策略但怎么判断一个策略是好是坏又怎么找到那个最好的这就需要引入“价值函数”和奠定所有优化算法基础的“贝尔曼方程”。4.1 状态价值函数这个位置“有多好”首先我们定义在某个策略π下一个状态s的价值Vπ(s)。它表示从状态s开始一直遵循策略π行动所能获得的长期折扣累积奖励的期望值。Vπ(s) Eπ [ R_t γR_{t1} γ²R_{t2} ... | S_t s ]这个值越高说明从这个状态出发未来的“钱景”越好。Vπ(s) 是对状态在长期视角下的一个综合评价。4.2 动作价值函数这个动作“有多值”有时光知道状态价值还不够。在同一个状态s下采取不同的动作a未来的前景可能天差地别。因此我们定义动作价值函数 Qπ(s, a)。它表示在状态s下先采取动作a这个动作不一定来自策略π然后再从此之后严格遵循策略π行动所能获得的长期折扣累积奖励的期望值。Qπ(s, a) Eπ [ R_t γR_{t1} γ²R_{t2} ... | S_t s, A_t a ]Q函数比V函数包含了更细粒度的信息。显然它们之间存在关系在状态s下按照策略π选动作那么状态价值等于所有可能动作的动作价值的概率加权平均Vπ(s) Σ_{a} π(a|s) * Qπ(s, a)。而对于最优策略π*我们对应有最优状态价值函数V*(s)和最优动作价值函数Q*(s, a)。其中Q*(s, a) 具有特别重要的意义它直接给出了在状态s下采取动作a并且后续一直采取最优动作所能获得的最佳可能回报。如果我们能算出Q*(s, a)那么最优策略就唾手可得在每个状态s选择那个使得Q*(s, a)最大的动作a即可。即π*(s) argmax_a Q*(s, a)。4.3 贝尔曼方程价值的“递归拆解”那么这些价值函数怎么计算呢它们并不是孤立的。贝尔曼发现了它们之间美妙的递归关系这就是贝尔曼方程。以最优动作价值函数Q*为例其贝尔曼方程如下Q*(s, a) Σ_{s} P(s|s, a) * [ R(s, a, s) γ * max_{a} Q*(s, a) ]这个方程是理解所有MDP求解算法的钥匙。它表达了一个深刻的洞见在(s, a)下的最优价值等于“立即奖励”的期望加上“折扣后下一个状态的最优价值”的期望。我们来拆解一下Σ_{s} P(s|s, a) * R(s, a, s)这部分是执行动作a后获得的即时奖励的期望值。Σ_{s} P(s|s, a) * γ * max_{a} Q*(s, a)这部分是未来奖励的期望现值。它计算了转移到每个可能的下一个状态s‘的概率然后乘以折扣因子γ再乘以在s’状态下能获得的最优价值即max_{a} Q*(s, a)。这个方程是递归的它用Q*(s, a)来定义Q*(s, a)。这为我们提供了两种求解思路动态规划如果我们知道模型的所有参数P和R我们可以通过反复迭代这个方程来求解Q*。采样与学习如果我们不知道模型大多数现实情况我们可以通过让智能体与环境交互采样得到(s, a, r, s)这样的序列然后用采样结果来近似更新Q值这就是Q-learning等强化学习算法的核心思想。贝尔曼方程将一个复杂的长期规划问题分解成了可一步接一步计算的递归问题是连接MDP理论与算法的桥梁。5. 三大经典求解算法从“全知全能”到“摸着石头过河”知道了贝尔曼方程我们就可以动手求解MDP了。根据我们对环境认知的程度主要有三类算法。5.1 动态规划已知世界的“精确计算”当环境的模型状态转移概率P和奖励函数R完全已知时我们处于一个“全知全能”的规划情境。这时我们可以使用动态规划方法进行精确计算。两个最经典的DP算法是策略迭代和值迭代。策略迭代是一个两步交替的过程策略评估给定一个策略π计算它的状态价值函数Vπ。这可以通过解一个线性方程组贝尔曼期望方程来实现更常用的是迭代法反复用V_{k1}(s) Σ_a π(a|s) Σ_{s} P(s|s,a)[R(s,a,s)γV_k(s)]来更新直到V值收敛。策略改进根据计算出的Vπ在每个状态s看看有没有哪个动作a能带来比当前策略π(s)更好的预期回报。即如果存在某个a使得Qπ(s, a) Vπ(s)那么就把策略在该状态下的动作改为这个更好的a。这步操作保证新策略π‘一定不比旧策略π差。策略迭代反复执行“评估-改进”直到策略不再变化此时就找到了最优策略。它就像是一个不断自我完善的计划先评估当前计划的价值然后找出改进点更新计划再评估……直到完美。值迭代则更加直接粗暴。它不显式地维护策略而是直接迭代最优价值函数V*。其核心更新公式就是贝尔曼最优方程的迭代形式V_{k1}(s) max_a Σ_{s} P(s|s,a) [R(s,a,s) γV_k(s)]对于每个状态s值迭代都考虑所有可能的动作a计算采取该动作后的期望回报即时奖励折扣后的未来最优价值然后取最大值作为该状态新的价值估计。不断迭代V值会收敛到最优V*。一旦V*收敛最优策略可以通过“一步前瞻”得到π*(s) argmax_a Σ_{s} P(s|s,a)[R(s,a,s)γV*(s)]。值迭代可以看作是策略迭代中“策略改进”步的极限情况只改进一次就重新评估。在实际中值迭代通常更容易实现。实操心得DP的局限与技巧动态规划虽然精确但它的计算复杂度与状态和动作数量的乘积成正比。对于状态空间稍大的问题比如10¹⁰个状态DP就完全不可行了这就是所谓的“维数灾难”。因此DP主要用于教学和小规模验证性问题。在实现时迭代的终止条件通常设置为价值函数更新的最大差值小于某个极小阈值如1e-6。另外初始化V值也有技巧乐观初始化初始值设得较高有时能加快收敛。5.2 蒙特卡洛方法从“完整经历”中学习在绝大多数现实问题中我们无法获得完整的环境模型P和R。比如你无法知道在某个棋局下走某一步对手所有应招的概率分布。这时我们就需要让智能体通过与环境实际交互来学习。蒙特卡洛方法是其中一类“无模型”方法。MC方法的核心思想非常直观要评估一个策略π的好坏那就用它多玩几局游戏把每局游戏得到的实际总回报Return记录下来然后对这些回报取平均作为状态价值或动作价值的估计。具体来说要评估Vπ(s)用策略π生成很多条从状态s或从任意状态开始首次访问到s开始的完整轨迹直到游戏结束。对每条轨迹计算从状态s开始往后获得的折扣累积奖励G_t。Vπ(s) 就近似等于所有这些G_t的平均值。MC方法有几个关键特点必须从完整的经验片段中学习它需要等到一局游戏结束知道了最终回报之后才能回头更新这条轨迹中每个状态的价值。这被称为“离线”学习。方差可能很大因为依赖于采样如果游戏本身随机性很强不同局得到的回报G_t可能差异巨大导致价值估计波动大、收敛慢。直观无需模型这是它最大的优势。MC方法也可以通过“探索开端”或ε-贪婪策略来优化策略实现蒙特卡洛控制从而找到近似最优策略。5.3 时序差分学习融合DP与MC的“中庸之道”时序差分学习是强化学习真正的核心。它巧妙地结合了动态规划的“自举”思想和蒙特卡洛的“采样”思想。“自举”是指用当前的估计值来更新估计值本身就像拽着自己的鞋带把自己提起来。DP是这么做的。“采样”是指通过实际交互的经验来更新。MC是这么做的。TD学习的核心公式以TD(0)为例用于估计Vπ是V(s_t) ← V(s_t) α [ r_{t1} γV(s_{t1}) - V(s_t) ]这个更新发生在从状态s_t转移到s_{t1}并获得奖励r_{t1}之后。我们来解读这个公式r_{t1} γV(s_{t1})被称为TD目标。它是对真实回报G_t的一个估计其中r_{t1}是实际得到的即时奖励γV(s_{t1})是利用当前价值函数对未来回报的估计自举。r_{t1} γV(s_{t1}) - V(s_t)被称为TD误差。它衡量了TD目标与当前估计V(s_t)之间的差异。α是学习率控制更新的步长。这个更新的含义是将当前价值估计V(s_t)朝着TD目标的方向调整一小步由α控制。如果TD误差为正说明实际经历比我们之前估计的要好就调高V(s_t)反之则调低。与MC和DP的对比相比MCTD不需要等到整局结束每一步都可以在线更新更高效也适用于没有明确终止状态的任务。相比DPTD不需要环境模型通过采样来估计期望值。最著名的TD算法是Q-learning它是一种离策略的TD控制算法用于直接学习最优动作价值函数Q*。其更新公式为Q(s_t, a_t) ← Q(s_t, a_t) α [ r_{t1} γ * max_{a} Q(s_{t1}, a) - Q(s_t, a_t) ]注意TD目标中使用了max_{a} Q(s_{t1}, a)这直接体现了贝尔曼最优方程的思想。智能体在实际交互中可能遵循一个探索性的策略如ε-贪婪但更新时却用到了最优动作的价值这使得Q-learning能够直接学习最优策略非常强大。实操心得TD学习中的超参数调优TD算法尤其是Q-learning的性能严重依赖于超参数学习率α和折扣因子γ以及探索策略中的ε。学习率α通常需要随着学习进程逐渐减小例如从0.1开始线性衰减到0.01。初期需要大步探索后期需要小步微调以保证收敛。折扣因子γ决定了智能体的远见程度。对于有明确终止状态的任务如游戏γ可以设为0.99或0.999对于持续任务需要仔细权衡。探索率ε在ε-贪婪策略中ε也需要衰减。初期需要高探索率如1.0去广泛尝试后期需要降低如0.01以利用学到的知识。一个常见的策略是ε线性衰减。 没有一套放之四海而皆准的参数需要在具体环境中通过实验来调整。记录下不同参数下的学习曲线累积奖励随时间的变化是必不可少的调试步骤。6. 从理论到实战一个网格世界寻宝的完整案例为了把上述所有概念串起来我们设计一个经典的“网格世界”问题并用手动计算和简单编程两种方式走一遍。6.1 问题定义风中的寻宝机器人假设一个4x4的网格世界坐标从(1,1)到(4,4)。智能体机器人从起点(1,1)出发目标是到达宝藏点(4,4)到达则获得奖励10并结束。网格中有一个陷阱(2,2)掉入获得奖励-10并结束。其他格子每走一步获得奖励-0.1鼓励尽快找到宝藏。世界有风当机器人试图向某个方向移动时有80%的概率成功有10%的概率被风吹向目标方向的左侧10%的概率吹向右侧如果偏移方向是墙则停在原地。到达边界撞墙则停在原地并得到-0.1的步数惩罚。现在我们将其建模为MDP状态S16个网格位置加上两个终止状态宝藏、陷阱。共18个状态。动作A{上下左右}。状态转移概率P(s|s,a)由上述风向规则定义。例如在(2,2)执行“上”有0.8概率到(1,2)0.1概率到(2,1)左0.1概率到(2,3)右。如果(2,1)是墙则那0.1的概率变为停在(2,2)。奖励函数R(s,a,s)到达(4,4)给10到达(2,2)给-10其他转移给-0.1。折扣因子γ设为0.9。6.2 手动演算值迭代的前三步我们手动演示值迭代的前几步感受一下价值是如何传播的。初始化所有非终止状态的价值V(s)0。终止状态V(宝藏)0 V(陷阱)0因为到达后游戏结束无未来回报。第一轮迭代 (k0 - k1)我们计算状态(3,4)宝藏左边一格的新价值V1(3,4)。可能动作右进宝藏、左、上、下。计算动作“右”的期望价值80%概率成功进入宝藏获得奖励10并进入终止状态未来价值为0。所以贡献为0.8 * [10 0.90] 8。其他动作左、上、下都会移动到非宝藏格奖励为-0.1下一状态价值为0初始值。以动作为“下”去(4,4)是墙假设停在原地为例100%概率停在(3,4)奖励-0.1贡献为1.0 * [-0.1 0.90] -0.1。对所有动作计算后取最大值。显然“右”动作的期望价值8远大于其他动作约-0.1。所以V1(3,4) max(8, -0.1, -0.1, -0.1) 8。类似地状态(4,3)宝藏上方一格的“下”动作价值也为8。而离宝藏较远的状态例如(1,1)所有动作的期望价值都大约是 -0.1因为下一步状态价值都是0所以V1(1,1) -0.1。第二轮迭代 (k1 - k2)现在V1(3,4)8, V1(4,3)8其他非终止状态V1≈-0.1。 计算状态(3,3)宝藏的左上方的新价值V2(3,3)。动作“右”80%概率到(3,4)[V18]奖励-0.110%概率到(2,3)[V1≈-0.1]10%概率到(4,3)[V18]。期望价值 0.8*(-0.10.98) 0.1(-0.10.9*(-0.1)) 0.1*(-0.10.98) ≈ 0.87.19 0.1*(-0.19) 0.1*7.19 ≈ 5.752 (-0.019) 0.719 ≈ 6.45。动作“下”类似计算主要可能去(4,3)和(3,4)结果也会是一个较大的正数。取最大值假设为6.45。所以V2(3,3) ≈ 6.45。可以看到宝藏的高价值通过奖励10体现正在像涟漪一样扩散开来。同时陷阱的负价值也在扩散。经过多轮迭代每个状态的价值会逐渐收敛形成一个“价值地形图”高处指向宝藏低处指向陷阱。6.3 代码实现PythonNumPy模拟值迭代下面我们用一小段Python代码来实现这个网格世界的值迭代。为了简化我们忽略风向假设动作确定执行80%成功10%左偏10%右偏的实现逻辑稍复杂但原理相同。这里我们用确定性移动来演示核心流程。import numpy as np # 定义网格大小 GRID_SIZE 4 # 定义状态0-15代表网格位置 (row-major)16代表宝藏终止17代表陷阱终止 STATES range(18) # 定义动作0上1下2左3右 ACTIONS [0, 1, 2, 3] # 动作对应的行列变化 ACTION_DELTA {0: (-1, 0), 1: (1, 0), 2: (0, -1), 3: (0, 1)} # 初始化价值函数 V(s) V np.zeros(18) # 设置终止状态价值可选因为终止后无未来回报通常为0 # V[16] 0 # 宝藏 # V[17] 0 # 陷阱 # 折扣因子 GAMMA 0.9 # 收敛阈值 THETA 1e-6 def is_terminal(state): 检查是否为终止状态宝藏或陷阱 return state 16 or state 17 def get_next_state(state, action): 在确定性环境下根据状态和动作计算下一状态 if is_terminal(state): return state # 终止状态保持不变 row, col divmod(state, GRID_SIZE) d_row, d_col ACTION_DELTA[action] new_row, new_col row d_row, col d_col # 检查边界 if 0 new_row GRID_SIZE and 0 new_col GRID_SIZE: new_state new_row * GRID_SIZE new_col else: new_state state # 撞墙留在原地 # 检查是否到达特殊格子 if new_state 15: # (4,4) 是索引15 return 16 # 进入宝藏终止状态 elif new_state 5: # (2,2) 是索引5 (0-based: row1, col1) return 17 # 进入陷阱终止状态 return new_state def get_reward(state, action, next_state): 计算奖励 if next_state 16: # 到达宝藏 return 10.0 elif next_state 17: # 到达陷阱 return -10.0 else: return -0.1 # 每步惩罚 # 值迭代主循环 iteration 0 while True: delta 0 new_V V.copy() for s in STATES: if is_terminal(s): continue # 终止状态价值保持为0 # 对每个状态计算所有可能动作的Q值并取最大作为新V值 q_values [] for a in ACTIONS: s_next get_next_state(s, a) r get_reward(s, a, s_next) q r GAMMA * V[s_next] q_values.append(q) new_V[s] max(q_values) delta max(delta, abs(new_V[s] - V[s])) V new_V iteration 1 print(fIteration {iteration}, delta: {delta}) if delta THETA: break print(\n收敛后的状态价值网格形式:) for i in range(GRID_SIZE): for j in range(GRID_SIZE): state_id i * GRID_SIZE j print(f{V[state_id]:6.2f}, end ) print() # 根据最优价值函数提取最优策略 print(\n最优策略网格形式U上 D下 L左 R右:) policy np.full((GRID_SIZE, GRID_SIZE), ) action_symbol {0:U, 1:D, 2:L, 3:R} for i in range(GRID_SIZE): for j in range(GRID_SIZE): state_id i * GRID_SIZE j if is_terminal(state_id): policy[i][j] T continue q_best -np.inf a_best None for a in ACTIONS: s_next get_next_state(state_id, a) r get_reward(state_id, a, s_next) q r GAMMA * V[s_next] if q q_best: q_best q a_best a policy[i][j] action_symbol[a_best] for row in policy: print( .join(row))运行这段代码你会看到价值函数经过若干轮迭代后收敛并输出每个格子应该采取的最优动作。在(4,4)宝藏和(2,2)陷阱附近策略会非常明确地指向宝藏或避开陷阱。在远离两者的区域由于每步有-0.1的惩罚策略会倾向于尽快向宝藏移动。避坑指南值迭代中的收敛性与初始化收敛性保证在折扣因子γ1且奖励有界的有限MDP中值迭代保证收敛到唯一最优解。我们的代码中delta THETA就是判断收敛的条件。初始化影响价值函数的初始化会影响迭代次数但不影响最终结果只要γ1。将所有状态价值初始化为0是常见做法。有时采用“乐观初始化”如设一个较高的正值可以鼓励早期探索但在简单的值迭代中影响不大。陷阱状态的处理在本例中陷阱(2,2)被建模为终止状态。这意味着一旦进入游戏结束智能体不再有机会离开。这在代码中通过is_terminal函数和get_next_state函数中直接返回终止状态ID来实现。确保你的终止状态逻辑正确否则智能体可能会错误地认为可以从陷阱中“走”出来。7. 超越表格当状态空间爆炸时我们何去何从我们上面的例子只有16个状态可以用一个表格数组来存储每个状态的价值V(s)或动作价值Q(s,a)。这种方法称为表格型方法。然而现实问题中的状态空间往往是天文数字。比如围棋约有10¹⁷⁰个状态。自动驾驶车辆位置、速度、周围车辆行人状态、路况……状态空间连续且维度极高。游戏画面每个像素点的RGB值状态空间是像素点数量的指数级。当状态空间巨大或连续时我们不可能为每个状态存储一个值。这就是表格型方法的死穴。解决方案是使用函数近似。7.1 价值函数近似从查表到“猜”表函数近似的核心思想是不再存储巨大的Q表或V表而是用一个参数化的函数来近似表示价值函数。即Q(s, a; w) ≈ Q*(s, a)或V(s; w) ≈ V*(s)其中w是函数的参数向量。这个函数可以是线性函数V(s; w) w^T * φ(s)其中φ(s)是状态s的特征向量。简单可解释性强但表达能力有限。神经网络深度神经网络尤其是深度学习。这就是深度Q网络的核心。输入是状态s如图像输出是每个动作a对应的Q值。DQN通过训练网络参数w使得网络预测的Q值尽可能接近TD目标。使用函数近似后我们的学习目标从更新表格中的某个条目变成了调整函数参数w以最小化预测值如Q(s,a;w)与目标值如rγ max Q(s,a;w)之间的误差。这本质上是一个监督学习中的回归问题可以用梯度下降来求解。例如对于Q-learning with function approximation参数更新规则变为w ← w α * [ (r γ * max_{a} Q(s, a; w)) - Q(s, a; w) ] * ∇_w Q(s, a; w)其中∇_w Q(s, a; w)是Q值对参数w的梯度。7.2 策略梯度方法另辟蹊径的直接优化价值函数近似是间接的先学好价值函数再导出策略。但还有另一条更直接的路直接参数化策略本身然后优化策略参数使得长期回报的期望最大。这就是策略梯度方法。我们用一个带参数θ的函数来表示策略π(a|s; θ)它输出在状态s下选择动作a的概率。我们的目标就是找到θ最大化目标函数J(θ)——长期折扣回报的期望。策略梯度定理给出了J(θ)关于θ的梯度公式。一个经典的算法是REINFORCE蒙特卡洛策略梯度用当前策略π_θ生成一条完整轨迹。计算这条轨迹的回报G。对轨迹中的每一步(s_t, a_t)用梯度上升更新参数θ ← θ α * γ^t * G * ∇_θ log π(a_t|s_t; θ)。这个更新的直观解释是如果某条轨迹获得了高回报G那么就加大这条轨迹上每一步所采取动作的概率通过调整θ。∇_θ log π是指示了如何调整参数才能增加选择动作a_t的概率。策略梯度方法的优势在于天然适用于连续动作空间输出一个概率分布如高斯分布。可以学习随机策略这在某些需要探索或博弈的环境中很有用。策略可能比价值函数更简单更容易近似。其缺点是采样效率可能较低方差大。后来发展的Actor-Critic方法结合了价值函数Critic和策略函数Actor用Critic来估计状态价值以降低方差成为了当前主流。7.3 深度强化学习当MDP遇见神经网络将深度神经网络作为函数近似器用于强化学习就产生了深度强化学习。2013年DeepMind的DQN在Atari游戏上的突破性表现展示了其强大能力。DQN解决了几个关键挑战经验回放将智能体的经历(s, a, r, s)存储在一个缓冲池中训练时从中随机采样。这打破了数据间的相关性使训练更稳定。目标网络使用一个独立的、更新较慢的目标网络来计算TD目标缓解了因目标值随学习网络快速变化而带来的不稳定性。此后深度强化学习领域百花齐放出现了处理连续控制的DDPG、TD3更高效的策略梯度方法PPO、SAC等。这些算法无一不是建立在MDP、贝尔曼方程、价值函数/策略梯度这些基础概念之上。实战经验深度RL调试的“血泪史”不收敛是常态深度RL算法非常不稳定对超参数学习率、网络结构、回放缓冲区大小、探索参数极其敏感。不要指望第一次运行就能成功。看到训练曲线像心电图一样波动甚至崩溃是家常便饭。复现是关键一定要使用别人论文或成熟代码库中报告的超参数作为起点。自己从头调参如同大海捞针。监控一切不仅要看最终得分或累积奖励还要监控TD误差、价值函数范围、策略熵、探索率等内部指标。它们能提供算法为何失效的线索。从小环境开始不要一上来就挑战复杂环境。先在CartPole、MountainCar这类简单标准测试环境上验证你的代码实现是正确的然后再迁移到更复杂的问题。计算成本高昂深度RL训练可能需要数百万甚至数千万步的环境交互在CPU上跑几天几夜是常事。准备好云计算资源或强大的GPU。马尔可夫决策过程为我们提供了一套描述和解决序列决策问题的强大数学语言。从精确的动态规划到无需模型的蒙特卡洛和时序差分学习再到应对高维状态的函数近似和深度强化学习这条脉络清晰地展示了智能决策系统从理论到实践、从简单到复杂的发展路径。理解MDP不仅是理解一个算法更是理解一种将目标、不确定性、长期规划统一起来的思维方式。当你下次再面临一个复杂的决策问题时不妨先问自己状态是什么动作是什么奖励是什么也许一个清晰的MDP模型就在你脑中浮现了。