深度强化学习——连续动作控制DDPG、NAF

联系方式:860122112@qq.com

传统的DQN只适用于离散动作控制,而DDPGNAF是深度强化学习在连续动作控制上的拓展。

一、存在的问题

DQN是一个面向离散控制的算法,即输出的动作是离散的。对应到Atari 游戏中,只需要几个离散的键盘或手柄按键进行控制。

然而在实际中,控制问题则是连续的,高维的,比如一个具有6个关节的机械臂,每个关节的角度输出是连续值,假设范围是0°~360°,归一化后为(-1,1)。若把每个关节角取值范围离散化,比如精度到0.01,则一个关节有200个取值,那么6个关节共有 2006 个取值,若进一步提升这个精度,取值的数量将成倍增加,而且动作的数量将随着自由度的增加呈指数型增长。所以根本无法用传统的DQN方法解决。

解决方法
使用Policy-Based方法,通过各种策略梯度方法直接优化用深度神经网络参数化表示的策略,即网络的输出就是动作。

二、DDPG

深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)算法是Lillicrap 等人利用 DQN 扩展 Q 学习算法的思路对确定性策略梯度(Deterministic Policy Gradient, DPG)方法进行改造,提出的一种基于行动者-评论家(Actor-Critic,AC)框架的算法,该算法可用于解决连续动作空间上的 DRL 问题。

这里写图片描述

随机性策略和确定性策略:

  • 随机性策略,策略输出的是动作的概率,比如上一篇A3C博客提到的连续动作控制,使用的是一个正态分布对动作进行采样选择,即每个动作都有概率被选到;优点,将探索和改进集成到一个策略中;缺点,需要大量训练数据。
  • 确定性策略,策略输出即是动作;优点,需要采样的数据少,算法效率高;缺点,无法探索环境。

在真实场景下机器人的操控任务中,在线收集并利用大量训练数据会产生十分昂贵的代价, 并且动作连续的特性使得在线抽取批量轨迹的方式无法达到令人满意的覆盖面, 这些问题会导致局部最优解的出现。

然而使用确定性策略无法探索环境,如何解决?
利用off-policy学习方法。off-policy是指采样的策略和改进的策略不是同一个策略。类似于DQN,使用随机策略产生样本存放到经验回放机制中,训练时随机抽取样本,改进的是当前的确定性策略。整个确定性策略的学习框架采用AC的方法。

DDPG公式
在DDPG中,分别使用参数为 θμ θQ 的深度神经网络来表示确定性策略 a=π(s|θμ) 和动作值函数 Q(s,a|θQ) 。其中,策略网络用来更新策略,对应 AC 框架中的行动者;值网络用来逼近状态动作对的值函数, 并提供梯度信息, 对应 AC 框架中的评论家。目标函数被定义为带折扣的总回报:

J(θμ)=Eθμ[r1+γr2+γ2r3+]

通过随机梯度法对目标函数进行端对端的优化( 注意,目标是提高总回报 J )。Silver等人证明了目标函数关于 θμ 的梯度等价于Q值函数关于 θμ 的期望梯度:
J(θμ)θμ=Es[Q(s,a|θQ)θμ]
根据确定性策略 a=π(s|θμ) 可得:
J(θμ)θμ=Es[Q(s,a|θQ)aπ(s|θμ)θμ]
沿着 提升 Q 值的方向更新策略网络的参数。

通过 DQN中更新值网络的方法来更新评论家网络,梯度信息为:

L(θQ)θQ=Es,a,r,sD[(TargetQQ(s,a|θQ))Q(s,a|θQ)θQ]
TargetQ=r+γQ(s,π(s|θμ)|θQ)

其中 θμ θQ 分别表示目标策略网络和目标值网络的参数,用梯度下降方式更新值网络。

算法伪代码
这里写图片描述

区别于DQN,DQN每隔一定的迭代次数后,将MainNet参数复制给TargetNet;而DDPG中TargetNet的参数每次迭代都以微小量逼近MainNet的参数。

网络训练流程图
这里写图片描述

实验表明, DDPG 不仅在一系列连续动作空间的任务中表现稳定,而且求得最优解所需要的时间步也远远少于 DQN。与基于值函数的 DRL 方法相比, 基于 AC 框架的深度策略梯度方法优化策略效率更高、 求解速度更快。

DDPG缺点:
不适用于随机环境的场景

三、NAF

Shixiang等人的论文中共有两个算法,第一个是NAF,第二个是基于模型(Model-based)加速的NAF。这里只介绍简单的NAF。

DDPG的问题:
需要训练两个网络即策略网络和值网络

解决方法
归一化优势函数(normalized advantage functions ,NAF)只需要训练一个网络。

NAF公式:
NAF的目的之一是要将深度神经网络Q-Learning应用于连续动作空间,而要用Q-Learing进行训练必须要知道目标Q值(TargetQ)。

和前面博客Dueling-DDQN介绍的dueling net思想类似,动作值函数可以表示为状态值函数 V 与动作价值函数 A 的和,即

Q(x,u|θQ)=V(x|θV)+A(x,u|θA)

其中 x 表示状态State,u 表示动作Action, θ 是对应的网络参数, A(x,u|θA) 可以看成动作 u 在状态 x 下的优势。我们的目的就是要使策略网络输出的动作 u 所对应的Q值最大。
如果能使 x,uA(x,u|θA)0,则 x,uQ(x,u|θQ)V(x|θV) 。在状态 x 下最优的动作 u 的动作优势函数 A(x,u|θA)=0 ,所以对应最优动作的值函数 Q(x,u|θQ)=V(x|θV) ,这样就很容易构造出TargetQ值了。具体的做法是令
A(x,u|θA)=12(uμ(x|θμ))TP(x|θP)(uμ(x|θμ))

P(x|θP) 是一个关于状态的正定矩阵,因为正定矩阵可以进行楚列斯基(Cholesky)分解,即
P(x|θP)=L(x|θP)L(x|θP)T
L(x|θP) 是对角线都是正数的下三角矩阵,且是唯一的。

最终算法的Loss Function为

L(θQ)=E[(TargetQQ(xt,ut|θQ))2]
TargetQ=rt+γV(xt+1|θQ)
Q(xt,ut|θQ)=V(xt|θV)+A(xt,ut|θA)

使用DQN的训练方式训练。

算法伪代码
这里写图片描述

网络训练流程图
这里写图片描述

网络输出的是下三角矩阵 L ,动作 u,状态值函数 V <script type="math/tex" id="MathJax-Element-42">V</script>

异步NAF训练机械臂
Shixiang等人还使用了异步NAF训练机械臂开门
这里写图片描述

该算法具有一个训练线程(trainer thread)和多个收集样本线程(collector thread),collector thread将收集到的样本存于经验回放机制中,供trainer thread训练。

这个异步NAF算法和A3C算法的不同之处在于:
异步NAF是off-policy,collector thread不提供梯度信息;
A3C是on-policy,每个线程agent都提供梯度信息。

参考文献
[1]Continuous control with deep reinforcement learning
[2]Continuous Deep Q-Learning with Model-based Acceleration
[3]Deterministic Policy Gradient Algorithm
[4]Deep Reinforcement Learning for Robotic Manipulation with Asynchronous Off-Policy Updates
[5]深度强化学习综述_刘全等


### 使用强化学习实现UR5机器人避障 #### 设计奖励函数 为了使 UR5 机器人能够有效地避开障碍物,设计合理的奖励函数至关重要。奖励函数应能引导机器人的行为趋向于安全路径规划并最终达到目标位置[^3]。 - **正向激励**:当机器人朝向目标前进且未接近任何障碍时给予正面奖励;越靠近目标获得越多分数。 - **惩罚机制**:如果检测到与物体距离过近,则施加负反馈来阻止这种动作继续发生。碰撞事件应当触发较大的负面得分减少量以强调其不可接受性。 #### 构建环境模型 采用 MuJoCo 或 Gazebo 这样的高精度物理仿真器可以帮助构建逼真的训练场景,在这些环境中测试不同的策略而无需担心实际硬件损坏的风险[^4]。 对于特定的应用案例——比如 Dual-UR5-Husky 组合平台上的任务执行——可以通过将 ROS 中定义的 URDF 文件转化为适用于 Mujoco 的 XML 描述来进行高效便捷的操作设置。 #### 应用 NAF 算法 NAF (Normalized Advantage Function) 是一种有效的深度 Q 学习变体方法,已被证明可以在连续空间内很好地解决复杂决策问题。将其应用于机器人避障意味着让智能体学会预测采取某个行动后的预期收益变化情况,并据此调整自己的运动模式以便更好地适应周围环境的变化条件[^2]。 ```python import gym from stable_baselines3 import DDPG, SAC, TD3, A2C, PPO from stable_baselines3.common.env_checker import check_env from ur_robot_env import URRobotEnv # 自定义环境类 env = URRobotEnv() # 初始化自定义环境实例 check_env(env) model = SAC('MlpPolicy', env, verbose=1).learn(total_timesteps=int(1e6)) obs = env.reset() for i in range(1000): action, _states = model.predict(obs) obs, rewards, dones, info = env.step(action) if dones: break ``` 此代码片段展示了如何利用 Stable Baselines3 实现一个简单的强化学习循环过程,其中 `URRobotEnv` 需要由开发者自行开发或选用现有的开源项目作为基础框架。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值