1. 为什么需要强化学习?
在进入数学公式之前,我们需要理解强化学习(Reinforcement Learning, RL)解决的是什么核心问题。
与监督学习(Supervised Learning)不同,RL 没有“上帝视角”的标签(Label)。Agent(智能体)是在未知的环境中,通过**试错(Trial-and-Error)**来学习的。这就像一个婴儿学习走路,没有说明书,只有摔倒时的疼痛(负奖励)和站稳时的喜悦(正奖励)。
本章我们将基于 Westlake University 赵世钰老师 的课程,结合配套的 GridWorld 代码,从零构建 RL 的数学大厦——马尔可夫决策过程 (MDP)。
2. 核心图景:Agent 与 Environment 的交互
RL 的世界观可以浓缩为一张图(对应视频中的核心板书):
- Time $t$: Agent 处于状态 $S_t$(State)。
- Decision: Agent 观察到 $S_t$,根据策略 $\pi$ 选择动作 $A_t$(Action)。
- Interaction: Agent 将 $A_t$ 施加给 Environment。
- Feedback: Environment 根据物理规则(Dynamics)演变到新状态 $S_{t+1}$,并反馈即时奖励 $R_{t+1}$(Reward)。
- Loop: 时间来到 $t+1$,循环继续。
这个循环产生的序列称为轨迹 (Trajectory):
$$ \tau = S_0, A_0, R_1, S_1, A_1, R_2, S_2, A_2, R_3, \dots $$
3. 马尔可夫决策过程 (MDP) 深度解析
为了用数学描述上述过程,我们定义 MDP 五元组 $\mathcal{M} = (\mathcal{S}, \mathcal{A}, \mathcal{P}, \mathcal{R}, \gamma)$。
3.1 状态空间 (State Space, $\mathcal{S}$)
状态是 Agent 做决策的依据。
- GridWorld 实例: 在一个 $5 \times 5$ 的网格中,状态空间是所有方格的集合。
$$ \mathcal{S} = { (x,y) \mid x,y \in {0,1,2,3,4} } $$
或者将其展平为索引 $s \in {0, 1, \dots, 24}$。 - 代码视角:
在src/grid_world.py中,self.num_states = env_size[0] * env_size[1]定义了状态大小。
3.2 动作空间 (Action Space, $\mathcal{A}$)
- GridWorld 实例: Agent 可以向四个方向移动或原地不动。
$$ \mathcal{A} = { \text{Up}, \text{Down}, \text{Left}, \text{Right}, \text{Stay} } $$ - 代码视角:
1
2# 动作被编码为坐标的变化量
self.action_space = [(0, -1), (0, 1), (-1, 0), (1, 0), (0, 0)]
3.3 状态转移概率 (State Transition Probability, $\mathcal{P}$) —— 核心中的核心
这是环境的“物理定律”。当我们执行动作 $a$ 时,环境并不一定 100% 听话。
- 定义:
$$ p(s’ | s, a) = \mathbb{P}(S_{t+1} = s’ \mid S_t = s, A_t = a) $$
它表示:在状态 $s$ 采取动作 $a$,跳转到状态 $s’$ 的概率。 - 性质: $\sum_{s’ \in \mathcal{S}} p(s’ | s, a) = 1$。
- GridWorld 代码逻辑:
虽然书中的数学定义允许随机性(例如:想向右走,但有 10% 概率被风吹向上),但在配套代码grid_world.py的基础实现中,转移是确定性 (Deterministic) 的:注意:理解 MDP 时,必须时刻记住 $p(s’|s,a)$ 通常是一个概率分布,确定性只是概率为 1 的特例。1
2
3
4def _get_next_state_and_reward(self, state, action):
# 确定性计算:当前坐标 + 动作向量
new_state = tuple(np.array(state) + np.array(action))
# ... (然后进行边界检查,撞墙则弹回)
3.4 奖励函数 (Reward Function, $\mathcal{R}$)
奖励是指挥棒,引导 Agent 学习我们期望的行为。
- 定义:
$$ r(s, a) = \mathbb{E}[R_{t+1} \mid S_t = s, A_t = a] $$
或者更通用的形式 $r(s, a, s’)$,依赖于下一状态。 - GridWorld 设计哲学:
在代码中,Reward 设计不仅是为了告诉 Agent “好坏”,更是为了“引导”。reward_target = 1: 正向激励,到达终点。reward_forbidden = -10: 强负反馈,踩到陷阱(禁区)。reward_step = -0.1(假设值): 生存惩罚。每走一步都扣分,这不仅不是坏事,反而是为了鼓励 Agent 走最短路径(因为走得越久扣得越多)。
3.5 折扣因子 (Discount Factor, $\gamma$)
这是一个常数 $\gamma \in [0, 1)$。为什么要它?
- 数学收敛性: 避免无限时间序列求和发散。
- 经济学/心理学: “双鸟在林不如一鸟在手”。未来的奖励充满不确定性,且价值随时间衰减。
4. 回报 (Return) —— 真正要最大化的目标
初学者容易混淆 Reward (即时奖励) 和 Return (回报)。
- Reward ($R_t$): 这一步走得怎么样?
- Return ($G_t$): 从这一步开始,未来这一辈子总共能拿多少分?
数学定义(Discounted Return):
$$ G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1} $$
从代码看 Return 的计算:
在 example_grid_world.py 的循环中,我们其实是在收集 $R$:
1 | state = env.reset() |
5. 策略 (Policy, $\pi$)
MDP 给了我们环境规则,Policy 则是 Agent 的玩法。
- 定义: $\pi(a|s)$ 是在状态 $s$ 选择动作 $a$ 的概率分布。
$$ \sum_{a \in \mathcal{A}} \pi(a|s) = 1 $$ - 代码实战:
在example_grid_world.py中,有一段代码手动添加了一个策略矩阵:可视化的结果是:在每个格子上,会有不同粗细的箭头指向不同方向,箭头越粗代表 $\pi(a|s)$ 越大。1
2
3
4
5
6
7# 创建一个随机策略矩阵 (num_states x num_actions)
policy_matrix = np.random.rand(env.num_states, len(env.action_space))
# 归一化:保证每一行的概率和为 1
policy_matrix /= policy_matrix.sum(axis=1)[:, np.newaxis]
env.add_policy(policy_matrix) # 可视化策略箭头
6. 本章总结与下章预告
本章我们构建了 RL 的静态框架:
- 我们有了地图 (State)。
- 我们知道能怎么走 (Action)。
- 我们知道走一步会发生什么 (Transition)。
- 我们知道什么是好的结果 (Reward)。
- 我们定义了终极目标:最大化 Return ($G_t$),而不是短视地看 $R_t$。
遗留问题:
现在 Agent 只是在“瞎走”(Random Policy)。如果你是 Agent,站在某个格子上,你怎么知道往哪走才是通往高 Return 的路?
你需要一个“地图导航”,告诉你每个格子的价值 (Value)。
这就引出了下一章的核心:状态价值函数 (State Value) 与 贝尔曼方程 (Bellman Equation) —— 它们是 RL 中评估策略好坏的标尺。

