### Deep Q Network (DQN) 的原理与实现
#### 1. DQN 的核心概念
DQN 是一种结合了强化学习中的 Q 学习算法和深度神经网络的方法,旨在解决高维输入环境下的动作价值函数估计问题。通过引入深度神经网络作为函数逼近器,DQN 能够有效地处理复杂的输入数据,例如图像或序列数据[^1]。
为了提高稳定性,DQN 使用了两种不同的神经网络:评估网络(Evaluation Network)和目标网络(Target Network)。这两种网络初始时具有相同的结构和参数配置,在训练过程中仅评估网络的参数会不断更新,而目标网络则定期从评估网络复制最新的参数。这种机制有助于减少目标值的变化频率,从而提升训练过程的稳定性和收敛速度[^2]。
#### 2. DQN 的工作流程
在每次交互中,智能体会基于当前的状态 \( s \),利用评估网络计算出对应的动作值 \( q(s, a; \theta) \),并通过某种策略(如 ε-greedy 策略)选择下一步要执行的动作 \( a \)[^3]。随后,环境返回新的状态 \( s' \) 和奖励 \( r \)。这些经验会被存储到一个回放缓冲区(Replay Buffer)中,以便后续采样进行批量训练。
当积累了一定数量的经验后,可以从缓冲区随机抽取一批样本,并使用目标网络计算下一时刻的最大期望回报 \( q_{\text{next}} = \max_a q(s', a; \theta^-) \),其中 \( \theta^- \) 表示目标网络的固定参数。接着,依据 Q-Learning 更新规则构建目标值 \( y_i = r + \gamma q_{\text{next}} \),并与实际预测值 \( q(s, a; \theta) \) 计算均方误差损失:
\[ L(\theta) = \frac{1}{N} \sum_{i=1}^{N}(y_i - q(s,a;\theta))^2 \]
最后,借助反向传播调整评估网络的参数以最小化上述损失函数。
#### 3. Python 实现代码示例
以下是基于 PyTorch 的简单 DQN 实现框架:
```python
import torch
import torch.nn as nn
import torch.optim as optim
from collections import deque
import random
class DQN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DQN, self).__init__()
self.fc = nn.Sequential(
nn.Linear(input_dim, 64),
nn.ReLU(),
nn.Linear(64, 64),
nn.ReLU(),
nn.Linear(64, output_dim)
)
def forward(self, x):
return self.fc(x)
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def push(self, state, action, reward, next_state, done):
self.buffer.append((state, action, reward, next_state, done))
def sample(self, batch_size):
samples = random.sample(self.buffer, batch_size)
states, actions, rewards, next_states, dones = zip(*samples)
return states, actions, rewards, next_states, dones
class DQNAgent:
def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, buffer_capacity=10000, batch_size=32):
self.eval_net = DQN(state_dim, action_dim)
self.target_net = DQN(state_dim, action_dim)
self.optimizer = optim.Adam(self.eval_net.parameters(), lr=lr)
self.gamma = gamma
self.replay_buffer = ReplayBuffer(buffer_capacity)
self.batch_size = batch_size
self.update_target()
def choose_action(self, state, epsilon):
if random.random() < epsilon:
return random.randint(0, action_dim - 1)
with torch.no_grad():
q_values = self.eval_net(torch.tensor([state], dtype=torch.float))
return torch.argmax(q_values).item()
def update_target(self):
self.target_net.load_state_dict(self.eval_net.state_dict())
def train(self):
if len(self.replay_buffer.buffer) < self.batch_size:
return
states, actions, rewards, next_states, dones = self.replay_buffer.sample(self.batch_size)
states_tensor = torch.tensor(states, dtype=torch.float)
actions_tensor = torch.tensor(actions, dtype=torch.long).unsqueeze(-1)
rewards_tensor = torch.tensor(rewards, dtype=torch.float).unsqueeze(-1)
next_states_tensor = torch.tensor(next_states, dtype=torch.float)
dones_tensor = torch.tensor(dones, dtype=torch.bool).unsqueeze(-1)
current_q_values = self.eval_net(states_tensor).gather(1, actions_tensor)
next_q_values = self.target_net(next_states_tensor).detach().max(1)[0].unsqueeze(-1)
target_q_values = rewards_tensor + (~dones_tensor * self.gamma * next_q_values)
loss_fn = nn.MSELoss()
loss = loss_fn(current_q_values, target_q_values)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
```
此代码定义了一个基础版本的 DQN 模型以及相应的智能体类 `DQNAgent`,其中包括动作选择逻辑、经验回放机制及训练步骤。
---