强化学习(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)。

下面逐个理解。

MDP 五元组的组成

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. 直接结束,得到奖励 $1$。
  2. 去 $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$,所以更优。

A、B、T 小型 MDP 的状态转移关系

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]
$$

它的思路是:

  1. 先给每个状态的价值一个初始值,比如全是 $0$。
  2. 用贝尔曼最优方程更新每个状态。
  3. 重复很多轮,直到价值变化很小。
  4. 根据最终价值函数选出每个状态下最好的动作。

可以把它理解为:

先粗略估计每个状态的价值
然后不断让每个状态参考后继状态的价值来修正自己

价值迭代的基本流程

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 等强化学习算法。

常见强化学习算法都建立在 MDP 建模框架之上

19. MDP 中几个容易混淆的概念

19.1 奖励和价值

奖励是一步反馈,价值是长期回报的期望。

例如在走格子中,某一步向右走可能只得到 $-1$,但如果这一步能让智能体更接近终点,那么当前状态或当前动作的价值仍然可能很高。

所以:

奖励看一步,价值看长期

19.2 状态和观测

理论上的 MDP 假设智能体能看到完整状态。

但现实中智能体经常只能看到一部分信息,这叫观测(Observation)。例如自动驾驶汽车不一定知道世界的完整真实状态,只能通过摄像头、雷达等传感器获得观测。

如果观测不能完整表示状态,问题就更接近部分可观测马尔可夫决策过程(Partially Observable Markov Decision Process,POMDP)。

19.3 策略和价值函数

策略告诉智能体“怎么做”,价值函数告诉智能体“这样做长期好不好”。

很多算法会先学习价值函数,再从价值函数中导出策略;也有算法直接学习策略。

20. 实践建议

用 MDP 思考强化学习问题时,可以按下面顺序拆解:

  1. 明确状态是什么,状态是否包含足够决策信息。
  2. 明确动作有哪些,是离散动作还是连续动作。
  3. 明确奖励怎么设计,避免奖励和真实目标不一致。
  4. 明确任务是否有终止状态,例如游戏结束、到达目标、失败退出。
  5. 选择合适的折扣因子 $\gamma$,短期任务可以小一点,长期任务通常接近 $1$。
  6. 如果已知环境模型,可以考虑动态规划;如果不知道模型,就通过交互数据学习。
  7. 先从小环境验证算法,再扩展到复杂环境。

21. 总结

MDP 是强化学习的地基。

它用状态、动作、转移概率、奖励函数和折扣因子,把连续决策问题描述成一个清晰的数学模型:

$$
(\mathcal{S}, \mathcal{A}, P, R, \gamma)
$$

其中,马尔可夫性要求当前状态已经包含足够信息;策略决定智能体如何行动;价值函数衡量长期回报;贝尔曼方程则把长期价值拆成“当前一步 + 未来价值”。

理解 MDP 之后,再看 Q-Learning、SARSA、DQN、Policy Gradient 等算法会顺很多。因为这些算法本质上都在回答同一个问题:

在这个 MDP 中,怎样选择动作,才能让长期累计奖励最大?

参考文献

本文主要参考了以下资料:

  1. Richard S. Sutton, Andrew G. Barto, Reinforcement Learning: An Introduction, 2nd Edition, MIT Press, 2018. 在线版:https://incompleteideas.net/book/the-book-2nd.html
  2. Martin L. Puterman, Markov Decision Processes: Discrete Stochastic Dynamic Programming, Wiley, 1994.
  3. Richard Bellman, “A Markovian Decision Process”, Journal of Mathematics and Mechanics, 1957.
  4. 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