深度强化学习——Dueling-DDQN

联系方式:860122112@qq.com

深度双Q网络(DDQN)基于竞争构架Q网络(Dueling-DQN)都是DQN的改进版本,前者是对DQN训练算法的改进,后者是对DQN模型结构的改进。

一、DDQN

论文(Hasselt等人)发现并证明了传统的DQN普遍会过高估计Action的Q值,而且估计误差会随Action的个数增加而增加。如果高估不是均匀的,则会导致某个次优的Action高估的Q值超过了最优Action的Q值,永远无法找到最优的策略。作者在他2010年提出的Double Q-Learning的基础上,将该方法引入了DQN中。具体操作是对要学习的Target Q值生成方式进行修改,原版的DQN中是使用TargetNet产生Target Q值,即

TargetQ=r+γmaxaQ(s,a;θi)
其中 θi 是TargetNet的参数。

在DDQN中,先用MainNet找到 maxaQ(s,a;θi) 的Action( θi 是MainNet的参数),再去TargetNet中找到这个Action的Q值以构成Target Q值,这个Q值在TargetNet中不一定是最大的,因此可以避免选到被高估的次优Action。最终要学习的Loss Function为:

L(θ)=E[(TargetQQ(s,a;θi))2]

TargetQ=r+γQ(s,maxaQ(s,a;θi);θi)

除此之外,其他设置与DQN一致。实验表明,DDQN能够估计出更准确出Q值,在一些Atari2600游戏中可获得更稳定有效的策略。

Loss Function 的构造流程图
这里写图片描述

二、Dueling-DQN

在许多基于视觉的感知的DRL任务中,不同的状态动作对的值函数是不同的,但是在某些状态下,值函数的大小与动作无关。根据以上思想,Wang等人提出了一种竞争网络结构(dueling network)作为DQN的网络模型。

先来看结构

这里写图片描述

如上图所示,第一个模型是一般的DQN网络模型,即输入层接三个卷积层后,接两个全连接层,输出为每个动作的Q值。

而(第二个模型)竞争网络(dueling net)将卷积层提取的抽象特征分流到两个支路中。其中上路代表状态值函数 V(s) ,表示静态的状态环境本身具有的价值;下路代表依赖状态的动作优势函数 A(a) (advantage function),表示选择某个Action额外带来的价值。最后这两路再聚合再一起得到每个动作的Q值。
这里写图片描述

这种竞争结构能学到在没有动作的影响下环境状态的价值 V(s) 。如下图,在训练过程中,上下两行图表示不同时刻,左右两列表示属于 V(s) A(a) ,(通过某种方法处理后)图中红色区域代表 V(s) A(a) 所关注的地方。 V(s) 关注于地平线上是否有车辆出现(此时动作的选择影响不大)以及分数; A(a) 则更关心会立即造成碰撞的车辆,此时动作的选择很重要。
这里写图片描述

公式:
状态价值函数表示为

V(s;θ,β)

动作优势函数表示为
A(s,a;θ,α)

动作Q值为两者相加
Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α)

其中 θ 是卷积层参数, β α 是两支路全连接层参数。
而在实际中,一般要将动作优势流设置为单独动作优势函数减去某状态下所有动作优势函数的平均值
Q(s,a;θ,α,β)=V(s;θ,β)+(A(s,a;θ,α)1|A|aA(s,a;θ,α))

这样做可以保证该状态下各动作的优势函数相对排序不变,而且可以缩小 Q 值的范围,去除多余的自由度,提高算法稳定性。

论文中dueling net结合了DDQN以及优先级采样(Prioritized Experience Replay)的训练方式。

Prioritized Experience Replay
简单来说,经验池中TD误差( r+γmaxaQ(s,a;θ)Q(s,a;θ) )绝对值越大的样本被抽取出来训练的概率越大,加快了最优策略的学习。

实验证明,Dueling-DDQN估计的值函数更加精确。在频繁出现 agent 采取不同动作但对应值函数相等的情形下,Dueling-DDQN优势最明显。

参考文献
[1]Deep Reinforcement Learning with Double Qlearning
[2]Dueling Network Architectures for Deep Reinforcement Learning
[3]深度强化学习综述_刘全等


### 实现或应用DDQN算法于Gazebo仿真环境 #### 设计与准备阶段 为了在Gazebo环境中实现深度双Q网络(Deep Double Q-Network, DDQN),需先构建合适的强化学习框架。这通常涉及安装必要的库,如TensorFlow或PyTorch用于神经网络训练,并配置好ROS(Robot Operating System)工作空间以便集成Gazebo模拟器。 #### 创建自定义机器人模型并设置环境 基于特定需求创建或调整现有的机器人URDF文件来描述机器人的物理特性。之后,在`rover_spawn.launch`文件中指定加载此模型到Gazebo场景内[^2]: ```xml <launch> <!-- 加载Erle-Rover模型 --> </launch> ``` 确保已正确设置了环境变量以访问所需的包路径,例如通过命令`source ~/simulation/ros_catkin_ws/devel/setup.bash`激活相关的工作区环境。 #### 编写控制器逻辑 编写Python脚本作为节点(node), 使用MAVProxy或其他方式控制车辆移动方向和速度。对于DDQN来说,这部分代码负责收集状态数据、执行动作以及接收奖励信号。这里的关键在于如何将实际世界的观测转换成适合输入给DNN的数据形式。 针对具体应用场景定制化设计奖励函数(reward function),它决定了智能体(agent)的学习目标是什么样的行为模式最优化。比如让无人车尽可能快而平稳地到达目的地可以设定为正向激励;碰撞则给予负反馈。 #### 训练过程中的注意事项 - **初始化参数**:合理选择超参(learning rate, discount factor γ等),这对收敛性和最终性能有很大影响。 - **探索策略**:采用ε-greedy policy平衡exploration vs exploitation之间的关系,即随机行动的概率随时间逐渐减小。 - **经验回放机制**:存储过往经历形成memory buffer,从中采样mini-batch来进行梯度下降更新权重w,从而打破样本间的关联性提高泛化能力。 - **双重估计减少过拟合风险**:利用两个独立评估网络分别预测当前action value y 和 target network q(s',a'; w-) ,以此降低TD error波动幅度。 #### 示例伪代码展示DDQN核心流程 ```python import gym from collections import deque import random import numpy as np import tensorflow as tf class DDPGAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size # 初始化其他成员... def remember(self, state, action, reward, next_state, done): """保存一次交互记录""" pass def act(self, state): """根据现有policy决定采取什么操作""" if np.random.rand() <= epsilon: return random.randrange(self.action_size) act_values = self.model.predict(state) return np.argmax(act_values[0]) def replay(self, batch_size): minibatch = ... for state, action, reward, next_state, done in minibatch: target = ... predicted_future_reward = ... # 更新target值考虑到了double dqn的特点 target[action] = reward + gamma * \ (predicted_future_reward - current_q_value) self.model.fit(state, target, epochs=1, verbose=0) if __name__ == "__main__": env = gym.make('YourEnvNameHere') agent = DDPGAgent(...) episodes = 1000 time_steps_per_episode = 500 try: for e in range(episodes): state = env.reset() score = 0 for t in range(time_steps_per_episode): action = agent.act(state) next_state, reward, done, _ = env.step(action) agent.remember(state, action, reward, next_state, done) if len(memory) > batch_size: agent.replay(batch_size) state = next_state if done: break print(f'Episode {e}/{episodes}, Score: {score}') finally: # Save trained weights here. pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值