为什么需要强化学习?

你已经熟悉监督学习:给一堆 (输入, 标签),模型学会从输入预测标签。但现实里很多问题没有标签——

  • 下棋:没有标准答案,只有「赢了 / 输了」这个延迟的反馈
  • 自动驾驶:没有「正确操作」的标注,目标是「安全到达」
  • 游戏 AI:目标是「通关」,但每一步该走哪没有现成答案

这类问题的共同特征是 「序列决策 + 延迟奖励」:智能体(Agent)在环境中连续做出决策,影响未来状态,最终获得奖励。这就是强化学习(Reinforcement Learning, RL) 要解决的问题。

💡 一句话直觉:强化学习就是让 AI 在试错中学会做事,通过奖励信号自己摸索出最优策略。


一、核心概念:MDP 五元组

强化学习问题通常被建模为马尔可夫决策过程(Markov Decision Process, MDP)。一个 MDP 由五个要素定义:

符号名称含义
$S$状态空间 State Space所有可能的环境状态集合
$A$动作空间 Action Space智能体能采取的所有动作
$P(s’|s,a)$转移概率 Transition在状态 $s$ 执行动作 $a$ 后,转移到 $s’$ 的概率
$R(s,a)$奖励函数 Reward在状态 $s$ 执行动作 $a$ 获得的即时奖励
$\gamma$折扣因子 Discount未来奖励的折扣率,取值 $[0,1]$

「马尔可夫」性质的意思是:下一个状态 $s’$ 只依赖于当前状态 $s$ 和动作 $a$,与历史无关。也就是:

$$P(s_{t+1} \mid s_t, a_t, s_{t-1}, a_{t-1}, \dots) = P(s_{t+1} \mid s_t, a_t)$$

这个假设极大简化了问题——我们不需要记住全部历史,只需关注「当前状态」即可决策。


二、目标:最大化累积奖励

强化学习的目标是找到一个策略(Policy) $\pi$——一个从状态到动作的映射 $\pi: S \to A$,使得累积奖励的期望最大化

由于未来的奖励不如眼前的奖励「值钱」(今天的 100 块比明天的 100 块有价值),我们引入折扣因子 $\gamma \in [0,1]$,定义回报(Return) $G_t$:

$$G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}$$

  • $\gamma = 0$:只看眼前,目光短浅
  • $\gamma = 1$:对未来一视同仁,可能不收敛
  • 实践中常取 $\gamma = 0.9 \sim 0.99$

我们的终极目标是求最优策略 $\pi^*$,使得期望回报最大:

$$\pi^* = \arg\max_\pi \mathbb{E}\left[\sum_{k=0}^{\infty} \gamma^k R_{t+k+1} \right]$$


三、价值函数:衡量「一个状态有多好」

直接求 $\pi^*$ 太抽象,我们需要更具体的工具——价值函数

状态价值函数 $V^\pi(s)$

在策略 $\pi$ 下,从状态 $s$ 出发的期望回报:

$$V^\pi(s) = \mathbb{E}_\pi \left[ G_t \mid S_t = s \right]$$

动作价值函数 $Q^\pi(s,a)$

在策略 $\pi$ 下,从状态 $s$ 执行动作 $a$ 后的期望回报:

$$Q^\pi(s,a) = \mathbb{E}_\pi \left[ G_t \mid S_t = s, A_t = a \right]$$

两者的关系很直观——状态价值是该状态下所有动作价值的(按策略加权的)平均:

$$V^\pi(s) = \sum_a \pi(a \mid s) , Q^\pi(s,a)$$

💡 直觉:$V(s)$ 告诉你「站在这里有多好」,$Q(s,a)$ 告诉你「站在这里做某个动作有多好」。后者信息更丰富,是大多数 RL 算法的核心。


四、贝尔曼方程:RL 的基石

价值函数满足一个优美的递推关系——贝尔曼方程(Bellman Equation)。它把「当前状态的价值」和「下一状态的价值」联系起来。

$V$ 的贝尔曼方程

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

直觉:当前状态的价值 = 所有动作的(即时奖励 + 折扣后的下一状态价值)的期望。

$Q$ 的贝尔曼方程

$$Q^\pi(s,a) = \sum_{s’} P(s’ \mid s,a) \left[ R(s,a) + \gamma \sum_{a’} \pi(a’ \mid s’) Q^\pi(s’,a’) \right]$$

贝尔曼最优方程

对于最优价值函数 $V^$ 和 $Q^$,动作选择不再是「按策略加权」,而是「直接取最大」:

$$Q^(s,a) = \sum_{s’} P(s’ \mid s,a) \left[ R(s,a) + \gamma \max_{a’} Q^(s’,a’) \right]$$

这就是整个 RL 的核心——只要能求出 $Q^*$,最优策略就是每个状态下选 $Q$ 值最大的动作:

$$\pi^(s) = \arg\max_a Q^(s,a)$$


五、Q-Learning:无模型学习的经典算法

现实中,转移概率 $P$ 和奖励函数 $R$ 往往未知(称为 model-free 场景),我们只能通过与环境的交互来学习。Q-Learning 是最经典的解法。

核心思想

维护一个 Q 表(表格化的 $Q(s,a)$),通过与环境的交互不断更新它,最终收敛到 $Q^*$。

更新规则

$$Q(s,a) \leftarrow Q(s,a) + \alpha \left[ r + \gamma \max_{a’} Q(s’,a’) - Q(s,a) \right]$$

其中:

  • $\alpha \in (0,1]$ 是学习率
  • $r + \gamma \max_{a’} Q(s’,a’)$ 是TD Target(时序差分目标)
  • $\delta = r + \gamma \max_{a’} Q(s’,a’) - Q(s,a)$ 是TD Error

直觉:用「实际经验」$(r, s’)$ 算出的新估计,去修正旧的 $Q(s,a)$,每次朝目标靠近一点点。

探索与利用(Exploration vs. Exploitation)

Q-Learning 用 $\varepsilon$-greedy 策略平衡探索与利用:

  • 以概率 $\varepsilon$:随机选动作(探索,避免陷入局部最优)
  • 以概率 $1-\varepsilon$:选 $Q$ 值最大的动作(利用已知信息)

通常 $\varepsilon$ 从 1.0 衰减到 0.1,前期多探索,后期多利用。


六、代码示例:Q-Learning 走迷宫

下面用一个最经典的例子——网格世界(GridWorld)走迷宫——展示 Q-Learning 的完整流程。智能体从起点走到终点,避开陷阱。

import numpy as np
import random

# 网格世界:4x4
# S = 起点, G = 终点(+1), X = 陷阱(-1)
# . = 普通格子(0)
grid = [
    ['S', '.', '.', 'X'],
    ['.', 'X', '.', '.'],
    ['.', '.', '.', 'X'],
    ['X', '.', '.', 'G'],
]
N = 4
ACTIONS = ['up', 'down', 'left', 'right']

def get_reward(cell):
    if cell == 'G': return 1.0       # 到达终点,正向奖励
    if cell == 'X': return -1.0      # 踩到陷阱,负向奖励
    return -0.01                     # 普通格子,小惩罚(鼓励尽快到达)

def is_terminal(cell):
    return cell in ('G', 'X')

def step(state, action):
    """执行动作,返回 (next_state, reward, done)"""
    r, c = state
    if   action == 'up':    r = max(0, r - 1)
    elif action == 'down':  r = min(N - 1, r + 1)
    elif action == 'left':  c = max(0, c - 1)
    elif action == 'right': c = min(N - 1, c + 1)
    next_state = (r, c)
    cell = grid[r][c]
    return next_state, get_reward(cell), is_terminal(cell)

# Q 表:state -> action -> value
Q = {}
def q_value(state, action):
    return Q.setdefault(state, {}).setdefault(action, 0.0)

# === Q-Learning 训练 ===
alpha, gamma, epsilon = 0.1, 0.95, 1.0
EPISODES = 2000

for ep in range(EPISODES):
    state = (0, 0)  # 起点 S
    done = False
    while not done:
        # ε-greedy 选动作
        if random.random() < epsilon:
            action = random.choice(ACTIONS)        # 探索
        else:
            action = max(ACTIONS, key=lambda a: q_value(state, a))  # 利用

        next_state, reward, done = step(state, action)

        # Q-Learning 更新
        td_target = reward + gamma * max(
            (q_value(next_state, a) for a in ACTIONS), default=0.0
        )
        Q.setdefault(state, {})[action] += alpha * (td_target - q_value(state, action))

        state = next_state

    # epsilon 衰减:从探索逐渐转向利用
    epsilon = max(0.1, epsilon * 0.995)

# === 提取学到的最优策略 ===
print("学到的最优策略:")
arrows = {'up': '↑', 'down': '↓', 'left': '←', 'right': '→'}
for r in range(N):
    row = []
    for c in range(N):
        cell = grid[r][c]
        if cell in ('G', 'X', 'S'):
            row.append(f' {cell} ')
        else:
            best = max(ACTIONS, key=lambda a: q_value((r, c), a))
            row.append(f' {arrows[best]} ')
    print(''.join(row))

运行后,你会看到智能体学到的路径——它会绕开陷阱、走向终点,即使我们从未告诉它「该怎么走」。


七、从 Q-Learning 到深度强化学习

Q-Learning 的致命限制:Q 表无法应对大状态空间。国际象棋有 $10^{47}$ 个状态,围棋有 $10^{170}$ 个——表格根本存不下。

解决思路很自然:用神经网络近似 $Q$ 函数 $Q_\theta(s,a)$,这就是 DQN(Deep Q-Network),DeepMind 用它让 AI 第一次在 Atari 游戏上达到人类水平。

DQN 的关键创新:

  1. 经验回放(Experience Replay):把交互数据存进缓冲区,随机采样训练,打破数据相关性
  2. 目标网络(Target Network):用单独的网络计算 TD Target,稳定训练

再往后,RL 家族不断演化:

类别代表算法特点
基于价值DQN, Rainbow学习 $Q$ 函数
策略梯度REINFORCE, A2C, A3C直接优化策略 $\pi_\theta$
Actor-CriticPPO, SAC结合价值与策略,当前主流
AlphaGo/ZeroMCTS + RL蒙特卡洛树搜索 + 自我博弈

八、写在最后

强化学习的美妙之处在于:它用一套统一的数学框架(贝尔曼方程 + 价值函数),描述了「如何在没有老师的情况下,通过试错学会做事」。这或许是最接近「智能本质」的学习范式。

本文梳理了从直觉到 Q-Learning 的核心脉络:

  1. MDP 建模问题
  2. 价值函数 衡量好坏
  3. 贝尔曼方程 给出递推关系
  4. Q-Learning 实现无模型学习
  5. DQN 用深度网络扩展到大状态空间

建议的下一步学习路径:

  • 📖 Sutton & Barto《Reinforcement Learning: An Introduction》(RL 圣经,免费 PDF)
  • 🎮 OpenAI Gym / Gymnasium —— 跑各种 RL 环境的标准工具
  • 🧪 Stable Baselines3 —— 开箱即用的 RL 算法实现(PPO/SAC 等)
  • 🏆 从简单环境(CartPole)开始,逐步挑战复杂任务

下一篇会写策略梯度方法,聊聊为什么「直接优化策略」在某些场景下比价值方法更强大。

Happy learning! 🚀