# DQN算法
# 基本概念
DQN(Deep Q-Network)是将深度学习与Q-Learning相结合的强化学习算法。它使用深度神经网络来近似Q函数,从而克服了传统Q-Learning在处理高维状态空间时的局限性。
# 数学原理
# 1. 神经网络近似
DQN使用深度神经网络来近似Q函数:
其中:
- 是神经网络输出的Q值
- 是神经网络的参数
- 是最优Q值
# 2. 损失函数
使用时序差分误差作为损失函数:
其中:
- 是经验回放缓冲区
- 是目标网络的参数
- 是折扣因子
# 3. 参数更新
使用随机梯度下降更新网络参数:
其中:
- 是学习率
- 是损失函数关于参数的梯度
# 核心技术
# 1. 经验回放
经验回放(Experience Replay)机制:
- 存储转移样本
- 随机采样批量数据
- 打破样本相关性
- 提高数据利用效率
# 2. 目标网络
目标网络(Target Network)设计:
- 维护两个网络:当前网络和目标网络
- 定期更新目标网络
- 提高训练稳定性
- 避免目标值频繁变化
# 算法步骤
初始化
- 创建评估网络和目标网络
- 初始化经验回放缓冲区
- 设定超参数
训练循环
- 对每个回合:
- 获取当前状态
- 使用ε-贪心策略选择动作
- 执行动作并观察奖励和下一状态
- 存储经验到缓冲区
- 从缓冲区采样批量数据
- 计算目标Q值
- 更新网络参数
- 定期更新目标网络
- 对每个回合:
import torch
import torch.nn as nn
import numpy as np
from collections import deque
import random
class DQN(nn.Module):
def __init__(self, state_dim, action_dim):
super(DQN, self).__init__()
self.network = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, 128),
nn.ReLU(),
nn.Linear(128, action_dim)
)
def forward(self, x):
return self.network(x)
class DQNAgent:
def __init__(self, state_dim, action_dim):
self.eval_net = DQN(state_dim, action_dim)
self.target_net = DQN(state_dim, action_dim)
self.target_net.load_state_dict(self.eval_net.state_dict())
self.memory = deque(maxlen=10000)
self.optimizer = torch.optim.Adam(self.eval_net.parameters())
self.epsilon = 0.1
self.gamma = 0.99
self.batch_size = 32
self.update_freq = 100
self.learn_step_counter = 0
def choose_action(self, state):
if np.random.random() > self.epsilon:
state = torch.FloatTensor(state)
action_value = self.eval_net(state)
action = torch.argmax(action_value).item()
else:
action = np.random.randint(0, self.action_dim)
return action
def store_transition(self, state, action, reward, next_state):
self.memory.append((state, action, reward, next_state))
def learn(self):
if len(self.memory) < self.batch_size:
return
batch = random.sample(self.memory, self.batch_size)
state_batch = torch.FloatTensor([data[0] for data in batch])
action_batch = torch.LongTensor([data[1] for data in batch])
reward_batch = torch.FloatTensor([data[2] for data in batch])
next_state_batch = torch.FloatTensor([data[3] for data in batch])
q_eval = self.eval_net(state_batch).gather(1, action_batch)
q_next = self.target_net(next_state_batch).detach()
q_target = reward_batch + self.gamma * q_next.max(1)[0]
loss = nn.MSELoss()(q_eval, q_target)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
if self.learn_step_counter % self.update_freq == 0:
self.target_net.load_state_dict(self.eval_net.state_dict())
self.learn_step_counter += 1
# 优势特点
# 1. 处理高维状态
- 可以处理图像输入
- 自动特征提取
- 端到端学习
# 2. 样本效率
- 经验回放机制
- 批量学习
- 并行计算
# 3. 稳定性
- 目标网络
- 梯度裁剪
- 批量归一化
# 应用场景
游戏AI
- Atari游戏
- 围棋
- 即时战略游戏
机器人控制
- 视觉导航
- 抓取操作
- 运动控制
自动驾驶
- 路径规划
- 决策控制
- 场景理解
智能系统
- 资源调度
- 能源管理
- 网络优化
# 优缺点
# 优点
- 可处理高维状态空间
- 端到端学习能力强
- 泛化性能好
- 可扩展性强
# 缺点
- 训练不稳定
- 超参数敏感
- 计算资源需求大
- 收敛时间长
# 实践建议
# 1. 网络设计
- 适当的网络深度
- 残差连接
- 注意力机制
# 2. 训练技巧
- 梯度裁剪
- 学习率调度
- 优先级采样
# 3. 参数调优
- 探索率衰减
- 缓冲区大小
- 批量大小
# 4. 稳定性优化
- 双DQN
- 对抗训练
- 集成学习
# 进阶优化
Rainbow DQN
- 多种改进的集成
- 性能全面提升
- 更好的收敛性
Distributional DQN
- 学习值分布
- 更好的不确定性建模
- 风险感知决策
Noisy DQN
- 参数化探索
- 自适应探索
- 更高效的探索
Recurrent DQN
- 处理部分可观察
- 时序依赖建模
- 长期记忆能力