策略梯度法的推导结论
- 策略梯度法推导结论是
$$
\begin{align}
\nabla_\theta J(\theta) &= \mathbb{E}_{\tau \sim p_\theta(\tau)} [R(\tau) \nabla_\theta \log p_\theta(\tau)] \\
& = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) R(\tau) \right] \\
& = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[\sum_t \psi_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right] \\
\end{align}
$$- 推导详情见RL——策略梯度法推导
- \(\psi_t\) 来替换 \(R(\tau)\) 的理由是可以考虑用一个与时间相关的变量来替换与时间无关的累计收益
- 进一步地,其中的 \(\psi_t\) 可以换成不同的形式,包括:
- \(\sum_{t’=0}^T \gamma^t r_{t’}\):完成的轨迹收益
- \(\sum_{t’=t}^T \gamma^{t’-t} r_{t’}\):从第 \(t\) 步开始的轨迹收益,理由是策略主要影响的是 \(t\) 步开始收益,对前面步骤的收益影响不大
- \(\sum_{t’=t}^T \gamma^{t’-t} r_{t’} - b(s_t)\):进一步降低方差,详细证明见RL——策略梯度法
- \(Q^{\pi_\theta}(s_t,a_t)\):动作价值函数,是 \(\sum_{t’=t}^T \gamma^{t’-t} r_{t’}\) 的估计值
- \(A^{\pi_\theta}(s_t,a_t)\):优势函数,仅考虑当前状态 \(s_t\) 下不同动作带来的收益,忽略状态本身的价值
- \( r_t + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_{t}) \): V 值的TD-Error形式,即贝尔曼残差,本质等价于优势函数
- 问题:将 \(\psi_t\) 换成 \( r_t + \gamma Q^{\pi_\theta}(s_{t+1}, a_{t+1}) - Q^{\pi_\theta}(s_{t}, a_t) \) 可以吗?
- 答案是不可以。理由是 \( r_t + \gamma Q^{\pi_\theta}(s_{t+1}, a_{t+1}) - Q^{\pi_\theta}(s_{t}, a_t) \) 本身不是优势函数 \(A(s,a)\),也不是 \(Q(s,a)\) 没有别的含义,只有 Q 值自身更新时的TD-Error
- 证明:如果 \(a_{t+1} \sim \pi_\theta\),则 \(Q^{\pi_\theta}(s_{t+1}, a_{t+1}) = V^{\pi_\theta}(s_{t+1})\) ;但是因为 \(Q^{\pi_\theta}(s_{t}, a_t) \neq V^{\pi_\theta}(s_{t})\) (因为 \(a_t\) 是已经发生的事实),故而 \( r_t + \gamma Q^{\pi_\theta}(s_{t+1}, a_{t+1}) - Q^{\pi_\theta}(s_{t}, a_t) \) 本身不是优势函数,也能等价于优势函数
- 改进:如果非要用 Q 值来作为 Actor Critic 的价值网络,则需要求解策略 \(\pi_{\theta^*} = \mathop{\arg\max}_{\pi_\theta} \mathbb{E}_{a_t \sim \pi_\theta(\cdot|s_t)} [Q(s_t, a_t)]\),比如DDPG就是如此
AC 算法
- 普通 AC(Actor Critic)算法一般是直接使用 \(Q(s_t,a_t)\) 来替换 \(\psi_t\)
Critic 网络的更新
- Critic 网络更新方式
$$
Loss_{\text{critic}} = \sum (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\)(实际上是 SARSA 的更新方式), \(Q^{w}\) 值拟合的目标是策略 \(\pi_\theta\) 对应的 Q 值 \(Q^{\pi_\theta}(s_{t}, a_t)\)
- 这里虽然使用 Target 网络的表达,但 AC 算法一般不需要 Target 网络,加入 Target 网络可能会导致收敛变慢
- Critic 网络往往可以使用比 Actor 网络更大的学习率或更多的更新次数,这称为双时间尺度 AC 算法(Two-time Scale Actor-Critic Algorithms),该算法中,使用两种不同的学习速率(或时间尺度)来更新 Actor 和 Critic
Actor 网络的更新
- Actor 网络的损失函数
$$
\begin{align}
Loss_{\text{actor}} &= \sum Q^{w}(s_{t}, a_t) \log \pi_\theta(a_t|s_t) \\
Q^{w}(s_{t}, a_t) &= \text{Stop_Gradient}(Q^{w}(s_{t}, a_t))
\end{align}
$$ - 这里面的 \(Q^{w}(s_{t}, a_t)\) 是不参与 Actor 参数的更新的
- \(a_t \sim \pi_\theta(\cdot|s_t)\)
AC 算法的问题
- AC 算法虽然是直接优化策略的,但是由于它是 on-policy 的,样本利用率很低,导致训练缓慢
A2C 算法
- A2C(Advantage Actor Critic)算法引入了优势函数(Advantage),这也是 A2C 名字的由来
- 即使用 \( r_t + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_{t}) \) 来替换 \(\psi_t\) 的方法
- 很多书籍里面会直接默认使用 A2C 算法作为 AC 算法的 等价 表述
Critic 网络的更新
- Critic 网络的损失函数:
$$
Loss_{\text{critic}} = \sum (r_t + \gamma V^{\bar{w}}(s_{t+1}) - V^{w}(s_{t})) ^ 2
$$ - 这里 V 值拟合的目标是策略 \(\pi_\theta\) 对应的 V 值 \(V^{\pi_\theta}\)
- 这里虽然使用 Target 网络的表达,但A2C 算法一般不需要 Target 网络,加入 Target 网络可能会导致收敛变慢
- Critic 网络往往可以使用比Actor 网络更大的学习率或更多的更新次数
Actor 网络的更新
- Actor 网络损失函数:
$$
\begin{align}
Loss_{\text{actor}} &= \sum \delta \log \pi_\theta(a_t|s_t) \\
\delta &= \text{Stop_Gradient}(r_t + \gamma V^{w}(s_{t+1}) - V^{w}(s_{t}))
\end{align}
$$ - 这里面的 \(r_t + \gamma V^{w}(s_{t+1}) - V^{w}(s_{t})\) 是不参与 Actor 参数的更新的
A2C 算法的问题
- A2C 算法是同步更新的,需要每个 Worker 都收集完成数据才能执行一次更新,很多时候数据交互完成的时间是很不一致的,训练也较慢
A3C 算法
- A3C(Asynchronous Advantage Actor Critic),是 Actor Critic 方法的异步版本
- 注意:这里的异步是参数更新的异步,类似 PS 架构,不会导致 A3C 变成 Off-Policy 的
- 也就是说:A3C 始终是 On-Policy 的
A3C 的主要优化点
异步训练框架优化:
- 一个全局网络(包括V网络和Actor 网络)和多个相互独立的 Local 网络(即 Worker)
- 训练时:使用多个 Worker 并行的和环境分别交互,各自收集数据、计算梯度、异步更新全局网络参数
- inference 时:仅适用全局网络中的 Actor 网络就可以
A3C 的“异步”更新流程
- A3C 的“异步”特指 “多线程并行更新全局网络的方式” ,而非“采样策略与更新策略的分离”
- 其核心逻辑是通过“多个本地线程独立采样+异步向全局网络传梯度”提升训练效率
- A3C 具体流程如下:
- 全局网络(Global Network) :
- 存储共享的策略参数\( \theta \)(Actor和Critic共享一套参数),是最终需要优化的目标网络
- Local Workers :通常有多个独立线程,每个线程的工作流程是:
- 同步参数 :先从全局网络复制当前最新的参数\( \theta \)到本地(此时本地策略=全局策略);
- 采样轨迹 :用本地策略\( \pi_\theta \)与环境交互,采样一段短轨迹(如n-step,5~20步);
- 计算梯度 :基于采样轨迹计算 Actor(策略)和 Critic(价值)的损失梯度(此时本地行为策略=本地待更新策略);
- 注意:这一步计算梯度时是在行为策略的基础上计算的,所以是 On-policy,不是 Off-policy
- 异步更新 :将本地梯度发送给全局网络,全局网络用这些梯度更新参数\( \theta \)(无需等待其他线程,即“异步”);
- 重置本地参数 :下一轮循环前,再次从全局网络同步最新的\( \theta \),覆盖本地旧参数
- 全局网络(Global Network) :
- 注:A3C 的“异步”仅描述“多个本地线程与全局网络的交互方式”,不改变“每个线程采样时用的策略=当前待更新的全局策略”这一核心事实
策略更新损失增加熵
- 增加熵的损失函数定义如下:
$$
\begin{align}
Loss_{\text{actor}} &= \sum \delta \log \pi_\theta(a_t|s_t) + c H(\pi_\theta(a|s)) \\
\delta &= \text{Stop_Gradient}(r_t + \gamma V^{w}(s_{t+1}) - V^{w}(s_{t}))
\end{align}
$$ - 增加熵相当于是一种正则,与 SAC 思想相似
AC/A2C/A3C的区别
- AC(Actor-Critic)、A2C(Advantage Actor-Critic)和 A3C(Asynchronous Advantage Actor-Critic)三者可以从名字上看出来算法的区别
AC(Actor-Critic)
- Actor-Critic 方法结合了值函数方法和策略梯度方法的优点。它由两部分组成:一个称为“actor”的网络负责学习采取什么行动;另一个称为“critic”的网络评估采取的动作的好坏,即这个动作的价值
A2C(Advantage Actor-Critic)
- 关键词:Advantage
- A2C 是 Actor-Critic 方法的一个变种,它引入了优势函数(advantage function)的概念来代替直接使用价值函数
- 优势函数 (A(s, a)) 定义为执行特定动作相对于遵循当前策略下的平均行为所能获得的优势或劣势。这种方法有助于更准确地估计哪些动作比其他动作更好,从而提高学习效率
- 更新方式 :A2C 使用同步的方式更新参数,可以考虑使用多个网Actor分别于环境进行交互,然后共同的样本一起同步更新主网络 ,这意味着所有代理(agents)共享同一个模型,并且在每个训练步骤结束时同步更新模型权重
A3C(Asynchronous Advantage Actor-Critic)
- 关键词:Asynchronous
- A3C 是 A2C 的异步版本,它允许多个代理同时在不同的环境中学习
- 更新方式 :每个代理都有自己的环境副本和局部模型副本,它们独立地探索环境并收集经验。然后,这些经验被用来异步地更新全局模型,这样可以增加数据多样性并加快学习速度
- 优点 :通过异步更新,A3C 可以有效利用多核处理器的能力,实现更快的学习速度和更好的性能
附录:为什么 A3C 不需要重要性采样?
- 标准 A3C 不需要重要性采样,因为其 “本地线程采样的策略” 与 “全局网络待更新的策略” 完全一致,无分布偏差
- A3C 的“异步”是工程实现层面的并行更新方式 ,解决“单线程采样慢”的问题;
- “On/Off-policy” 是算法理论层面的策略更新逻辑 ,解决“采样数据是否匹配目标策略”的问题
- A3C 中“异步(Asynchronous)”与“Off-policy”的概念辨析
- A3C 的“异步”是“更新方式的异步”,而非“采样与更新策略的偏离(即Off-policy)”
- 正因为 A3C 本质上仍是On-policy(同策略) 算法,所以依然不需要重要性采样
- 对 A3C 而言,每个本地线程的采样过程完全满足 On-policy:
- 1)线程在采样前,会强制同步全局网络的最新参数\( \theta \)到本地采样用的策略\( \pi_\theta \),就是当前全局网络正在优化的“目标策略”;
- 2)采样得到的轨迹,仅用于更新“产生该轨迹的策略\( \pi_\theta \)”(即全局网络的\( \theta \));
- 旧轨迹不会被重复用于更新新策略
- 3)A3C 的异步可以保证每个 Local Worker 上计算得到的梯度是 On-policy 的,但是这个参数更新的异步会导致更新使用的参数是过期的(比如使用到上一个版本的 Actor 计算的梯度来更新这个版本)
- 再次强调:这里不是 Off-policy,只是参数梯度更新存在一定的滞后性,这是 A3C 为了效率使用 异步导致的,是可以容忍的