为什么需要强化学习?
你已经熟悉监督学习:给一堆 (输入, 标签),模型学会从输入预测标签。但现实里很多问题没有标签——
- 下棋:没有标准答案,只有「赢了 / 输了」这个延迟的反馈
- 自动驾驶:没有「正确操作」的标注,目标是「安全到达」
- 游戏 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 的关键创新:
- 经验回放(Experience Replay):把交互数据存进缓冲区,随机采样训练,打破数据相关性
- 目标网络(Target Network):用单独的网络计算 TD Target,稳定训练
再往后,RL 家族不断演化:
| 类别 | 代表算法 | 特点 |
|---|---|---|
| 基于价值 | DQN, Rainbow | 学习 $Q$ 函数 |
| 策略梯度 | REINFORCE, A2C, A3C | 直接优化策略 $\pi_\theta$ |
| Actor-Critic | PPO, SAC | 结合价值与策略,当前主流 |
| AlphaGo/Zero | MCTS + RL | 蒙特卡洛树搜索 + 自我博弈 |
八、写在最后
强化学习的美妙之处在于:它用一套统一的数学框架(贝尔曼方程 + 价值函数),描述了「如何在没有老师的情况下,通过试错学会做事」。这或许是最接近「智能本质」的学习范式。
本文梳理了从直觉到 Q-Learning 的核心脉络:
- MDP 建模问题
- 价值函数 衡量好坏
- 贝尔曼方程 给出递推关系
- Q-Learning 实现无模型学习
- DQN 用深度网络扩展到大状态空间
建议的下一步学习路径:
- 📖 Sutton & Barto《Reinforcement Learning: An Introduction》(RL 圣经,免费 PDF)
- 🎮 OpenAI Gym / Gymnasium —— 跑各种 RL 环境的标准工具
- 🧪 Stable Baselines3 —— 开箱即用的 RL 算法实现(PPO/SAC 等)
- 🏆 从简单环境(CartPole)开始,逐步挑战复杂任务
下一篇会写策略梯度方法,聊聊为什么「直接优化策略」在某些场景下比价值方法更强大。
Happy learning! 🚀