ddpg解决swing-up问题,超详细附代码

版权声明:本文为博主原创文章,转载请附上链接出处。 https://blog.csdn.net/allen_li123/article/details/86663654

标签: 机器学习

一. 什么是DDPG(deep deterministic policy gradient)

DDPG在continuous control with deep reinforcement learning论文中提出并作出了详细的解释

在论文中比较重要的信息有以下:

  1. DQN无法处理高维输出,并且只能输出离散值,因为一些动作维度结构可能包括一些信息,所以在连续控制问题上可能表现很糟糕。而DDPG可以将DQN的维度变低维,并且可以输出连续值
    例如:一个关节可以取值{-k,0,k}三个值,如果有七个关节,那么DQN的输出将是 3 7 = 2187 3^7=2187 个单元,训练效果将大打折扣。而对于DDPG来说,输出层是七个关节的取值,输出维度大大降低。
  2. DQN的两大创新分别是记忆库和时间差异副本(eval网络与target网络异步更新),DDPG有actor网络用于根据状态选择动作,critic网络对状态与动作的选择进行打分,对于每个actor网络和critic网络都有一个时间差异副本,故DDPG一共有四个网络
  3. 在选取状态输入的时候注意选取的变量量纲是否一致,如果量纲不同,取值范围不同等问题将会影响网络学习效率(在这里被坑过),解决方法是可以使用batch normalization维护平均值和方差,对状态和网络的所有层进行归一化。
  4. 对eval网络与target网络的异步更新建议用 θ = τ θ + ( 1 τ ) θ \theta^{'}=\tau\theta+(1-\tau)\theta^{'} , τ < < 1 \tau<<1
  5. DDPG算法如下图:

在这里插入图片描述

算法流程:
(1). 初始化 a c t o r e v a l actor与eval 网络 Q ( s , a θ Q ) Q(s,a|\theta^{Q}) μ ( s θ μ ) \mu(s|\theta^{\mu}) ,并将 a c t o r _ e v a l actor\_eval c r i t i c _ e v a l critic\_eval 的值赋予 a c t o r _ t a r g e t actor\_target c r i t i c _ e v a l critic\_eval (如果不赋相同的值可能会影响后面训练效率,同样被坑过)
(2). 初始化记忆库R
(3). 对于每一个回合执行:选取一个噪音N,并且随机初始化状态s(噪音是为了探索环境,可以随着回合增加而降低)
(4). 对于每一个回合的每一步执行以下(5)-(12)
(5). 选取动作 a t = μ ( s t θ μ ) + N a_t=\mu(s_t|\theta^{\mu})+N (这里使用的是 a c t o r _ e v a l actor\_eval 网络)
(6). 对 s t s_t 执行 a t a_t 进行仿真获得奖励 r _ t r\_t 与新状态 s t + 1 s_{t+1} (使用actor_eval的前向传播,不更新)
(7). 存储 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) 到记忆库R
(8). 随机选取R中的一组数据,执行(9)-(12)
(9). $y_i=r_i+\gamma Q{’}(s_{i+1},\mu{’}(s_{i+1}|\theta{\mu{’}})|\theta{Q^{’}}) ( 使 (这里使用的是 actor_target与critic_target$
(10). 通过loss更新critic, L = M S E ( y i Q ( s i , a i θ Q ) ) L=MSE(y_i-Q(s_i,a_i|\theta^{Q})) (我一般直接使用均方差公式,同时这里 Q ( s i , a i θ Q ) Q(s_i,a_i|\theta^{Q}) 使用的是 c r i t i c _ e v a l critic\_eval
(11). 更新actor, L = Q ( s , u ( s θ μ ) θ Q ) L=Q(s,u(s|\theta^{\mu})|\theta^{Q}) (这里使用的是actor_eval与critic_eval,这个数学公式有点看不懂,可能理解不对,敬请指正)
(12). 更新两个target网络
θ Q < = τ θ Q + ( 1 τ ) θ Q \theta^{Q{'}}<=\tau\theta^{Q}+(1-\tau)\theta^{Q^{'}}
θ μ < = τ θ μ + ( 1 τ ) θ μ \theta^{\mu{'}}<=\tau\theta^{\mu}+(1-\tau)\theta^{\mu^{'}}

二. 什么是swing-up

swing-up 是gym中开源的一个游戏,主要任务是通过对杆子施加力让杆子立起来不倒,越快立起来保持越久分数越高

三. 完全代码

代码已经全部上传至github:https://github.com/allenabx/swing-up-using-ddpg/tree/master/ddpg
包含莫凡写的用TensorFlow实现的DDPG与我参照莫凡与学长代码写的pytorch版本的DDPG(遇到了好多坑一步一步对照改出来的)

四. 了解更多

对DDPG仍然不熟悉的可以参看莫凡的DDPG讲解https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/

还有莫凡的用ddpg搭建机械手臂的全部教程https://morvanzhou.github.io/tutorials/machine-learning/ML-practice/RL-build-arm-from-scratch1/

如果有其他问题可以留言

猜你喜欢

转载自blog.csdn.net/allen_li123/article/details/86663654