深度Q网络(DQN)算法详解
简介
深度Q网络(Deep Q-Network, DQN)是一种结合深度学习和Q-learning的强化学习算法,通过深度神经网络近似Q值函数,从而解决高维状态空间下的强化学习问题。DQN在处理如Atari游戏等复杂任务时表现出色。
DQN的基本概念
DQN采用深度神经网络来逼近Q值函数。通过训练神经网络,DQN可以在高维状态空间中估计每个状态-动作对的Q值。DQN的核心创新包括经验回放和目标网络,这些技术帮助稳定和加速训练过程。
关键技术
1. 经验回放(Experience Replay)
经验回放技术通过存储代理的经历(状态、动作、奖励、下一状态)在一个记忆库中,并在每次更新Q值时从中随机抽取一批样本进行训练。这种方法打破了数据相关性,提高了数据利用率,并减少了训练的不稳定性。
2. 目标网络(Target Network)
目标网络是DQN中的一个辅助网络,它的参数定期从主网络复制,而在平时保持不变。目标网络提供相对稳定的目标值,减少了训练过程中的波动。
DQN算法流程
-
初始化:
- 初始化经验回放记忆库。
- 初始化Q网络和目标网络的参数。
-
重复直到收敛:
-
在当前状态 ( s ) 下选择一个动作 ( a ),通常使用 (\epsilon)-贪婪策略。
-
执行动作 ( a ),观察即时奖励 ( r ) 和下一状态 ( s’ )。
-
将经历 ( (s, a, r, s’) ) 存储到经验回放记忆库中。
-
从记忆库中随机抽取一个批次的经历样本 ( (s_j, a_j, r_j, s’_j) )。
-
对于每个样本,计算目标Q值:
[ y_j = r_j + \gamma \max_{a’} Q_{\text{target}}(s’_j, a’) ]
-
使用目标Q值更新Q网络的参数:
[ \text{Loss} = \frac{1}{N} \sum_j \left( y_j - Q(s_j, a_j) \right)^2 ]
-
定期将Q网络的参数复制到目标网络。
-
实现示例
以下是使用Python和Keras库实现DQN在OpenAI Gym的CartPole环境中的示例:
import numpy as np
import gym
from collections import deque
import random
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
# 定义DQN代理
class DQNAgent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = deque(maxlen=2000)
self.gamma = 0.95 # 折扣因子
self.epsilon = 1.0 # 探索率
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.learning_rate