Skip to content

元数据卡

  • 前置知识:ch01 搜索、ch02 概率推理、Vol 10 动态规划
  • 预计时间:50 分钟
  • 核心难度:进阶
  • 阅读模式:高度专注
  • 完成标志:能用 MDP 建模决策问题,实现 Q-Learning 和 Policy Gradient

你的进度

你在模型工坊里搭了两套系统:一套会搜索,一套会推理。但阿花又来信了:

“你那些系统都是别人告诉它答案它才学的。现实中哪有人一直告诉你答案?”

你看向工坊深处——那里有第三张工作台,上面写着:“只有反馈,没有答案。”

你的任务

强化学习是智能体在环境中通过奖励信号学习决策策略的框架。你从马尔可夫决策过程(MDP)的数学建模开始,然后实现两种核心方法:基于价值的 Q-Learning 和基于策略的 Policy Gradient。

本章分层

  • 必读:MDP 建模、Q-Learning、epsilon-greedy 探索
  • 选读:Policy Gradient 与 REINFORCE 算法
  • 进阶:Actor-Critic 方法、深度 Q 网络

破局 · 溯源

想象你设计了一个自动走迷宫的机器人。你没有给一一标注每步"正确"或"错误"——你只告诉它:"在终点拿到 100 分,每走一步 -1 分。"

现在它要在试错中找到最优路线。这比 BFS 问题难在哪里?第一,环境可能随机(风会把机器人吹偏);第二,它没有完整的地图(环境是未知的)。

强化学习的框架就是为这种设定准备的三元组:(状态 s, 动作 a, 奖励 r)。

马尔可夫决策过程

MDP 是强化学习的数学基础。它假设未来只依赖当前状态(马尔可夫性),用以下元素描述:

(S, A, P, R, gamma)
- S: 所有可能状态的集合
- A: 每个状态下可用的动作
- P(s'|s,a): 状态转移概率
- R(s,a,s'): 即时奖励函数
- gamma: 折扣因子(0~1),控制对长期奖励的重视程度

目标是找到一个策略 π(a|s),使期望累计折扣奖励最大。

价值函数 V*(s) 表示在状态 s 下的最优期望回报。贝尔曼方程给出了递归定义:

V*(s) = max_a sum_{s'} P(s'|s,a) [R(s,a,s') + gamma * V*(s')]

Q-Learning

Q-Learning 是一个无模型(model-free)算法——它不显式学 P(s'|s,a),而是直接学习每个状态-动作对的价值 Q(s,a)。

python
import numpy as np

class QLearning:
    def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.9, epsilon=0.1):
        self.Q = np.zeros((n_states, n_actions))
        self.alpha = alpha    # 学习率
        self.gamma = gamma    # 折扣因子
        self.epsilon = epsilon  # 探索率

    def act(self, state):
        """epsilon-greedy 策略"""
        if np.random.random() < self.epsilon:
            return np.random.randint(self.Q.shape[1])
        return np.argmax(self.Q[state])

    def update(self, state, action, reward, next_state):
        """Q 值更新:Q(s,a) += alpha * (r + gamma * max_a' Q(s',a') - Q(s,a))"""
        best_next = np.max(self.Q[next_state])
        td_target = reward + self.gamma * best_next
        td_error = td_target - self.Q[state][action]
        self.Q[state][action] += self.alpha * td_error

核心洞察:Q-Learning 是 off-policy 算法——它用贪心策略(max_a' Q(s',a'))来评估下一步的价值,但实际执行的是 epsilon-greedy 策略。这让它在探索(尝试新动作)和利用(执行已知最优点)之间找到平衡。

在经典的"冰湖"环境中测试(4x4 网格,从 S 到 G,避开 H):

S  .  .  .
.  H  .  H
.  .  .  H
H  .  .  G

经过几千轮训练,Q 表收敛:智能体学会了滑向终点而避开冰洞。

Policy Gradient

Q-Learning 学到的是状态-动作值函数,然后从中导出策略。Policy Gradient 直接学习策略参数 θ,用梯度上升最大化期望回报。

REINFORCE 算法是最简单的方法:

python
class REINFORCE:
    def __init__(self, n_states, n_actions, lr=0.01):
        # 用一个简单线性策略:P(a|s) = softmax(s * W + b)
        self.W = np.random.randn(n_states, n_actions) * 0.01
        self.b = np.zeros(n_actions)
        self.lr = lr

    def policy(self, state):
        logits = state @ self.W + self.b
        exp_logits = np.exp(logits - np.max(logits))
        return exp_logits / exp_logits.sum()

    def act(self, state):
        probs = self.policy(state)
        return np.random.choice(len(probs), p=probs)

    def update(self, trajectory):
        """用整条轨迹的回报更新策略参数"""
        states, actions, rewards = zip(*trajectory)
        # 计算折扣回报 G_t
        G = np.zeros(len(rewards))
        running = 0
        for t in reversed(range(len(rewards))):
            running = rewards[t] + self.gamma * running
            G[t] = running

        for t in range(len(states)):
            probs = self.policy(states[t])
            # 策略梯度的近似:grad = G_t * grad(log pi(a_t|s_t))
            d_log = probs.copy()
            d_log[actions[t]] -= 1  # 对 cross-entropy 的梯度
            grad = np.outer(states[t], d_log) * G[t]
            self.W += self.lr * grad

Policy Gradient 的直接优势:可以学习随机策略(在石头剪刀布里很有用),天然处理连续动作空间,用神经网络参数化也很自然。

常见陷阱

  • Q-Learning 的 Q 表在状态空间连续时立刻失效——需要函数近似(深度 Q 网络)。
  • epsilon 衰减太慢导致收敛慢,太快则陷入局部最优。建议从 1.0 指数级衰减到 0.01。
  • REINFORCE 的方差很大:同一策略在不同轨迹上跑出来的回报差异巨大。解决方法有基线(减去平均回报)和 Advantage 函数。
  • 奖励设计是强化学习的隐藏工程——稀疏奖励(只在终点给分)几乎没法学,需要奖励塑形(给中间步骤小奖励)。
  • 折扣因子 gamma 接近 1 时考虑长远回报但收敛慢;接近 0 时只顾眼前,适合"每一步独立"的场景。

通关挑战

  • 热身(15 分钟):在 3x3 网格上手动推导 Q-Learning 的贝尔曼更新过程。起点 (0,0),终点 (2,2),奖励终点+10,每步-1。
  • 挑战(40 分钟):实现一个 CartPole 的 Q-Learning 求解器。注意需要离散化连续状态空间(把角度、位置离散成几个桶)。
  • 观察:运行 Q-Learning 时打印 epsilon 值和平均每回合回报,观察探索和利用的切换过程。

旅人笔记

强化学习跳出"数据驱动"的最后一步——连数据本身都是从交互中采集的。MDP 建模、Q-value 迭代、策略梯度,三层递进,从表格到函数近似,从离散到连续。

-> 下一站预告

搜索、推理、强化学习构成了"经典 AI"的三大支柱。但从下一章开始,主角换成"数据"——机器学习登场。

Built with VitePress | Software Systems Atlas