论文笔记:DDPG算法结构

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

这篇文章是DeepMind开发的面向连续动作空间控制的RL算法,据说效果不错。

论文地址: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,负责价值网络参数$w$的迭代更新,并且给出当前的$Q ( S , A , w )$。
      • Critic target network,参数$w^{\prime}$定期从$w$复制,计算目标$Q ( S , A , w )$
      • target-current的机制是为了防止参数爆炸,将两个网络固定作为目标进行训练,然后定期复制训练中网络的参数(但是DDPG中不是直接复制,是用软更新)到目标网络上。
    • 损失函数:DDPG的策略是确定性的,所以不需要对动作空间作积分来取期望。对于Actor网络,原文定义的损失梯度是

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

      $L = \frac { 1 } { N } \sum { i } \left( y { i } - Q \left( s { i } , a { i } \mid \theta ^ { Q } \right) ^ { 2 } \right)(2)$,其中

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

  • DDPG使用的特殊机制

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

    输入:

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

      输出:

    • 训练完成的Actor和Critic网络,分别使用$\theta$和$w$。

      过程:

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