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

标签: 机器学习

一. 什么是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 37=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τ)θ, τ < < 1 \tau<<1 τ<<1
  5. DDPG算法如下图:

ddpg解决swing-up问题,超详细附代码_第1张图片

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

二. 什么是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/

如果有其他问题可以留言

你可能感兴趣的:(机器学习)