强化学习范式与数学 preliminaries
强化学习的本质,是研究智能体(Agent)如何在动态环境中,通过与环境持续交互来学习最优行为序列的 computational framework。它不依赖于预先标注的“正确答案”,而是让智能体在试错中,依据稀疏、延迟且可能带有噪声的奖励信号,逐步优化其长期累积收益。这种“从互动中学习”的范式,与人类和动物在现实世界中学习的方式有着深刻的哲学同构性,也是其区别于其他机器学习分支的根本所在。要构建这一理论大厦,必须首先厘清其最基础的构件:状态、动作、奖励、策略与价值,以及将它们编织在一起的交互循环。本章将系统性地定义这些核心概念,并通过一个贯穿全书的网格世界迷宫示例,具象化强化学习中的经典困境——探索与利用的权衡。随后,我们将追溯其理论根源,严格定义马尔可夫决策过程这一数学基石,并为后续章节的 rigorous 数学推导奠定基础。
1.1 范式界定:强化学习、监督学习与无监督学习的核心分歧
机器学习领域通常被划分为三大范式:监督学习、无监督学习和强化学习。理解它们之间的根本区别,是把握强化学习独特性的前提。
监督学习 处理的是从固定数据集 $D = \{ (x_i, y_i) \}_{i=1}^N$ 中学习一个映射函数 $f: X \rightarrow Y$ 的问题。这里的每个训练样本 $(x_i, y_i)$ 都包含了完整的“输入-输出”对,即所谓的“标签” $y_i$。学习的目标是使模型在未见数据上的预测 $\hat{y} = f(x)$ 与真实标签 $y$ 之间的损失(如均方误差、交叉熵)最小化。其核心假设是训练数据独立同分布(i.i.d.),且数据本身是静态、预先收集好的。例如,图像分类任务中,每张图片都标明了其所属类别;房价预测中,每条记录都包含了房屋特征和最终成交价。监督学习的“答案”是明确的、即时的,模型的任务是拟合这个已知的映射关系。
无监督学习 则处理没有标签的数据 $D = \{ x_i \}_{i=1}^N$。其目标不是预测某个特定输出,而是发现数据中内在的结构、模式或表示。典型任务包括聚类(将数据分组)、降维(如PCA,保留主要信息的同时减少维度)和密度估计(学习数据的概率分布)。无监督学习的“信号”隐含在数据本身的统计特性中,例如相似样本倾向于聚集。它不涉及一个外部的、提供反馈的“环境”,学习过程是对静态数据集的内在分析。
强化学习 则处于一个完全不同的维度。它关注的是一个智能体与一个环境之间的持续交互。环境是动态的、对智能体的行为做出反应的。智能体在每个时间步 $t$ 观测到环境的某个状态 $s_t \in \mathcal{S}$,并据此选择一个动作 $a_t \in \mathcal{A}$。环境在接收到动作后,会转移到下一个状态 $s_{t+1}$,并反馈给智能体一个标量奖励 $r_{t+1} \in \mathbb{R}$。智能体的终极目标,不是最大化即时奖励,而是最大化从当前时间步开始,直到任务终止的累积奖励(Return),通常用折扣累积奖励 $G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1}$ 来定义,其中 $\gamma \in [0, 1]$ 是折扣因子,用于权衡当前与未来奖励的重要性。
下表清晰地对比了三种范式的核心要素:
| 特性维度 | 监督学习 | 无监督学习 | 强化学习 | | :--- | :--- | :--- | :--- | | 数据 | 带标签的静态数据集 $(x, y)$ | 无标签的静态数据集 $x$ | 动态交互序列 $(s, a, r, s')$ | | 目标 | 学习输入到输出的映射 $f(x) \approx y$ | 发现数据内在结构/表示 | 学习最优行为策略 $\pi(a|s)$ 以最大化长期累积奖励 | | 反馈 | 即时、完整的“答案”(标签) | 无显式反馈,基于数据统计 | 延迟、稀疏、可能带有噪声的标量奖励信号 | | 交互性 | 无(被动学习) | 无(被动分析) | 有(主动探索) | | 时序性 | 无(i.i.d.假设) | 无(i.i.d.假设) | 强(序列决策,当前决策影响未来状态) | | 核心挑战 | 过拟合、泛化能力 | 定义“结构”、评估无监督目标 | 信用分配、探索-利用困境、非平稳性 |
从上表可见,强化学习最鲜明的标签是序列决策与主动交互。智能体的每一个动作不仅影响当前的奖励,更通过改变环境状态,影响未来所有可能获得的奖励。这使得“哪个动作对最终成功贡献最大”(信用分配问题)变得异常困难。同时,智能体必须在利用(选择当前看来最优的动作以获取已知奖励)和探索(尝试新动作以发现可能更高的长期奖励)之间做出艰难权衡。这种困境是监督和无监督学习中所不具备的。
1.2 智能体-环境交互循环:核心要素的具象化
强化学习问题的最基本架构,可以用下图所示的交互循环来概括:
```mermaid graph TD A[智能体 Agent] -- 观测状态 s_t --> B[环境 Environment]; B -- 执行动作 a_t --> A; B -- 产生奖励 r_{t+1} 和<br>新状态 s_{t+1} --> A; A -- 根据 s_t, r_{t+1}, s_{t+1} 更新策略 --> A; ```
在这个循环中,五个核心要素依次登场:
1. 状态 (State, $s$):状态是对环境在某一时刻情况的完整描述。它是智能体做决策所依据的全部信息。状态空间 $\mathcal{S}$ 是所有可能状态的集合。状态可以是完全可观测的(如棋盘的完整布局),也可以部分可观测的(如机器人仅通过摄像头获取视觉信息,存在遮挡),后者引出部分可观测马尔可夫决策过程(POMDP)这一更复杂的领域。
2. 动作 (Action, $a$):动作是智能体在某个状态下可以执行的操作。动作空间 $\mathcal{A}$ 是所有可能动作的集合。根据空间性质,可分为离散动作空间(如棋类游戏中的落子位置、雅达利游戏中的手柄按钮组合)和连续动作空间(如机器人关节的扭矩控制、自动驾驶的转向角度)。动作空间的性质直接决定了策略函数 $\pi$ 的输出形式。
3. 奖励 (Reward, $r$):奖励是环境对智能体动作的即时数值反馈。它是定义任务目标的唯一信号。奖励函数 $R: \mathcal{S} \times \mathcal{A} \rightarrow \mathbb{R}$(或在某些定义下为 $R: \mathcal{S} \times \mathcal{A} \times \mathcal{S}' \rightarrow \mathbb{R}$)指定了在状态 $s$ 执行动作 $a$(并转移到 $s'$)后获得的即时奖励值。设计一个能够精确、无歧义地引导智能体达成最终目标的奖励函数,是强化学习实践中最困难且最具艺术性的环节之一,不恰当的奖励设计会导致智能体学会“钻空子”(Reward Hacking),获得虚假的高奖励却未完成真实任务。
4. 策略 (Policy, $\pi$):策略是智能体的行为准则,它定义了智能体在给定状态下选择动作的方式。它是强化学习算法的优化对象。
- **确定性策略**:$\pi: \mathcal{S} \rightarrow \mathcal{A}$,在状态 $s$ 下总是输出唯一动作 $a = \pi(s)$。
- **随机性策略**:$\pi: \mathcal{S} \times \mathcal{A} \rightarrow [0,1]$,在状态 $s$ 下以概率分布 $\pi(a|s)$ 选择动作 $a$。随机性策略对于处理不确定性、促进探索至关重要。
5. 价值 (Value):价值函数用于评估状态或状态-动作对的长期优劣,是克服奖励信号稀疏性和延迟性的关键工具。
- **状态价值函数** $V^\pi(s)$:在策略 $\pi$ 下,从状态 $s$ 开始所能获得的期望累积折扣奖励。$V^\pi(s) = \mathbb{E}_\pi[ G_t | s_t = s ]$。
- **动作价值函数** $Q^\pi(s, a)$:在状态 $s$ 下先执行动作 $a$,然后遵循策略 $\pi$,所能获得的期望累积折扣奖励。$Q^\pi(s, a) = \mathbb{E}_\pi[ G_t | s_t = s, a_t = a ]$。
最优价值函数 $V^*(s)$ 和 $Q^*(s, a)$ 则定义为所有策略中能获得的最大期望累积折扣奖励。一旦知晓最优动作价值函数 $Q^*$,最优策略即为 $\pi^*(s) = \arg\max_a Q^*(s, a)$。价值函数是连接即时奖励与长期目标的桥梁,也是许多经典算法(如Q-learning、SARSA)的直接优化目标。
1.3 网格世界迷宫:探索-利用困境的直观舞台
为了将上述抽象概念落地,我们引入一个经典的强化学习测试平台:网格世界(Grid World)。假设我们有一个 $N \times M$ 的二维网格,每个格子是一个状态。智能体(如一个机器人)位于某个起点格子。网格中存在:
- **普通格子**:通过时不产生奖励(或产生微小的负奖励,如 $-0.01$,鼓励尽快完成任务)。
- **目标格子(终点)**:进入后任务成功,获得一个大的正奖励(如 $+10$),并终止本轮交互。
- **陷阱格子(深渊)**:进入后获得大的负奖励(如 $-10$),并终止本轮交互。
- **障碍物格子**:不可进入。
智能体在每个非终止状态,可以选择上、下、左、右四个动作之一(动作空间 $\mathcal{A} = \{\uparrow, \downarrow, \leftarrow, \rightarrow\}$)。执行动作后,环境以概率 $p$ 按预定方向移动智能体,以概率 $1-p$ 随机滑动到其他三个方向之一(模拟环境不确定性)。智能体的目标是学习一个策略,从任意起点出发,以最高概率避开陷阱,抵达目标。
这个简单框架蕴含了强化学习的核心挑战:
1. 信用分配:如果智能体在走了10步后终于抵达目标并获得 $+10$ 奖励,这 $+10$ 应该“归功于”哪一步?是最后一步,还是最初选择正确方向的某一步?每一步的贡献需要被追溯和分配。 2. 探索-利用困境:这是网格世界中最直观的体现。
- **利用 (Exploitation)**:假设智能体已经发现一条从起点到目标的“安全路径”(例如,先向右走3步,再向下走2步)。为了最大化即时奖励(或避免陷阱),它应该反复选择这条已知的、可靠的道路。这是“利用”现有知识。
- **探索 (Exploration)**:但这条路径是否是最优的?是否存在更短、更安全的路径?或者,网格中是否还有其他未被发现的路径(例如,绕过一个隐藏的陷阱)?为了发现这些可能带来更高长期收益的新信息,智能体必须**偶尔**尝试一些非当前最优的动作,即使这些动作在短期内可能导致它掉入陷阱(获得负奖励)或走弯路。
- **困境**:过度利用,智能体可能陷入局部最优,永远发现不了全局最优路径;过度探索,则可能浪费大量步数在已知的差路径上,导致累积奖励低下。如何在两者间取得平衡,是强化学习算法设计的核心艺术。简单的 $\epsilon$-贪婪策略(以概率 $\epsilon$ 随机探索,以概率 $1-\epsilon$ 选择当前认为最优的动作)是最直观的尝试,但 $\epsilon$ 的设置本身就是一个难题。
3. 延迟奖励:奖励仅在终点或陷阱处才发生。在漫长的路径上,中间步骤的奖励为零或微小的负值。智能体必须学会“忍受”暂时的无奖励或负奖励,为了最终的大的正奖励。这要求智能体具备“远见”,即通过价值函数来评估中间状态对未来收益的贡献。
1.3.1 网格世界环境代码框架(Python)
下面提供一个简洁但功能完整的网格世界环境类 `GridWorld` 的实现。它遵循 OpenAI Gym 的经典接口(`reset`, `step`),便于后续与各种标准算法对接。代码中包含了详细的注释,以阐明状态、动作、奖励和状态转移的细节。
```python import numpy as np from typing import Tuple, Dict, List
class GridWorld: """ 一个带有滑动不确定性的网格世界环境。 状态用 (row, col) 元组表示,动作是离散的 0:上, 1:右, 2:下, 3:左。 """ def __init__(self, size: Tuple[int, int] = (5, 5), start: Tuple[int, int] = (0, 0), goal: Tuple[int, int] = (4, 4), traps: List[Tuple[int, int]] = [(1, 1), (2, 2), (3, 3)], walls: List[Tuple[int, int]] = [], slip_prob: float = 0.2, step_reward: float = -0.01, goal_reward: float = 10.0, trap_reward: float = -10.0): """ 初始化环境。 Args: size: 网格大小 (行数, 列数) start: 起点坐标 goal: 目标点坐标 traps: 陷阱点坐标列表 walls: 障碍物坐标列表 slip_prob: 动作执行时的滑动概率。执行意图方向概率为 1-slip_prob, 剩余概率均分给其他三个方向。 step_reward: 每走一步的奖励(通常为负,鼓励快速完成) goal_reward: 到达目标的奖励 trap_reward: 掉入陷阱的奖励 """ self.rows, self.cols = size self.start = start self.goal = goal self.traps = set(traps) self.walls = set(walls) self.slip_prob = slip_prob self.step_reward = step_reward self.goal_reward = goal_reward self.trap_reward = trap_reward
动作定义: 0:上, 1:右, 2:下, 3:左
self.actions = [0, 1, 2, 3] self.action_deltas = {0: (-1, 0), 1: (0, 1), 2: (1, 0), 3: (0, -1)}
状态空间是所有非墙格子的集合
self.state_space = [(r, c) for r in range(self.rows) for c in range(self.cols) if (r, c) not in self.walls] self.n_states = len(self.state_space)
当前状态
self.state = None
预计算状态转移概率和奖励,以加速查询(可选,对于小网格)
self.P = self._build_transition_probabilities()
def _build_transition_probabilities(self) -> Dict: """ 构建状态转移概率字典。 结构: P[s][a] = [(prob, next_state, reward, done), ...] """ P = {} for s in self.state_space: P[s] = {} for a in self.actions: P[s][a] = []
考虑滑动:以 (1-slip_prob) 概率执行意图方向 a
以 slip_prob 概率随机滑到其他三个方向
intended_delta = self.action_deltas[a] next_states_intended = self._get_next_state(s, intended_delta)
意图方向的结果(可能因撞墙而停留)
for next_s_intended in next_states_intended: prob_intended = 1.0 - self.slip_prob reward_intended, done_intended = se