强化学习基础:马尔可夫决策与深度 Q 网络
强化学习入门:从 Q-Learning 到 DQN
什么是强化学习?
强化学习(Reinforcement Learning, RL)是机器学习的一个分支,它研究智能体(Agent)如何通过与环境(Environment)的交互来学习最优策略,以最大化累积奖励。与监督学习不同,RL 没有给定的“正确答案”;与无监督学习也不同,RL 拥有奖励信号作为延迟的反馈。
核心元素:
- 状态(State, S):环境在某一时刻的描述。
- 动作(Action, A):智能体可以执行的操作。
- 奖励(Reward, R):环境对动作的即时反馈标量。
- 策略(Policy, π):状态到动作的映射,可以是确定性的或随机的。
- 轨迹(Trajectory):一系列状态、动作、奖励的序列。
我们的目标:找到一个策略 π,使得未来累积折扣奖励的期望值最大化:
G_t = R_{t+1} + γ R_{t+2} + γ^2 R_{t+3} + ... = Σ_{k=0}^∞ γ^k R_{t+k+1}
其中 γ ∈ [0,1] 是折扣因子,平衡即时奖励与长期回报。
第一部分:马尔可夫决策过程(MDP)
几乎所有强化学习问题都可以被形式化为马尔可夫决策过程(Markov Decision Process, MDP)。MDP 提供了一个数学框架,用于对序贯决策建模。
MDP 的构成
一个有限 MDP 由五元组 (S, A, P, R, γ) 定义:
- S:有限状态集。
- A:有限动作集。
- P(s' | s, a):状态转移概率,即在状态 s 采取动作 a 后转移到状态 s' 的概率。
- R(s, a, s') 或简写为 R(s, a):奖励函数,表示在状态 s 执行动作 a 后(可能转移到 s')获得的即时奖励的期望。
- γ:折扣因子,0 ≤ γ ≤ 1。
马尔可夫性质:下一状态和奖励只依赖于当前状态和动作,与历史无关:
P(S_{t+1}, R_{t+1} | S_t, A_t, ..., S_0, A_0) = P(S_{t+1}, R_{t+1} | S_t, A_t)
价值函数与 Q 函数
为了评估策略的好坏,我们定义两个价值函数:
- 状态价值函数 V^π(s):从状态 s 开始,始终遵循策略 π 的期望回报。
V^π(s) = E_π [ G_t | S_t = s ] - 动作价值函数 Q^π(s, a):从状态 s 开始,采取动作 a,之后一直遵循策略 π 的期望回报。
Q^π(s, a) = E_π [ G_t | S_t = s, A_t = a ]
两者关系:
V^π(s) = Σ_a π(a|s) Q^π(s, a)
贝尔曼方程
贝尔曼期望方程揭示了当前状态价值与后续状态价值之间的递归关系:
对于 V 函数:
V^π(s) = Σ_a π(a|s) Σ_{s'} P(s'|s,a)[ R(s,a,s') + γ V^π(s') ]
对于 Q 函数:
Q^π(s, a) = Σ_{s'} P(s'|s,a)[ R(s,a,s') + γ Σ_{a'} π(a'|s') Q^π(s', a') ]
最优策略对应的最优价值函数满足贝尔曼最优方程:
Q*(s, a) = Σ_{s'} P(s'|s,a)[ R(s,a,s') + γ max_{a'} Q*(s', a') ]
如果我们能得到 Q*,那么最优策略就是简单的贪婪选择:π*(s) = argmax_a Q*(s, a)。
第二部分:Q-Learning 算法
Q-Learning 是一种无模型(model-free)的时序差分(Temporal Difference, TD)学习算法。它直接学习最优动作价值函数 Q*,无需知道环境转移概率 P 和奖励函数 R。
算法核心:TD 更新
Q-Learning 的更新规则基于贝尔曼最优方程的采样版本:
Q(S_t, A_t) ← Q(S_t, A_t) + α [ R_{t+1} + γ max_a Q(S_{t+1}, a) - Q(S_t, A_t) ]
- α ∈ (0,1]:学习率。
- 括号内的项称为 TD 误差,表示当前估计与“目标”之间的差异。
探索与利用:ε-贪婪策略
为了保证在学习的早期能充分探索所有动作,我们使用 ε-贪婪行为策略:
- 以概率 1-ε 选择当前状态下 Q 值最大的动作(利用)。
- 以概率 ε 随机选择一个动作(探索)。 通常,ε 随时间衰减(例如每轮乘以 0.999),以逐步减少探索。
表格型 Q-Learning 伪代码
初始化 Q(s, a) 为任意值(通常为 0)
对于每一个回合(episode):
初始化状态 s
对于该回合的每一步:
根据 ε-贪婪策略从 Q(s,·) 中选择动作 a
执行动作 a,观察奖励 r 和下一状态 s'
更新: Q(s, a) ← Q(s, a) + α [ r + γ max_{a'} Q(s', a') - Q(s, a) ]
s ← s'
直到 s 为终止状态
实例:网格世界
考虑一个 4×4 网格世界,智能体从左上角出发,目标是右下角(奖励 +1),有一些陷阱格子(奖励 -1)。动作集为 {上, 下, 左, 右},可能由于噪声而移动失败。使用 Q-Learning 训练后,Q 值表逐渐收敛到最优价值,智能体学会避开陷阱并最快到达目标。
表格型 Q-Learning 的局限在于:当状态或动作空间巨大(或连续)时,我们无法存储一张完整的 Q 表。这便引出了深度 Q 网络。
第三部分:深度 Q 网络(DQN)
Deep Q-Network (DQN) 将深度学习与 Q-Learning 结合,用深度神经网络来近似 Q 函数。
为什么需要函数逼近?
实际任务(如玩游戏、机器人控制)的状态往往是高维的(例如 Atari 游戏的原始像素)。表格无法处理。我们引入参数为 θ 的函数逼近器:Q(s, a; θ) ≈ Q(s, a)*。 深度神经网络是强大的非线性函数逼近器,可以从原始高维输入(如图像)中提取特征。
DQN 的关键创新
单纯用神经网络代替 Q 表会导致训练不稳定甚至发散。DQN 引入了两项关键技术来稳定训练:
1. 经验回放(Experience Replay)
将智能体在每个时间步产生的经验 (s, a, r, s') 存入一个固定大小的回放记忆(Replay Buffer)。每次更新参数时,从回放记忆中**随机抽取小批量(mini-batch)**经验。
- 打破样本之间的时序相关性,满足独立同分布假设。
- 提高数据利用效率,单条经验可被多次使用。
2. 目标网络(Target Network)
DQN 使用两个结构相同的网络:
- 在线网络 Q(s, a; θ):用于选择动作和实时更新。
- 目标网络 Q(s, a; θ^-):用于计算 TD 目标值 y = r + γ max_{a'} Q(s', a'; θ^-)。
目标网络的参数 θ^- 每隔 C 步从在线网络 θ 直接复制,而在间隔期内保持不变。这减轻了目标值随在线网络快速波动导致的震荡,使训练更稳定。
损失函数
给定从回放记忆抽取的一批经验 (s, a, r, s'),TD 目标为:
y_i = r_i + γ max_{a'} Q(s_i', a'; θ^-) (若 s_i' 为非终止状态)
y_i = r_i (若 s_i' 为终止状态)
我们最小化均方误差损失:
L(θ) = E_{(s,a,r,s')~D} [ ( y_i - Q(s, a; θ) )^2 ]
通过梯度下降法更新在线网络参数 θ。
DQN 算法流程
初始化回放记忆 D,容量为 N
随机初始化在线网络 Q(s, a; θ)
初始化目标网络 Q 的参数 θ^- = θ
对于 episode = 1 到 M:
初始化状态 s_1
对于 t = 1 到 T:
根据 ε-贪婪策略选择动作 a_t
执行 a_t,观察 r_t 和 s_{t+1}
将 (s_t, a_t, r_t, s_{t+1}) 存入 D
从 D 中随机采样小批量 (s_j, a_j, r_j, s_{j+1})
设置 y_j = r_j + γ max_a' Q(s_{j+1}, a'; θ^-) (如果终止则 y_j = r_j)
对损失 (y_j - Q(s_j, a_j; θ))^2 执行梯度下降
每隔 C 步,更新目标网络:θ^- ← θ
收敛与表现
在 Atari 2600 经典游戏任务中,DQN 以原始像素作为输入,输出所有合法动作的 Q 值(单一网络架构,输出维度等于动作数),在多数游戏中达到了超越人类专业玩家的水平,证明了深度强化学习的强大能力。
第四部分:超越基础 DQN(改进方向简介)
为了进一步提升性能和稳定性,研究者提出了多种 DQN 变体:
- Double DQN:解决 DQN 中 Q 值高估的问题。在线网络用于选择动作,目标网络用于评估该动作的价值,即 y = r + γ Q(s', argmax_a Q(s', a; θ); θ^-)。
- Dueling DQN:将 Q 网络拆分为状态价值流 V(s) 和优势流 A(s, a),Q(s, a) = V(s) + A(s, a) - mean(A)。这种分离使得模型能够分别评估状态的整体价值和各动作的相对优势,学习更高效。
- Prioritized Experience Replay:为经验赋予优先级,根据 TD 误差大小进行加权采样,让对学习更有价值的经验被更频繁地回放。
这些改进通常可以叠加,形成诸如 Rainbow 等高度融合的算法。
第五部分:动手实践入门
你可以使用 OpenAI Gym 等环境快速体验从 Q-Learning 到 DQN 的实现。以下是一个 Q-Learning 在 FrozenLake-v1 上的极简伪代码,以及使用 PyTorch 实现 DQN 的框架要点。
Q-Learning 示例(FrozenLake)
import gym
import numpy as np
env = gym.make("FrozenLake-v1", is_slippery=True)
Q = np.zeros([env.observation_space.n, env.action_space.n])
alpha, gamma, epsilon, episodes = 0.1, 0.99, 0.1, 5000
for ep in range(episodes):
state = env.reset()
done = False
while not done:
if np.random.random() < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(Q[state])
next_state, reward, done, _ = env.step(action)
Q[state][action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state][action])
state = next_state
DQN 框架要点(PyTorch)
- 网络结构:使用卷积层(如果输入是图像)或全连接层(如果输入是低维向量)。输出层节点数等于动作数。
- 经验回放:实现一个 deque 或循环缓冲区。
- 训练循环:每与环境交互一步,将经验存储,然后从回放记忆采样训练批次,计算损失并反向传播。
- 探索衰减:ε 从 1.0 线性或指数衰减到 0.01 左右。
初始化环境、模型、优化器和回放记忆后,反复执行:
for episode in range(max_episodes):
state = env.reset()
total_reward = 0
while True:
# 选择动作 (ε-greedy)
# 执行动作,存储经验
# 从回放记忆采样并更新网络
# 定期更新目标网络
# 如果终止,跳出
关键要点回顾
- MDP 是 RL 的数学基础,定义了状态、动作、转移和奖励。
- Q-Learning 是一种无模型 TD 方法,直接学习最优 Q 函数,通过 ε-贪婪进行探索。
- DQN 使用深度神经网络近似 Q 函数,并用经验回放和目标网络两大技巧稳定训练。
- 从表格到 DQN 的演进,解决了高维状态空间的挑战,是深度强化学习的重要基石。
掌握了这些内容,你便拥有了从经典强化学习到深度强化学习的完整桥梁。接下来可以尝试在 CartPole、LunarLander 等环境中复现算法,逐步深入更复杂的策略梯度、Actor-Critic 等方法。