☰
马尔可夫决策过程:强化学习元素周期表与五元组详解
2026/10/26 4:21:02 网站建设 项目流程

读这篇文章之前,请你先回答一个小问题:如果给你一套积木,你觉得最难的是“按图纸搭出房子”,还是“理解每块积木能承重多少、能和什么咬合”?我自己的答案是后者。搭房子只需要模仿,理解积木之间的关系才决定了你能不能搭出没见过的新结构。

强化学习也是这样。Q-learning、策略梯度、Actor-Critic这些算法看起来五花八门,但它们本质上都是在同一个框架里做文章。这个框架就是马尔可夫决策过程(Markov Decision Process,MDP)。如果给强化学习找一张元素周期表,那MDP就是那张表——有限个基本元素,却能排列组合出我们见过的几乎所有算法。

这是“强化学习简史”系列的第二篇。上一篇我们聊过试错学习从哪里来,这一篇我们把地基夯实:MDP到底是什么、五个基本元素分别管什么、为什么所有强化学习问题都能被它装进去,以及最重要的——你拿到一个真实问题时,怎么把它翻译成MDP。这篇文章适合刚接触强化学习的读者,也适合那些已经把DQN、PPO代码跑起来但总觉得“差点意思”的人。看完之后你再看任何一篇算法论文,都会有一种“原来它是在改MDP的这一个环节”的豁然开朗。

1. 为什么MDP能成为强化学习的“元素周期表”

1.1 MDP是在解决什么问题

先把时间拨回强化学习还不是一门独立学科的年代。那时候做最优控制的人已经在研究“怎么让一个系统沿着最优轨迹运行”,做动态规划的人则在琢磨“怎么把多阶段决策问题分解成一层层子问题”。这两条线碰到一起,碰出的火花就是一个朴素但极其锋利的抽象:你在每个时刻观察系统状态、做出一个动作、系统发生变化、你拿到奖励,然后重复这个过程。

这个抽象犀利在哪里?它把所有复杂问题都压缩成了一句话——“状态到动作到新状态到奖励”的循环。机器人走路是这一套,股票交易是这一套,游戏通关是这一套,连对话系统说下一句话也是这一套。现实世界千奇百怪的干扰因素,在这个循环里被强行归约成了四个东西:状态、动作、转移、奖励。这就是MDP能成为“元素周期表”的第一个原因——它足够通用。

但也有人会说,你这不是把问题简单化了吗?现实哪里有那么多理想化的状态和奖励?确实,MDP做了很多理想化假设,比如我们待会要讲的马尔可夫性质,现实中几乎不严格成立。可是你别忘了化学元素周期表也做了理想化假设——没有哪种现实里的纯元素是绝对纯的,但科学家照样用它来预测和设计新材料。MDP的价值不在于“真实”,而在于“可计算”。它把一团乱麻的现实问题,变成了一个数学上可定义、可求解的决策问题。

1.2 为什么偏偏是“马尔可夫”

这里有个关键词必须拆开说。“马尔可夫”来自随机过程里的马尔可夫性质:未来的状态只取决于当前状态,与更早的历史无关。你可以把它理解成一种“极简主义记忆”——我只记当前这一步管用的信息,之前走过多少弯路、踩过多少坑,统统不重要。

为什么要做这么强的假设?想象一下没有这个假设的世界。智能体在t时刻看到的不是一个状态,而是从第1步到第t步的整段历史轨迹。随着时间推移,这段历史呈指数级膨胀,到了第100步,你要处理的数据量比整个宇宙的原子数还多,任何算法都跑不动。马尔可夫性质等于告诉你:别慌,你只需要记住“目前我在哪”就够了,历史信息已经被压缩进当前状态里。

放到强化学习里,这个假设的真正含义是:状态设计好不好,直接决定了问题容不容易学。你玩迷宫游戏,当前房间编号就是全部信息,天然满足马尔可夫性质。但自动驾驶就不行了——单看当前一帧图像,你根本判断不出车速,必须把连续几帧叠在一起,或者直接把速度、加速度加进状态,才能让“当前状态”真正包含决策所需的全部信息。所以工程上常说一句话:马尔可夫性质不是环境的恩赐,而是状态设计的产物。后面我会专门讲这一块。

1.3 MDP如何一统强化学习江湖

你肯定听过一句话:“所有强化学习问题都可以形式化为MDP。”这句话不是修辞,而是事实。因为强化学习的目标定义——最大化累积奖励期望——本身就是建立在MDP的回报公式上的。无论你用的是查表法、神经网络、还是演化算法,只要你承认“环境给出奖励”这个设定,你就已经在MDP的框架里了。

经典教材《强化学习:导论》整本书的目录就是按MDP展开的:先讲策略、价值函数、贝尔曼方程这些MDP的推论,再讲怎么用动态规划、蒙特卡洛、时序差分去解MDP,最后讲怎么用函数逼近去解大规模MDP。可以说,这本教材不是在讲“强化学习算法”,而是在讲“解MDP的十八般武艺”。理解了MDP,你就拿到了进入整个学科的钥匙。

2. 决策过程原子:MDP五元组速查

MDP用一个五元组就能写完全部家当:(S, A, P, R, γ)。这五个符号就是强化学习世界的五种基本元素,所有算法都是围绕它们做文章。我先给一张速查表,再逐一细说。

元素符号含义现实类比常见类型
状态集合S智能体观察到的环境情况棋局上的落子分布离散/连续
动作集合A智能体可以做出的选择你手里能走的棋步离散/连续
状态转移概率P环境在你动作之后的反应规律对手怎么回应你的棋步已知/未知
奖励函数R你每走一步得到的即时反馈赢了给1分,输了给0分稠密/稀疏
折扣因子γ你对未来收益的重视程度眼前的一块和一年后的一块0到1之间

2.1 状态S:智能体的“眼前所见”

状态就是智能体在每个时刻用来做决策的全部信息。它是S,意味着存在一个集合,所有可能的状态都在里面,不管是十个还是十亿个。离散状态比如象棋的局面,连续状态比如机器人的关节角度和角速度。

这里有个初学者最容易混淆的点:状态和观测不是一回事。观测是智能体真正拿到的数据,状态是理论上足以描述环境情况的最小充分统计。你打游戏时看到的原始像素是观测,把连续几帧像素叠起来才能构成包含速度信息的状态。MDP假设智能体能看到完满的状态,但现实往往是部分可观测的。这个差异是很多训练失败的根源,我在第六节会专门展开。

2.2 动作A:你对环境的“干预旋钮”

动作集合定义了智能体的“能动空间”。有些问题动作是离散的,比如上下左右、出石头剪刀布;有些问题是连续的,比如机器人关节力矩、方向盘转角。

动作空间大小直接影响算法选择。动作维度低、离散个数少,你可以用基于价值的算法,把每个动作的价值估计得明明白白;动作空间连续且维度高,策略梯度类算法通常更顺手,因为它在动作分布上直接优化策略,不需要对每个动作逐一计算价值。所以拿到一个问题的第一步就是问自己:这个动作空间是离散还是连续?这是决定算法家族的指针。

2.3 状态转移概率P:环境的“物理规律”

P(s'|s,a) 表示在当前状态s下执行动作a后,转移到新状态s'的概率。这个条件概率描述的是环境对动作的响应规律。打个比方,你在马路上开车,踩油门是动作,车往前蹿多少、会不会打滑,都由环境的“物理规律”决定,你算不准但可以学习。

这里有一个很重要的分野。如果P是已知的,比如规则完全清楚的下棋游戏,你完全可以做一个“基于模型”的智能体,直接用动态规划或者搜索树去规划,不需要靠试错。如果P是未知的,比如真实世界,你就得靠“免模型”算法,让智能体不断与环境互动、用采样的数据去估计价值,绕开对转移概率的直接建模。市面上大红大紫的Q-learning、策略梯度都属于免模型派。你只需要记住:P的已知与否,决定了你的解题路线是“精准计算”还是“统计推断”。

2.4 奖励函数R:唯一来自环境的“老师信号”

R(s,a)(或者R(s,a,s'))是环境给出的标量反馈,告诉智能体这一个动作走得好不好。说它是“老师信号”一点也不夸张,因为在强化学习里,没有监督学习的标注、没有专家示例,智能体唯一的改进方向就来自这个数字。

奖励函数设计是一门手艺活。给稀疏了,比如只有通关才给1分,智能体在漫漫长路上连个方向感都没有,学习会极其艰难;给稠密了,每走一步都给小分数,学得快,但又容易诱导智能体“刷分”——明明目标是把东西推倒,它学会了转圈不停拿每步奖励也不去推。这就是著名的奖励黑客问题。奖励函数不是越精细越好,而是越能精确表达“你真正希望它完成的目标”越好。

2.5 折扣因子γ:时间维度的“价值观”

γ 是五元组里最容易被忽略但其实极其重要的一个参数。它的取值范围是[0,1),决定了智能体有多看重未来的收益。γ=0意味着智能体只管眼前这一下,γ越接近1,越愿意为远期的大收益牺牲眼前的即得利益。

为什么不把γ直接取1呢?因为在无限步的任务里,如果每步奖励都原样累加,回报很可能趋向无穷大,没法比较优劣。γ小于1等于给未来的奖励打了折,让几何级数能收敛。举个例子,γ=0.9时,第20步的奖励折算到现在只值 0.9^20 ≈ 0.12,基本可以忽略;而γ=0.99时,第200步的奖励还值 0.99^200 ≈ 0.13。这个差异直接决定了智能体的“眼光”有多远。我在库存管理的例子里还会再算一笔账,你就能直观感受到它的作用。

3. 马尔可夫性质:MDP的“无记忆性”不是缺陷,而是礼物

3.1 一个性质,两种理解

马尔可夫性质教科书写法是“给定当前状态,未来与过去条件独立”。听起来绕,我用一句大白话:只要知道我现在在哪,过去我走过的路对将来怎么走没有任何额外的帮助。

这个性质猛一看是个很强的限制,好像现实里哪有那么听话的系统?但你换个角度想:这个限制恰恰是把问题从“不可能”变成“可能”的礼物。正是因为智能体只需要维护一个“当前状态”,而不是整段历史,强化学习算法才有办法用反复迭代的方式逼近最优解。否则维数灾难会直接掐死所有方法。

判断一个任务满不满足马尔可夫性质有个很实用的测试法:你把自己放到智能体的位置上,只看当前状态、不看历史,能不能做出合理决策?如果能,问题就是马尔可夫的;如果不能,说明当前状态信息不足,必须重新设计状态表示。

3.2 用状态设计“制造”马尔可夫性质

我做过的第一个强化学习项目就栽在这里。当时想让一个智能体玩接球游戏,输入只用当前一帧画面,结果不管怎么调超参数,训练曲线从头到尾趴在地上。后来我把最近四帧画面叠在一起作为状态输入,神奇的事情发生了:曲线开始稳步上升。原因很简单,单帧画面里看不出球的速度和方向,只有连续几帧才能推算出运动趋势。换句话说,单帧观测不满足马尔可夫性质,但四帧堆叠后的状态就基本满足了。

类似的手段还有把速度、位置、剩余时间直接拼进状态向量;处理对话任务时把最近几轮对话内容拼接起来;处理需要长时记忆的任务时用循环神经网络的隐藏状态当作近似的“状态”来用。你可以把这套操作理解为给原始观测“加内存”,目标是让当前状态尽可能携带决策所需的全部信息。

但这里有个现实的trade-off:状态信息加得越全,马尔可夫性质满足得越好,可状态维度也越高,训练要的数据量和算力随之上涨。所以你不需要追求100%的马尔可夫,只需要做到“够用就行”。这个“够用”的度怎么把握?我的经验是先从直觉出发设计状态,跑一轮小规模训练看看会不会收敛;不收敛再逐步加信息,而不是一上来就把所有传感器数据都塞进去。

4. 从五元素到算法家族:MDP如何“生成”强化学习

4.1 MDP引出的三个核心问题

有了五元组,强化学习的任务就被刻画成一件事:找一个策略π(a|s),告诉智能体在每个状态该采用什么动作,使得从任意初始状态出发的累积折扣回报期望最大。围绕这个目标,MDP自然派生出三个核心量。

第一个是状态价值函数V(s),意思是“从状态s出发,按策略π走,平均能拿多少累积回报”。第二个是动作价值函数Q(s,a),意思是“在状态s先执行动作a,之后按策略π走,平均能拿多少累积回报”。第三个就是最优策略π*,也就是那个能让V或Q达到最大值的策略。你去看任何一个强化学习算法,它想尽一切办法都在逼近这三样东西中的至少一样。

4.2 贝尔曼方程:递归思想改变一切

价值函数怎么算?直接按定义从当前状态往后推所有可能的轨迹再求期望,在连续状态空间下根本做不到。贝尔曼方程给了一个精妙的递归拆解:当前状态的价值等于即时奖励加上下一个状态价值的折扣期望。用数学写就是:

V(s) = E[ r + γ V(s') | s, a ~ π ]

这个公式看起来简单,却是整个强化学习的引擎。它把“对未来无穷步求和”变成了“当前一步的奖励加上对未来一步的递归调动”,把一个全局问题变成了一个局部方程。动态规划里著名的策略迭代和价值迭代,本质上就是在反复利用这个递归关系:先估价值,再根据价值改进策略,循环往复直到收敛。

这个思想对后世的强化学习算法影响深远,你可以在一众免模型算法里看到同样的影子:Q-learning的更新式、策略梯度算法里对优势函数的估计,全都建立在“当前值等于即时奖励加未来折扣值”这个递归关系上。

4.3 算法家族在MDP框架上的坐标

现在我们可以画一张“周期表到化合物”的映射表了。同一张MDP,不同的算法选择作用于不同的元素:

算法家族它重点管什么是否需要已知P直观类比
动态规划/策略迭代求V和π需要拿着完整地图做全局规划
蒙特卡洛方法用整段回报估计V不需要考完试才看分数,自我复盘
时序差分/Q-learning用单步差异估计V和Q不需要每走一步都立刻自我修正
策略梯度直接优化π的参数不需要用“多试好动作、少试坏动作”的频率说话
基于模型的搜索规划学习/利用P做前瞻需要学出来的P学完地图规律再连续推演几步

为什么围棋AI这类项目能碾压人类?因为它站在了MDP的“上帝视角”上:规则已知、转移概率完全清楚,它用强大的网络学一个评估函数,再用搜索算法向前推演很多步,整个决策过程既用上了免模型的价值网络,又用上了基于模型的规划机制。这正是MDP框架精妙的地方:五种元素就像五块积木,不同算法就是不同的搭法。

4.4 无模型与有模型的根本不是对立的

现在很多初学者把“免模型”和“基于模型”当成了水火不容的两个流派,其实在MDP框架里,它们只是对P这个元素处理方式不同。免模型算法在面对未知P时干脆绕开它,直接用数据估计价值;基于模型算法则多了一个环节,先拿数据学一个P的近似,再在这个近似世界里做规划。

这个差别我用一个生活场景解释。你要从五道口去首都机场(此地名仅作指代示例)——实际说“从城市去机场”就好——免模型算法是你反复打车试路,每次记录时间和路线,慢慢形成对不同路线的价值判断;基于模型算法是你先坐几次车,脑子里建了一张道路地图和拥堵规律,之后每次都先在地图上模拟几条路线再出行。现实中,如果能学出靠谱的模型,基于模型通常样本效率更高;但如果模型学偏了,误差会在规划中放大。理解了这个坐标,你以后看算法论文就能一眼看出对方在“改哪个积木”。

5. 手把手建模:一个库存管理问题的MDP改造

空讲无数道理,不如实打实把一个真实问题装进MDP。我选库存管理,因为它足够简单又不失典型性,而且你在很多工业场景中都能套用同样思路。

5.1 问题设定

假设你管理一家小店的某种日用品库存。每天开始营业前,你可以决定向供应商订购多少件货;白天会有顾客来买,需求量服从某个随机分布;晚上打烊时如果货不够卖,流失的顾客就变成了缺货损失;剩余的货还要付仓储成本。你的目标是在一整段经营周期里让总利润最大化。

这个任务怎么翻译成MDP?项目标题里说的“元素周期表”就在这里发挥作用了。

5.2 逐个元素落位

状态S:我选择用一个数字表示——当天晚上盘点时的库存量。为什么不加在途订单量?如果补货不是当天到货,就要把“已经下单但还没到的数量”也加进状态,不然第二天决策时你根本不知道几天后会有多少货到,状态就不满足马尔可夫性质。这一步就是前面讲的“用状态设计制造马尔可夫性”。

动作A:每天补货数量。为了演示方便,我假设每次最多补10件,动作空间就是0到10的整数。

状态转移概率P:由需求量的随机分布隐式决定。比如我假设每日需求服从均值为5、标准差为2的截断正态分布,那么给定当前库存和补货量,明天的期初库存 = 当前库存 + 补货量,当天期末库存 = 最大值(期初库存 - 当日需求, 0)。这里期末库存比它是否命中顾客需求更重要。

奖励函数R:设计成 每卖出一件赚6元(但需求量超过库存的部分卖不掉),每补一件货要付2元,仓库里每剩一件货要付1元持有成本,缺货一件(需求超过库存的部分)罚2元。于是单日奖励可以写成:销售件数 × 6 - 补货数 × 2 - 期末库存 × 1 - 缺货件数 × 2。

折扣因子γ:由于这是一个持续经营、没有明确终点的问题,我取γ=0.99。这意味着智能体大约会考虑未来几十天的收益,既能避免回报发散,又不会短视到只盯明天。

5.3 代码:环境怎么写

我习惯把环境写成一个独立的类,这样后面接动态规划、Q-learning还是策略梯度都方便。下面是我当时实际用过的环境骨架,你几乎可以直接抄走。

import numpy as np class InventoryEnv: def __init__(self, max_inventory=20, max_order=10): self.max_inventory = max_inventory self.max_order = max_order self.state = 5 # 初始库存 self.done = False def step(self, action): action = int(np.clip(action, 0, self.max_order)) # 期初库存 begin_inventory = min(self.state + action, self.max_inventory) # 随机需求,均值5,标准差2,截断到非负 demand = int(np.random.normal(5, 2)) demand = max(demand, 0) # 计算销售、缺货与期末库存 sold = min(begin_inventory, demand) shortage = demand - sold end_inventory = begin_inventory - sold # 奖励分解 reward = sold * 6 - action * 2 - end_inventory * 1 - shortage * 2 # 状态更新 self.state = int(end_inventory) return self.state, reward, False, {} def reset(self): self.state = 5 return self.state

注意到我没有设置终止状态,这是一个continuing任务。如果非要在固定周期(比如30天)后结束,可以把 done 置为 True,并在每轮训练时重置环境。这个细节影响算法实现,后面我还会提。

5.4 用动态规划跑一份“标准答案”

既然P是已知的(我完全清楚需求分布),最合适的解法就是动态规划。我用价值迭代来求最优策略,顺便验证奖励设计是否合理。

# 价值迭代 gamma = 0.99 V = np.zeros(21) theta = 1e-4 policy = np.zeros(21, dtype=int) while True: delta = 0 for s in range(21): v_old = V[s] best_value = -np.inf best_a = 0 for a in range(11): if s + a > 20: continue # 对每个动作,枚举可能的需求,计算期望价值 expected = 0 for d in range(15): demand = d begin_inventory = min(s + a, 20) sold = min(begin_inventory, demand) shortage = demand - sold end_inventory = begin_inventory - sold r = sold * 6 - a * 2 - end_inventory * 1 - shortage * 2 prob = 0 # 用正态近似计算需求d的概率 if d == 0: prob = 0.5 * (1 + erf((0 - 5) / (2 * np.sqrt(2)))) else: prob = 0.5 * (erf((d + 0.5 - 5) / (2 * np.sqrt(2))) - erf((d - 0.5 - 5) / (2 * np.sqrt(2)))) if prob < 0: prob = 0 expected += prob * (r + gamma * V[end_inventory]) if expected > best_value: best_value = expected best_a = a V[s] = best_value policy[s] = best_a delta = max(delta, abs(v_old - V[s])) if delta < theta: break

跑完之后你会发现一个有意思的现象:库存低时策略会大胆补货,库存高时策略会谨慎补货甚至不补,说明智能体学会了在高持有成本和缺货损失之间找平衡。这就是MDP建模成功的一个直观信号。

6. 初学MDP必须避开的四个坑

6.1 坑一:把观测当状态,遇到部分可观测就懵

这是所有RL新手必踩的第一个坑。以为摄像头拍到的就是全部,结果智能体如瞎子摸象。我前文讲的接球游戏就是活生生例子。部分可观测的严格说法叫POMDP,处理方案不外乎两条路:一是设计更丰富的状态表示(帧堆叠、加传感器数据),二是用循环神经网络让智能体自己维护隐藏记忆。绝大多数问题是靠第一条路就够解决的,别急着上复杂模型。

6.2 坑二:奖励函数设计得像“监工”,引发动作变形

我见过一个做机械臂抓取的项目,为了让智能体快点完成任务,设计者给每一步加了一个“离目标越近奖励越大”的项。结果智能体学到的策略是把手伸到目标旁边不断抖动——因为它发现抖动可以获得密集的近距奖励,又不用真正完成抓取,总体期望回报比老老实实抓取更高。这种奖励黑客现象在工业界极其常见。对策是回到MDP的奖励要素去审视:你写的奖励函数,是不是真的和终极目标严格同向?

6.3 坑三:折扣因子随手填,算法训出一堆怪东西

γ取太小,比如0.5,智能体只看未来几步,在一个需要长期规划的任务里会表现得极其短视;γ取太接近1,比如0.9999,在无限步任务里目标的方差会剧增,训练不稳定。我的经验是:episodic任务里常用0.9到0.99;continuing任务里通常要更接近1,比如0.99起;具体场景还要按“有效视野”换算,想看未来多少步就把γ的主体高次项落在那个范围附近。

6.4 坑四:把episodic任务写成continuing任务,价值函数永远发散

有的任务明明有终点——比如一局游戏、一次对话——你却忘了定义终止状态。一旦回合结束后还在继续给奖励累积,价值函数就会变得没有边界,算法也容易出nan。正确做法是在环境里显式设置done标志,并在贝尔曼更新中把终态的未来价值设成0。这也是一个特别隐蔽但一查就能查出来的bug。

下面把这个经验总结成一张速查表,方便你以后干活候参考:

问题现象可能原因排查方向常见对策
训练不收敛,loss乱跳状态信息不足,不满足马尔可夫性质检查状态设计是否包含决策所需信息帧堆叠、增加速度/位置特征、用循环结构处理时序
智能体学到了“投机取巧”的行为奖励函数与真实目标错位重新审视每个奖励项的语义简化奖励项,去掉和终极目标不直接对齐的诱导项
行为短视,只顾眼前γ太小检查γ取值与有效视野按任务预期决策窗口调整γ,常在0.9至0.99区间
回报偶尔爆炸或训练不稳定γ过大,方差太高观察折扣回报的分布适当降低γ,或改用标准化收益处理
回合结束后还在累积奖励终止状态没被正确处理检查环境的done标志终态置零,续期任务单独设计回报结构

最后一个建议:当你拿到一个新问题,不要急着写算法。先花半天时间把自己的问题认真填进MDP的五个框里,然后问自己三个问题——状态是不是足够支撑决策?动作空间能不能被算法接受?奖励函数是否会诱导出我不想要的行为?这三个问题想清楚,算法选型自然就有答案了。我自己的习惯是,看任何一篇强化学习论文,都会先找它改动了MDP的哪个环节,再判断它与其他方法的本质差异。这种思维方式,比背一百个公式都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询