1. MDP 概述与基本概念
马尔可夫决策过程,简写 MDP,是强化学习里最基础的数学框架。我最早接触它的时候,觉得不就是一堆概率和状态吗?后来调 DQN 调到头秃才明白——MDP 这套框框架得不对,后面全是白搭。
说白了,MDP 就是描述智能体怎么跟环境交互的模子。你每走一步,环境给你一个反馈,然后你根据反馈决定下一步怎么走。这个过程用数学语言包装一下,就成了 MDP。
一句话记忆:MDP 是“状态 → 动作 → 奖励 → 下一个状态”的闭环。
1.1 核心五元组
一个标准的 MDP 由五个元素组成,我们叫它五元组。我习惯用 ⟨S, A, P, R, γ⟩ 来标记。
| 符号 | 含义 | 简单解释 |
|---|---|---|
| S | 状态集合 | 环境可能处于的所有情况 |
| A | 动作集合 | 智能体可以做的所有选择 |
| P | 状态转移概率 | 从状态 s 做动作 a 后到 s' 的概率 |
| R | 奖励函数 | 在某个状态做动作后能拿到的即时奖励 |
| γ | 折扣因子 | 未来奖励打多少折扣,0~1 之间 |
嗯,这里要注意:P 和 R 严格来说都是依赖于当前状态和动作的。不少人刚学的时候以为 R 只跟状态有关,其实不对——奖励通常是在执行动作之后收到的,所以是 R(s, a, s') 或者简写为 R(s, a)。
1.2 状态空间与动作空间
状态空间 S 可以是离散的或者连续的。离散的比如棋盘上的 361 个交叉点;连续的比如机器人关节的角度。动作空间 A 也类似。
我曾在项目里碰到过状态空间爆炸的问题——把每个传感器的读数都当独立状态,结果状态数比宇宙原子还多。后来才意识到,你得好好地做状态抽象。
- 离散状态/动作:可以用表格存,适合小规模问题。
- 连续状态/动作:必须用函数近似,比如神经网络。
- 混合状态:一半离散一半连续,比较棘手。
我的个人习惯:一开始先把动作空间和状态空间降维到最少必要维度,再逐步增加。别一上来就搞大而全。
1.3 状态转移概率矩阵
P 是 MDP 里最麻烦的部分。它描述的是:在状态 s 做了动作 a,环境会以什么概率跳到状态 s'。你想想看,在现实系统中,这个概率通常不知道,得从数据里学——这就是无模型的由来。
举个例子,假设有两个状态 S={0,1},两个动作 A={left, right}:
在状态 0 时,若动作 left:
-> 0 的概率 0.8
-> 1 的概率 0.2
在状态 0 时,若动作 right:
-> 0 的概率 0.3
-> 1 的概率 0.7
这就是转移概率矩阵的一小部分。全矩阵大小是 |S| × |A| × |S|,所以状态一多你就存不下了。我记得有一次帮团队优化一个库存调拨模型,状态数才 100 个,转移矩阵就有 1 万项,还能忍;等加到 1000 个状态,数据就直接崩了。
我曾经踩过的坑:手算转移概率时用了不合理的假设,导致训练的智能体一直做奇怪的动作。最后发现统计概率时没考虑动作依赖,把独立概率当成了条件概率。这玩意一定要小心。
1.4 奖励函数与折扣因子
奖励函数 R 告诉智能体这一步走得好不好。通常我们设 R(s, a) 是一个实数,正数表示好,负数表示惩罚。但这里有个坑——奖励稀疏的问题。比如围棋,只有下完最后一步才知道输赢,中间几千步全是零奖励。
我建议你一开始就规划好奖励结构:
- 即时奖励不要太大,否则模型会变成“近视眼”。
- 稀疏奖励要多设计一些辅助奖赏,比如接近目标就给小奖励。
- 折扣因子 γ 很重要:γ=0 的话只关心眼前利益;γ→1 的话几乎不折扣,未来和现在一样重要。
实际项目中,我一般把 γ 设 0.9 ~ 0.99 之间。太久远的奖励会指数衰减,你的策略就不太会为很远的事考虑。反过来,如果你的任务需要长期规划,比如物流配送,γ 就要靠近 1。
1.5 策略与价值函数
策略 π 是智能体的决策规则:给定状态 s,选哪个动作 a。可以是确定性的(π(s)=a),也可以是随机性的(π(a|s)=概率)。
价值函数分两种:
- 状态价值函数 V(s):从状态 s 开始,按照策略 π 走,未来累计折扣奖励的期望。
- 动作价值函数 Q(s,a):从状态 s 采取动作 a 开始,之后再按策略 π 走,累计奖励的期望。
我个人觉得 Q 函数更直观——直接告诉我每个动作的“好坏”。你想想看,在训练 DQN 的时候,我们一直在拟合的就是 Q 函数。
关键公式记忆:Bellman 期望方程:V(s) = ∑a π(a|s) [ R(s,a) + γ ∑s' P(s'|s,a) V(s') ]
1.6 知识结构图
下面我用一张 SVG 图把 MDP 的核心概念串起来。方便你脑子里面建立整体结构。
1.7 总结避坑
这一章先给你搭个框架。你要记住几个最核心的东西:
- MDP 假设:未来的状态只取决于当前状态和动作,与历史无关(马尔可夫性)。如果你的环境不满足这个,MDP 就不太适用了。
- 概率转移矩阵往往未知,需要从采样中估计或直接用无模型方法。
- 奖励设计决定智能体的行为倾向,千万别随便拍脑袋。
- 折扣因子 γ 控制视野长短,选错会直接导致策略质量差。
一个小建议:学 MDP 的时候,试着去把现实里一个简单的任务(比如“打开冰箱拿水”)抽象成 S、A、P、R、γ。不用形成代码,就是脑内模拟。你会发现很多直觉性的错误——比如你认为“拿水”是个动作,但在 MDP 里它可能要拆成“走向冰箱→打开门→伸手→拿到”一系列动作。这种练习做多了,你写算法时的抽象能力会突飞猛进。