引言
监督学习教模型「这个输入对应哪个答案」,强化学习教模型「怎么做能拿更多回报」——它没有标准答案,只有环境给的奖励信号。下棋、机器人控制、推荐排序、广告投放都靠它。本文用可运行的 Python 讲透强化学习的骨架:MDP 五要素、策略与价值函数、动态规划与 Q-learning、再到深度强化学习 DQN,最后在经典环境里跑通一个小例子。
前置:/ml-neural-networks-basics/(神经网络基础)、/ml-deep-learning-advanced/(训练调参)、/ml-model-evaluation/(评估思维)。
目录
- 1. 强化学习在解决什么问题
- 2. MDP 五要素:状态动作奖励转移折扣
- 3. 策略与价值函数
- 4. 动态规划:已知环境的解法
- 5. 蒙特卡洛与时序差分:不知道环境也能学
- 6. Q-learning 与 Q 表实战
- 7. 探索与利用:强化学习的核心张力
- 8. DQN:用神经网络替代 Q 表
- 9. 奖励设计与经典环境实战
- 10. 速查表与一句话记忆
- 延伸阅读
1. 强化学习在解决什么问题
1.1 与监督/无监督的本质区别
| 维度 | 监督学习 | 强化学习 |
|---|---|---|
| 数据 | 有标注样本 | 环境给的奖励信号 |
| 反馈 | 立即、明确 | 延迟、稀疏 |
| 目标 | 拟合标注 | 最大化长期回报 |
| 结构 | 静态数据集 | 交互序列(agent 决策影响后续) |
1.2 核心设定
# Agent(智能体)在环境中做动作
# 环境反馈:新状态 + 奖励
# 目标:学到策略,让"长期累积回报"最大
# 关键难点:动作影响未来状态——"眼前的甜头"未必是"长远的正确"
记忆:强化学习 = Agent 与环境交互学「怎么做」;反馈延迟稀疏、动作影响未来,目标是最大化长期累积回报而不是拟合标注。
2. MDP 五要素:状态动作奖励转移折扣
2.1 形式化定义
马尔可夫决策过程(MDP)用五元组描述一个强化学习问题:
<S, A, P, R, γ>
S:状态集合(agent 观察到的环境情况)
A:动作集合(agent 能做的选择)
P:状态转移概率 P(s'|s, a)(执行 a 后到 s' 的概率)
R:奖励函数 R(s, a, s')(每次转移的即时回报)
γ:折扣因子(0~1,未来回报的打折)
2.2 折扣因子为什么存在
# γ = 0:只在乎眼前一步(短视)
# γ = 1:所有未来等值(可能不收敛)
# γ = 0.9:未来 10 步价值约打三折
# 折扣让"越远越不确定的回报权重越低",也保证总和有界
记忆:MDP 五元组 <S,A,P,R,γ> 是强化学习的语言;折扣因子 γ 给未来回报打折——越小越短视、越大越看长远,通常取 0.9~0.99。
3. 策略与价值函数
3.1 策略 π:状态 → 动作
策略是 agent 的行为准则:看到状态 s 就选动作 a。分确定性(固定选 a)与随机性(按概率分布选)。
3.2 价值函数:一个状态/动作「值多少」
# 状态价值 V(s):从 s 出发按策略走,长期回报的期望
# 动作价值 Q(s, a):在 s 先做 a、再按策略走,长期回报的期望
# 价值函数把"看不见的长期回报"量化成可比较的数字
# 有了准确的 Q(s,a),决策就是"选 Q 最大的动作"
3.3 最优的追求
强化学习的终极目标是从状态价值/动作价值反推最优策略——先估准价值,再按价值取最优动作。
记忆:策略是「看到什么状态做什么动作」,价值函数把长期回报量化(V(s) 是状态的期望回报、Q(s,a) 是状态+动作的期望回报);先估准价值、再按价值取最优动作。
4. 动态规划:已知环境的解法
4.1 什么时候能用动态规划
动态规划要求已知转移概率 P 和奖励 R(模型已知)——现实中很少,但它是理解后续算法的地基。
4.2 两个经典算法
| 算法 | 思路 |
|---|---|
| 策略迭代 | 评估当前策略的价值 → 贪心改进策略 → 反复 |
| 值迭代 | 直接反复更新 V(s) = max_a Σ P·(R + γV(s’)) 直到收敛 |
两者都依赖贝尔曼方程:一个状态的价值 = 立即奖励 + 折扣的未来价值。这是整个强化学习的核心等式。
贝尔曼方程:V(s) = max_a Σ P(s'|s,a) [ R(s,a,s') + γ·V(s') ]
记忆:动态规划靠已知 P、R 用贝尔曼方程迭代——策略迭代「评估→改进」、值迭代直接刷 V;贝尔曼「价值=即时奖励+折扣未来价值」是全部强化学习的核心等式。
5. 蒙特卡洛与时序差分:不知道环境也能学
5.1 蒙特卡洛:跑完一整局再更新
不需要 P、R——直接和环境互动,一局结束用实际总回报更新价值:
V(s) ← V(s) + α · (G - V(s))
G = 这一局从 s 开始拿到的实际总回报
优点:无偏(用真实回报);缺点:方差大、要等到局结束才能更新。
5.2 时序差分(TD):走一步就更新
TD 只走一步就用「即时奖励 + 下一状态的估计价值」来更新当前价值:
V(s) ← V(s) + α · (R + γ·V(s') - V(s))
不需要等整局结束,方差小、能在线学习——实践中远比蒙特卡洛常用。Q-learning 就是 TD 家族的一员。
记忆:不知道环境就靠「与环境互动」——蒙特卡洛跑完整局用真实总回报更新(无偏高方差)、时序差分走一步就用「即时奖励+下状态估计」更新(有偏低方差、在线学习);TD 是实用主力。
6. Q-learning 与 Q 表实战
6.1 Q 表
维护一张「状态 × 动作」的表,每格存 Q(s, a),用 TD 思想反复更新:
import numpy as np
# 2 维格子世界,状态 = 坐标,动作 = 上下左右
n_states, n_actions = 25, 4
Q = np.zeros((n_states, n_actions))
gamma, alpha, episodes = 0.9, 0.1, 500
for _ in range(episodes):
s = env.reset()
done = False
while not done:
# ε-greedy:多数按 Q 最优,偶尔随机探索
a = np.argmax(Q[s]) if np.random.rand() > 0.1 else np.random.randint(n_actions)
s2, r, done = env.step(a)
# Q-learning 更新:走一步 + 下一个状态的最优 Q
Q[s, a] += alpha * (r + gamma * Q[s2].max() - Q[s, a])
s = s2
6.2 为什么用 Q[s2].max()
Q-learning 是 off-policy:更新时不依赖「实际选择的动作」,而假设「后续都用最优动作」——所以用下一个状态的最大 Q 值。
记忆:Q-learning 用一张 Q 表存状态×动作的价值,更新走 TD 一步 + 取下一个状态的最大 Q(off-policy:假设后续最优);小状态空间手搓就能跑。
7. 探索与利用:强化学习的核心张力
7.1 两难
- 利用(exploit):按当前已知最优做——稳定但可能错过更好的
- 探索(explore):尝试没试过的动作——有机会发现更好但代价是短期吃亏
7.2 常用策略
| 策略 | 做法 |
|---|---|
| ε-greedy | 以 ε 概率随机探索,其余用最优(ε 常从 1 衰减到 0.1) |
| 乐观初始化 | Q 表初值设大,逼 agent 先探索再收敛 |
| 玻尔兹曼 | 按 Q 值软max概率选动作,温度控制随机性 |
# ε 衰减:前期多探索,后期多用已知最优
epsilon = max(0.1, 1.0 - episode / total_episodes)
记忆:探索与利用是 RL 的核心张力——ε-greedy 以 ε 概率随机探索、其余按最优利用,ε 随训练衰减;乐观初始化与玻尔兹曼是变体。
8. DQN:用神经网络替代 Q 表
8.1 为什么需要 DQN
状态空间很大(图像像素、连续状态)时 Q 表存不下、也泛化不了——用神经网络逼近 Q(s, a):
# DQN 结构示意
model = nn.Sequential(
nn.Linear(state_dim, 128), nn.ReLU(),
nn.Linear(128, 64), nn.ReLU(),
nn.Linear(64, n_actions), # 输出每个动作的 Q 值
)
8.2 DQN 的两个关键技巧
# 1) 经验回放(Experience Replay)
# 交互产生的 (s, a, r, s') 存进缓冲,训练时随机采样——打破样本相关性、提高利用率
# 2) 目标网络(Target Network)
# 用一份"慢更新"的 Q 网络算目标值,避免更新目标与预测用同一份参数导致振荡
8.3 DQN 的训练循环
for step in range(total_steps):
s = torch.tensor(state).float()
if random < eps: action = random_action()
else: action = model(s).argmax().item()
s2, r, done = env.step(action)
replay.append((s, action, r, s2, done))
if len(replay) > batch_size:
# 从回放缓冲随机采样一批,用目标网络算 y = r + γ·max Q_target(s2)
loss = mse(q_pred, y_target)
optimizer.zero_grad(); loss.backward(); optimizer.step()
# 周期性同步目标网络权重
记忆:DQN 用神经网络逼近 Q(s,a) 解决大状态空间;两个关键技巧——经验回放(随机采样打断相关性、提数据利用率)与目标网络(慢更新的目标 Q,防振荡);Atari/围棋类问题由此起步。
9. 奖励设计与经典环境实战
9.1 奖励设计的常见陷阱
# 奖励太稀疏:几乎拿不到信号,学不动 → 给中间子目标小奖励或做课程
# 奖励太密/太细:agent 学会"刷奖励"而不是"真目标"(奖励黑客)
# 奖励与目标不一致:agent 会钻空子——奖励设计决定行为上限
9.2 经典环境上手
# Gymnasium(OpenAI Gym 继承者)是 RL 入门标配
import gymnasium as gym
env = gym.make("CartPole-v1") # 平衡小车:状态 4 维,动作 2 个
s, _ = env.reset()
for _ in range(200):
a = 0 if s[2] < 0 else 1 # 根据杆倾角简单策略
s, r, done, _, _ = env.step(a)
if done: break
入门路线:CartPole(简单连续控制)→ FrozenLake(格子导航)→ Taxi(组合任务)→ LunarLander(更复杂控制)。
记忆:奖励设计决定行为上限——稀疏学不动、太密被刷奖励;入门从 Gymnasium 的 CartPole/FrozenLake 跑起,先手搓 Q 表再上 DQN。
10. 速查表与一句话记忆
| 概念 | 一句话 |
|---|---|
| MDP | <S,A,P,R,γ> 五元组描述问题 |
| 策略 | 状态→动作的准则 |
| 价值 V/Q | 长期回报的期望(先估价值再选动作) |
| 贝尔曼方程 | 价值=即时奖励+折扣未来价值 |
| 动态规划 | 已知 P/R 时的精确解法 |
| 蒙特卡洛 | 整局真实回报,无偏高方差 |
| 时序差分 | 一步更新,有偏低方差 |
| Q-learning | off-policy Q 表 + TD 更新 |
| ε-greedy | 探索利用的平衡 |
| DQN | 神经网络 Q 逼近 + 回放 + 目标网络 |
一句话记忆:强化学习 = Agent 与环境交互、最大化长期回报——问题用 MDP 五元组 <S,A,P,R,γ> 描述,核心等式是贝尔曼「价值=即时奖励+折扣未来价值」;未知环境靠采样学习:蒙特卡洛跑整局(无偏高方差)、时序差分走一步就更新(实用主力);Q-learning 用 Q 表 off-policy 更新,配上 ε-greedy 平衡探索利用;状态空间大时 DQN 用神经网络逼近 Q,靠经验回放打断相关性、目标网络防振荡;奖励设计决定行为上限——从 Gymnasium 的 CartPole 手搓 Q 表起步,再上深度强化学习。
延伸阅读
- /ml-neural-networks-basics/ — 神经网络与训练循环(DQN 的骨架)
- /ml-deep-learning-advanced/ — 优化器与训练调参
- /ml-model-evaluation/ — 评估思维与过拟合
- /ml-supervised-classification/ — 与监督学习的对比
- [[ai-ml]] — 深度学习与强化学习前沿
- Gymnasium 文档
- Sutton & Barto 强化学习经典教材
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。