系列 · 强化学习 · 第 1 篇

强化学习(一):基础与核心概念

用骑自行车的类比把强化学习从零讲清楚:MDP、Bellman 方程、动态规划、蒙特卡洛、时序差分(TD),附带可直接运行的 Python 代码。

第一次骑自行车时,没人会给你一本手册,上面写着“倾角超过 7.4 度时,反向打方向 12%”。你只能自己摸索:晃一下、过调一下、摔倒、爬起来再试。几百次尝试后,身体自然就掌握了骑车的技巧,尽管你可能说不清具体原因。

这种试错—反馈—改进的循环,不仅是学骑车的方式,也是 AlphaGo 击败围棋世界冠军、Boston Dynamics 机器人学会走路、推荐系统在每次点击后悄悄优化的核心机制。它们都基于同一个数学框架:强化学习(Reinforcement Learning,RL)。

这篇文章从零开始搭建 RL 的基础。我会用骑自行车作为贯穿全文的例子,把每个直观感受转化为现代 RL 算法背后的数学原理。

强化学习(一):基础与核心概念 — 章节概览图


你将学到什么#

  • 马尔可夫决策过程(MDP)——RL 问题的数学骨架
  • Bellman 方程:为什么它让价值函数变得可解
  • 动态规划:规则已知时解决环境问题的方法
  • 蒙特卡洛方法:完全从经验中学习
  • 时序差分(TD)学习:连接 DP 和 MC 的桥梁,支撑了 DQN、PPO 等算法
  • 每种方法都有能直接运行的 Python 实现,在你的笔记本上就能跑

前置知识:懂点概率基础,会一点 Python;熟悉监督学习有帮助,但不是必须的。


自行车回路#

智能体与环境构成一个闭合回路

想象一下,你第一次骑上自行车。每一瞬间,三件事在快速循环:

  1. 观察:车身倾斜角度、当前速度、路边的位置。
  2. 行动:稍微倾斜身体、轻轻转动车把、踩动踏板。
  3. 反馈:车子可能稳住,可能继续倾斜,也可能直接把你摔在地上。

第三步给你一个信号——保持平衡时是小小的奖励,摔倒时是狠狠的惩罚。经过多次尝试,大脑逐渐形成一套策略:从“我现在感知到什么”到“我接下来该做什么”的映射。这套策略不会被明确写出来,而是通过这个循环内化为你的反射行为。

强化学习就是用数学形式描述这个循环。图中的“你”叫智能体(agent),自行车和路面是环境(environment),倾斜和转向是动作(action),倾斜角度和速度是状态(state),不摔倒的感觉是奖励(reward)。后文的内容,本质上都是对图中各要素的精细化建模。


马尔可夫决策过程:数学基础#

强化学习(一):基础与核心概念 — 章节小结图

三状态自行车 MDP 的小例子

$$\langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle.$$

上面的图特意画得很简单:只有三个状态(平衡摇晃摔倒),几个动作,转移概率和奖励直接标在边上。所有实际的强化学习问题——机器人控制、围棋、大模型微调——本质上都是这个结构的扩展版本。

五个核心要素#

状态空间 $\mathcal{S}$ :智能体可能处于的所有情况。比如骑自行车时的状态包括倾角、角速度、车速、路面曲率。状态可以是离散的(如棋盘上的位置)或连续的(如机器人的关节角度)。

动作空间 $\mathcal{A}$ :智能体能执行的所有操作。可以是离散的(例如 {左倾、右倾、保持}),也可以是连续的(例如给把手施加 0.37 N·m 的扭矩)。

$$P(s' \mid s, a) = \Pr(S_{t+1} = s' \mid S_t = s, A_t = a),\qquad \sum_{s'} P(s' \mid s, a) = 1.$$

现实世界充满不确定性:一阵风、一颗石子、踩踏时的一点不均匀,都可能导致不同的下一状态。转移概率把这些不确定性全部包含在内。

奖励函数 $R(s, a, s')$ :从状态 $s$ 执行动作 $a$ 转移到状态 $s'$ 后获得的即时奖励。奖励是智能体唯一的学习信号。如果设计得不好,智能体会优化错误的目标,这就是所谓的“奖励漏洞”(reward hacking)。

折扣因子 $\gamma \in [0, 1)$ :智能体对未来奖励与即时奖励的重视程度。后面会看到,这不仅仅是让公式收敛的小技巧。

马尔可夫性质#

$$P(S_{t+1} \mid S_t, A_t, S_{t-1}, A_{t-1}, \ldots) = P(S_{t+1} \mid S_t, A_t).$$

对自行车来说,这似乎有点可疑——上一刻的倾斜方向难道不重要吗?确实重要,但解决方法是把历史信息“折叠”到状态中。如果把状态从单纯的“倾角”扩展为“(倾角,角速度,车速)”,马尔可夫性质就成立了。DeepMind 在 Atari 游戏中把最近 4 帧画面堆叠成状态,也是基于同样的考虑。

策略:从状态到动作#

策略 $\pi$ 是智能体的行为准则,它将观测映射为决策:

  • 确定性策略$a = \pi(s)$ 。同一状态下总是选择相同动作。
  • 随机性策略$\pi(a \mid s) = \Pr(A_t = a \mid S_t = s)$ 。给出动作的概率分布。

随机性策略有两个重要作用:一是让智能体能够探索新行为;二是神经网络的自然输出形式(例如动作上的 softmax 分布)。

回报与价值函数#

$$G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots = \sum_{k=0}^{\infty} \gamma^k r_{t+k}.$$

为什么要引入折扣?有三个独立的理由支持这一点:

  • 数学层面:当 $|r| \le R_{\max}$ 时,几何级数保证了回报有限,$|G_t| \le R_{\max} / (1 - \gamma)$ 。否则,无限视界任务会导致回报爆炸。
  • 认知层面:今天的奖励比明天的同等奖励更有价值——因为未来充满不确定性。
  • 工程层面:没有折扣因子,智能体可能会永远什么都不做,却声称自己获得了无穷回报。折扣因子迫使它尽快行动。
$$V^\pi(s) = \mathbb{E}_\pi[G_t \mid S_t = s], \qquad Q^\pi(s, a) = \mathbb{E}_\pi[G_t \mid S_t = s, A_t = a].$$ $$V^\pi(s) = \sum_a \pi(a \mid s) \, Q^\pi(s, a),\qquad Q^\pi(s, a) = \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V^\pi(s')\right].$$

Bellman 方程:强化学习的核心递归#

Bellman 备份树:今天的价值由明天的价值递推

价值函数有一个优雅的递归结构。这是整个强化学习理论中最重要的一点——一旦理解了它,后续所有算法都会显得像是同一个主题的不同变奏。

$$V^\pi(s) = \sum_a \pi(a \mid s) \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V^\pi(s')\right].$$

用语言描述就是:当前状态的价值 = 即时奖励的期望 + 下一状态价值的折扣期望。上图正是这个方程的可视化——根节点是当前状态,中间层是按策略 $\pi$ 加权的动作,叶子节点是按转移概率 $P$ 加权的下一状态,奖励则标注在边上。

$$V^*(s) = \max_a \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V^*(s')\right],$$ $$Q^*(s, a) = \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma \max_{a'} Q^*(s', a')\right].$$ $$\pi^*(s) = \arg\max_{a} Q^*(s, a).$$

数值例子#

来看一个简单的两状态 MDP,状态集为 $\{s_1, s_2\}$ ,只有一个动作 $a_1$ 永远被选中,折扣因子 $\gamma = 0.9$

状态动作下一状态概率奖励
$s_1$$a_1$$s_1$0.55
$s_1$$a_1$$s_2$0.510
$s_2$$a_1$$s_1$0.72
$s_2$$a_1$$s_2$0.38
$$V(s_1) = 0.5\,[5 + 0.9 V(s_1)] + 0.5\,[10 + 0.9 V(s_2)],$$ $$V(s_2) = 0.7\,[2 + 0.9 V(s_1)] + 0.3\,[8 + 0.9 V(s_2)].$$ $$0.55\,V(s_1) - 0.45\,V(s_2) = 7.5,\qquad -0.63\,V(s_1) + 0.73\,V(s_2) = 3.8,$$

解得 $V(s_1) \approx 52.3$$V(s_2) \approx 50.4$ 。数值这么大是因为奖励会持续累加,而折扣因子接近 1——这就是几何级数效应的作用。

动态规划:规则已知时的选择#

如果环境模型 $P$$R$ 完全已知,动态规划(DP) 可以精确计算出最优策略。没有采样误差,也没有噪声,只需对 Bellman 方程进行确定性迭代。

策略评估#

$$V_{k+1}(s) = \sum_a \pi(a \mid s) \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V_k(s')\right].$$

$V_0 \equiv 0$ 开始迭代。Bellman 算子在 sup-norm 下是 $\gamma$ -压缩映射,因此 $V_k$ 会以指数速度收敛到 $V^\pi$

策略改进#

$$\pi'(s) = \arg\max_{a} \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V^\pi(s')\right].$$

策略改进定理保证,对于每个状态 $s$ ,都有 $V^{\pi'}(s) \ge V^\pi(s)$ 。只要价值函数正确,“更贪心”不会让结果变差。

策略迭代#

将上述两步交替进行:

  1. 随便初始化一个策略 $\pi_0$
  2. 评估:计算 $V^{\pi_k}$
  3. 改进:生成贪心策略 $\pi_{k+1}$
  4. 如果 $\pi_{k+1} = \pi_k$ ,停止——已经找到不动点,这就是最优策略。

价值迭代#

$$V_{k+1}(s) = \max_a \sum_{s'} P(s' \mid s, a)\!\left[R(s, a, s') + \gamma V_k(s')\right].$$

每次扫描都会把误差压缩 $\gamma$ 倍。下图展示了一个小网格世界中收敛后的价值函数和对应的贪心策略。

网格世界上的价值热力图与贪心策略

这两幅图是同一个答案的两面:热力图告诉你“这里有多好?”,箭头告诉你“下一步该往哪走?”。箭头总是指向热力图上更亮的方向,这正是“对 $V$ 贪心”的几何意义。

代码:用价值迭代解 GridWorld#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import numpy as np

class GridWorld:
    """智能体从起点走到终点;障碍格不可通过。"""

    def __init__(self, grid_size=(5, 5), start=(0, 0),
                 goal=(4, 4), obstacles=None):
        self.height, self.width = grid_size
        self.start = start
        self.goal = goal
        self.obstacles = set(obstacles or [])
        self.actions = [0, 1, 2, 3]                        # 上下左右
        self.action_names = ['U', 'D', 'L', 'R']
        self.action_deltas = {0: (-1, 0), 1: (1, 0),
                              2: (0, -1), 3: (0, 1)}
        self.reset()

    def reset(self):
        self.state = self.start
        return self.state

    def step(self, action):
        dr, dc = self.action_deltas[action]
        nr, nc = self.state[0] + dr, self.state[1] + dc
        if (0 <= nr < self.height and 0 <= nc < self.width
                and (nr, nc) not in self.obstacles):
            self.state = (nr, nc)
        if self.state == self.goal:
            return self.state, 10.0, True
        return self.state, -1.0, False

    def get_transitions(self, state, action):
        """确定性转移,返回 [(下一状态, 概率, 奖励)]。"""
        old = self.state
        self.state = state
        ns, r, _ = self.step(action)
        self.state = old
        return [(ns, 1.0, r)]

def value_iteration(env, gamma=0.9, theta=1e-6):
    """通过反复 max 备份求解 Bellman 最优方程。"""
    V = np.zeros((env.height, env.width))
    for iteration in range(1000):
        delta = 0
        for r in range(env.height):
            for c in range(env.width):
                s = (r, c)
                if s == env.goal or s in env.obstacles:
                    continue
                old_v = V[r, c]
                V[r, c] = max(
                    sum(p * (rew + gamma * V[ns])
                        for ns, p, rew in env.get_transitions(s, a))
                    for a in env.actions
                )
                delta = max(delta, abs(old_v - V[r, c]))
        if delta < theta:
            print(f"第 {iteration + 1} 次扫描后收敛")
            break

    policy = np.zeros((env.height, env.width), dtype=int)
    for r in range(env.height):
        for c in range(env.width):
            s = (r, c)
            if s == env.goal or s in env.obstacles:
                continue
            q = [sum(p * (rew + gamma * V[ns])
                     for ns, p, rew in env.get_transitions(s, a))
                 for a in env.actions]
            policy[r, c] = int(np.argmax(q))
    return V, policy

env = GridWorld(grid_size=(5, 5), start=(0, 0), goal=(4, 4),
                obstacles=[(1, 1), (2, 2), (3, 1)])
V, policy = value_iteration(env)
print(np.round(V, 1))

DP 精确且优雅,但有两个致命缺陷。一是需要环境模型——现实中很少能拿到 $P$$R$ 的解析形式。二是每次迭代都要遍历整个状态空间——当状态是 Atari 的 $84 \times 84$ 像素帧时,根本无法承受。接下来两节分别解决这两个问题。

蒙特卡洛方法:无模型学习#

如果不知道 $P$$R$ ,那就只能从经验中学习。最直接的办法也是统计学里最老的套路:多采样,求平均

核心思想#

$$V(s) \approx \frac{1}{N} \sum_{i=1}^{N} G_t^{(i)},$$

其中 $G_t^{(i)}$ 是第 $i$ 次经过状态 $s$ 时观测到的回报。当 $N \to \infty$ 时,这个估计无偏且一致。

操作流程非常简单粗暴:

  1. 从起点跑到终点,记录下 $s_0, a_0, r_0, s_1, a_1, r_1, \ldots, s_T$
  2. 对每个访问过的状态,反向计算从该点开始的回报:$G_t = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k}$
  3. 更新滑动平均。

首次访问 vs 每次访问#

一个回合里,同一个状态可能多次出现。有两种处理方式:

  • 首次访问 MC:只用第一次出现时的回报。
  • 每次访问 MC:每次出现都用。

随着回合数增加,两种方法都会收敛到 $V^\pi$ 。首次访问更容易证明无偏,教科书里通常默认用它。

MC 控制:寻找更好的策略#

$$ \pi(a \mid s) = \begin{cases} 1 - \varepsilon + \varepsilon / |\mathcal{A}|, & a = \arg\max_{a'} Q(s, a'), \\ \varepsilon / |\mathcal{A}|, & \text{其他}. \end{cases} $$

那个小小的 $\varepsilon$ 就是探索的核心——没有它,智能体可能会卡在一个平庸的动作上,永远找不到更好的。

代码:MC 评估与控制#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import numpy as np
from collections import defaultdict

def mc_policy_evaluation(env, policy_fn, num_episodes=10000, gamma=0.9):
    """首次访问 MC 策略评估。"""
    returns = defaultdict(list)
    V = defaultdict(float)
    for _ in range(num_episodes):
        trajectory, state, done = [], env.reset(), False
        while not done:
            action = policy_fn(state)
            next_state, reward, done = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        G, visited = 0.0, set()
        for state, _, reward in reversed(trajectory):
            G = reward + gamma * G
            if state not in visited:
                visited.add(state)
                returns[state].append(G)
                V[state] = float(np.mean(returns[state]))
    return V

def mc_control(env, num_episodes=10000, gamma=0.9, epsilon=0.1):
    """带 epsilon-贪心探索的同策略 MC 控制。"""
    Q = defaultdict(lambda: np.zeros(len(env.actions)))
    returns = defaultdict(list)
    for _ in range(num_episodes):
        trajectory, state, done = [], env.reset(), False
        while not done:
            if np.random.random() < epsilon:
                action = int(np.random.choice(env.actions))
            else:
                action = int(np.argmax(Q[state]))
            next_state, reward, done = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        G, visited = 0.0, set()
        for state, action, reward in reversed(trajectory):
            G = reward + gamma * G
            if (state, action) not in visited:
                visited.add((state, action))
                returns[(state, action)].append(G)
                Q[state][action] = float(np.mean(returns[(state, action)]))
    return Q

优点:无需模型,思路清晰,无偏。

缺点:必须等回合结束(非终止任务没法用),整段回报依赖一条很长的噪声轨迹,方差高,无法在线更新。


时序差分:两全其美#

三种折扣因子下的回合回报曲线

时序差分(TD)学习是现代强化学习的核心。它用一行代码把蒙特卡洛的无模型思想和动态规划的自举方法结合起来,DQN、A3C、PPO 和 SAC 都是基于它发展起来的。

TD(0):单步更新#

$$V(S_t) \leftarrow V(S_t) + \alpha\,\big[\,r_t + \gamma V(S_{t+1}) - V(S_t)\,\big].$$ $$\delta_t = r_t + \gamma V(S_{t+1}) - V(S_t).$$

它表示“刚刚发生的事”($r_t + \gamma V(S_{t+1})$ )和“我的预期”($V(S_t)$ )之间的差距。智能体会根据学习率 $\alpha$ 把估计值往实际值的方向调整。

这个规则有三个特点:

方法更新目标偏差 / 方差是否在线
蒙特卡洛$G_t$ (实际回报)无偏 / 高方差
TD(0)$r_t + \gamma V(S_{t+1})$初期有偏 / 低方差
动态规划备份$\mathbb{E}[r_t + \gamma V(S_{t+1})]$无噪声、需模型

上图展示了在一个小网格任务中,$\gamma$ 的选择如何影响 Q-Learning(一种 TD 方法)从早期训练困境中走出的速度。较小的 $\gamma$ 更关注局部信用分配,前期学得快;较大的 $\gamma$ 收敛慢,但更注重长期收益。

Sarsa:同策略 TD 控制#

$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha\,\big[\,r_t + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)\,\big].$$

它的名字直接拼出了依赖的五元组:$(S_t, A_t, R_t, S_{t+1}, A_{t+1})$

Q-Learning:离策略 TD 控制#

$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha\,\big[\,r_t + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t)\,\big].$$

一个字符的差别——$A_{t+1}$ 还是 $\max_{a'}$ ——决定了本质区别。Sarsa 评估的是当前执行的策略(同策略),而 Q-Learning 评估的是贪心策略,不管实际执行什么(离策略)。因此,Q-Learning 可以一边随机探索,一边学习最优策略。

Sarsa vs Q-Learning:悬崖行走#

经典例子是 cliff walking

1
2
S . . . . . . G
C C C C C C C C

智能体从 S 出发,目标是到达 G,如果踩到下方的悬崖 C 就会掉下去。

  • Sarsa 会考虑探索时可能掉下悬崖的风险,最终学会一条贴着上沿走的安全路线。
  • Q-Learning 评估的是从不探索的贪心策略,所以它学到的是紧贴悬崖的最短路径——但在训练过程中掉下悬崖的次数更多。

这是同策略与离策略权衡的最佳示例:Sarsa 保守,Q-Learning 渐近最优,但训练时更冒险。

TD($\lambda$ ) 与资格迹#

$$G_t^\lambda = (1 - \lambda) \sum_{n=1}^{\infty} \lambda^{n-1} G_t^{(n)},$$

其中 $G_t^{(n)}$$n$ 步回报。插值参数 $\lambda \in [0, 1]$ 在 TD(0)($\lambda = 0$ )和蒙特卡洛($\lambda = 1$ )之间平滑过渡。

$$e_t(s) = \gamma \lambda \, e_{t-1}(s) + \mathbf{1}[S_t = s], \qquad V(s) \leftarrow V(s) + \alpha \, \delta_t \, e_t(s)\quad\text{对所有 } s.$$

最近访问过的状态在奖励到来时会获得更多信用,信息一次性沿整条轨迹反向传播。

代码:Sarsa 与 Q-Learning#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np

def _eps_greedy(Q, state, actions, epsilon):
    if np.random.random() < epsilon:
        return int(np.random.choice(actions))
    return int(np.argmax(Q[state]))

def sarsa(env, num_episodes=1000, alpha=0.1, gamma=0.9, epsilon=0.1):
    """Sarsa:同策略 TD 控制。"""
    Q = {(r, c): np.zeros(len(env.actions))
         for r in range(env.height) for c in range(env.width)}
    for _ in range(num_episodes):
        state = env.reset()
        action = _eps_greedy(Q, state, env.actions, epsilon)
        done = False
        while not done:
            next_state, reward, done = env.step(action)
            next_action = _eps_greedy(Q, next_state, env.actions, epsilon)
            target = reward + gamma * Q[next_state][next_action]
            Q[state][action] += alpha * (target - Q[state][action])
            state, action = next_state, next_action
    return Q

def q_learning(env, num_episodes=1000, alpha=0.1, gamma=0.9, epsilon=0.1):
    """Q-Learning:离策略 TD 控制。"""
    Q = {(r, c): np.zeros(len(env.actions))
         for r in range(env.height) for c in range(env.width)}
    for _ in range(num_episodes):
        state, done = env.reset(), False
        while not done:
            action = _eps_greedy(Q, state, env.actions, epsilon)
            next_state, reward, done = env.step(action)
            target = reward + gamma * np.max(Q[next_state])
            Q[state][action] += alpha * (target - Q[state][action])
            state = next_state
    return Q

贯穿始终的两个主题#

上面提到的所有算法中,有两个核心概念反复出现。提前把它们拎出来,后面再遇到时就能一眼认出。

探索与利用#

10臂老虎机上不同epsilon的累积遗憾

每个学习智能体都会面临一个永恒的难题:用已知的,还是探索未知的? 如果总是选择当前认为最优的动作,可能永远发现不了更好的选项;如果一直随机尝试,学到的东西多,但收益却少得可怜。

上图展示了一个经典的 10 臂老虎机实验:每根“摇臂”是一台期望收益未知的老虎机,智能体有 1000 次拉动机会。累积遗憾是最佳摇臂的收益和实际获得收益之间的差距。

  • $\varepsilon = 0$ (纯贪心)很容易锁定在前几次“看起来不错”但其实不是最优的摇臂上——遗憾会一直线性增长。
  • $\varepsilon = 0.3$ 不断浪费机会在差的摇臂上。
  • $\varepsilon \in [0.01, 0.1]$ 则处于最佳区间。

这个权衡贯穿整个系列:DQN 中的 $\varepsilon$ -贪心、PPO 中的熵正则、第 4 篇的内在动机、贝叶斯 RL 中的 Thompson 采样……名字换了,问题没变。

折扣因子作为规划视野#

折扣因子如何控制智能体的规划视野

折扣因子 $\gamma$ 不只是一个数值旋钮,它实际上定义了智能体能“看”多远的未来。可以从两个角度理解:

  • 奖励权重(左图):$k$ 步之后的奖励折算到现在只值 $\gamma^k$ 。当 $\gamma = 0.5$ 时,10 步后的奖励连 0.1% 都不到;而 $\gamma = 0.99$ 时,仍然保留约 90% 的价值。
  • 有效视野(右图):对 $G_t$ 有显著贡献的未来步数大约是 $1 / (1 - \gamma)$ 。比如,$\gamma = 0.9$ 意味着“考虑约 10 步”,$\gamma = 0.99$ 意味着“考虑约 100 步”,$\gamma = 0.999$ 则是“考虑约 1000 步”。注意纵轴是对数刻度——将 $\gamma$ 从 0.99 调到 0.999,规划视野扩大了10 倍,而不是 1% 的小幅调整。

实际意义:$\gamma$ 需要匹配任务的时间尺度。游戏智能体通常使用 $\gamma \approx 0.99$ ;推荐系统关注用户十年级别的终身价值,可能需要更高的 $\gamma$ ;而机器人反射控制器可能只用 $\gamma = 0.9$ 甚至更低,因为超过一秒的事已经无关紧要。

选方法的门道#

一张快速参考表:

场景推荐方法理由
模型已知动态规划精确计算,不用采样
回合短、模型未知蒙特卡洛无偏估计,思路简单直接
长任务或持续任务TD(Q-Learning / Sarsa)在线更新,方差小
追求最优策略Q-Learning离策略学习,最终收敛到 $Q^*$
安全性重要Sarsa自带探索风险考量
长因果链条TD($\lambda$ ) / Sarsa($\lambda$ )资格迹加速信息传递

记住这三句话就够了

价值 = 当前奖励 + 折扣后的未来价值。

改进策略 = 优先选择高价值动作。

学习 = 根据经验调整价值估计。


总结#

本章为整个系列打下了基础:

  • MDP 把智能体和环境的交互过程形式化,包括状态、动作、转移、奖励和折扣。
  • Bellman 方程 给价值函数赋予了递归结构,把长期规划问题简化成局部计算。
  • 动态规划 在模型已知的情况下可以精确求解 MDP。
  • 蒙特卡洛方法 通过完整的回合数据,在没有模型的情况下进行学习。
  • 时序差分方法 结合了无模型和在线学习的优点,取两者之长。
  • 探索与利用折扣因子 是每个算法中都会涉及的两个关键点。

这些方法都假设状态和动作空间较小且离散,能够用表格存储每个状态对应的值。但当状态空间爆炸时——比如 Atari 游戏中的 $256^{84 \times 84}$ 种帧状态——表格法就完全失效了。

下一篇第二篇 将介绍 深度 Q 网络(DQN)。它用神经网络近似 $Q$ ,并通过经验回放和目标网络来稳定训练。这是从教科书式的强化学习迈向击败人类玩家的 Atari 算法的重要一步。


参考文献#

  • Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction (2nd ed.). MIT Press.
  • Watkins, C. J., & Dayan, P. (1992). Q-learning. Machine Learning, 8(3-4), 279-292.
  • Sutton, R. S. (1988). Learning to predict by the methods of temporal differences. Machine Learning, 3(1), 9-44.
  • Bellman, R. (1957). Dynamic Programming. Princeton University Press.
  • Silver, D. (2015). UCL Course on Reinforcement Learning.
本系列

强化学习 12 篇

  1. 01 强化学习(一):基础与核心概念 当前
  2. 02 强化学习(二):Q-Learning 与深度 Q 网络(DQN)
  3. 03 强化学习(三):Policy Gradient 与 Actor-Critic 方法
  4. 04 强化学习(四):探索策略与好奇心驱动学习
  5. 05 强化学习(五):Model-Based 强化学习与世界模型
  6. 06 强化学习(六):PPO 与 TRPO —— 信任域策略优化
  7. 07 强化学习(七):模仿学习与逆强化学习
  8. 08 强化学习(八):AlphaGo 与蒙特卡洛树搜索
  9. 09 强化学习(九):多智能体强化学习
  10. 10 强化学习(十):离线强化学习
  11. 11 强化学习(十一):层次化强化学习与元学习
  12. 12 强化学习(十二):RLHF 与大语言模型应用

读有所得?

GitHub 关注我 → 新文周更

GitHub