第8章:强化学习与深度学习
深度Q网络(DQN)
1. DQN的核心思想
深度Q网络(Deep Q-Network, DQN)是深度学习和强化学习的里程碑式结合,其核心是通过神经网络近似Q值函数(动作价值函数),解决传统Q-Learning在高维状态空间中的局限性。关键创新包括:
- 经验回放(Experience Replay):存储智能体的经验(状态、动作、奖励、下一状态)到缓冲池,并随机采样训练,打破数据相关性。
- 目标网络(Target Network):使用独立的网络计算目标Q值,缓解训练不稳定性。
2. 算法原理与数学表达
DQN的更新目标基于贝尔曼方程: [ Q(s,a) \leftarrow Q(s,a) + \alpha \left[ r + \gamma \max_{a'} Q(s',a') - Q(s,a) \right] ] 其中:
- ( \alpha ) 为学习率,( \gamma ) 为折扣因子。
- 实际实现中,通过最小化均方误差损失函数训练网络: [ \mathcal{L}(\theta) = \mathbb{E}{(s,a,r,s') \sim D} \left[ \left( r + \gamma \max{a'} Q_{\text{target}}(s',a'; \theta^-) - Q(s,a; \theta) \right)^2 \right] ]
- ( \theta ) 为主网络参数,( \theta^- ) 为目标网络参数,定期同步。
3. 网络架构设计
典型DQN的输入为环境状态(如游戏画面像素),输出为每个动作的Q值:
- 输入层:卷积层(CNN)处理图像状态,全连接层处理结构化状态。
- 隐藏层:多层感知机(MLP)或卷积层堆叠。
- 输出层:神经元数量等于动作空间维度。
4. 实现细节与优化技巧
- 探索策略:ε-贪婪策略(初始高探索率ε,逐步衰减)。
- 奖励裁剪:规范化奖励值(如Atari游戏中截断到[-1,1])。
- 帧堆叠:输入连续多帧以捕捉时序信息(如Atari的4帧堆叠)。
5. 经典案例:Atari游戏
2013年DeepMind提出的DQN在Atari 2600游戏中表现超越人类玩家:
- 预处理:灰度化、降采样(84×84)、帧差分。
- 网络结构:
class DQN(nn.Module): def __init__(self, action_dim): super().__init__() self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4) self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2) self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1) self.fc = nn.Linear(7*7*64, 512) self.out = nn.Linear(512, action_dim) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = x.view(x.size(0), -1) x = F.relu(self.fc(x)) return self.out(x)
6. 改进与扩展
- Double DQN:解耦动作选择和Q值评估,减少过高估计。
- Dueling DQN:分离状态价值函数和优势函数,提升策略评估精度。
- Prioritized Experience Replay:根据TD误差优先级采样重要经验。
7. 代码示例(PyTorch片段)
def train_dqn():
# 初始化环境、网络、目标网络
env = gym.make("PongNoFrameskip-v4")
policy_net = DQN(action_dim=env.action_space.n).to(device)
target_net = DQN(action_dim=env.action_space.n).to(device)
target_net.load_state_dict(policy_net.state_dict())
# 经验回放缓冲池
replay_buffer = ReplayBuffer(capacity=10000)
for episode in range(1000):
state = preprocess(env.reset())
done = False
while not done:
action = select_action(state, policy_net, epsilon)
next_state, reward, done, _ = env.step(action)
replay_buffer.push(state, action, reward, next_state, done)
# 训练阶段
if len(replay_buffer) > batch_size:
batch = replay_buffer.sample(batch_size)
loss = compute_loss(batch, policy_net, target_net)
optimizer.zero_grad()
loss.backward()
optimizer.step()
state = next_state
# 定期同步目标网络
if episode % target_update == 0:
target_net.load_state_dict(policy_net.state_dict())
8. 挑战与注意事项
- 训练不稳定:目标网络和经验回放是稳定训练的关键。
- 稀疏奖励问题:需设计合理的奖励函数或结合内在激励(Intrinsic Motivation)。
- 高计算成本:分布式训练或异步方法(如A3C)可加速收敛。
延伸阅读:
- 原始论文:Human-level control through deep reinforcement learning (Nature 2015)
- 进阶方向:Rainbow DQN(整合所有改进的复合架构)
