RL——DDPG和TD3


DPG

Stochastic Actor-Critic Algorithms

  • Critic 网络损失函数
    $$
    Loss_{\text{critic}} = \sum_t (r_t + \gamma Q^{\bar{w}}(s_{t+1}, a_{t+1}) - Q^{w}(s_{t}, a_t)) ^ 2
    $$
    • 这里要求 \(a_{t+1} \sim \pi_\theta\), \(Q^w(s_t,a_t)\) 值拟合的目标是策略 \(\pi_\theta\) 对应的Q值 \(Q^{\pi_\theta}(s_{t}, a_t)\) ,代码中使用next_action = self.actor(next_states)代替动作即可
    • 这里训练使用的 \((s_t,a_t,s_{t+1})\) 是当前策略采样到的数据(实际上,Q值的学习样本保证 \(a_{t+1}\) 的采样策略即可,样本可以是任意策略采样的,当然,用当前策略采样的会更好些)
  • Actor 网络优化梯度:
    $$
    \nabla_\theta J(\pi_\theta) = \mathbb{E}_{s\sim \rho^{\pi},a\sim\pi_\theta}\left[ \nabla_\theta \log \pi_\theta(a|s)Q^w(s,a) \right]
    $$
    • 问题: \(s\sim \rho^{\pi}\) 中的 \(\pi\) 必须是 \(\pi_\theta\) 吗?
      • 回答:是的,原始推导中,回合 \(\tau\) 必须是来自当前策略的

Off-Policy Actor Critic

  • Critic 网络损失函数
    $$
    Loss_{\text{critic}} = \sum_t (r_t + \gamma Q^{\bar{w}}(s_{t+1}, a_{t+1}) - Q^{w}(s_{t}, a_t)) ^ 2
    $$
    • 这里要求 \(a_{t+1} \sim \pi_\theta\), \(Q^w(s_t,a_t)\) 值拟合的目标是策略 \(\pi_\theta\) 对应的Q值 \(Q^{\pi_\theta}(s_{t}, a_t)\) ,代码中使用next_action = self.actor(next_states)代替动作即可
    • 这里训练使用的 \((s_t,a_t,s_{t+1})\) 是当前其他行为策略采样到的数据
  • Actor 网络优化梯度:
    $$
    \nabla_\theta J(\pi_\theta) = \mathbb{E}_{s\sim \rho^\beta,a\sim \beta}\left[ \frac{\pi_\theta(a|s)}{\beta_\theta(a|s)} \nabla_\theta \log \pi_\theta(a|s)Q^w(s,a) \right]
    $$
    • 问题:动作的偏移通过重要性采样 \(\frac{\pi_\theta(a|s)}{\beta_\theta(a|s)} \) 来解决,但是状态也可以吗?
      • 回答:不可以,这里状态采用行为策略采样是因为off-policy场景下,策略梯度的目标就是在行为策略采样的状态上最大化目标函数(这样得到的不是最优策略,线上serving时的状态分布肯定与当前行为策略采样的状态不一致,所以是一个妥协的次优解)
    • 思考:off-policy AC 与 DQN 的区别
      • 对于DQN,我们通过在每一个状态上让Q值拟合到最优策略对应的Q值(与状态分布无关,任意的状态我们都可以找到最优策略对应的Q值),然后通过 \(\mathop{\arg\max}_a Q(s,a)\) 来找到最优策略
      • 对于off-policy AC,如果不考虑状态的分布,这里带来的偏差是从优化目标上出现的,即off-policy AC最大化的目标是,在行为策略采样的状态分布下,寻找一个策略,最大化累计策略收益期望。这里的目标显然与on-policy的原始目标不同了,状态分布线上线下不一致问题会导致天然的偏差
      • 问题:为什么不可以理解为与DQN一样?任意给定的状态我都做到策略最大化了,实际上就已经求到了最优策略了?(按照这个理解,除了off-policy都会遇到的训练评估数据分布不一致外,没有别的问题?)
        • 回答:不可以,因为DQN的目标是拟合 \(Q^*(s,a)\),与状态分布无关;而策略梯度法的目标找到一个最优策略 \(\pi^*\),最大化策略该策略下的累计收益,这里要求状态分布和动作分布均来自求解到的最优策略 \(\pi^*\) ,off-policy AC下的状态分布是行为策略的,存在偏差
  • 注:off-policy AC方法中,若使用n-step回报,则每一步都需要重要性采样,使用连乘方式将新旧策略的重要性采样比值乘上去即可
  • off-policy AC方法不常用,因为从目标上天然旧带着偏差
Off-Policy AC如何对混合策略采样的样本进行重要性采样?
  • 在 Replay Buffer 中记录下每个样本的采样策略(代码示例),并在更新时逐个样本计算动作概率比值(代码示例),参见:

    1
    2
    3
    4
    5
    6
    7
    8
    ## 策略记录
    memory.append(state, action, reward, policy.detach())

    ## 动作概率比值计算
    if off_policy:
    rho = policies[i].detach() / old_policies[i]
    else:
    rho = torch.ones(1, action_size)
  • 上面的代码是 ACER(Actor-Critic with Experience Replay)方法的样例

    • ACER 基于 Actor-Critic 框架
    • ACER 利用经验回放技术来提高样本效率
    • ACER 使用通过重要性采样权重来修正策略更新时的偏差,确保梯度估计的无偏性

On-Policy Deterministic Actor-Critic

  • 优化目标
    $$ J(\theta) = \int_\mathcal{S} \rho^{\mu_\theta}(s) Q^{\mu_\theta}(s, \mu_\theta(s)) ds $$
    • 其中 \(\rho^{\mu_\theta}(s’) = \int_\mathcal{S} \sum_{k=1}^\infty \gamma^{k-1} \rho_0(s) \rho^\mu(s \to s’, k) ds\)
  • 确定性梯度定理:
    $$
    \begin{aligned}
    \nabla_\theta J(\theta)
    &= \int_\mathcal{S} \rho^{\mu_\theta}(s) \nabla_a Q^{\mu_\theta}(s, a) \nabla_\theta \mu_\theta(s) \rvert_{a=\mu_\theta(s)} ds \\
    &= \mathbb{E}_{s \sim \rho^{\mu_\theta}} [\nabla_a Q^{\mu_\theta}(s, a) \nabla_\theta \mu_\theta(s) \rvert_{a=\mu_\theta(s)}]
    \end{aligned}
    $$
  • 确定性策略看作是随机策略的一种特殊形式,也就是策略的概率分布仅在某一个动作上有非零概率(该动作概率为1)
  • 实际上,在 DPG 的论文中,作者指出:如果对随机策略,通过确定性策略和一个随机变量进行重参数化(re-parameterize),那么随机策略最终会在方差 \(\sigma=0\) 时与确定性策略等价
    • 由于随机策略需要对整个状态和动作空间进行积分,我们可以预计随机策略的学习需要比确定性策略更多的样本(这里只是猜测,没有证据证明)

Off-Policy Deterministic Actor-Critic

  • 优化目标
    $$ J_\beta(\theta) = \int_\mathcal{S} \rho^\beta(s) Q^{\mu_\theta}(s, \mu_\theta(s)) ds $$

    • 其中 \(\rho^\beta(s)\) 是行为策略上采样得到的样本状态分布,这里直接导致了优化目标不是在最优策略下的回合(回合包含状态和动作)分布下的奖励期望最大,相对on-policy Deterministic AC算是次优解
  • 推导结果:
    $$
    \begin{aligned}
    \nabla_\theta J_\beta(\theta) &= \mathbb{E}_{s \sim \rho^\beta(s)} \left[\nabla_a Q^{\mu_\theta}(s, a) \nabla_\theta \mu_\theta(s) \rvert_{a=\mu_\theta(s)} \right]
    \end{aligned}
    $$

  • Critic 网络更新(TD-Error)
    $$
    Loss_{\text{critic}} = \sum_t (r_t + \gamma Q^{\bar{w}}(s_{t+1}, a_{t+1}) - Q^{w}(s_{t}, a_t)) ^ 2
    $$

    • 这里要求 \(a_{t+1} = \mu_\theta(s_{t+1})\), \(Q^w(s_t,a_t)\) 值拟合的目标是策略 \(\mu_\theta\) 对应的Q值 \(Q^{\mu_\theta}(s_{t}, a_t)\),实际更新中常使用Target网络 \(\bar{\theta}\) 一个简单的实现示例如下(参考自《动手学强化学习书籍》):

      1
      2
      3
      next_q_values = self.target_critic(next_states, self.target_actor(next_states))
      q_targets = rewards + self.gamma * next_q_values * (1 - dones)
      critic_loss = torch.mean(F.mse_loss(self.critic(states, actions), q_targets))
    • 这里训练使用的 \((s_t,a_t,s_{t+1})\) 是行为策略采样到的数据(Q值 \(Q^{\mu_\theta}(s_{t}, a_t)\) 的学习样本保证 \(a_{t+1}\) 的采样策略是 \(\mu_\theta\) 即可,样本可以是任意策略采样的,当然,用当前策略采样的会更好些)

  • Actor 网络更新
    $$
    \begin{aligned}
    Loss_{\text{actor}} = - \mathbb{E}_{s_t \sim \rho^\beta(s)} [Q_w(s_t,\mu_\theta(s_t))]
    \end{aligned}
    $$

    • 上面的Loss求导就可以得到梯度是 \(\mathbb{E}_{s \sim \rho^\beta(s)} \left[\nabla_a Q^{\mu_\theta}(s, a) \nabla_\theta \mu_\theta(s) \rvert_{a=\mu_\theta(s)} \right]\),与之前推导结论一致
    • 直观上理解,这里的目标是对于任意给定的状态 \(s_t\) 下(这个状态样本是行为策略采样得到的),找到一个最大最大化当前 \(Q_w(s_t,\mu_\theta(s_t)) \) 的动作参数 \(\mu_\theta\)

DDPG

DDPG训练流程

  • 伪代码如下(其中 \(\theta^{\mu’}\) 和 \(\theta^{Q’}\) 分别表示策略 \(\mu’\) 和价值 \(Q’\) 的参数):

  • 随机探索 :做选择动作 \(a_t\) 时,添加一个随机噪声,可以增强探索能力,使得模型更加鲁棒,如果没有随机噪声,可能会很快收敛到局部最优

  • 软更新 :Target网络的更新选择软更新,DQN中是硬更新


DDPG 为什么可以是 off-policy 的?

  • DDPG 是 off-policy 的,原因如下:
    • Q函数的学习 :DQN 和 DDPG 本质都是基于贝尔曼最优公式迭代Q值的,因为 Q 函数都是在学习某个策略 \(\pi_0\) (\(\pi_0\) 实际上就是截止到当前的最优策略)下对应的 Q 值,只要 TD-Error中 的 Q 值目标 \(r(s,a)+\gamma Q(s’,a’) - Q(s, a)\) 中的 \(a’\) 是策略 \(\pi_0\) 采样的,即服从策略 \(a\sim\pi_0(\cdot|s’)\) 即可保证学到的Q值是 \(Q^{\pi_0}(s,a)\),与 \((s,a,s’)\) 本身的采样策略无关
    • 策略的学习 :在保证Q函数预估的是当前策略(即截止到目前的最优策略)对应的Q值以后,我们只需要求解一个策略,保证当前策略对应的动作分布下的Q值最大即可,此时有:
      • DDPG如何找到最优策略? :目标是找到一个确定性策略 \(\pi_\theta(s)\),最大化 \(Q(s,\pi_\theta(s))\) (本质可以理解为Q值在策略下的期望 \(\pi_\theta(s)\),确定性策略的期望就是这个策略对应的Q值),可采用梯度直接回传的方式链式求导;
      • 注意:DDPG/SAC等方法中 ,策略学习的目标是找到使得当前 \(Q(s,a)|a\sim\pi_\theta(s)\) 值最大的策略 \(\pi_\theta\),学习时状态 \(s\) 是从什么策略采样来的无关,即任意给我一个状态 \(s\),目标策略都能使得该状态下的 \(Q\) 值最大化(这里的Q值在学习中拟合目标是在当前策略下的Q值);但普通的AC方法中 ,Actor是直接对Reward的期望求梯度来更新的,这个期望是需要在当前策略下的期望,故而状态和动作都需要是当前状态下采样得到的,否则梯度有偏,而DDPG/SAC中则因为直接最大化Q值(该Q值是当前策略下的Q值)来实现了,绕过了必须保证状态 \(s\) 是当前策略采样得到的这一步了
  • 更多详情讨论可参考:RL——强化学习相关笔记

TD3

TD3 训练流程

  • 伪代码如下(其中, \(t \ \text{mod} \ d\) 表示策略更新比Q值更新慢一些, \(d\) 次Q值更新对应一次策略更新):

改进1:Twin

  • 采用双Critic网络(训练网络和target网络均为双网络),缓解Q值高估问题

改进2:Delayed

  • Actor的目标是在Q值更新时,寻找最优的策略,如果Q值更新太快,容易波动,可以让Q值比较稳定了再更新Actor网络
  • 具体做法,Critic网络更新 \(d\) 次再更新一次Actor

改进3:Target 策略网络增加噪声

  • 在Actor 的target策略网络输出的策略中,增加噪声,可以缓解Q值高估问题

TD3+BC(TD3 with behavior cloning,for Offline RL)