探秘强化学习中的双深度Q网络算法
此篇文章是博主在研习强化学习(RL)领域时,用于自身学习、探究或品鉴之用,是依据博主对相关领域的若干认知所记录的学习摘要与笔记,若存在不当或侵权之处,一经指出将即刻修正,还望海涵。文章归类于👉强化学习
专栏:【强化学习】- 【单智能体强化学习】(12)---《Double DQN(Double Deep Q-Network)算法》
Double DQN(Double Deep Q-Network)算法
目录
一、Double DQN算法详解
二、算法背景和提出
2.1 过估计偏差问题
2.2 Double Q-Learning的灵感
2.3 Double DQN的提出
三、Double DQN的核心思想
四、算法流程
五、公式推导
[Python] Double DQN算法实现
[Notice] 代码说明
六、优势与特点
七、总结
一、Double DQN算法详解
强化学习领域中,深度Q网络(DQN)是融合深度学习与Q学习的算法,它依靠神经网络去逼近Q函数,从而解决复杂的高维状态问题。不过,DQN存在过估计问题(Overestimation Bias),也就是在更新Q值的时候,由于同时使用同一个网络来选择动作和计算目标Q值,很可能使得Q值的估计偏高。
Double DQN(DDQN)引入了“双网络”机制来缓解该问题,进而提升算法的稳定性与收敛性。
二、算法背景和提出
在强化学习的早期研究里,Q学习是经典算法,它通过构建Q值表来描述每个状态 - 动作对的长期累积奖励。但当状态和动作空间变得极为庞大甚至连续时,Q学习方法难以扩展。于是,深度Q网络(Deep Q-Network, DQN)引入神经网络来逼近Q函数,并取得了显著成果,比如成功应用于Atari游戏。然而,DQN算法在实际应用中暴露出诸多问题,其中过估计偏差(Overestimation Bias)尤为突出。
2.1 过估计偏差问题
在DQN算法中,Q值更新公式如下:
其中:
是当前的即时奖励;
是折扣因子;
是目标网络的Q值。
DQN采用“最大值”max操作来选择动作并估计未来价值,这种方式可能引发过高估计。其根本缘由在于:
- 同一个网络(目标网络)既负责选择动作(动作选择偏好),又负责评估这些动作的价值(动作的价值计算)。
- 神经网络的逼近误差会放大估计值,从而进一步加剧过估计问题。
这种偏差会导致:
- 策略变得过于激进;
- 学习过程变得不稳定;
- 收敛速度减慢甚至无法收敛。
2.2 Double Q-Learning的灵感
Double Q-Learning是一种用于降低过估计问题的经典方法。其基本理念是分离动作选择和价值估计。它运用两个独立的Q值表:
- 一个表用于选择动作;
- 另一个表用于计算目标值。
Double Q-Learning的目标值公式为:
通过这种分离计算,动作选择的误差不会直接影响目标值计算,从而降低了过估计的风险。
2.3 Double DQN的提出
Double DQN(DDQN)受Double Q-Learning启发,将其思想拓展到深度强化学习领域。主要区别在于:
- 使用在线网络(Online Network)来选择动作;
- 使用目标网络(Target Network)来估计动作的价值。
Double DQN的目标值公式为:
其中:
是在线网络,用于选择动作;
是目标网络,用于估计目标Q值。
这种方法成功解决了DQN的过估计问题,并在多个强化学习任务中展现出更好的性能与稳定性。
三、Double DQN的核心思想
Double DQN通过分离动作选择和目标Q值计算来减小过估计问题:
- 使用在线网络(Online Network)选择动作。
- 使用目标网络(Target Network)计算目标Q值。
这种分离使得目标Q值的计算更为可靠,有助于减少估计偏差。
四、算法流程
1.初始化:
初始化两个神经网络:在线网络和目标网络
。
的参数定期从
同步。
2.执行动作:
当前状态下,利用
选择动作
:
3.存储经验:
将转移样本存入经验回放池。
4.经验回放:
从经验回放池中随机采样一个小批量 。
5.目标值计算(关键点):
使用在线网络选择下一个状态的最佳动作:
使用目标网络计算目标Q值:
6.更新在线网络:
使用均方误差(MSE)作为损失函数,对进行梯度下降:
7.更新目标网络:
每隔一定步数,将的参数复制到
。
五、公式推导
-
Q学习目标 :
传统DQN的目标值是:
这里的 max 操作会导致过估计问题。 -
Double DQN目标 :
DDQN通过分离动作选择和目标计算,目标值改为:- 动作 a 是由在线网络
选择的。
- Q值是由目标网络
计算的。
-
减小过估计的作用 :
-
通过在线网络选择动作,可以更准确地反映当前策略的动作价值。
- 目标网络仅用来计算Q值,减少了目标计算时的估计偏差。
- 动作 a 是由在线网络
[Python] Double DQN算法 实现
以下给出Double DQN算法的完整Python实现代码,它借助PyTorch框架实现,包含核心的在线网络和目标网络的更新机制:
项目代码已存放于GitCode中,可通过以下链接跳转:🔥
后续相关单智能体强化学习算法将持续在【强化学习】项目中更新,若该项目对您有所帮助,请为我点个星✨✨✨✨✨,鼓励分享,万分感谢!!!
若下方代码复现存在困难或有问题,也欢迎在评论区留言。
1. 导入必要库
import numpy as np # 导入NumPy库,用于处理数组和数值计算
import torch # 导入PyTorch库,用于构建和训练深度学习模型
import torch.nn as nn # 导入PyTorch的神经网络模块,用于构建网络结构
import torch.optim as optim # 导入PyTorch的优化器模块,用于优化神经网络参数
import random # 导入Python的随机模块,用于实现随机采样
from collections import deque # 导入deque数据结构,用于存储经验回放池
2. 超参数设置
# Hyperparameters
GAMMA = 0.99 # 折扣因子,控制奖励的时间衰减
LR = 0.001 # 学习率,用于控制优化器的步长
BATCH_SIZE = 64 # 每次训练的批量大小
MEMORY_CAPACITY = 10000 # 经验回放池的最大容量
TARGET_UPDATE = 10 # 目标网络更新的周期(每10个回合更新一次)
3. 定义网络
# Define the neural network
class QNetwork(nn.Module): # 定义Q网络,用于逼近Q值函数
def __init__(self, state_dim, action_dim):
super(QNetwork, self).__init__() # 初始化父类
self.fc1 = nn.Linear(state_dim, 128) # 第一层全连接层,输入维度为状态维度,输出128维
self.fc2 = nn.Linear(128, 128) # 第二层全连接层,输入和输出均为128维
self.fc3 = nn.Linear(128, action_dim) # 输出层,输出维度为动作维度
def forward(self, x): # 定义前向传播过程
x = torch.relu(self.fc1(x)) # 第一层激活函数为ReLU
x = torch.relu(self.fc2(x)) # 第二层激活函数为ReLU
x = self.fc3(x) # 输出层不加激活函数,直接输出Q值
return x
4. 缓存经验区
```python
Replay buffer
class ReplayBuffer: # 定义经验回放池,用于存储和采样经验数据
def init(self, capacity):
self.buffer = deque(maxlen=capacity) # 使用deque实现固定长度的经验池
def push(self, state, action, reward
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12774.html