强化学习入门实战:MDP、Q-learning 与 DQN 概览

强化学习入门实战:与监督学习区别、MDP 五要素、策略与价值函数、奖励设计、动态规划(策略迭代/值迭代)、蒙特卡洛、时序差分与 Q-learning、表格 Q 表实战、DQN 与经验回放、探索与利用、经典环境实战、常见陷阱。

引言

监督学习教模型「这个输入对应哪个答案」,强化学习教模型「怎么做能拿更多回报」——它没有标准答案,只有环境给的奖励信号。下棋、机器人控制、推荐排序、广告投放都靠它。本文用可运行的 Python 讲透强化学习的骨架:MDP 五要素、策略与价值函数、动态规划与 Q-learning、再到深度强化学习 DQN,最后在经典环境里跑通一个小例子。

前置:/ml-neural-networks-basics/(神经网络基础)、/ml-deep-learning-advanced/(训练调参)、/ml-model-evaluation/(评估思维)。


目录


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-learningoff-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 强化学习经典教材

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「ml」更多文章

  1. 模型压缩与推理优化实战:量化、剪枝与知识蒸馏
  2. 多分类与多标签学习实战:OvR、softmax 与多输出评估
  3. 模型监控与数据漂移检测:PSI、KS 与概念漂移实战