强化学习:从状态、动作到马尔可夫决策过程
强化学习(Reinforcement Learning,RL)研究的是:一个智能体如何在环境中不断尝试,通过奖励信号学会更好的决策。
和监督学习不同,强化学习通常没有现成的标准答案。智能体每一步都要自己选择动作,然后环境会返回新的状态和奖励。
例如:
- 游戏角色向左走、向右走、攻击或防御。
- 机器人选择前进、转弯、抓取物体。
- 推荐系统选择给用户展示哪一个内容。
- 自动驾驶系统根据路况选择加速、刹车或转向。
这些问题都有一个共同点:当前的选择不只影响当前结果,还会影响以后能走到哪里、以后能拿到多少奖励。
马尔可夫决策过程(Markov Decision Process,MDP)就是强化学习中描述这种“连续决策问题”的基础数学框架。
一句话概括:
MDP 描述的是:智能体在某个状态下选择动作,环境按照一定概率转移到下一个状态,并给出奖励;智能体的目标是在长期上获得尽可能多的累计奖励。
1. 为什么需要 MDP
前面学习线性回归、逻辑回归、决策树时,我们面对的问题通常是这样的:
输入一个样本 -> 模型给出一个预测
例如:
房屋面积 -> 房价
学习时长 -> 是否通过考试
花瓣长度、花瓣宽度 -> 鸢尾花类别
这类问题通常可以把每个样本看成相对独立的。
但强化学习的问题更像这样:
当前状态 -> 选择动作 -> 得到奖励 -> 进入新状态 -> 再选择动作 -> ...
每一步不是孤立的。比如下棋时,当前一步可能没有立刻得分,但它可能让后面更容易获胜;机器人为了避开障碍物,当前可能要绕远一点,但长期看能更安全地到达目标。
所以强化学习关心的不是“这一步奖励最大”这么简单,而是:
从现在开始,一直决策下去,长期总奖励能不能最大
MDP 正是用来把这件事数学化的工具。
2. 一个直观例子:走格子
假设有一个很小的网格世界:
S . G
. X .
其中:
S表示起点。G表示目标位置。X表示障碍物。- 智能体每一步可以选择上、下、左、右。
- 到达
G得到奖励 $+10$。 - 每走一步消耗 $-1$。
- 撞墙或撞障碍物会留在原地,并得到 $-1$。
如果只看当前一步,智能体可能随便走,因为每一步大多都是 $-1$。但如果看长期回报,它应该尽快找到通往 G 的路线。
这个例子里:
- 当前所在格子就是状态。
- 上下左右就是动作。
- 移动之后的位置就是下一个状态。
- 每一步得到的分数就是奖励。
- “如何从每个格子选择动作”就是策略。
这就是一个非常简单的 MDP。
3. MDP 的五元组
一个标准的 MDP 通常写成五元组:
$$
(\mathcal{S}, \mathcal{A}, P, R, \gamma)
$$
分别表示:
- $\mathcal{S}$:状态集合(State Space)。
- $\mathcal{A}$:动作集合(Action Space)。
- $P$:状态转移概率(Transition Probability)。
- $R$:奖励函数(Reward Function)。
- $\gamma$:折扣因子(Discount Factor)。
下面逐个理解。
4. 状态:智能体看到的局面
状态用 $s$ 表示,所有可能状态组成集合 $\mathcal{S}$。
在不同任务中,状态的含义不同:
| 任务 | 状态例子 |
|---|---|
| 走格子 | 智能体当前所在坐标 |
| 下棋 | 当前棋盘局面 |
| 机器人控制 | 位置、速度、传感器读数 |
| 推荐系统 | 用户画像、历史点击、当前页面 |
状态要尽可能包含做决策需要的信息。比如在走格子中,只知道“当前奖励”是不够的,必须知道当前在什么位置,才能判断下一步往哪里走。
5. 动作:智能体可以做的选择
动作用 $a$ 表示,所有可能动作组成集合 $\mathcal{A}$。
例如在走格子任务中:
$$
\mathcal{A} = {\text{上}, \text{下}, \text{左}, \text{右}}
$$
在实际问题中,动作可以是离散的,也可以是连续的。
- 离散动作:向左、向右、跳跃、攻击。
- 连续动作:机器人关节转动角度、车辆油门大小、机械臂施加的力。
这篇文章先讨论离散状态、离散动作的情况,因为它最适合用来理解 MDP 的核心思想。
6. 状态转移概率:动作不一定产生确定结果
状态转移概率描述的是:在状态 $s$ 下执行动作 $a$ 后,转移到下一个状态 $s’$ 的概率。
通常写成:
$$
P(s’|s,a)=\Pr(S_{t+1}=s’|S_t=s,A_t=a)
$$
例如在走格子中,如果环境是确定的,那么在某个位置选择“向右”,下一个状态就一定是右边那个格子。
但很多现实问题不是确定的。比如机器人选择向前走,可能因为地面打滑而偏了一点;推荐系统展示一个内容,用户可能点击,也可能不点击。
此时可以写成:
$$
P(s_1|s,a)=0.8,\quad P(s_2|s,a)=0.2
$$
意思是:在状态 $s$ 执行动作 $a$ 后,有 $80%$ 的概率到达 $s_1$,有 $20%$ 的概率到达 $s_2$。
7. 奖励函数:什么结果是好的
奖励函数描述的是智能体执行动作后能得到多少反馈。
一种常见写法是:
$$
R(s,a)=\mathbb{E}[R_{t+1}|S_t=s,A_t=a]
$$
也可以把奖励写成和下一个状态有关:
$$
R(s,a,s’)=\mathbb{E}[R_{t+1}|S_t=s,A_t=a,S_{t+1}=s’]
$$
奖励是强化学习中的目标信号。
例如:
- 到达终点:$+10$
- 每走一步:$-1$
- 撞到障碍物:$-5$
- 游戏获胜:$+1$
- 游戏失败:$-1$
奖励设计非常重要。如果奖励设计不合理,智能体可能学到一些看起来“钻空子”的行为。
比如只奖励机器人“移动速度快”,却不惩罚撞墙,那么机器人可能会学会高速乱撞;只奖励推荐系统“点击率高”,却不考虑用户体验,系统可能会倾向于推荐标题夸张但质量低的内容。
8. 折扣因子:未来奖励要不要打折
强化学习关心长期回报,但未来太远的奖励通常要打一点折扣。
折扣因子用 $\gamma$ 表示:
$$
0 \le \gamma \le 1
$$
如果从时刻 $t$ 开始,之后的奖励依次为:
$$
R_{t+1}, R_{t+2}, R_{t+3}, \dots
$$
那么累计回报定义为:
$$
G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots
$$
其中:
- $\gamma=0$ 时,只关心下一步奖励。
- $\gamma$ 越接近 $1$,越重视长期奖励。
- $\gamma<1$ 可以让无限步任务中的累计回报更容易收敛。
举个例子,假设未来三步奖励分别是:
$$
R_{t+1}=1,\quad R_{t+2}=2,\quad R_{t+3}=10
$$
如果 $\gamma=0.9$,那么回报为:
$$
G_t = 1 + 0.9 \times 2 + 0.9^2 \times 10 = 10.9
$$
如果 $\gamma=0.5$,那么回报为:
$$
G_t = 1 + 0.5 \times 2 + 0.5^2 \times 10 = 4.5
$$
可以看到,$\gamma$ 越小,越不在意远处的奖励。
9. 马尔可夫性:未来只依赖现在
MDP 中的“马尔可夫”来自马尔可夫性。
马尔可夫性可以理解为:
只要当前状态已经包含足够信息,那么未来如何变化只和当前状态、当前动作有关,不需要再追溯更早的历史。
用公式表示:
$$
\Pr(S_{t+1}=s’|S_t=s,A_t=a,S_{t-1},A_{t-1},\dots)
=
\Pr(S_{t+1}=s’|S_t=s,A_t=a)
$$
也就是说,给定当前状态 $s$ 和当前动作 $a$ 后,过去发生过什么不再额外影响下一个状态。
这并不是说“历史不重要”,而是说:如果历史重要,就应该把历史中有用的信息放进当前状态里。
例如在股票交易中,如果只把“当前价格”作为状态,可能不满足马尔可夫性,因为过去的价格趋势也会影响决策。此时可以把过去一段时间的价格、成交量、技术指标都加入状态,让状态包含更多信息。
10. 策略:在每个状态下如何选择动作
策略(Policy)描述的是智能体的行为方式,通常用 $\pi$ 表示。
确定性策略写成:
$$
a=\pi(s)
$$
表示在状态 $s$ 下直接选择动作 $a$。
随机策略写成:
$$
\pi(a|s)=\Pr(A_t=a|S_t=s)
$$
表示在状态 $s$ 下选择动作 $a$ 的概率。
例如在某个格子中,策略可能是:
| 动作 | 概率 |
|---|---|
| 上 | 0.1 |
| 下 | 0.1 |
| 左 | 0.2 |
| 右 | 0.6 |
这表示智能体更倾向于向右走,但仍然保留一定探索其他动作的概率。
强化学习要学习的,通常就是一个好的策略。
11. 状态价值函数
状态价值函数用 $V^\pi(s)$ 表示,意思是:
如果当前处于状态 $s$,之后一直按照策略 $\pi$ 行动,期望能获得多少累计回报。
公式为:
$$
V^\pi(s)=\mathbb{E}_\pi[G_t|S_t=s]
$$
把回报展开:
$$
V^\pi(s)=\mathbb{E}\pi[R{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+\cdots|S_t=s]
$$
价值函数可以理解为“这个状态有多好”。
在走格子任务中,离终点越近、越容易到达终点的格子,价值通常越高;离障碍物近、容易被困住的位置,价值通常较低。
12. 动作价值函数
动作价值函数用 $Q^\pi(s,a)$ 表示,意思是:
如果当前处于状态 $s$,先执行动作 $a$,之后再按照策略 $\pi$ 行动,期望能获得多少累计回报。
公式为:
$$
Q^\pi(s,a)=\mathbb{E}_\pi[G_t|S_t=s,A_t=a]
$$
状态价值函数关注“状态好不好”,动作价值函数关注“在这个状态下做某个动作好不好”。
二者的关系是:
$$
V^\pi(s)=\sum_a \pi(a|s)Q^\pi(s,a)
$$
如果策略是确定性的,在状态 $s$ 下只选择动作 $\pi(s)$,那么:
$$
V^\pi(s)=Q^\pi(s,\pi(s))
$$
13. 贝尔曼方程:把长期价值拆成一步
强化学习中最核心的公式之一就是贝尔曼方程。
它的思想非常朴素:
当前状态的价值 = 下一步奖励 + 下一个状态的折扣价值
对于某个策略 $\pi$,状态价值函数满足:
$$
V^\pi(s)=\sum_a \pi(a|s)\sum_{s’}P(s’|s,a)
\left[R(s,a,s’)+\gamma V^\pi(s’)\right]
$$
这个公式看起来长,但每一部分都能对应到 MDP 的元素:
- $\pi(a|s)$:在状态 $s$ 下选择动作 $a$ 的概率。
- $P(s’|s,a)$:执行动作 $a$ 后到达 $s’$ 的概率。
- $R(s,a,s’)$:这一步得到的奖励。
- $\gamma V^\pi(s’)$:下一个状态的未来价值。
贝尔曼方程的关键在于:它把“无限长的未来”拆成了“眼前一步 + 剩下的未来”。
这和动态规划的思想很像:如果后面的子问题已经知道答案,那么当前问题就可以通过一步递推算出来。
14. 最优价值函数和最优策略
如果我们不想评价某一个固定策略,而是想找到最好的策略,就会用到最优价值函数。
最优状态价值函数定义为:
$$
V^*(s)=\max_\pi V^\pi(s)
$$
意思是:在所有可能策略中,从状态 $s$ 出发能得到的最大期望回报。
最优动作价值函数定义为:
$$
Q^*(s,a)=\max_\pi Q^\pi(s,a)
$$
对应的最优贝尔曼方程为:
$$
V^*(s)=\max_a \sum_{s’}P(s’|s,a)
\left[R(s,a,s’)+\gamma V^*(s’)\right]
$$
最优策略可以从最优价值函数中取出来:
$$
\pi^*(s)=\arg\max_a \sum_{s’}P(s’|s,a)
\left[R(s,a,s’)+\gamma V^*(s’)\right]
$$
直观地说,就是在每个状态下选择能让“当前奖励 + 未来价值”最大的动作。
15. 手工计算一个小例子
假设现在只有两个普通状态 $A$、$B$,以及一个终止状态 $T$。
动作规则如下:
| 当前状态 | 动作 | 下一个状态 | 奖励 |
|---|---|---|---|
| A | 去 B | B | 0 |
| A | 结束 | T | 1 |
| B | 去 A | A | 0 |
| B | 结束 | T | 3 |
设折扣因子:
$$
\gamma=0.9
$$
终止状态价值为:
$$
V^*(T)=0
$$
对于状态 $A$,有两个选择:
- 直接结束,得到奖励 $1$。
- 去 $B$,得到奖励 $0$,然后获得 $B$ 的未来价值。
所以:
$$
V^*(A)=\max(1,;0+0.9V^*(B))
$$
对于状态 $B$:
$$
V^*(B)=\max(3,;0+0.9V^*(A))
$$
可以先猜一下:在 $B$ 直接结束可以得到 $3$,看起来很划算。
如果 $V^*(B)=3$,那么:
$$
V^*(A)=\max(1,;0.9\times 3)=2.7
$$
再代回 $B$:
$$
V^*(B)=\max(3,;0.9\times 2.7)=\max(3,;2.43)=3
$$
所以结果稳定:
$$
V^*(A)=2.7,\quad V^*(B)=3
$$
最优策略为:
- 在 $A$ 选择“去 B”。
- 在 $B$ 选择“结束”。
这个例子说明:状态 $A$ 直接结束只能得到 $1$,但如果先去 $B$,再结束,折扣后还能得到 $2.7$,所以更优。
16. 价值迭代:不断逼近最优价值
如果状态和动作数量不大,并且已知转移概率和奖励函数,就可以使用价值迭代(Value Iteration)求解 MDP。
价值迭代的更新公式来自最优贝尔曼方程:
$$
V_{k+1}(s)=\max_a \sum_{s’}P(s’|s,a)
\left[R(s,a,s’)+\gamma V_k(s’)\right]
$$
它的思路是:
- 先给每个状态的价值一个初始值,比如全是 $0$。
- 用贝尔曼最优方程更新每个状态。
- 重复很多轮,直到价值变化很小。
- 根据最终价值函数选出每个状态下最好的动作。
可以把它理解为:
先粗略估计每个状态的价值
然后不断让每个状态参考后继状态的价值来修正自己
17. Python 实现价值迭代
下面用 Python 实现上面 $A$、$B$、$T$ 的小 MDP。
states = ["A", "B", "T"]
actions = {
"A": ["go_B", "end"],
"B": ["go_A", "end"],
"T": [],
}
# transitions[(state, action)] = [(probability, next_state, reward)]
transitions = {
("A", "go_B"): [(1.0, "B", 0)],
("A", "end"): [(1.0, "T", 1)],
("B", "go_A"): [(1.0, "A", 0)],
("B", "end"): [(1.0, "T", 3)],
}
gamma = 0.9
theta = 1e-6
# 对应模块:初始化价值函数,终止状态和普通状态一开始都设为 0
V = {s: 0.0 for s in states}
while True:
delta = 0.0
for s in states:
# 对应模块:终止状态没有动作,价值保持为 0
if not actions[s]:
continue
old_value = V[s]
action_values = []
for a in actions[s]:
value = 0.0
# 对应模块:计算某个动作的期望价值
for prob, next_state, reward in transitions[(s, a)]:
value += prob * (reward + gamma * V[next_state])
action_values.append(value)
# 对应模块:贝尔曼最优更新,选择价值最大的动作
V[s] = max(action_values)
delta = max(delta, abs(old_value - V[s]))
if delta < theta:
break
print("最优价值函数:")
for s in states:
print(s, round(V[s], 4))
print("\n最优策略:")
for s in states:
if not actions[s]:
continue
best_action = None
best_value = float("-inf")
for a in actions[s]:
value = 0.0
for prob, next_state, reward in transitions[(s, a)]:
value += prob * (reward + gamma * V[next_state])
if value > best_value:
best_value = value
best_action = a
print(s, "->", best_action)
输出结果大致为:
最优价值函数:
A 2.7
B 3.0
T 0.0
最优策略:
A -> go_B
B -> end
这和前面的手工计算一致。
18. MDP 和强化学习算法的关系
MDP 是问题建模框架,而强化学习算法是在这个框架上学习策略或价值函数的方法。
常见算法可以这样理解:
| 算法 | 主要学习什么 | 依赖模型吗 |
|---|---|---|
| 动态规划 | $V(s)$ 或 $Q(s,a)$ | 需要已知 $P$ 和 $R$ |
| 蒙特卡洛方法 | 通过完整回合估计价值 | 不需要已知模型 |
| TD 学习 | 用一步奖励和下一个状态估计价值 | 不需要已知模型 |
| Q-Learning | 学习最优动作价值 $Q^*(s,a)$ | 不需要已知模型 |
| SARSA | 学习当前策略下的动作价值 | 不需要已知模型 |
| Policy Gradient | 直接优化策略参数 | 不需要已知模型 |
如果环境的转移概率 $P$ 和奖励函数 $R$ 已知,就可以用动态规划类方法直接求解。
但很多真实问题中,智能体并不知道 $P$ 和 $R$ 的完整形式,只能通过和环境交互得到样本:
(s, a, r, s')
这时就需要 Q-Learning、SARSA、Policy Gradient 等强化学习算法。
19. MDP 中几个容易混淆的概念
19.1 奖励和价值
奖励是一步反馈,价值是长期回报的期望。
例如在走格子中,某一步向右走可能只得到 $-1$,但如果这一步能让智能体更接近终点,那么当前状态或当前动作的价值仍然可能很高。
所以:
奖励看一步,价值看长期
19.2 状态和观测
理论上的 MDP 假设智能体能看到完整状态。
但现实中智能体经常只能看到一部分信息,这叫观测(Observation)。例如自动驾驶汽车不一定知道世界的完整真实状态,只能通过摄像头、雷达等传感器获得观测。
如果观测不能完整表示状态,问题就更接近部分可观测马尔可夫决策过程(Partially Observable Markov Decision Process,POMDP)。
19.3 策略和价值函数
策略告诉智能体“怎么做”,价值函数告诉智能体“这样做长期好不好”。
很多算法会先学习价值函数,再从价值函数中导出策略;也有算法直接学习策略。
20. 实践建议
用 MDP 思考强化学习问题时,可以按下面顺序拆解:
- 明确状态是什么,状态是否包含足够决策信息。
- 明确动作有哪些,是离散动作还是连续动作。
- 明确奖励怎么设计,避免奖励和真实目标不一致。
- 明确任务是否有终止状态,例如游戏结束、到达目标、失败退出。
- 选择合适的折扣因子 $\gamma$,短期任务可以小一点,长期任务通常接近 $1$。
- 如果已知环境模型,可以考虑动态规划;如果不知道模型,就通过交互数据学习。
- 先从小环境验证算法,再扩展到复杂环境。
21. 总结
MDP 是强化学习的地基。
它用状态、动作、转移概率、奖励函数和折扣因子,把连续决策问题描述成一个清晰的数学模型:
$$
(\mathcal{S}, \mathcal{A}, P, R, \gamma)
$$
其中,马尔可夫性要求当前状态已经包含足够信息;策略决定智能体如何行动;价值函数衡量长期回报;贝尔曼方程则把长期价值拆成“当前一步 + 未来价值”。
理解 MDP 之后,再看 Q-Learning、SARSA、DQN、Policy Gradient 等算法会顺很多。因为这些算法本质上都在回答同一个问题:
在这个 MDP 中,怎样选择动作,才能让长期累计奖励最大?
参考文献
本文主要参考了以下资料:
- Richard S. Sutton, Andrew G. Barto, Reinforcement Learning: An Introduction, 2nd Edition, MIT Press, 2018. 在线版:https://incompleteideas.net/book/the-book-2nd.html
- Martin L. Puterman, Markov Decision Processes: Discrete Stochastic Dynamic Programming, Wiley, 1994.
- Richard Bellman, “A Markovian Decision Process”, Journal of Mathematics and Mechanics, 1957.
- David Silver, Lecture 2: Markov Decision Processes, UCL Course on Reinforcement Learning, 2015. 课程资料:http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html
