论文笔记:DDPG算法结构

实验室最近有个项目可能要用上一些强化学习和GNN相关的东西,只好疯狂看论文了。

这篇文章是DeepMind开发的面向连续控制的off policy算法,算是deterministic policy,据说效果不错。

论文地址:Continuous control with deep reinforcement learning

  • DQN:Q-function(状态价值函数)

    • 输入→状态,输出→动作空间的预期奖励
    • 输入→状态、动作对,输出→这个动作的预期奖励
    • 问题:只能应用于动作空间离散化的问题,否则Q函数计算量会极大。
  • DDPG提出的解决方案:

    • 使用actor-critic双网络。算上训练过程,实际上共有四个网络:

      • Actor current network,负责策略网络参数θ\theta的更新,并且根据环境给出动作。
      • Actor target network,参数θ\theta^{ \prime }定期从θ\theta复制。从replay buffer里采样的状态生成对应的动作。
      • Critic current network,负责价值网络参数ww的迭代更新,并且给出当前的Q(S,A,w)Q ( S , A , w )
      • Critic target network,参数ww^{\prime}定期从ww复制,计算目标Q(S,A,w)Q ( S , A , w )
      • target-current的机制是为了防止参数爆炸,将两个网络固定作为目标进行训练,然后定期复制训练中网络的参数(但是DDPG中不是直接复制,是用软更新)到目标网络上。
    • 损失函数:DDPG的策略是确定性的,所以不需要对动作空间作积分来取期望。对于Actor网络,原文定义的损失梯度是

      θμμsi1NiaQ(s,aw)s=si,a=μ(si)θμ(sθ)si(1)\left. \left. \left. \nabla _ { \theta ^ { \mu } } \mu \right| _ { s _ { i } } \approx \frac { 1 } { N } \sum _ { i } \nabla _ { a } Q \left( s , a \mid w \right) \right| _ { s = s _ { i } , a = \mu \left( s _ { i } \right) } \nabla _ { \theta } \mu \left( s \mid \theta \right) \right| _ { s _ { i } }(1)

      对于Critic网络,用的是均方差损失

      L=1Ni(yiQ(si,aiθQ)2)(2)L = \frac { 1 } { N } \sum _ { i } \left( y _ { i } - Q \left( s _ { i } , a _ { i } \mid \theta ^ { Q } \right) ^ { 2 } \right)(2),其中

      yi=ri+γQ(si+1,μ(si+1θμ)θQ)y _ { i } = r _ { i } + \gamma Q ^ { \prime } \left( s _ { i + 1 } , \mu ^ { \prime } \left( s _ { i + 1 } \mid \theta ^ { \mu ^ { \prime } } \right) \mid \theta ^ { Q ^ { \prime } } \right)

      是用从replay buffer采样的一组(si,ai,ri,si+1)\left( s _ { i } , a _ { i } , r _ { i } , s _ { i + 1 } \right)算出来的。

  • DDPG使用的特殊机制

    • 类似DQN的Replay Buffer机制:用一个队列作为缓存,设定固定大小,维护(st,at,rt,st+1)\left( s _ { t } , a _ { t } , r _ { t } , s _ { t + 1 } \right)。每次从这个队列里采样一个mini-batch进行训练。
    • Soft target update软更新:不直接把更新后的权重赋值到网络里,而是创建actor和critic的拷贝,用拷贝计算目标进行训练,训练后的权重用 θτθ+(1τ)θ\theta ^ { \prime } \leftarrow \tau \theta + ( 1 - \tau )\theta^{ \prime } 的方法(τ1\tau \ll 1)更新回去。
    • 随机化探索策略:通过用A=πθ(S)+NA = \pi _ { \theta } ( S ) + \mathcal { N }取代原本的动作AA
      • 原文中用奥恩斯坦-乌伦贝克过程过程生成噪声N\mathcal { N }。OU过程在时序上具备很好的相关性,可以使agent很好的探索具备动量属性的环境,表达式为dxt=θ(μxt)dt+σdWd x _ { t } = \theta \left( \mu - x _ { t } \right) d t + \sigma d W,其中xtx_t是我们使用的变量,μ\mu是这个变量的均值,WW表示维纳过程(一维下的概率密度函数:fWt(x)=12πtex2/2tf _ { W _ { t } } ( x ) = \frac { 1 } { \sqrt { 2 \pi t } } e ^ { - x ^ { 2 } / 2 t },数学期望为0,方差为t),σ\sigma是维纳过程(其实就是布朗运动)带来的噪声的权重。
      • 这个方法在惯性系统上(例如Pendulum)会提升探索效率,但是在其他情况下做实现的时候不一定要用这个方法。
  • 完整的算法过程:

    输入:

    • 四个初始化的网络,分别使用参数θ,  θ,  w,  w\theta,\;\theta^{\prime},\;w,\;w^{\prime}
    • 衰减因子γ\gamma
    • 软更新系数τ\tau
    • 从Replay Buffer采样的批量mm
    • 最大迭代次数TT
    • Episode的数量MM
    • 两个网络的更新频率ff

    输出:

    • 训练完成的Actor和Critic网络,分别使用θ\thetaww

    过程:

    1. 初始化四个网络和Replay Buffer RR
    2. for i = 1, MM do
      1. 初始化一个随机过程N\mathcal{N},获取一个随机的初始状态s1s_1
      2. for t = 1, TT do
        1. 使用当前的Actor生成一个动作at=μ(stθ )+Nta_t =\mu \left( s _ { t } \mid \theta \ \right) + \mathcal { N } _ { t }
        2. 执行ata_t,从环境获取st+1s_{t+1}rtr_t,将(st,at,rt,st+1)\left( s _ { t } , a _ { t } , r _ { t } , s _ { t + 1 } \right)放入RR
        3. RR里采样大小为mm的minibatch,分别计算对应的yiy_i,然后用这些值去计算Loss(2),更新Critic current
        4. 用损失梯度(1)更新Actor current
        5. 用软更新方法更新3和4中得到的参数到Actor target和Critic target中