强化学习—第二部分
DQN 算法

在上述的 Q-Learning 算法中,以矩阵的方式建立了一个存储了所有状态动作对的动作价值函数 Q 表,表格中每个动作价值函数都表示在对应状态下选择相应动作然后继续遵循某一策略预期得到的期望回报。但是这种构建表格存储动作价值的做法只适用于环境的状态和动作都是离散的,并且只在空间都比较小的情况下使用。当状态是一个 RGB 图像时,则它的状态是非常庞大的,所以此时就放弃表格形式记录 Q 值。
可以使用函数拟合的方式来估计 Q 值,即将这个复杂的 Q 值表格视作数据,利用参数化的函数来拟合这些数据。DQN 方法可以用来解决这种连续状态下离散动作的问题。于是可以使用一个神经网络来表示函数 Q,若动作是连续的,神经网络的输入为状态 $s$ 和动作 $a$ ,然后输出一个标量,表示在状态 $s$ 下采取动作 $a$ 能获得的价值。若动作是离散的,那就可以只将状态 $s$ 输入到神经网络中,使其同时输出每一个动作的 Q 值。
但是由于在 DQN 中,动作价值函数 $Q$ 的更新过程中有个 $\max$ 操作,所以它只能用于处理动作离散的情况。在 DQN 方法中维护了两个用于拟合函数 Q 的神经网络,即 Q 网络。它的输入为系统的状态信息,输出的是当前状态下所有动作的 Q 值。
根据先前 Q-Learning 的更新规则 $Q(s_t,a_t)=Q(s_t,a_t)+\alpha[r_t+\gamma \underset{a\in A}{\max}Q(s_{t+1},a)-Q(s_t,a_t)]$ , 上述公式用时序差分学习目标 $r_t+\gamma \underset{a\in A}{\max}Q(s_{t+1},a)-Q(s_t,a_t)$ 来增量式更新 $Q(s_t,a_t)$ ,也就是说要使 $Q(s_t,a_t)$ 向 TD 误差目标 $r_t+\gamma \underset{a\in A}{\max}Q(s_{t+1},a)$ 靠近。于是对于一组数据 $\{s_t,a_t,r_t,s_{t+1}\}$ 来说,可以将 Q 网络的损失函数构造为均方误差的形式。设 $\omega$ 是 Q 网络的拟合参数,即可得到
然后就可以根据这个函数将 Q-Learning 扩展到神经网络的形式,就是 DQN 算法。而 DQN 算法是离线策略算法,因此在收集数据时可以使用一个 $\epsilon$ 贪婪策略来平衡探索和利用,将收集到的数据存储起来,在后续的训练中使用。
在一般的监督学习中,假设训练数据是相互独立的,每次训练神经网络时,都会从训练数据中选择一部分数据来进行梯度下降算法,随着学习的进行,每个数据都会被多次使用。而在上述的 Q-Learning 算法中,每一个数据只会用来更新一次 Q 值。为了更好地将 Q-Learning 和深度神经网络结合,在 DQN 算法中,采用了经验回放的方法,它维护了一个回访缓冲区,训练 Q 网络时再从回访缓冲区中随机采样若干数据来进行训练。
由于在训练过程中,TD 误差目标本身包含神经网络的输出,因此在更新网络参数的同时,目标也会不断改变,这就容易导致网络训练不稳定。所以 DQN 使用了目标网络,也就是利用两个 Q 网络来训练,将原来的损失函数改写为
- 训练网络 $Q_0(s,a)$
- 目标网络 $Q_1(s,a)$
其中两个网络的更新是不一样的,训练网络使用梯度下降法正常更新,且每一步都更新,而目标网络不会每一步都更新,而是每间隔一定的步数才会与训练网络同步一次。这样会使得目标网络相对于训练网络更加稳定。
DQN 算法的具体流程如下
- 用随机的网络参数 $w_0$ 来初始化网络 $Q_0(s,a)$ ,并且复制相同的参数到目标网络 $Q_1(s,a)$ 中
- 初始化经验回访池
- 对于每个训练回合
- 重置环境,得到初始状态
- 对于每个时间步
- 根据当前训练网络,以 $\epsilon$ 贪婪策略选择动作 $a_t$
- 执行动作得到环境反馈的 $r_t,s_{t+1}$
- 将 $(s_t,a_t,r_t,s_{t+1})$ 存储在回放池中
- 如果回放池中数据足够多,从回放池中采样 $N$ 个数据
- 对每个数据,用目标网络计算损失 $y_i=r_i+\gamma\underset{a}{\max}Q_1(s_{i+1},a)$
- 最小化目标损失函数 $L=\frac{1}{N}\sum_i(y_i-Q_0(s_i,a_i))^2$ ,以此来更新当前训练网络
- 每 $C$ 个时间步更新一次目标网络
另外 DQN 还可以修改为以图像为输入的强化学习,它与上述问题最主要的区别就是 QNet 网络结构的不同,将原来的全连接网络修改为卷积网络,能够提取图像中的信息来进行学习。
Double DQN
传统的 DQN 优化的 TD 误差目标为 $r_i+\gamma\underset{a^\prime\in A}{\max}Q_1(s^\prime_{i},a^\prime)$ ,其中 $\underset{a^\prime\in A}{\max}Q_1(s^\prime_{i},a^\prime)$ 是由目标网络计算出的,还可以将其写作
实际上 $\max$ 的操作可以被拆成两个部分,首先是取状态 $s_i^\prime$ 下的最优动作 $a^\star=\underset{a^\prime\in A}{\argmax}Q_1(s^\prime_{i},a^\prime)$ ,接着计算该动作对应的价值 $Q_1(s_i^\prime,a^\star)$ ,当这两个部分都用目标网络计算时,就是传统的 DQN 算法,每次都会选择所有动作价值中的最大值。考虑到神经网络估算的 Q 值本身会产生正向或福祥的误差,而在 DQN 的更新方式下会产生正向误差累积,有可能会导致过高估计。
为了解决这个问题,Double DQN 算法提出将原来的 $\underset{a^\prime\in A}{\max}Q_1(s^\prime_{i},a^\prime)$ 改为 $Q_1(s_i^\prime,\underset{a^\prime\in A}{\argmax}Q_0(s^\prime_{i},a^\prime))$ ,即利用训练网络的输出来选取价值最大的动作,使用目标网络来计算 Q 值。这样即使其中一个网络存在比较严重的过高估计的问题,由于另一个网络,所以也不会存在很大的过高估计问题
Dueling DQN

Dueling DQN 是 DQN 的一种改进算法,在传统 DQN 的基础上做了微小的改动,就大幅度提升 DQN 的表现。在强化学习中,将动作价值函数 $Q$ 减去状态价值函数 $V$ 的结果定义为优势函数 $A$ ,即 $A(s,a)=Q(s,a)-V(s)$ ,在同一个状态下,所有动作的优势值之和为 0,由于所有动作的动作价值的期望就是这个状态的状态价值。所以在 Dueling DQN 中,将 $Q$ 建模为
其中 $\eta$ 是状态价值函数和优势函数共享的网络参数,一般用在神经网络中,用以提取特征的前几层;而 $\alpha$ 和 $\beta$ 分别为状态价值函数和优势函数的参数。此时神经网络不再直接输出 $Q$ 值,而是训练神经网络的最后几层的两个分支,分别输出状态价值函数和优势函数,求和得到 $Q$ 值。
利用状态价值函数和优势函数分别建模的好处在于:某些环境下智能体只会关注状态价值,而并不关心不同动作导致的差异,此时将两者分开建模能更好处理与动作关联的较小的状态。但是将两者分开之后,它存在对于 $V$ 和 $A$ 建模的不唯一性的问题,这就导致了训练的不稳定性。为了解决这个问题,Dueling DQN 中强制将最优动作的优势函数的实际输出为 0,即:
此时的 $V(s)=\underset{a^\prime}{\max}Q(s,a^\prime)$ ,可以确保 $V$ 值建模的唯一性。在实现过程中,还可以用均值代替最大化操作
而此时的 $V(s)=\frac{1}{\vert A\vert}\sum_{a^\prime}Q(s,a^\prime)$ ,它虽然不满足 Bellman 最优方程,但是在应用中更加稳定。
Multi-step DQN
Multi-step DQN 是传统的 DQN 的改进,核心在于将单步回报扩展为多步回报,通过考虑未来连续 $n$ 步的奖励信号来更新 Q 值,从而平衡偏差与方差,加速学习过程且提高样本效率。
Multi-step DQN 将目标值扩展为 $n$ 步累积奖励加上 $n$ 步后的折扣 $Q$ 值,回报设计为累积 $n$ 步奖励+第 $n$ 步状态价值,它的数学定义如下
其中
- $r_{t+1}$ 是当前步骤的即时奖励
- $Q(s_{t+n},a^\prime)$ 是目标网络对下一状态的 $Q$ 值估计
当 $t+n\geq T$ ,即到达终止状态时,回报变为 $G_t=\sum_{k=t}^{T-1}\gamma^{k-t}r_{k+1}$
将后续 $n$ 步的奖励信号直接用于当前状态的 Q 值更新,避免单步更新中奖励信号需要多轮迭代才能向后传播的问题。在稀疏奖励环境中,单步 DQN 可能需要大量步骤才能从偶然获得的奖励中学习,而 Multi-step DQN 只要 n 步窗口内包含奖励信号就能立即学习。相对来说 n 值越大,目标值越接近真实回报,但引入的方差也越大。
要想实现 Multi-step DQN,需要在回放池上做些改动。由于从回放池中抽取动作并不是连续的,所以就需要在回放池采样时,就将该动作对应的 $n$ 步之后的奖励信号、n 步之后的动作等放入其中,待到从回放池中取出该经验时,就能计算出其在 $n$ 步之后的奖励,从而根据损失函数更新网络。
Noisy DQN
Noisy DQN 是在 2017 年提出的对 DQN 的改进算法,核心创新是通过在神经网络权重中引入可学习的参数噪声来代替传统的 $\epsilon$ 贪婪探索策略,实现更高效、状态依赖的只能探索。这种方法让智能体能学习如何根据环境状态进行自适应探索,解决了 $\epsilon$ 贪婪探索策略与状态无关且效率低下的问题。
它的核心是 Noisy Linear Layer,它将传统的线性层的权重和偏置替换为可学习的均值和标准差参数,并且在每次前向传播时注入噪声。Noisy Linear Layer 的数学表示如下
其中
- $\mu_W,\mu_b$ 是可学习的权重共和偏置的均值参数
- $\sigma_W,\sigma_b$ 是可学习的权重共和偏置的标准差参数
- $\xi_W,\xi_b$ 从固定分布采样的噪声变量
为了减少计算的开销,Noisy DQN 设计了两种噪声的分布,核心是减少随机变量的数量,如下
- 独立高斯噪声:每个权重或偏置的 $\xi$ 独立采样自 $\mathcal{N}(0,1)$
- 因子分解的高斯噪声:
- 将 $\xi_W$ 分解为输入噪声 $\xi_i$ 和输出噪声 $\xi_j$ ,最终噪声为 $\xi_W=f(\xi_i)f(\xi_j)$ ,其中的 $f(x)=sign(x)\sqrt{\vert x\vert}$
- 将 $\xi_b$ 分解为 $\xi_b=f(\xi_j)$
通常将 $\mu$ 参数初始化为一个较小的常数
通常将 $\sigma$ 参数也初始化为一个较小的常数,例如
其中 $\sigma_0$ 通常设置为 0.5, $n_i$ 为输入维度。剩下的部分都与标准的 DQN 一致了。
噪声 $Q$ 网络的输出为 $Q(s,a,\xi)=f(s,\xi)[a]$ ,其中 $f(s,\xi)$ 就是含噪声层的神经网络,其中的 $\xi$ 就是噪声参数样本。传统 DQN 的损失是确定 Q 值得 MSE 损失,但是由于 Noisy DQN 存在噪声,所以它的损失需要对噪声的分布求期望,用以保证损失的稳定性,如下
在实际使用中,通过重参数化技巧计算梯度,将噪声期望转为前向传播时的采样操作,避免高维度积分计算。梯度计算时用蒙特卡洛近似估计期望,每次训练只采样一组 $\xi_0$ 和 $\xi_1$ ,直接计算损失并反相传播,更新在线的 $\mu$ 和 $\sigma$
Prioritized Experience Replay DQN
在之前所讨论的 DQN,它们都是通过经验回放来采样,进而做目标 $Q$ 值的计算的,在采样时,所有样本都有相同的被采样到的概率。但是注意到在经验回放池里面的不同的样本由于 TD 误差的不同,对我们反向传播的作用是不一样的;TD 误差越大,那么它对反向传播的作用越大;而 TD 误差小的样本,对反向梯度的计算影响不大。在 Q 网络中,TD 误差就是目标 Q 网络计算的目标 Q 值和当前 Q 网络计算的 Q 值之间的差距。
所以 TD 误差的绝对值较大的样本更容易被采样的话,算法就会比较容易收敛,这就是 Prioritized Experience Replay DQN 的工作核心。在 PER-DQN 中,优先级的计算方式有两种,如下
- 比例优先级 $p_i=\vert \delta_i\vert +\epsilon$ ,其中 $\epsilon$ 是一个很小的正数,用于确保每个经验都有一定的优先级
- 排名优先级 $p_i=\frac{1}{rank}$ ,经验的优先级是根据它在经验缓冲区中的排名来确定的,排名越高的经验具有更高的优先级。其中 $rank$ 表示经验在排序之后的位置
优先采样机制,采样概率与优先级的 $\alpha$ 次方成正比
其中 $\alpha\in[0,1]$ 用于控制优先级的影响程度。引入优先采样会引入分布偏差,需要 IS 权重修正,即
其中 $\beta\in[0,1]$ ,用于控制偏差修正强度,在训练初期可以选择较小的 $\beta$ ,训练时逐步增加到 1。之后进行归一化,避免权重过大影响训练的稳定性
在损失函数中加入 IS 权重,修正分布偏差
为了高效实现优先采样,使用 SumTree,一种完全二叉树结构,它能利用权重来抽取数据进行学习,权重越大的数据就越容易被抽取。使用 SumTree 存储优先级,还有一个额外的数据块来存储需要的数据。SumTree 的结构如下
- 叶子节点:每个叶子节点对应着一个数据样本,存储每个经验的优先级 $p_i$ ,叶子节点总数是 SumTree 的容量
- 内部节点:存储子节点优先级之和
- 根节点:存储所有叶子节点的优先级总和
- 所有节点的数目为 $2n_{leaf}-1$
- 数组索引的映射规则如下
- 若父节点的索引为 $i$
- 则左子节点的索引为 $2i+1$
- 右子节点的索引为 $2i+2$
- 通过子节点可以找到父节点 $\frac{i-1}{2}$
SumTree 的使用流程如下
- 初始化:确定 SumTree 的容量,也就是叶子节点数量,计算完全二叉树的总长度,初始化所有数组值为 0
- 存储过程
- 确定待更新的叶子节点的索引
- 计算优先级的差值:当前优先级减去该叶子节点的当前值
- 更新叶子节点
- 从叶子节点上回溯,依次更新所有父节点的数值,直到根节点
- 整体更新所需的时间度为 $O\log(N)$
- 概率抽样
- 先获取根节点的总和 $s$ ,随机生成随机数 $s\in(0,s]$
- 从根节点开始,比较 $s$ 和当前节点的左子节点的值
- 如果左侧子节点大于 $s$ ,将左侧子节点作为父节点,遍历其子节点
- 如果左侧子节点小于 $s$ ,则将 $s$ 减去左侧子节点的数值,选择右侧子节点作为父节点,遍历其子节点
- 重复步骤直到遍历到叶子节点
剩下的部分与 DQN 的结构一致。
Distributional DQN
Distributional DQN 是对 DQN 的重要改进,核心的创新点在于,它不直接预测状态-动作对的 Q 值期望,而是学习 Q 值的完整的概率分布。传统的 DQN 仅估计 $Q(s,a)=E[Z(s,a)]$ ,其中 $Z(s,a)$ 是状态 $s$ 执行动作 $a$ 之后获得的累积回报随机变量,而 Distributional DQN 则建模整个分布,从而捕捉更多关于未来奖励的不确定性和风险信息。学习分布能提高训练的稳定性和最终性能,尤其是在随机的环境中。
累积回报 $Z(s,a)$ 本身是随机变量,其分布包含比期望值更丰富的信息。另外在 DQN 中使用的 Bellman 方程可以扩展到分布层面,即形成分布贝尔曼算子。
分布 Bellman 方程
分布贝尔曼方程是 Distributional DQN 的理论基础,它描述了价值分布如何随时间步转移。对于最优策略 $\pi^\star$ ,分布 Bellman 方程如下
其中
- $Z(s,a)$ 是回报的分布,也就是分布式 DQN 网络的输出
- $R(s,a)$ 是即时奖励随机变量
- $d$ 是结束标志
- $\gamma$ 是折扣因子
Wasserstein 距离
Wasserstein 距离也被称为推土机距离,用来表示两个分布的相似程度。Wasserstein 距离衡量了把数据从分布 $p$ 移动为分布 $q$ 时所需要移动的平均距离的最小值。对于两个分布 $U$ 和 $Y$ ,其 Wasserstein 距离等于两者分布函数的 L1 距离
其中 $F^{-1}(\tau)$ 是分布的分位数函数,即累积概率为 $\tau$ 时的回报值
Distributional DQN: C51 DQN
C51 是首个 Distributional DQN 算法。C51 不直接估计 Q 值,而是估计 Q 值的概率分布。通过将 $Q$ 值限制在 $[V_{\min},V_{\max}]$ 之间,将这个区间均匀离散化为 $N=51$ 个等距支撑点(称作原子)
- 初始化
- 构建训练网络 $Q^0$ 和目标网络 $Q^1$ ,两者的架构一致,输出层改为输出 51 个原子的概率
- 初始化时,将训练网络的参数复制到目标网络中,保证初始化的目标分布一致稳定
- 设置价值范围 $[V_{\min},V_{\max}]$
- 在每个时间步
- 基于当前训练网络输出的价值分布,计算每个动作的期望值 $\sum_iz_ip_i(s_t,a_t)$ ,采用 $\epsilon$ 贪婪策略选择动作。即大概率选期望最大的动作 $a^\star=\underset{a}{\argmax}\sum_iz_ip_i^0(s_t,a_t)$ ,小概率随机选择动作
- 选定动作之后,执行选定的动作,获得环境反馈的即时奖励 $r_t$ 和下一状态 $s_{t+1}$ 、以及是否终止的标志 $d$
- 将样本 $(s_t,a_t,r_t,s^{t+1},d)$ 存入经验回放池,后续随机采样以避免样本的相关性
- 当经验回放池累积足够的样本之后,随机采样批量样本,每个样本的计算步骤如下
- 选择下一状态的贪心策略,用目标网络 $Q_1$ 计算 $s_{t+1}$ 对应的所有动作的期望价值,选择期望最大的动作 $a^\star=\underset{a}{\argmax}\sum_iz_ip_i^1(s_t,a_t)$
- 对目标网络 $Q_1$ 输出的 $a^\star$ 对应的 $N$ 个原子值 $z_j^\prime=r+\gamma(1-d)z_j$ ,并且将原子值限制在区间内,即 $z_j^\prime=\max(\min(z_j^\prime,V_{\max}),V_{\min})$
- 将原子值投影到原子集,它在支撑点序列中的位置 $b_j=\frac{z_j^\prime-V_{\min}}{\Delta z}$ ,取 $b_j$ 的整数上界 $l_j$ 和下界 $u_j$ ,对应最近的两个预定义的支撑点,操作为向上和向下取整。另外还有特殊情况,即 $l_j=u_j=b_j$ 时的情况,当存在特殊情况时,需要进行处理,即将 $u=l+1$
- 在每次更新时都初始化 $m=0$ ,并且计算累计概率分配,将目标支撑点的概率按距离分配给 $z_l$ 和 $z_u$ ,得到分布 $m$
- $m_l=m_l+p_j^1(s_{t+1},a^\star)(u_j-b_j)$
- $m_u=m_u+p_j^1(s_{t+1},a^\star)(b_j-l_j)$
- 其中 $p_j^1(s_{t+1},a^\star)$ 就是目标网络中 $z_j$ 的概率,其中的 $a^\star=\underset{a}{\argmax}\sum_iz_ip_i^1(s_{t+1},a)$
- 计算损失函数,最小化正交熵损失
- 利用训练网络 $Q_0$ 对当前状态 $s_t$ 和动作 $a_t$ 输出预测分布 $z(x,a)$
- 最小化目标分布与预测分布的 KL 散度,损失函数设置为 $L=-\sum_i^{N}m_i\log(p_i(s_t,a_t)+\epsilon)$
- 利用 Adam 优化器计算梯度,更新训练网络参数
- 定期同步:每隔固定步数,将训练网络的最新参数复制到目标网络,避免目标分布频繁波动导致训练震荡
- 迭代训练,直到训练次数达到预定值或在测试上满足性能要求
Distributional DQN: QR DQN
在此前的 C51 DQN 存在参数化局限,即固定回报的支持区间,需要将分布投影到固定支持上,容易丢失分布信息,而且 C51 使用的是 KL 散度优化,理论上可以选择更优的 Wasserstein 距离。所以 QR DQN 通过反向参数化来解决上述问题,即通过设定分位数的概率,动态调整分位数的位置,用分位数回归直接最小化 Wasserstein 距离,保证理论收敛性。
- 初始化阶段
- 构建训练网络 $Q^0$ 和目标网络 $Q^1$ ,两者的架构一致,网络的输出尺寸为 $\vert A\vert\times N$ ,其中 $\vert A\vert$ 为动作空间大小, $N$ 为分位数数量,每个输出值 $\theta_i(s,a)$ 表示在状态 $s$ 、动作 $a$ 下的第 $i$ 个分位数的回报值
- 初始化时,将训练网络的参数复制到目标网络中,保证初始化的目标分布一致稳定
- 设置分位数数量 $N$ ,设置折扣因子 $\gamma$ ,设置探索率 $\epsilon$ ,设置 Huber 平滑参数 $\kappa$
- 对于每个分位数 $\tau_i\in(0,1)$ ,在 QR DQN 中取均匀的分位数 $\tau_i=\frac{1}{N}$ ,分位数回归损失时非对称凸损失 $\rho_\tau(u)=\left\{\begin{aligned}&\tau\vert u\vert&&u\geq0\\&(1-\tau)\vert u\vert&&u<0\end{aligned}\right.$ 。即对低估回报的惩罚权重为 $(1-\tau)$ ,对高估回报的惩罚权重为 $\tau$ ,确保损失与 Wasserstein 距离的最小化等价
- 由于上述的非对称凸损失在 $u=0$ 处不光滑,可能影响梯度下降效率,还可以对上述的非对称凸损失进行平滑改进。在区间 $[-\kappa,\kappa]$ 内用平方损失,区间外保留分位数损失,即 $\rho_\tau^\kappa(u)=\left\{\begin{aligned}&\tau\kappa(\vert u\vert-\frac{1}{2}\kappa )&&u>\kappa\\&\tau(\frac{1}{2}u^2)&&\vert u\vert\leq\kappa\\&(1-\tau)\kappa(\vert u\vert-\frac{1}{2}\kappa )&&u<-\kappa\end{aligned}\right.$ ,在实验中可以取 $\kappa=1$ ,平衡光滑性与损失的准确性
- 在每个时间步中
- 根据当前状态 $s_t$ ,利用 $\epsilon$ 贪婪策略选择动作 $a_t$ ,以概率 $\epsilon$ 随机选择动作,以概率 $1-\epsilon$ 选择分位数均值最大的动作 $a_t=\underset{a}{\argmax}\frac{1}{N}\sum_i^N\theta_i(s_t,a)$
- 执行动作 $a_t$ ,获得奖励 $r_t$ 、下一状态 $s_{t+1}$ 和终止标志 $d$
- 将样本 $(s_t,a_t,r_t,s_{t+1},d)$ 存入经验回放池,后续随机采样以避免样本的相关性
- 当经验回放池累积足够的样本之后,随机采样批量样本,为每个样本计算目标价值分布,步骤如下
- 对于每个采样经验,定义目标网络 $Q_1$ 的对于 $s_{t+1}$ 状态时动作为 $a$ 的目标分位数的均值为 $Q(s_{t+1},a)=\frac{1}{N}\sum_i^N\theta_i^1(s_{t+1},a)$ 。以此来选择分位数均值最大的动作,即 $a_{t+1}^\star=\underset{a}{\argmax}Q(s_{t+1},a)$
- 计算目标分位数 $T_{\theta_i^1}=r_j+\gamma(1-d)\theta_i^1(x_{t+1},a_{t+1}^\star)$ ,即目标分布的第 $i$ 个分位数
- 计算训练网络 $Q^0$ 输出的当前状态 $s_t$ ,动作 $a_t$ 的估计分位数 $\theta^0_i(x_t,a_t)$
- 计算每条经验的分位数 Huber 损失 $L(\theta)=\frac{1}{N}\sum_i^NE[\rho_{\tilde\tau_i}^\kappa(T_{\theta_i^1}-\theta^0_i(x_t,a_t))]$ ,其中 $\tilde\tau_i=\frac{\tau_{i-1}+\tau_i}{2}$
- 通过梯度下降法最小化损失,利用 Adam 优化器更新参数
Distributional DQN: IQN
IQN 基于 DQN 扩展,核心是加入分位数嵌入层,强制状态特征与分位数特征交互。IQN 的核心是学习分位数函数,而非离散分位数或固定回报点。
对于回报随机变量 $Z(s,a)$ ,它的分位数函数为 $F_Z^{-1}(\tau)=\inf\{z\vert P(Z\leq z)\geq\tau\}$ 。若从基分布采样 $\tau$ ,并通过网络输出 $Z_\tau(s,a)\approx F_Z^{-1}(\tau)$ ,则 $Z_\tau(s,a)$ 的集合隐式定义了回报分布,无需参数化显示概率,仅通过 $\tau\rightarrow Z_\tau$ 的映射实现。
扭曲期望公式:对风险测度的映射函数 $\beta:[0,1]\rightarrow[0,1]$ ,即连续单调函数,动作 $a$ 的风险敏感价值为 $Q_\beta(s,a)=E_{\tau\sim U([0,1])}[Z_{\beta(\tau)}(x,a)]=\int^1_0F_Z^{-1}(\tau)d\beta(\tau)$ ,通过 $\beta$ 函数来调整分位数权重,实现风险的规避或风险追求。可以通过修改扭曲函数 $\beta(\tau)$ 来实现不同的风险偏好
- 风险中性 $\beta(\tau)=\tau$ ,此时 $Q_\beta(s,a)=E[Z(s,a)]$ ,与传统的 Q 值一致
- 风险规避:例如 CVaR 策略 $\beta(\tau)=\eta\tau$ ,其中 $\eta<1$ ,只关注低回报的分位数
- 风险寻求:例如 Power 函数 $\beta(\tau)=\tau^{\frac{1}{1+\eta}}$ ,其中 $\eta>0$ ,侧重于关注高回报的分位数
策略选择扭曲期望最大的动作,即 $\pi_\beta(s)=\underset{a\in A}{\argmax}Q_\beta(s,a)$ ,推理时通过采样 $K$ 个 $\tau_k\sim U([0,1])$ 来近似 $Q_\beta$ ,即得到的策略公式为 $\pi_\beta(s)=\underset{a\in A}{\argmax}\frac{1}{K}\sum_k^KZ_{\beta(\tau_k)}(s,a)$ 。
在 IQN 中采用双重采样来计算 TD 误差,即同时采样当前分位数 $\tau$ 和目标分位数 $\tau^\prime$ ,公式为 $\delta_t^{\tau,\tau^\prime}=r_t+\gamma Z_{\tau^\prime}(s_{t+1},\pi_\beta(s_{t+1}))-Z_\tau(s_t,a_t)$ 。其中 $Z_\tau(s_t,a_t)$ 是当前状态 $s_t$ ,动作 $a_t$ 的当前分位数价值, $Z_{\tau^\prime}(s_{t+1},\pi_\beta(s_{t+1}))$ 是目标状态 $s_{t+1}$ 下,最优动作的目标分位数价值。
另外在 IQN 中采用 Huber 分位数损失,即结合分位数回归的鲁棒性与 Huber 损失对异常值的容忍性,公式为
其中 $N$ 为当前分位数的采样数量, $N^\prime$ 为目标分位数的采样数量, $\rho_\tau^\kappa(\delta)$ 为 Huber 分位数损失核,定义为
这个损失函数的核心目的即最小化当前分位数分布与 Bellman 更新后目标分位数分布的 Wasserstein 距离,保证分布逼近的稳定性
- 初始化
- 构建训练网络 $Q^0$ 和目标网络 $Q^1$ ,两者的架构一致,输出分位数价值 $Z_\tau(x,a)$ ,初始时需要将训练网络的参数复制到目标网络中
- 网络的结构设计 $IQN(s,\tau)=f(\psi(s)\odot\phi(\tau))$
- 状态的特征提取 $\psi(s)$
- 分位数嵌入 $\phi(\tau)$ ,使用余弦基函数
- 特征交互 $\psi(s)\odot\phi(\tau)$ ,强制状态与分位数信息融合
- 输出 $f(\cdot)$ 映射到动作的分位数价值上 $Z_\tau(s,a)$
- 初始化超参数: $\tau$ 采样数 $N$ , $\tau^\prime$ 采样数 $N^\prime$ ,策略采样数 $K$ ,Huber 阈值 $\kappa$ ,折扣因子 $\gamma$ ,贪婪探索率 $\epsilon$
- 在每个时间步中
- 对于当前状态 $s_t$ 采样 $K$ 个 $\tau_k\sim U([0,1])$ ,计算每个动作的扭曲期望,即 ${Q}^0_\beta(s_t,a)=\frac{1}{K}\sum_k^KZ_{\beta(\tau_k)}(s_t,a)$
- 采用贪婪策略选择动作,即以概率 $\epsilon$ 选择随机动作,以概率 $1-\epsilon$ 选择 $a_t=\underset{a\in A}{\argmax}{Q}^0_\beta(s_t,a)$
- 执行动作 $a_t$ ,观察奖励 $r_t$ 和下一状态 $s_{t+1}$ ,并且将 $(s_t,a_t,r_t,s_{t+1},d)$ 存入经验池
- 当经验回放池累积足够的样本之后,随机采样批量样本,每个样本计算步骤如下
- 对于每个样本,采样 $N$ 个当前分位数 $\tau_i\sim U([0,1])$ 用于计算当前价值,采样 $N^\prime$ 个目标分位数 $\tau_j^\prime\sim U([0,1])$ 用于计算目标价值
- 计算当前分位数价值 $Z_{\tau_i}(s_t,a_t)=Q^0(s_t,\tau_i).gather(1,a_t)$
- 计算目标分位数价值
- 计算下一状态最优动作 $a^\star=\underset{a\in A}{\argmax}\frac{1}{K}\sum_k^KZ_{\beta(\tau_k)}(s_{t+1},a)$
- 计算目标分位数 $Z_{\tau_j^\prime}(s_{t+1},a^\star)=Q^1(s_{t+1},\tau_j^\prime).gather(1,a^\star)$
- 计算目标值 $t=r+\gamma Z_{\tau_j^\prime}(s_{t+1},a^\star)(1-d)$
- 计算 TD 误差 $\delta_{t,i,j}=t-Z_{\tau_i}(s_t,a_t)$ ,之后计算批量 Huber 分位数损失 $L(s_t,a_t,r_t,s_{t+1})=\frac{1}{NN^\prime}\sum_i^N\sum_j^{N^\prime}\rho_{\tau_i}^\kappa(\delta_{t,i,j})$
- 通过梯度下降最小化损失,更新训练网络 $Q^0$ 的网络参数
- 定期同步目标网络参数
Rainbow DQN
Rainbow DQN 并非是单一的算法,而是融合了 DQN 系列中 6 项关键改进的模块化集成框架,旨在解决传统 DQN 的过估计、样本效率低、探索盲目等问题。
Rainbow DQN 的网络架构是多个组件的深度结合,核心就是分布型输出+双流分支+噪声层的组合,配合离散动作空间。它的流程如下
- 使用 Double DQN 的两个 Q 网络的结构,用以解决过估计问题。用训练网络 $Q_0$ 选择动作,用目标网络 $Q_1$ 评价动作
- 网络的结构参考自 Dueling DQN 的结构,将动作价值函数 $Q$ 减去状态价值函数 $V$ 的结果定义为优势函数 $A$ ,即 $Q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a)$ ,将动作价值 $Q_{\eta,\alpha,\beta}(s,a)$ 分解为状态价值 $V_{\eta,\alpha}(s)$ 和优势函数 $A_{\eta,\beta}(s,a)$ ,避免对每个动作单独学习,提升网络的泛化能力
- 将高维输入(例如图像)转化为低层的抽象,在 Rainbow DQN 的论文中,采用 3 层卷积神经网络,每一层的参数如下
- $8\times8\times32$ 卷积核,步长为 4,使用 ReLU 激活函数
- $4\times4\times64$ 卷积核,步长为 2,使用 ReLU 激活函数
- $3\times3\times64$ 卷积核,步长为 1,使用 ReLU 激活函数
- 输出扁平化之后的特征向量
- 价值流 $V(s)$ ,使用 1 层 Noisy Linear 层,输出 $N$ 个值,对应分布式 DQN 的每个原子的状态价值
- 优势流 $A(s,a)$ ,使用 1 层 Noisy Linear 涔变,输出 $N\times\vert A\vert$ 个值,对应每个动作、每个原子的优势
- 聚合公式
- Noisy Linear 层:替代传统的 $\epsilon$ 贪婪探索,实现状态依赖的智能探索。Noisy Linear 层的数学表示为 $y=x(\mu_W+\sigma_W\odot\xi_W)+(\mu_b+\sigma_b\odot\xi_b)$
- 网络结构的输出为 $Q(s,a)=V(s)+A(s,a)-\frac{1}{\vert A\vert}\sum_{a^\prime}A(s,a^\prime)$ ,对每个动作的 51 个原子 Q 值应用 Softmax,且每个动作下的概率总和为 1
- 将高维输入(例如图像)转化为低层的抽象,在 Rainbow DQN 的论文中,采用 3 层卷积神经网络,每一层的参数如下
- 环境交互与经验存储
- 根据当前的状态,选择 $s_t$ 状态下的动作 $a_t=\underset{a}{\argmax}Q_0(s_{t+n},a)$
- 执行动作 $a_t$ ,与环境交互,得到回报值 $r_t$ 和下一状态 $s_{t+1}$
- 根据 Multi-Step Learning ,用 $n$ 步累积
- 将 $(s_t,a_t,r_t,s_{t+1})$ 存储进经验回放池中,经验回放池利用 Prioritized Experience Replay 来进行经验的重新采样
- 计算经验的优先级 $p_t\propto\vert R_t+\gamma^nQ_1(s_{t+n},\underset{a}{\argmax}Q_0(s_{t+n},a))-Q_0(s_t,a_t)\vert^w$ ,其中 $w$ 是优先级指数,控制优先级的影响程度
- 重要性采样权重:修正优先采样导致的偏差,公式为 $w_t=(\frac{1}{Np_t})^\beta$ ,其中 $N$ 是缓冲区大小, $\beta$ 是 IS 指数,最终的损失需要乘以 $w_t$
- 当经验回放池累积足够的样本之后,随机采样批量样本,每个样本的计算步骤如下
- 选择下一状态的贪心策略,用目标网络 $Q_1$ 计算 $s_{t+1}$ 对应的所有动作的期望价值,选择期望最大的动作 $a^\star=\underset{a}{\argmax}\sum_iz_ip_i^1(s_t,a_t)$
- 对目标网络 $Q_1$ 输出的 $a^\star$ 对应的 $N$ 个原子值 $z_j^\prime=r+\gamma(1-d)z_j$ ,并且将原子值限制在区间内,即 $z_j^\prime=\max(\min(z_j^\prime,V_{\max}),V_{\min})$
- 将原子值投影到原子集,它在支撑点序列中的位置 $b_j=\frac{z_j^\prime-V_{\min}}{\Delta z}$ ,取 $b_j$ 的整数上界 $l_j$ 和下界 $u_j$ ,对应最近的两个预定义的支撑点,操作为向上和向下取整。另外还有特殊情况,即 $l_j=u_j=b_j$ 时的情况
- 计算概率分配,将目标支撑点的概率按距离分配给 $z_l$ 和 $z_u$
- $m_l=m_l+p_j^1(s_{t+1},a^\star)w_l$
- $m_l=m_l+p_j^1(s_{t+1},a^\star)w_u$
- 其中 $p_j^1(s_{t+1},a^\star)$ 就是目标网络中 $z_j$ 的概率,其中的 $a^\star=\underset{a}{\argmax}\sum_iz_ip_i^1(s_{t+1},a)$
- 将上述的改进整合到一起,Rainbow 的单步训练损失为 $L=\sum w_tD_{KL}\Big(\Phi_z(d_t^n))\Vert d_t\Big)$ ,其中 $d_t^n=\Big(R_t+\gamma^nz,p^1(s_{t+n},a^\star_{t+n})\Big)$ ,另外 $d_t=\Big(z,p^0(s_t,a_t)\Big)$
- 定期同步:每隔固定步数,将训练网络的最新参数复制到目标网络,避免目标分布频繁波动导致训练震荡
策略梯度算法
在之前所介绍的 Q-Learning、DQN 以及它的一些改进算法都是基于价值的方法,在强化学习中,除了基于价值的方法,还有基于策略的方法。基于值函数的方法主要是学习值函数,然后根据值函数导出一个策略,学习过程中并不存在一个显式的策略;而基于策略的方法是直接显式地学习一个目标策略。策略梯度算法就是基于策略的方法的基础
REINFORCE
基于策略的方法首先需要将策略参数化。假设策略 $\pi_\theta$ 是一个随机性的策略,并且处处可微,其中 $\theta$ 是策略的参数。可以使用一个线性模型或神经网络模型来为策略函数建模,输入某个状态,然后输出动作的概率分布。目标就是寻找一个最优策略并最大化这个策略在环境中的期望回报,即策略学习的目标函数为
其中的 $s_0$ 表示初始状态。将目标函数对策略 $\theta$ 求导,得到导数之后,就可以利用梯度上升法来最大化这个目标函数,从而得到最优的策略。此时定义在策略 $\pi$ 下的状态访问分布 $v^\pi$ ,公式如下
其中 $\alpha$ 是用于使概率之和为 1 的归一化因子, $P_t^\pi(s)$ 表示采取策略 $\pi$ 使得智能体在 $t$ 时刻状态为 $s$ 的概率。上述这个公式还可以写作如下的形式
对上述的目标函数求梯度,得到如下公式
这个梯度可以用以更新策略,由于上述公式中期望 $E$ 的下标为 $\pi_\theta$ ,所以策略梯度算法为在线策略算法,即必须使用当前策略采样到的数据来计算梯度来更新当前的策略。在这个公式中,用到了 $Q^{\pi_\theta}(s,a)$ ,可以用多种方式对它进行估计。在 REINFORCE 算法中,策略梯度公式为
其中 $T$ 是与环境交互的最大步数。REINFORCE 的流程如下
- 初始化策略参数 $\theta$
- 对于每个训练回合
- 利用当前策略 $\pi_\theta$ 采样轨迹 $\{s_1,a_1,r_1,\cdots,s_T,a_T,r_T\}$
- 计算当前轨迹每个时刻 $t$ 往后的回报 $\sum_{t^\prime=t}^T\gamma^{t^\prime-t}r_{t^\prime}$ ,记作 $G_t$
- 计算损失函数 $L_\pi(\theta)=-\frac{1}{T+1}\sum^T_t G_t\log\pi_\theta(a_t\vert s_t)$ ,反向传播更新 $\theta$
- 循环迭代,直到满足需求
上述中用到了公式 $\nabla_\theta J(\theta)\propto \sum_{s\in S}v^{\pi_\theta}(s)\sum_{a\in A}Q^{\pi_\theta}(s,a)\nabla_\theta\pi_\theta(a\vert s)$ ,下面给出证明。对于状态价值函数
为了简化,此时令 $\phi(s)=\sum_{a\in A}\nabla_\theta\pi_\theta(a\vert s)Q^{\pi_\theta}(s,a)$ ,此时定义 $d^{\pi_\theta}(s\rightarrow s^\prime,n)=\sum_{a\in A}\pi_\theta(a\vert s)P(s^\prime\vert s,a)$ 为策略 $\pi$ 从状态 $s$ 出发 $n$ 步之后到达 $s^\prime$ 的概率,继续推导上述公式
可以看到上述公式出现了重复项 $\nabla_\theta V^{\pi_\theta}(s^\prime)$ ,所以上述公式经过推导之后可以得到如下的公式
回到目标函数中
此时令 $\eta(s)=E_{s_0}\Big[\sum_{k=0}^\infty\gamma^kd^{\pi_\theta}(s_0\rightarrow s,k)\Big]$ ,带入到其中可以得到
基线 REINFORCE
基线 REINFORCE 是 REINFORCE 的改进,核心是在策略梯度算法中引入基线函数,在保持梯度估计无偏性的同时显著降低方差,使得训练过程更加稳定、收敛更快。
基础的 REINFORCE 使用蒙特卡洛采样的完整轨迹回报来计算策略梯度,它的公式为 $\nabla_\theta J(\theta)=E_{\pi_\theta}\Bigg[\sum_{t=0}^T\Bigg(\sum_{t^\prime=t}^T\gamma^{t^\prime-t}r_{t^\prime}\Bigg)\nabla_\theta\log\pi_\theta(a\vert s)\Bigg]$ 。基础的 REINFORCE 之所以有高方差的原因是因为环境随机性导致每次与环境交互产生的轨迹差异大,而且策略参数微小变化可能导致生成的轨迹发生巨大改变。
此时引入一个参考值 $b(s_t)$ ,参考值通常设置可以为状态价值函数 $V^\pi(s_t)$ ,将上述的梯度公式修改为
基线函数 $b(s_t)$ 只依赖于状态 $s_t$ ,而与动作 $a_t$ 无关。根据期望的线性性质
基线函数 $b(s_t)$ 通常选择为状态 $s_t$ 的期望回报估计,即状态价值函数 $V^\pi(s_t)=E[G_t\vert s_t]$ ,其中的 $G_t=\sum_{t^\prime=t}^T\gamma^{t^\prime-t}r_{t^\prime}$ 就是累积回报,此时的 $G_t-b(s_t)$ 表示优势函数 $A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t)$ ,即动作 $a_t$ 相对于平均水平的优劣
基线 REINFORCE 的流程如下
- 初始化
- 初始化策略网络 $\pi_\theta(a\vert s)$ ,输出动作的概率分布
- 初始化价值网络 $V_\phi(s)$ ,作为基线估计状态价值
- 初始化超参数
- 在每个训练回合中
- 利用当前策略 $\pi_\theta$ 采样轨迹 $\{s_1,a_1,r_1,\cdots,s_T,a_T,r_T\}$
- 计算当前轨迹每个时刻 $t$ 往后的回报 $\sum_{t^\prime=t}^T\gamma^{t^\prime-t}r_{t^\prime}$ ,记作 $G_t$
- 用均方误差损失训练价值网络 $L_V(\phi)=\frac{1}{T+1}\sum_t^T(V_\phi(s_t)-G_t)^2$ ,反向传播更新参数 $\phi$
- 对采样轨迹中的每个时间步,计算优势值 $A_t=G_t-V_\phi(s_t)$
- 计算策略损失 $L_\pi(\theta)=-\frac{1}{T+1}\sum^T_t A_t\log\pi_\theta(a_t\vert s_t)$ ,反向传播更新 $\theta$
- 循环迭代,直到满足需求
Actor-Critic 算法
之前介绍了基于值函数的方法和基于策略的方法,基于值函数的方法只学习ige价值函数,而基于策略的方法只学习一个策略函数。而 Actor-Critic 算法是囊括了上述的两种方法,虽然 Actor-Critic 算法本质上是基于策略的算法,它会额外学习价值函数,从而帮助策略函数更好地学习。
在 REINFORCE 算法中,目标函数的梯度中有一项是轨迹回报,用于直到策略的更新。在 REINFORCE 算法中,使用蒙特卡洛方法来估计 $Q(s,a)$ ,在 AC 算法中,拟合一个值函数来直到策略进行学习。在策略梯度中,可以将梯度写作如下的形式
其中的 $\psi_t$ 可以有多种形式
- 轨迹的总回报 $\sum_{t^\prime=0}^T\gamma^{t^\prime}r_{t^\prime}$
- 动作 $a_t$ 之后的回报 $\sum^T_{t^\prime=t}\gamma^{t^\prime-t}r_{t^\prime}$
- 基准线版本 $\sum^T_{t^\prime=t}\gamma^{t^\prime-t}r_{t^\prime}-b(s_t)$
- 动作价值函数 $Q^{\pi_\theta}(s_t,a_t)$
- 优势函数 $A^{\pi_\theta}(s_t,a_t)=Q^{\pi_\theta}(s_t,a_t)-V^{\pi_\theta}(s_t)$
- 时序差分残差 $r_t+\gamma V^{\pi_\theta}(s_{t+1})-V^{\pi_\theta}(s_t)$
将 AC 分为两个部分:Actor 和 Critic
- Actor:直接表示智能体的策略,输出动作选择概率,负责决策。需要与环境交互,并且在 Critic 价值函数的指导下用策略梯度学习一个更好的策略
- Critic:近似价值函数 $Q^\pi(s,a)$ 或优势函数 $A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s,a)$ ,负责评估 Actor 决策的好坏,减少策略梯度估计的方差,帮助 Actor 进行更新
AC 算法的流程如下
- 初始化
- 初始化策略网络 $\pi_\theta(s)$ ,初始化网络参数 $\theta$
- 初始化价值网络 $Q^{\pi_\theta}(s)$ ,初始化网络参数 $\omega$
- 初始化超参数
- 对于每个训练循环
- 根据当前策略 $\pi_\theta$ 采样
- 在每一步中,计算 $\psi_t=Q^{\pi_\theta}(s_t,a_t)$
- 计算完整轨迹的累积回报作为 $Q^{\pi_\theta}$ 的真实目标,有两种形式
- 用完整轨迹的累积折扣回报 $y_t=\sum^{T-1}_{k=t}\gamma^{k-t} r_{k+1}$ 作为真实目标
- 用一步时序差分目标近似 $y_t=r_t+\gamma Q^{\pi_\theta}(s_{t+1},a_{t+1})$
- 计算价值网络损失 $L_\psi=E[(y_t-Q^{\pi_\theta}(s_t,a_t))^2]$ ,反向传递更新价值网络参数 $w$
- 计算策略网络损失 $L_\pi=\sum_t\psi_t\log\pi_\theta(a_t\vert s_t)$ ,反向传递更新策略网络参数 $\theta$
- 迭代训练
Advantage Actor-Critic
Advantage Actor-Critic 结合了策略优化和价值估计的优势,通过引入优势函数来显著降低策略梯度的方差,同时保持了较好的收敛速度和稳定性。由于传统的 AC 算法一般使用动作价值函数,它存在高方差的问题,所以在 A2C 中使用优势函数
优势函数表示在状态 $s$ 下采取动作 $a$ 相比于平均水平的额外收益,也就是动作的优势。优势函数可以通过如下方式实现估计
- 一步优势估计 $A_t=r_t+\gamma V^{\pi_\theta}(s_{t+1})-V^{\pi_\theta}(s_{t})$
- 多步优势估计 $A_t=G_t^{n}-V^{\pi_\theta}(s_{t})$ ,其中 $G_t^n=\sum_{k=0}^{n-1}\gamma^k r_{t+k}+\gamma^n V^{\pi_\theta}(s_{t+n})$
- 广义优势估计:结合多步 TD 估计,通过参数 $\lambda$ 权衡偏差和方差 $A_t=\sum_{k=0}^\infty \lambda^k\delta_{t+k}$ ,其中 $\delta_{t+k}=r_{t+k}+\gamma V^{\pi_\theta}(s_{t+k+1})-V^{\pi_\theta}(s_{t+k})$
A2C 算法的工作流程与 AC 的一致,如下
- 初始化
- 初始化策略网络 $\pi_\theta(s)$ ,初始化网络参数 $\theta$
- 初始化价值网络 $V^{\pi_\theta}(s)$ ,初始化网络参数 $\omega$
- 初始化超参数
- 对于每个训练循环
- 根据当前策略 $\pi_\theta$ 采样轨迹
- 在每一步中,计算 $A_t$
- 计算价值网络损失 $L_\psi=\frac{1}{2}\sum_t(r_t+\gamma V^{\pi_\theta}(s_{t+1})-V^{\pi_\theta}(s_t))^2$ ,反向传递更新价值网络参数 $w$
- 计算策略网络损失 $L_\pi=\sum_tA_t\log\pi_\theta(a_t\vert s_t)$ ,反向传递更新策略网络参数 $\theta$
- 迭代训练
Asynchronous Advantage Actor-Critic
相比于 A2C 来说,A3C 的优化主要在于异步训练框架、网络结构优化、Critic 评估点的优化。

A3C 主要是一个公共的神经网络模型,这个神经网络包括 Actor 网络 $\theta$ 和 Critic 网络 $\omega$ 两部分,下面有多个工作线程,每个线程里有着与公共神经网络一样的网络结构,即 $\theta^\prime$ 和 $\omega^\prime$ ,每个线程会与独立的环境进行交互,得到经验数据,每个线程交互到一定的数据量之后,就计算在自己线程里的神经网络损失函数的梯度,这些梯度却并不更新自己线程里的神经网络,而是去更新公共的神经网络
在每一个线程中,是一个 A2C 算法。使用优势函数来进行更新和估计,优势函数公式为 $A^{\theta^\prime}(s_t,a_t)=Q^{\theta^\prime}(s_t,a_t)-V^{\pi_\theta}(s_t)$ ,其中的 $Q^{\theta^\prime}(s_t,a_t)$ 的值一般可以通过单步采样来近似估计,此时优势函数表达式为 $A^{\theta^\prime}(s_t,a_t)=r_t+\gamma V^{\omega^\prime}(s_{t+1})-V^{\omega^\prime}(s_t)$ 。另外在 A3C 中,采样使用 $N$ 步采样以加速收敛,则上述的公式可以写作如下形式
策略 Actor 的梯度更新的目标是最大化期望回报,通过策略梯度上升实现,为了减少方差,此时引入优势函数作为权重,并且添加熵正则化鼓励探索,则策略的损失函数为
Critic 的梯度更新的目标是最小化价值估计与 $N$ 步回报的均方误差
累积 Actor 的本地梯度更新公式为
累积 Critic 的本地梯度更新公式为
更新全局神经网络的模型参数,在 A3C 采用共享统计信息的 RMSProp 优化器,无锁异步更新,以提升训练效率
其中 $\eta$ 是学习率; $\epsilon$ 是一个极小数,防止除零错误; $g_\theta$ 和 $g_\omega$ 是全局共享的梯度平方移动平均,是由所有线程共享,提升稳定性。A3C 的工作流程如下
- 初始化
- 全局共享参数:策略参数 $\theta$ 和价值网络参数 $\omega$
- 全局计数器,用于记录总训练步数
- 启动多个并行的线程,每个线程为独立的 AC 模型,对于每个模型
- 具有本地策略参数 $\theta^\prime$ 和本地价值网络参数 $\omega^\prime$
- 独立的环境副本
- 本地策略梯度 $d\theta^\prime$ 和价值梯度缓存 $d\omega^\prime$
- 同步全局参数到本地 $\theta^\prime\leftarrow\theta$ 和 $\omega^\prime\leftarrow\omega$
- 对于每个线程的每个训练循环,需要记录当前线程步数起点 $t_s=1$
- 在每个时间步中,执动作直到终止状态
- 根据本地策略 $\pi_{\theta^\prime}(a_t\vert s_t)$ 选择动作 $a_t$ ,离散空间中可以使用 $\epsilon$ 贪婪策略,在连续空间中采样正态分布
- 执行动作 $a_t$ ,获得环境反馈:即时奖励 $r_t$ ,下一状态 $s_{t+1}$
- 更新本地计数器和全局计数器
- 将 $(s_t,a_t,r_t,s_{t+1})$ 存入列表中
- 状态更新 $s_t=s_{t+1}$
- 计算多步优势函数 $A(s_t,a_t)=\sum_{k=0}^{N-1}\gamma^{k}r_{t+k}+\gamma^NV^{\omega^\prime}(s_{t+N})-V^{\omega^\prime}(s_t)$
- 计算 Actor 和 Critic 的损失函数,并计算对应的梯度
- 累积更新 Actor 和 Critic 的本地梯度
- 更新全局神经网络的模型参数
- 在每个时间步中,执动作直到终止状态
- 迭代循环
TRPO 算法
之前介绍的基于策略的方法包括策略梯度算法和 AC 算法,但是这些算法在实际使用中会遇到训练不稳定的情况。对于策略梯度算法:假设 $\theta$ 表示策略 $\pi_\theta$ 的参数,定义目标函数 $J(\theta)=E_{s_0}[V^{\pi_\theta}(s_0)]=E_{\pi_\theta}\Big[\sum_{t=0}^\infty \gamma^tr(s_t,a_t)\Big]$ ,基于策略的方法的目标就是找到 $\theta^\star=\underset{\theta}{\argmax}J(\theta)$ ,策略梯度算法主要沿着 $\nabla_\theta J(\theta)$ 方向迭代更新策略参数 $\theta\leftarrow\theta+\alpha\nabla_\theta J(\theta)$ 。但是当策略网络是深度模型时,可能由于步长太大导致策略突然变差,进而影响训练效果。
针对这种问题,在更新时可以设置一块信任区域,在这个区域内更新策略时能够得到某种策略性能的安全性保证,这就是策略信任区域策略优化,即 TRPO 算法的主要思想,理论上它能保证策略学习的性能单调性。
假设当前策略 $\pi_\theta$ ,它的参数为 $\theta$ ,考虑使用当前的 $\theta$ 找到一个更优的参数 $\theta^\prime$ 使得 $J(\theta^\prime)\geq J(\theta)$ 。由于初始状态 $s_0$ 的分布和策略无关,因此上述策略 $\pi_\theta$ 下的优化目标 $J(\theta)$ 可以写作新策略 $\pi_{\theta^\prime}$ 下的期望形式
基于上述公式,可以推导出新旧策略的目标函数之间的差距
将时序差分残差定义为优势函数 $A^{\pi_\theta}(s_t,a_t)$ ,则上述公式可以定义为
由状态访问分布 $v^\pi(s)=(1-\gamma)\sum_{t=0}\gamma^tP_t^\pi(s)\Rightarrow\sum_{t=0}\gamma^tP_t^\pi(s)=\frac{1}{1-\gamma}v^\pi(s)$ ,上述公式可以写作
所以只要找到一个新的策略满足 $E_{s\sim v^{\pi_{\theta^\prime}}}E_{a\sim \pi_{\theta^\prime}(\cdot\vert s)}[A^{\pi_\theta}(s,a)]\geq0$ 就能保证策略性能单调递增,即 $J(\theta^\prime)\geq J(\theta)$ 。需要求解的就是新策略 $\pi_{\theta^\prime}$ ,但是在公式中需要采样状态 $s\sim v^{\pi_{\theta^\prime}}$ ,即需要用到新的策略采样,这就导致难以求解新策略,而且也不可能把所有新的策略都拿来收集对应的数据,然后判断哪个策略满足上述的条件。在 TRPO 做了一步近似的操作,忽略了两个策略之间的状态访问分布的变化,直接使用旧的策略的状态访问分布替代,定义如下的替代优化目标
另外可以用重要性采样对动作分布进行处理
此时就可以基于旧的策略采样出的数据来估计并且优化新的策略 $\pi_{\theta^\prime}$ 了,为了保证新旧策略足够接近,TRPO 使用 KL 散度来衡量策略之间的距离,并且定义了整体的优化公式
其中的不等式约束定义了策略空间中的一个 KL 球,称作信任区域,在这个区域中,可以认为当前学习策略和环境交互的状态分布与上一轮策略最后采样的状态分布一致,进而可以基于一步动作的重要性采样方法使当前学习策略稳定提升。
直接对上述带约束的优化问题求解有点困难,TRPO 算法在视线中做了近似操作来实现快速求解。先对目标函数和约束在 $\theta$ 处进行泰勒展开,分别用一阶和二阶进行近似,用 $\theta_k$ 代替 $\theta$ ,可以得到如下公式
其中
- $g=\nabla_{\theta^\prime}E_{s\sim v^{\pi_{\theta_k}}}E_{a\sim \pi_{\theta_k}(\cdot\vert s)}\bigg[\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_{\theta_k}(a\vert s)}A^{\pi_{\theta_k}}(s,a)\bigg]$ 表示目标函数的梯度
- $H=H[E_{s\sim v^{\pi_{\theta_k}}}[D_{KL}(\pi_{\theta_k}(\cdot\vert s),\pi_{\theta^\prime}(\cdot\vert s))]]$ 表示策略之间平均 KL 距离的 Hessian 矩阵
于是上述的优化目标变成了
对于这个问题,可以直接使用 KKT 条件写出上述问题的解
由于在神经网络中,策略函数的参数数量会非常多,计算和存储 Hessian 矩阵的逆矩阵会占用大量时间和内存,TRPO 通过共轭梯度法来回避这个问题。它的核心就是直接计算 $x=H^{-1}g$ 即参数的更新方向,假设满足 $KL$ 距离约束的参数更新时的最大步长为 $\beta$ ,于是根据 KL 距离约束条件,则有 $\frac{1}{2}(\beta x)^TH(\beta x)=\delta$ ,则可以得到 $\beta=\sqrt{\frac{2\delta}{x^THx}}$ ,则参数的更新公式为
因此只要可以直接计算 $x=H^{-1}g$ ,就可以根据上述公式来更新参数,问题转化为解 $Hx=g$ 。实际上 $H$ 为对称正定矩阵,所以就可以直接使用共轭梯度法求解,具体流程如下
- 初始化 $r_0=g-Hx_0,p_0=r_0,x_0=0$
- 迭代循环,对于第 $k$ 次循环,执行如下操作
- 计算 $\alpha_k=\frac{r_k^Tr_k}{p_k^THp_k}$
- $x_{k+1}=x_k+\alpha_kp_k$
- $r_{k+1}=r_k-\alpha_kHp_k$
- 若 $r_{k+1}^Tr_{k+1}$ 足够小,则退出循环
- $\beta_k=\frac{r_{k+1}^Tr_{k+1}}{r_k^Tr_k}$
- $p_{k+1}=r_{k+1}+\beta_kp_k$
- 循环迭代直到收敛,输出最终的结果 $x_{k+1}$
在共轭梯度运算过程中,直接计算 $\alpha_k$ 和 $r_{k+1}$ 需要计算和存储 Hessian 矩阵。为了避免这种大矩阵的出现,就只计算 $Hx$ 向量。对于任意的列向量 $v$ 存在
即可以先用梯度和向量点乘之后再计算梯度。
由于 TRPO 算法是使用泰勒一阶和二阶展开近似求解,并非是精确求解。所以求解得到的 $\theta^\prime$ 可能并不会比 $\theta_k$ 好,或不一定能满足 KL 散度的限制。所以 TRPO 在每次迭代的最后进行一次线性搜索,以确保找到满足条件,也就是找到一个最小的非负整数 $i$ ,使得
求出的 $\theta_{k+1}$ 依然满足最初的 $KL$ 散度限制,并且确实能够提升目标函数 $L_{\theta_k}$ ,其中 $\alpha\in(0,1)$ 是一个决定线性搜索长度的超参数。只需要判断前后的策略是否满足 $\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_{\theta_k}(a\vert s)}A^{\pi_{\theta_k}}(s,a)\geq A^{\pi_{\theta_k}}(s,a)$ 即可,线性搜索的流程如下
- 读取旧的策略的参数
- 利用策略网络,计算当前策略的 $\pi_{\theta_k}(a\vert s)$
- 开始迭代循环,设置最大迭代次数
- 计算 $\alpha^i$
- 计算新的策略的参数 $\theta^\prime=\theta_k+\alpha^i\sqrt{\frac{2\delta}{x^THx}}x$
- 定义一个新的策略网络,并且将新的策略参数赋值给它
- 利用新的策略网络计算新的策略 $\pi_{\theta^\prime}(a\vert s)$
- 计算 KL 散度 $D_{KL}(\pi_\theta(\cdot\vert s),\pi_{\theta^\prime}(\cdot\vert s))$ 和 $\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_{\theta_k}(a\vert s)}A^{\pi_{\theta_k}}(s,a)$
- 比较:若满足 $D_{KL}(\pi_\theta(\cdot\vert s),\pi_{\theta^\prime}(\cdot\vert s))\leq\delta$ 且 $\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_{\theta_k}(a\vert s)}A^{\pi_{\theta_k}}(s,a)\geq A^{\pi_{\theta_k}}(s,a)$ 则更新参数作为新的参数 $\theta_{k+1}=\theta^\prime$
- 若到达最大迭代次数依旧不能得到更好的参数,则将旧参数作为新的参数 $\theta_{k+1}=\theta_k$
另外在 TRPO 中,还需要估计每个状态动作对的优势 $A(s_t,a_t)$ ,比较常用的方法就是广义优势估计 GAE。首先利用 $\delta_t=r_t+\gamma V(s_{t+1})-V(s_t)$ 表示时序差分误差,其中 $V$ 是一个已经学习的状态价值函数。根据多步时序差分的思想,可以得到
将上述的这些优势估计进行指数加权平均
由于级数求和 $1+\lambda+\lambda^2+\cdots=\underset{n\rightarrow\infty}{\lim}\frac{1-\lambda^{n+1}}{1-\lambda}$ ,由于此时额外引入的超参数 $\lambda\in[0,1]$ ,则有 $1+\lambda+\lambda^2+\cdots=\frac{1}{1-\lambda}$ ,代入之后可得
当 $\lambda=0$ 时,则 $A_t^{GAE}=\delta_t$ ,即只看一步差分得到的优势;当 $\lambda=1$ 时,则 $A_t^{GAE}=\sum_i^\infty\gamma^i\delta_{t+i}=\sum_{i=0}^\infty\gamma^ir_{t+i}-V(s_t)$ ,即看每一步差分得到的优势的均值。
根据上述的分析,TRPO 的算法流程如下
- 初始化策略网络参数 $\theta$ 和价值网络参数 $\omega$
- 在每个训练回合中
- 利用当前策略 $\pi_\theta$ 采样轨迹 $\{s_1,a_1,r_1,\cdots,s_T,a_T,r_T\}$
- 根据收集到的数据和价值网络估计每个状态动作对的优势 $A_t$
- 计算策略目标函数的梯度 $g$
- 利用共轭梯度法计算 $x=H^{-1}g$
- 用线性搜索找到能提升策略并满足 KL 距离限制的最小整数 $i$ 值,并且更新策略网络参数 $\theta_{k+1}=\theta_k+\alpha^i\sqrt{\frac{2\delta}{x^THx}}x$
- 计算价值网络的损失函数 $L(\omega)=\frac{1}{2}(r+\gamma V(s_{t+1}-V(s_t))^2$ ,反向传播更新 $\omega$
PPO 算法
PPO 算法是 TRPO 算法的改进版,PPO 算法基于 TRPO 算法的思想,但是其算法的实现相对于 TRPO 来说更简单,而且 PPO 能学习的和 TRPO 一样好。在 TRPO 的优化目标如下
TRPO 在解算过程中使用了泰勒展开来近似计算,利用共轭梯度法和线性搜索来求解,PPO 的优化目标与 TRPO 相同,但 PPO 使用了一些相对简单的方法来求解。PPO 有两种形式,即 PPO 惩罚和 PPO 截断。
PPO 惩罚
PPO 惩罚利用 Lagrange 乘数法直接将 KL 散度的限制放在目标函数内,这就变成了一个无约束的优化的问题,在迭代的过程中不断更新 KL 散度前的系数。则优化函数可以写作如下的形式
令 $d_k=D_{KL}(\pi_\theta(\cdot\vert s),\pi_{\theta^\prime}(\cdot\vert s))$ , $\beta$ 的更新规则如下
- 若 $d_k<\frac{\delta}{1.5}$ ,则 $\beta_{k+1}=\frac{\beta_k}{2}$
- 若 $d_k>1.5\delta$ ,则 $\beta_{k+1}=2\beta_k$
- 否则 $\beta_{k+1}=\beta_k$
其中 $\delta$ 是设定好的超参数,用于限制学习策略和之前一轮的策略之间的差距
工作流程如下
- 初始化策略网络参数 $\theta$ 和价值网络参数 $\omega$
- 在每个训练回合中
- 利用当前策略 $\pi_\theta$ 采样轨迹 $\{s_1,a_1,r_1,\cdots,s_T,a_T,r_T\}$
- 根据收集到的数据和价值网络估计每个状态动作对的优势 $A_t$ ,计算方式利用 TPRO 中的 GAE 方法
- 计算策略目标 $\psi=r+\gamma V(s_{t+1})$
- 计算当前策略的 $\pi_\theta(a\vert s)$ 用于下面循环迭代的计算,这个值就是根据训练前网络参数计算的,后续的计算中不再改变
- 定义每个策略采样轨迹的训练次数,开始如下的迭代
- 计算策略网络的损失函数 $L(\theta)=-\Big(E_{s\sim v^{\pi_{\theta}}}E_{a\sim \pi_{\theta^\prime}(\cdot\vert s)}[A^{\pi_\theta}(s,a)]-D_{KL}(\pi_\theta(\cdot\vert s),\pi_{\theta^\prime}(\cdot\vert s))\Big)$ ,最小化损失函数,反向传播更新 $\theta$
- 计算价值网络的损失函数 $L(\omega)=\frac{1}{2}(\psi-V(s_t))^2$ ,反向传播更新 $\omega$
- 根据上述规则更新 $\beta$
PPO 截断
PPO 截断直接在目标函数中进行限制,以保证新的参数和旧的参数的差距不会太大。公式如下
其中的函数 $\mathrm{clip}(x,l,u)=\max(\min(x,u),l)$ ,把 $x$ 限制在范围 $[l,u]$ 之间。其中的 $\epsilon$ 是一个超参数,表示截断的范围。
即如果 $A^{\pi_\theta}(s,a)>0$ ,说明这个动作的价值高于平均值,最大化这个式子会增大 $\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_\theta(a\vert s)}$ ,但会限制它不能超过 $1+\epsilon$ ;相反如果 $A^{\pi_\theta}(s,a)<0$ ,最大化这个式子会减小 $\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_\theta(a\vert s)}$ ,也会限制它不小于 $1-\epsilon$
工作流程如下
- 初始化策略网络参数 $\theta$ 和价值网络参数 $\omega$
- 在每个训练回合中
- 利用当前策略 $\pi_\theta$ 采样轨迹 $\{s_1,a_1,r_1,\cdots,s_T,a_T,r_T\}$
- 根据收集到的数据和价值网络估计每个状态动作对的优势 $A_t$ ,计算方式利用 TPRO 中的 GAE 方法
- 计算策略目标 $\psi=r+\gamma V(s_{t+1})$
- 计算当前策略的 $\pi_\theta(a\vert s)$ 用于下面循环迭代的计算,这个值就是根据训练前网络参数计算的,后续的计算中不再改变
- 定义每个策略采样轨迹的训练次数,开始如下的迭代
- 计算策略网络的损失函数 $L(\theta)=-E_{s\sim v^{\pi_{\theta}}}E_{a\sim \pi_{\theta}(\cdot\vert s)}\bigg[\min\Big(\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_\theta(a\vert s)}A^{\pi_\theta}(s,a),\mathrm{clip}\Big(\frac{\pi_{\theta^\prime}(a\vert s)}{\pi_\theta(a\vert s)},1-\epsilon,1+\epsilon\Big)A^{\pi_\theta}(s,a)\Big)\bigg]$ ,最小化损失函数,反向传播更新 $\theta$
- 计算价值网络的损失函数 $L(\omega)=\frac{1}{2}(\psi-V(s_t))^2$ ,反向传播更新 $\omega$
确定性策略梯度算法
上面介绍了基于策略梯度的算法 REINFORCE、AC、TRPO 和 PPO 算法,这些算法都是在线策略算法,即它们的样本效率较低。之前的 DQN 算法直接估计最优函数 $Q$ ,可以做到离线策略学习,但是由于它需要从所有动作中挑选一个 $Q$ 值最大的动作,所以它只能处理动作空间有限的环境。
DPG 算法专为连续的动作空间设计,传统策略梯度算法采用随机策略,输出动作概率分布,在高维连续空间中计算复杂且方差大,而 DPG 直接输出确定性动作,显著降低计算复杂度并且提升样本效率。DPG 的核心突破是确定性策略梯度定理,且证明了确定性策略梯度的存在性与收敛性,为连续控制问题提供了高效解决方案。
确定性梯度定理
确定性策略梯度定理是连续动作空间强化学习的核心理论基石,它解决了随机策略梯度在连续动作空间中计算复杂、方差大的问题,直接给出确定性策略的性能梯度解析公式,是 DPG、DDPG 算法的理论源头。
对于确定性策略 $\mu$ ,强化学习的目标函数可以写作期望的形式
其中 $S$ 表示状态空间, $v$ 是状态访问分布。确定性策略梯度与随机策略梯度相似。由于 $\mu_\theta$ 是确定性的策略,则有 $V^{\mu_\theta}(s)=Q^{\mu_\theta}(s,\mu_\theta(s))$ ,计算 $V^{\mu_\theta}(s)$ 对 $\theta$ 的梯度如下
令 $P(s\rightarrow s^\prime,1,\mu_\theta)=P(s^\prime\vert s,\mu_\theta(s))$ ,含义为从状态 $s$ ,执行策略 $\mu_\theta$ ,1 步到达状态 $s^\prime$ 的概率,代入公式中便于后续计算。积分中出现了 $\nabla_\theta V^{\mu_\theta}(s^\prime)$ ,正好是公式左侧中的 $\nabla_\theta V^{\mu_\theta}(s)$ 在状态 $s^\prime$ 下的值,因此可以反复迭代计算
不断迭代计算之后,得到
这就计算出了 $V^{\mu_\theta}(s)$ 对 $\theta$ 的梯度。最终的优化目标累积回报函数 $J(\mu_\theta)$ 的其中一种定义就是 $V(s)$ 按照初始状态的分布 $v_0(s)$ 对状态求期望,即
计算 $J(\mu_\theta)$ 对 $\theta$ 的梯度,并且代入上面的结果
上述过程的就是在线策略形式的确定性策略梯度定理,期望下标表示 $s\sim v^{\mu_\theta}$ ,为了得到离线策略形式的确定性策略梯度定理,只需要将目标函数写作 $J(\theta)=\int_S v^\beta V^{\mu_\theta}(s)ds=\int_Sv^\beta Q^{\mu_\theta}(s,\mu_\theta(s))ds$ 之后进行求导即可
DPG 算法
DPG 是基于 Actor-Critic 架构的连续动作空间强化学习算法,核心创新是通过确定性策略梯度定理简化梯度计算,结合离线学习保证探索,兼容函数近似修正偏差。DPG 的工作核心流程就是通过随机行为策略保证探索,利用 Critic 估计动作的价值,Actor 沿确定性策略梯度优化目标策略,迭代循环到收敛,适配连续动作空间。
- 初始化
- 初始化目标策略 $\mu_\theta(s)$ 网络,初始化对应的参数 $\theta$
- 初始化价值函数 $Q_w(s,a)$ ,初始化对应的参数 $\omega$
- 初始化超参数
- 对于每个训练回合
- 重置环境,得到初始状态
- 利用固定方差的高斯分布作为行为策略,即 $\beta(a\vert s)=\mathcal{N}(\mu_\theta(s),\sigma_\beta)$
- 对于每个时间步
- 根据当前训练网络,以行为策略选择动作 $a_t$
- 执行动作得到环境反馈的 $r_t,s_{t+1}$
- 将 $(s_t,a_t,r_t,s_{t+1})$ 存储在回放池中
- 如果回放池中数据足够多,从回放池中采样 $N$ 个数据
- 对于每组数据,用目标网络计算 $y_i=r_i+\gamma Q^w(s_{t+1},\mu_\theta(s^\prime_i))$
- 最小化目标损失 $L=\frac{1}{N}\sum_{i=1}^N(y_i-Q_w(s_i,a_i))^2$ ,以此来更新当前价值网络参数 $\omega$
- 计算采样的策略的目标损失 $L=\frac{1}{N}\sum_{i=1}^NQ_w(s_i,\mu_\theta(s_i))$ ,以此来更新当前的策略网络参数 $\theta$
DDPG
DDPG 算法需要用到 4 个神经网络,其中的 Actor 和 Critic 各用两个网络,它们都有一个目标网络。目标网络可以保证训练更加稳定,但是在 DDPG 中目标网络的更新与之前的不一样,使用一种软更新的方式,让目标 $Q$ 网络缓慢更新,逐渐接近 Q 网络,公式为 $\omega_1=\tau\omega_0+(1-\tau)\omega_1$ ,通常的 $\tau$ 是一个比较小的数。另外作为一种离线的策略算法,DDPG 在行为策略上引入了一个随机噪声 $\mathcal{N}$ 来进行探索。具体的工作流程如下
- 初始化
- 初始化两个策略网络 $\mu_\theta^0(s)$ 和 $\mu_\theta^1(s)$ ,对应的参数为 $\theta_0$ 和 $\theta_1$
- 初始化两个价值网络 $Q_\omega^0(s)$ 和 $Q_\omega^1(s)$ ,对应的参数为 $\omega_0$ 和 $\omega_1$
- 初始化超参数
- 对于每个训练回合
- 初始化随机过程 $\mathcal{N}$ ,用于动作探索
- 重置环境,得到初始状态
- 对于每个时间步
- 根据当前训练网络,用当前策略选择动作 $a_t=\mu_\theta(s_t)+\mathcal{N}$
- 执行动作得到环境反馈的 $r_t,s_{t+1}$
- 将 $(s_t,a_t,r_t,s_{t+1})$ 存储在回放池中
- 如果回放池中数据足够多,从回放池中采样 $N$ 个数据
- 对于每组数据,用目标网络计算 $y_i=r_i+\gamma Q_\omega^1(s_{t+1},\mu^1_\theta(s^\prime_i))$
- 最小化目标损失 $L=\frac{1}{N}\sum_{i=1}^N(y_i-Q_w^0(s_i,a_i))^2$ ,以此来更新当前训练价值网络参数 $\omega^0$
- 计算采样的策略的目标损失 $L=\frac{1}{N}\sum_{i=1}^NQ^0_\omega(s_i,\mu_\theta^0(s_i))$ ,以此来更新当前的训练策略网络参数 $\theta^0$
- 更新目标网络参数 $\omega_1=\tau\omega_0+(1-\tau)\omega_1,\theta_1=\tau\theta_0+(1-\tau)\theta_1$
TD3
TD3 是 DDPG 算法的改进版本,专门针对连续动作空间问题,通过核心改进解决了 DDPG 的 Q 值过高估偏差和训练不稳定的问题。单 Critic 网络在计算目标值时使用 max 操作,易导致价值估计过高;Actor 网络更新过于频繁,易利用 Critic 网络的估计误差,导致策略震荡;确定性目标策略缺乏探索,导致价值估计方差大。
截断双 Q 学习
同时训练两个独立的 Critic 网络 $Q_{\omega_1}$ 和 $Q_{\omega_2}$ ,目标值取两者中的较小值,公式如下
两个 Critic 网络分别最小化 MSE 损失,分别进行更新
延迟更新策略
Critic 网络的更新频率高于 Actor 网络,通常是每更新 2 次 Critic 网络,更新 1 次 Actor 网络和目标网络,确保价值估计更准确后再更新策略,避免策略过拟合。Actor 的损失函数最大化当前状态的 Q 值估计
目标策略平滑
在目标动作中添加少量噪声,鼓励探索并降低价值估计方差,使目标值更稳定
其中 $\epsilon\sim\mathcal{N}(0,\sigma)$ 为小噪声,一般选择 $\sigma=0.2$
TD3 的训练流程如下
- 初始化
- 初始化主网络:Actor 网络 $\pi_\theta$ ,两个 Critic 网络 $Q_{\theta_1}$ 和 $Q_{\theta_2}$
- 初始化对应的目标网络 $\pi_{\theta^\prime},Q_{\theta_1^\prime},Q_{\theta_2^\prime}$
- 初始化经验回放缓冲区
- 设置超参数
- 对于每个训练回合
- 重置环境,得到初始状态
- 对于每个时间步
- 对于当前状态 $s_t$ ,Actor 输出确定性的动作 $a_t=\pi_\theta(s_t)+\epsilon$
- 执行动作得到环境反馈的 $r_t,s_{t+1},d_t$
- 将 $(s_t,a_t,r_t,d_t,s_{t+1})$ 存储在回放池中
- 当经验回放池中的样本数量超过一定数目时,从经验回放池中采样进行更新 $(s,a,r,d,s^\prime)$
- 计算目标动作 $a^\prime=\mathrm{clip}(\pi_{\theta^\prime}(s^\prime)+\epsilon,a_{\min},a_{\max})$
- 计算目标 Q 值 $y=r+\gamma\underset{j=1,2}{\min}Q_{\omega_j^\prime}(s^\prime,a^\prime)(1-d)$
- 利用损失函数 $L(\omega_1)$ 和 $L(\omega_2)$ 更新 Critic 网络参数 $\omega$
- 计算 Actor 损失 $L(\theta)=-E[Q_{\theta_1}(s,\pi_\theta(s))]$ 反向传播更新 Actor 网络参数 $\theta$
- 更新目标网络 $\omega^\prime_1=\tau\omega_1+(1-\tau)\omega^\prime_1$ 和 $\omega^\prime_2=\tau\omega_2+(1-\tau)\omega^\prime_2$ 和 $\theta^\prime=\tau\theta+(1-\tau)\theta^\prime$
最大熵强化学习
最大熵强化学习是在传统强化学习最大化累积奖励目标基础上,加入策略熵最大化约束的范式,核心是平衡奖励最大化与策略随机性,解决传统 RL 易陷入局部最优、探索不足、泛化性差的问题。
最大熵框架
最大熵强化学习是以最大熵原理为核心,将传统强化学习的单目标奖励最大化扩展为奖励最大化+策略熵最大化的理论框架。最大熵原理定义了熵:策略在状态 $s$ 下的熵定义为 $\mathcal{H}(\pi(\cdot\vert s))=-E_{a\sim\pi(\cdot\vert s)}[\log\pi(a\vert s)]$ ,当熵越大则策略越随机,探索能力就越强;当熵为 0 时,策略退化为确定性策略。另外定义熵的权重:温度系数 $\alpha$ ,当温度系数越大时,探索优先级越高。
Soft Bellman 方程
传统 RL 的核心是 Bellman 方程,最大熵 RL 的核心是 Soft Bellman 方程,它是最大熵框架下价值函数的递推规则,所有最大熵算法的价值更新都基于此。定义状态 $s$ 下采样动作 $a$ 的最大熵动作价值
与传统的 $Q$ 函数的唯一区别就是后续状态价值替换为 Soft 状态的状态价值。定义状态 $s$ 的最大熵状态价值,如下
其中 $\mathcal{H}(\pi(\cdot\vert s))$ 是定义策略在状态 $s$ 处的熵
将 $V_{soft}(s)$ 带入到上述的 $Q_{soft}(s,a)$ 函数中,可以得到 Soft Benllman 方程的原始形式
在最大熵框架下,最优策略 $\pi^\star$ 满足玻尔兹曼分布,如下
其中 $Q^\star(s,a)$ 是最优动作价值函数,满足 Soft Bellman 最优方程,即
上述得到的最优策略是概率分布,而非是确定性的动作,所以自带有探索的能力;而且 $Q$ 值越大的动作,被选择的概率就越大,平衡利用与探索;温度系数 $\alpha$ 越大,策略分布越均匀,温度系数越小,分布越尖锐。将上述的最优策略带入到 $V_{soft}(s)$ ,可以简化为 Log-Sum-Exp 的形式,得到最优的价值函数的公式
下面计算 $\log\frac{\exp(\frac{Q^\star_{soft}(s,a)}{\alpha})}{\sum_{a^\prime\in A}\exp(\frac{Q^\star_{soft}(s,a^\prime)}{\alpha})}$
且由于 $\sum_{a\in A}\frac{\exp(\frac{Q^\star_{soft}(s,a)}{\alpha})}{\sum_{a^\prime\in A}\exp(\frac{Q^\star_{soft}(s,a^\prime)}{\alpha})}=1$ ,带入可以得到
策略评估
在固定策略 $\pi$下,估计 Soft Q 函数 $Q_{soft}^\pi(s,a)$ 与 Soft 价值函数 $V_{soft}^\pi(s)$ 满足 Soft Bellman 方程
- Soft Q 函数 $Q^\pi_{soft}(s,a)=r(s,a)+\gamma E_{s^\prime\sim P(\cdot\vert s,a)}[V_{soft}(s^\prime)]$
- Soft 价值函数
- 期望+熵的形式 $V_{soft}^\pi(s)=E_{a\sim\pi(\cdot\vert s)}[Q_{soft}(s,a)-\alpha\log\pi(a\vert s)]$
- LogSumExp 形式 $V^\pi_{soft}(s)=\alpha\log\sum_{a^\prime\in A}\exp(\frac{Q^\star_{soft}(s,a^\prime)}{\alpha})$
定义 Soft 策略评估通过迭代应用 Soft Bellman 算子 $T$ 实现
当 $\alpha\rightarrow0$ 时,Soft 价值函数退化为传统价值函数,算子退化为 Bellman 算子。算子 $T^\pi$ 是压缩映射,迭代收敛到唯一的不动点 $Q=TQ$ ,工作方式如下
- 精确迭代 $Q^\pi_{k+1}=T^\pi Q_k^\pi$
- 近似学习:利用最小化 Soft Bellman 残差实现,定义目标函数 $L(Q)=E\Big[\Big(Q(s,a)-\big(r+\gamma V(s^\prime)\big)\Big)^2\Big]$ ,通过最小化目标函数来求解 $Q$
策略提升
基于当前 Soft Q 函数,构造新的策略 $\pi^\prime$ 以满足 Soft 策略提升定理
同时保证策略随机性以满足最大熵的目标。寻找最优的策略 $\pi^\prime$ ,最大化状态 $s$ 下的 Q 值+熵的期望
对上述公式求极值,利用拉格朗日乘子法,并且约束 $\sum_a\pi(a\vert s)=1$ ,解得最大熵最优策略
将其归一化可以得到
当 $\alpha\rightarrow0$ 时,退化为传统的贪心策略,即 $\pi^\star(a\vert s)=\underset{a}{\argmax}Q^\star(s,a)$ 。而策略提升的更新方式如下
- 精确更新:直接构造 Boltzmann 分布
- 参数化近似:对参数化策略 $\pi_\theta(a\vert s)$ ,最小化 KL 散度 $\underset{\theta}{\min}E_{s\sim S}\Big[D_{KL}\Big(\pi_\theta(\cdot\vert s),\frac{\exp(\frac{Q^\star_{soft}(s,a)}{\alpha})}{\sum_{a^\prime\in A}\exp(\frac{Q^\star_{soft}(s,a^\prime)}{\alpha})}\Big)\Big]$ ,等价于最大化对数似然函数 $\underset{\theta}{\max}E_{s\sim S,a\sim\pi_\theta}\Big[\frac{Q(s,a)}{\alpha}-\log\pi_\theta(a\vert s)\Big]$
策略迭代
交替执行 Soft 策略评估和 Soft 策略提升,从初始策略出发,逐步迭代至最大熵最优策略 $\pi^\star$ 由于每次评估得到的 Q 是当前策略的最优价值,每次提升得到的策略是当前 Q 的最优策略,且满足单调改进,因此迭代必然收敛到不动点
- Soft 策略评估:固定 $\pi$ ,利用最小化 Soft Bellman 残差迭代更新 $Q$ 函数
- Soft 策略提升:基于上述策略评估更新后的 $Q$ 函数,利用 Boltzmann 分布或 KL 散度来更新策略,得到新的策略 $\pi^\prime$ 使其满足 $Q^{\pi^\prime}\geq Q^{\pi}$
Soft DQN
Soft Q-Learning 是一种基于最大熵强化学习 (Maximum Entropy RL)思想的深度强化学习算法,它通过在传统 Q-Learning 中引入熵正则化,在最大化预期累积奖励的同时鼓励策略的探索性和多样性。Soft Q-Learning 的核心是优化熵正则化的累积奖励目标函数,定义为
最大熵框架下的最优动作价值函数 $Q^\star_{soft}(s,a)$ 满足 Soft Bellman 方程
其中的软价值函数定义为
这个操作也被称为 softmax 操作。在最大熵框架下,最优策略具有 Boltzmann Distribution 形式
Soft Q-Learning 通过 Soft Bellman 更新 Q 函数,替代传统 Q-Learning 算法
均方贝尔曼误差(MSBE)作为损失函数,这是强化学习中 Q 网络训练的标准损失,物理意义是让当前 Q 网络的预测值尽可能接近软贝尔曼目标值,损失函数的公式为
之后利用梯度下降法更新对应的参数。总体的工作流程如下
- 初始化
- Soft Q-Learning 的核心网络为双 Q 网络,即训练网络 $Q_0$ 和目标网络 $Q_1$ ,初始时将训练网络参数复制到目标网络中
- 训练网络 $Q_0$ 核心作用是实时预测 Soft 动作价值
- 目标网络 $Q_1$ 的核心作用是生成固定的 Soft Bellman 目标值 $Q_{target}$ ,避免目标值随训练 Q 网络同步波动导致训练震荡
- 初始化经验回放池
- 初始化超参数
- 对于每个训练回合
- 重置环境,得到初始状态
- 在每个时间步 $t$ 时
- 根据当前的策略 $\pi^\star(a\vert s)=\frac{\exp(\frac{Q^\star_{soft}(s,a)}{\alpha})}{\sum_{a^\prime\in A}\exp(\frac{Q^\star_{soft}(s,a^\prime)}{\alpha})}$ 选择动作
- 执行动作,得到环境反馈的 $r,s_{t+1}$ ,得到样本 $(s_t,a_t,r_t,s_{t+1})$ 存入经验回放池
- 当经验回放池中的样本数量超过一定数目时,从经验回放池中采样进行更新 $(s,a,r,s^\prime)$
- 计算 Soft Q 函数 $Q^0(s,a)$
- 对于下一个状态 $s^\prime$ ,根据定义计算 $V^1(s^\prime)=\alpha\log(\sum_a\exp(\frac{Q^1(s^\prime,a)}{\alpha}))$
- 计算 Soft Q 函数的 TD 目标 $y=r+\gamma V^1(s^\prime)$
- 计算损失函数 $L=E[(Q^0(s,a)-y)^2]$ ,反向传递更新 Soft Q 函数
- 定期更新目标网络 $Q_1$
Soft Policy Gradient
Soft Policy Gradient 算法是最大熵深度强化学习框架下的关键算法,核心是通过熵正则化平衡累积奖励最大化与策略随机性,同时解决传统强化学习在连续动作空间、样本效率和训练稳定性的痛点。
该算法的核心点在于从熵正则化目标函数出发,通过双采样和梯度裁剪来解决训练的不稳定性。双采样通过拆分状态期望和动作期望的采样过程,使连续动作空间的期望可计算;梯度裁剪限制策略梯度的全局范数,避免过大更新导致训练震荡。
- 双采样:双采样并非是单一采样操作,而是状态批量采样+单状态多动作采样的组合策略
- 状态批量采样:从回放缓冲区中随机采样 $N$ 个状态,逼近状态分布的期望
- 单状态多动作采样:对每个采样到的状态,从对应策略中独立采样 $M$ 个动作,逼近动作分布的期望
- 双采样会分别在 Critic 网络更新和 Actor 网络更新中执行
- 在 Critic 中,对下一状态 $s^\prime$ 采样 $M$ 个动作 $a^\prime_{ij}$ ,通过求每个状态动作对下的目标函数值的均值来逼近期望值
- 在 Actor 中,对当前状态 $s$ 采样 $M$ 个动作 $a_{ij}$ ,通过求每个状态动作对下的梯度项的均值来逼近期望值
- 梯度裁剪:Actor 网络的梯度直接依赖 Soft Q 网络的输出值 $Q^\omega$ ,而它并无同一的量纲,容易导致微小的参数更新可能引发动作分布的剧烈变化,为了使得更稳定,使用梯度裁剪
- 在 Actor 的目标函数的梯度进行限制,强制将梯度的取值约束在预设值之内
Soft Policy Gradient 的 Actor 的目标函数如下
对其求梯度可以得到
利用当前每个状态 $s_i$ 和训练网络 $\pi_\theta$ 采样动作 $a_{ij}$ ,计算均值来逼近期望
为了保证梯度的稳定性,对上述梯度使用梯度裁剪,限制全局范数不超过 $\mathcal{N}$
这得到的就是关于 Actor 的目标函数的梯度,通过梯度来更新 Actor 网络参数
另外计算 Critic 的目标值 $y_i$ ,利用训练网络 $\pi_\theta$ 对于每个动作 $s^\prime_i$ 采样 $M$ 个动作 $a_{ij}^\prime$
计算 Critic 的目标函数
通过最小化目标函数来更新 Critic 网络参数
- 初始化
- 初始化 Actor 网络 $\pi_\theta(a\vert s)$ ,输出连续动作的概率分布
- 初始化 Critic 网络 $Q_\omega(s,a)$
- 初始化目标网络 $Q_{\omega^\prime}$ 和 $\pi_{\theta^\prime}$ ,更新时参数复制自训练网络
- 初始化回放缓存区
- 初始化超参数
- 对于每一轮训练
- 重置环境,获得初始状态
- 对于每个时间步
- 根据当前策略 $\pi_\theta(a\vert s)$ 采样动作 $a_t$
- 执行动作,获得即时奖励 $r_t$ 和下一状态 $s_{t+1}$
- 得到样本 $(s_t,a_t,r_t,s_{t+1})$ 存入经验回放池
- 当经验回放池中的样本数量超过一定数目时,从经验回放池中采样进行更新 $(s,a,r,s^\prime)$
- 对于每个下一状态 $s^\prime_i$ ,从目标 Actor 网络 $\pi_{\theta^\prime}$ 采样 $M$ 个动作 $a_{ij}^\prime$
- 计算 Soft Bellman 目标值 $y_i=\frac{\gamma}{M}\sum_{j=1}^M\Big[Q_{\omega^\prime}(s_i^\prime,a_{ij}^\prime)-\log\pi_{\theta^\prime}(a_{ij}^\prime\vert s_i^\prime)\Big]$,利用 $M$ 个动作近似动作期望
- 最小化损失函数 $L(\omega)=\frac{1}{N}\sum_i^N(Q_\omega(s_i,a_i)-y_i)$ ,反向传播更新参数 $\omega$
- 对于每一个当前状态 $s_i$ ,从当前 Actor 网络 $\pi_\theta$ 采样 M 个动作 $a_{ij}$
- 计算 $\nabla_\theta J(\pi_\theta)\approx\frac{1}{NM}\sum_i^N\sum_j^M[(Q_\omega(s_i,a_{ij})-\log\pi_\theta(a_{ij}\vert s_i)-1)\nabla_\theta\log\pi_\theta(a_{ij}\vert s_i)]$ ,对梯度应用梯度裁剪,限制全局范数不超过 $\mathcal{N}$ ,得到稳定梯度 $\nabla_\theta^{CLIP} J(\pi_\theta)$ ,更新参数 $\theta$
- 更新目标网络 $\omega^\prime=\tau\omega+(1-\tau)\omega^\prime$ 和 $\theta^\prime=\tau\theta+(1-\tau)\theta^\prime$
Soft Actor-Critic
前面的 AC 算法都是在线策略的算法,它的采样效率比较低,所以更倾向于使用离线策略算法。相比于 DDPG 算法, SAC 算法会更加稳定。SAC 的前身是 Soft Q-Learning 算法,都属于是最大熵强化学习。由于 Soft Q-Learning 不存在显式的策略函数,而是使用一个函数 $Q$ 的玻尔兹曼分布,这在连续空间下求解比较麻烦,所以在 SAC 中提出使用一个 Actor 表示策略函数,从而解决这个问题。
熵表示对一个随机变量的随机程度的度量。对于一个随机变量 $X$ ,且它的概率密度函数为 $p$ ,那么它的熵 $H$ 被定义为
在强化学习中,可以使用 $H(\pi(\cdot\vert s))$ 表示策略 $\pi$ 在状态 $s$ 下的随机程度。而最大化熵强化学习的思想就是除了要最大化累积奖励,还要使策略更加随机,所以在强化学习中加入了一项熵的正则项,定义为
其中 $\alpha$ 是一个正则化系数,用来控制熵的重要程度。熵正则化增强了强化学习算法的探索程度, $\alpha$ 越大,探索性越强,有助于加速后续的策略学习,并减少策略陷入较差的局部最优的可能性。在最大熵强化学习框架中,由于目标函数发生了变化,则其他的一些定义也发生了变化,如下
根据上述的 Soft Bellman 方程,在有限的状态和动作空间下,Soft 策略评估可以收敛到策略 $\pi$ 的 Soft Q 函数,然后根据如下的 Soft 策略提升公式可以改进策略
交替使用 Soft 策略评估和 Soft 策略迭代,最终的策略可以收敛到最大熵强化学习目标中的最优策略。但是该 Soft 策略迭代的方式只适用于表格型设置的情况,即状态空间和动作空间有限的情况下,而在连续空间下,需要通过参数化函数 $Q$ 和策略 $\pi$ 来近似这样的迭代。
在 SAC 算法中,为两个动作价值 $Q$ 函数 $Q_{\omega_1}$ 和 $Q_{\omega_2}$)和一个策略函数 $\pi_\theta$ 建模,另外为了使训练更加稳定,也引入了动作价值函数的目标 $Q$ 网络 $Q_{\omega_1^\prime}$ 和 $Q_{\omega^\prime_2}$ ,基于 Double DQN 的思想,SAC 使用两个 Q 网络,每次使用 Q 网络时会挑选一个 Q 值小的网络,从而缓解 Q 值过高估计的问题。其中的任意一个函数 $Q$ 的损失函数如下:
其中 $D$ 是策略过去手机的数据,相当于是经验回放池。在 SAC 中,目标 Q 网络的更新方式与 DDPG 一致。另外策略 $\pi$ 的损失函数由 KL 散度得到,如下
也可以理解为最大化状态价值函数 $V$ ,根据最大熵状态价值函数有 $V(s_t)=E_{a_t\sim\pi}[Q_\omega(s_t,a_t)-\alpha\log\pi_\theta(a_t\vert s_t)]$ 。
对于连续的动作空间的环境,SAC 算法的策略输出高斯分布的均值和标准差,但是根据高斯分布来采样动作的过程是不可导的,所以需要用到重参数化技巧。即先从一个单位高斯分布 $\mathcal{N}$ 采样,再把采样值乘以标准差之后加上均值,这就可以认为是从高斯分布采样,并且这个采样动作对于策略函数是可导的,可以将其写作 $a_t=f_\theta(\epsilon_t,s_t)$ 。则策略的损失函数可以写作
另外在 SAC 中,需要选择熵正则化的系数,在不同状态下需要不同大小的熵:在最优动作的不确定某个状态下,需要熵大一些;在某个最优动作比较确定的状态下,熵的取值可以小一些。为了自动调整熵正则项,SAC 将强化学习的目标 $\pi_\theta$ 改为一个带有约束的优化问题
最大化期望回报,且同时约束熵的均值大于 $H_0$ ,将其进行化简之后,可以得到 $\alpha$ 的损失函数
当策略的熵低于目标值 $H_0$ 时,训练目标会使得 $\alpha$ 增大;当策略的熵高于目标值 $H_0$ 时,训练目标会使 $\alpha$ 减小。
SAC 具体的算法流程如下
- 初始化
- 用随机的网络参数 $\omega_1$ 和 $\omega_2$ 分别初始化训练 Critic 网络 $Q_{\omega_1}(s,a)$ 和 $Q_{\omega_2}(s,a)$
- 用随机的网络参数 $\theta$ 初始化 Actor 网络 $\pi_\theta(s)$
- 复制相同的参数到对应的目标 Critic 网络 $Q_{\omega_1^\prime}(s,a)$ 和 $Q_{\omega_2^\prime}(s,a)$
- 初始化经验回收池
- 初始化超参数
- 对于每个训练回合
- 重置环境,得到初始状态
- 对于每个时间步
- 根据当前策略选择动作 $a_t=\pi_\theta(s_t)$
- 执行动作,得到环境反馈的 $r,s_{t+1}$ ,得到样本 $(s_t,a_t,r_t,s_{t+1})$ 存入经验回放池
- 当经验回放池中的样本数量超过一定数目时,从经验回放池中采样进行更新 $(s,a,r,s^\prime)$
- 对于每个元组,用目标网络计算 $y=r+\gamma\underset{j=1,2}{\min}Q_{\omega_j^\prime}(s,a)-\alpha\log\pi_\theta(a^\prime\vert s^\prime)$ 其中 $a^\prime\sim\pi_\theta(\cdot\vert s^\prime)$
- 对两个 Critic 网络都进行更新:最小化损失函数 $L(\omega)=E[(y-(Q_{omega}(s,a))^2]$
- 用重参数化技巧采样动作 $\tilde{a}$ 更新 Actor 网络:最小化损失函数 $L(\theta)=E[\alpha\log\pi(\tilde{a}\vert s)-\underset{j=1,2}{\min}Q_{\omega_j}(s,\tilde{a})]$
- 更新熵正则项的系数 $\alpha$
- 更新目标网络 $\omega^\prime_1=\tau\omega_1+(1-\tau)\omega^\prime_1$ 和 $\omega^\prime_2=\tau\omega_2+(1-\tau)\omega^\prime_2$
另外需要注意的是,由于 SAC 算法是应用于连续动作空间的,当要用于离散动作空间时,需要将策略网络和它对应的动作选择修改一下:网络结构输出层添加 softmax 函数,输出之后设置转化为分布的形式,然后从分布中采样,得到对应的动作。
Soft DDPG
Soft DDPG 是 DDPG 算法的扩展,核心在于引入最大熵强化学习框架与 Soft 策略迭代机制,在保留 DDPG 处理连续动作空间能力的同时,提升探索效率、鲁棒性与收敛稳定性。
DDPG 采用单 Q 网络估计价值,存在严重偏差,导致策略的不稳定。另外传统认为 Softmax 算子非压缩映射,不适用于价值更新,但是在《Softmax Deep Double Deterministic Policy Gradients》中证明得到:
- 在连续动作空间中 Softmax 算子与 max 算子的误差有界,价值迭代收敛
- Softmax 算子能平滑优化地形,减少局部最优解,使梯度下降更易收敛
- 基于但估计器时,Softmax 可降低过估计偏差,基于双估计器时,可以改善估计偏差
定义在连续空间的 Softmax 算子,如下
其中 $\beta$ 时温度系数,越大则 Softmax 越接近 max 算子,越小则探索性越强。上述公式中,积分形式不可直接计算,可以使用重要性采样来近似:对目标动作 $\pi_{\theta^\prime}(s^\prime)$ 添加高斯噪声 $\epsilon\sim\mathcal{N}(0,\sigma)$ 并且约束到范围 $[-c,c]$ 中,得到 $K$ 个采样动作 $a^\prime$ ,再通过如下近似
其中 $p(a^\prime)$ 是采样动作的概率密度。Soft DDPG 算法有两种算法 SD2 和 SD3,如下
SD2
SD2 中使用单 Actor 和单 Critic 网络,还有它们对应的目标网络,将 Softmax 算子融入到 DDPG,解决过估计的问题。SD2 中有 4 个网络,即 $Q_\omega,Q_{\omega^\prime},\pi_\theta,\pi_{\theta^\prime}$
计算 Critic 的目标值
计算 Critic 的损失,Bellman 均方误差
计算 Actor 的策略梯度
与 DDPG 的策略梯度形式一致,但是 Q 值的更新是由 Softmax 目标值更新,偏差会更小。更新目标网络
SD3
SD3 中使用双 Actor 和双 Critic 网络,它们也都有对应的目标网络,可以缓解过估计和低估的问题。SD3 中有 8 个网络,即 $Q_{\omega_1},Q_{\omega_2},Q_{\omega_1^\prime},Q_{\omega_2^\prime},\pi_{\theta_1},\pi_{\theta_2},\pi_{\theta_1^\prime},\pi_{\theta_2^\prime}$
先对双 Critic 的输出取最小值,避免过估计的问题
计算 Critic 的目标值
不直接对单个 Critic 的输出应用 Softmax,而是先取双 Critic 最小值,再用 Softmax 平滑。计算 Critic 的损失,Bellman 均方误差
计算 Actor 的策略梯度
更新目标网络
