清华大学李升波教授强化学习书籍《Reinforcement Learning for Sequential Decision and Optimal Control》读书笔记U10深度强化学习
本篇博客对应于原书的第十单元,重点讲述了深度强化学习(Deep Reinforcement Learning,DRL)的基础知识。深度强化学习时神经网络与强化学习的结合,需要进行大量的交互并消耗巨量的计算资源。在早期因为硬件计算资源的限制,并未受到太多重视。但是近些年来随着计算能力的不断提高,将深度学习与强化学习结合的研究取得了巨大的进展。AlphaGo及其后继者不断战胜人类顶尖高手标志着人工智能

该书由清华大学李升波教授撰写的,主要面向工业控制领域的研究者和工程师,曾获得2024年度Springer中国新发展奖(China New Development Awards)。全书按照原理剖析、主流算法、典型示例的架构,系统地介绍了用于动态系统决策与控制的强化学习方法。全书共分为11章,内容涵盖了强化学习的基本概念、蒙特卡洛法、时序差分法、动态规划法、函数近似法、策略梯度法、近似动态规划、状态约束的处理和深度强化学习等知识点。书籍及源代码下载网站:书籍及代码链接点这里。
文章目录
-
- 10.1 神经网络入门
- 10.2 神经网络的训练
- 10.3 深度强化学习的挑战与解决办法
- 10.4 深度强化学习算法
-
- 10.4.1 深度Q网络(Deep Q-Network,DQN)
- 10.4.2 Dueling DQN
- 10.4.3 Double DQN(DDQN)
- 10.4.4 TRPO
- 10.4.5 PPO
- 10.4.6 A3C(Asynchronous Actor-Critic)
- 10.4.7 DDPG(Deep Deterministic Policy Gradient)
- 10.4.8 TD3(Twin Delayed DDPG)
- 10.4.9 SAC(Soft Actor-Critic)
- 10.4.10 DSAC(Distributional Soft Actor-Critic)
书籍链接:Reinforcement Learning for Sequential Decision and Optimal Control
本篇博客对应于原书的第十单元,重点讲述了深度强化学习(Deep Reinforcement Learning,DRL)的基础知识。深度强化学习时神经网络与强化学习的结合,需要进行大量的交互并消耗巨量的计算资源。在早期因为硬件计算资源的限制,并未受到太多重视。但是近些年来随着计算能力的不断提高,将深度学习与强化学习结合的研究取得了巨大的进展。AlphaGo及其后继者不断战胜人类顶尖高手标志着人工智能在围棋领域已经通过强化学习取得了超越人类的成就。后续的深度强化学习算法又陆续攻克了Atari、StarCraft等领域。
早期将强化学生与神经网络结合的尝试未取得成功,这可以归结为若干原因,如非独立同分布的(IID)的序列数据、算法发散、过估计和采样效率低下。首次将二者结合的成功尝试是Deepmind的DQN算法。在该算法中,Q-Learning和一个卷积神经网络进行结合,而这个卷积神经网络被用来在连续状态空间中学习一个对于最优Q函数的估计。除了算法本身,DQN的论文还提出了两个对于后续算法影响深远的技巧来稳定训练过程:经验回放(Experience Replay)和目标网络(Target Network)。之后提出的Double DQN采用了两个Q网络,从而将动作选择和动作评估分离。作为DQN的一个重要的变体,DDPG(Deep Deterministic Policy Gradient)用于同时学习一个 Q 函数和一个用于连续控制任务的确定性策略。
Q 值的高估是 DDPG等算法中的一个常见问题。在DDPG中这导致了脆弱的策略,即使添加了一些例如双 Q 函数技巧。为了解决这个问题,Fujimoto提出了Twin-Delayed DDPG(TD3),其中包含一些新提出的技巧,包括有界双 Q 函数和延迟策略更新。 Soft Actor-Critic (SAC)算法依赖于最大熵 RL 框架,在随机探索和确定性策略搜索之间建立了一座桥梁。在这里,“soft” 意味着传将策略熵加入原本的奖励中,这样可以平衡探索(Exploration)和利用(Exploitation)。而Distributional Soft Actor-Critic(DSAC)是 SAC 的增强版本,通过学习回报(Return)的分布而不是直接学习Return的期望(值函数)来克服高估问题并提高学习效率。
深度强化学习中另一个常见的问题时训练的不稳定性,这还通常伴随着严重的低效率。一种常见的应对之道是在每步更新的时候避免过大的改变策略。但是怎么定义改变的大小呢?又该怎么决定每次的更新步长呢?太小的步长导致收敛过慢,但是太大的步长则会导致不稳定性。TRPO(Trust Region Policy Optimization)算法通过构造一个信赖域约束来量化旧策略和新策略之间的距离。TRPO的好处是可以保证策略优化时的单调改进(即一直变好),但它的缺点在于每次优化都要求解一个二阶优化问题。为了解决这个问题,PPO(Proximal Policy Optimization)算法提出了一种一阶的剪裁方法来简化计算。令人惊奇的是,在大大提升计算效率的同时仍能保证策略的单调改进。
另外,online的强化学习算法通常效率很低。为此,A3C(Asynchronous Advantage Actor-Critic)算法提出了一种并行化的方法,通过多个actor同时与平行的环境交互来提高效率。A3C同时还使用了熵正则化来平衡探索和利用。
10.1 神经网络入门
神经网络的基础单元是神经元,神经元在宽度方向上排列组成层,层在深度方向上排列组成网络。
一个网络如果超过5层就可以被称为深度网络。
神经网络的一大优点在于所谓的全局逼近能力。现已证明即使是一个简单的只具有单一隐层的前馈网络,在一些轻微的假设下,也可以逼近任意连续函数。这个定理被称为万能逼近定理(Universal Approximation Theorem)。在1989年,Cybenko证明了一个使用logistic激活函数(sigmoid)的单隐层网络可以逼近任意连续函数。后续研究证明了只要激活函数不是线性的多项式函数就可以逼近任意连续函数。
10.1.1 神经元
人工神经元作为对于生物神经元的一种模仿,也具有生物神经元接受来自其它神经元不同强度的电信号并在超过一定阈值之后被激活的特性。这种模式的数学表述如下:
z = w T x + b , y = σ ( z ) . z=w^{\mathrm{T}}x+b,\\y=\sigma(z). z=wTx+b,y=σ(z). 这里, x x x是输入向量, w w ∈ R n ww\in\mathbb{R}^n ww∈Rn是权重向量, b ∈ R b\in\mathbb{R} b∈R是偏置, z z z是加权之后的和, σ \sigma σ是激活函数,最终输出为 y y y。一个神经元的典型图示如下:
常见的激活函数由如下三种:
- Sigmoid函数(Logistic函数): σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1 输出为0到1之间的值,适合做二分类问题。
- 双曲正切函数(Tanh函数): σ ( z ) = e z − e − z e z + e − z \sigma(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} σ(z)=ez+e−zez−e−z Sigmoid函数的变体,关于原点对称,输出为-1到1之间的值。
- ReLU函数: σ ( z ) = max ( 0 , z ) \sigma(z)=\max(0,z) σ(z)=max(0,z) 上述两种激活函数都有严重的梯度消失问题(从上图也可以看出,即在两端梯度接近于0,这种现象在深层网络的反向传播过程中影响尤其显著),因此提出了ReLU函数。ReLU函数在 z < 0 z<0 z<0时梯度为0,而在 z > 0 z>0 z>0时梯度为常数。而且由于ReLU函数能够输出0值,因此它具有所谓的“稀疏表征”的特性,即某些神经元如果没用的话就会自动被“关闭”,这有助于提高网络的泛化能力。
10.1.2 典型的神经网络的层
层可以分为输入层、隐层和输出层。一般来说,一个神经网络具有一个输入层、一个输出层和若干个隐层。通常认为,隐层越多,网络的近似能力就越强。一般来说,一个隐层只与它前后的两层相连,但是在DenseNet中,一个隐层可以与所有前面的层相连,且它的输出会传给之后的所有层。因此可以用更少的参数实现更高的准确率。
10.1.2.1 全连接层
全连接层是最简单的一种层,每个神经元均接受前一层的所有神经元的输入,通过权重矩阵 W W W和偏置向量 b b b进行线性变换,然后通过激活函数进行非线性变换,之后输出给下一层。
但是,这种层的缺点在于计算量大,参数多,且容易过拟合,因此泛化性能较差。为了解决这个问题,常使用Dropout技术,即手动或自动的去处神经元之间的一些连接,从而在不损失准确率的情况下减少过拟合。
10.1.2.2 卷积层
卷积层是全连接层的一种特殊变体。它的基础是一种叫做卷积的数学操作。一个一维卷积的例子如下:
其数学公式为:
y = σ ( w ∗ x ) , y i = σ ( w T x ˉ i ) = σ ( ∑ j = 1 N w j ⋅ x i + j − 1 ) , i = 1 , 2 , ⋯ , m , y=\sigma(w*x),\\y_i=\sigma(w^\mathrm{T}\bar{x}_i)=\sigma\left(\sum_{j=1}^Nw_j\cdot x_{i+j-1}\right),i=1,2,\cdots,m, y=σ(w∗x),yi=σ(wTxˉi)=σ(j=1∑Nwj⋅xi+j−1),i=1,2,⋯,m, 其中, w w w被称为卷积核,长度为 N N N, x x x是输入向量,包含 n n n个元素, y y y是输出向量,包含 m m m个元素, σ \sigma σ是激活函数。如上图所示,卷积操作可以看做卷积核在输入向量上的滑动(上图中每次滑动一格,实机不一定,这个滑动的步长称为stride),每次卷积核与其覆盖区域的对应元素先相乘最后再相加即可得到输出向量的一个元素。从上图可以看出,卷积相比于全连接好在两点:
- 参数共享:卷积核在整个输入上滑动,因此每个位置上的参数都是一样的,这样可以大大减少参数数量。
- 局部连接:卷积核每次计算的时候仅与输入的一部分相连,这样可以保留输入的空间结构,从而提高网络的泛化能力。
卷积可分为一维卷积、二维卷积和三维卷积,分别对应于一维、二维和三维的输入。一维卷积刚才已经举过例子,下面来看一个二维卷积:
上图的例子中,卷积核大小为 2 × 2 2\times2 2×2,步长为1,输入大小为 4 × 4 4\times4 4×4,那么根据卷积的原理,可以自己是试一试,易得输出大小为 3 × 3 3\times3 3×3。三维卷积则是在二维卷积的基础上再增加一个维度,即深度(或者称为通道数)。三维卷积的例子如下:
在三维卷积中,输入的通道数等于卷积核的厚度 C C C,而输出的通道数等于卷积核的个数 K K K。可以看出,每个卷积核在于三维输入做卷积的时候实际上是卷积核 C C C层中的每一层都在于输入进行运算,最后加在一起,而着在输出中只表现为 K K K个通道中的一个。
然而,卷积的一个缺点是它对于输入的每个位置都是敏感的,因此对于输入的变化不够鲁棒。为了解决这个问题,可以使用降采样技术,如池化(Pooling)技术。池化将输出划分为一系列不重合的矩形区域,每个区域的输出则根据最大化、最小化或者平均化等操作得到。池化技术使得网络对于输入的变化更加鲁棒,这也被称为平移不变性。
10.1.2.3 循环层
循环层是一种特殊的具有时序上的反馈机制的层。上一个时间步的输出会作为当前时间步的输入的一部分。这种循环机制要求网络具有记忆能力,这通常通过隐状态(Hidden State)来实现。循环层的图示和公式如下:
y t = σ ( W x y x t + W y y y t − 1 ) , y_t=\sigma(W_{xy}x_t+W_{yy}y_{t-1}), yt=σ(Wxyxt+Wyyyt−1), 其中, x t x_t xt是当前时刻的输入, y t y_t yt是当前时刻的输出, y t − 1 y_{t-1} yt−1是上一个时刻的输出, W x y W_{xy} Wxy和 W y y W_{yy} Wyy分别是针对当前输入和上一个输出的权重矩阵, σ \sigma σ是激活函数。当在时间维度上展开后循环层就变成了一个前馈层:
但是,训练一个循环神经网络是非常困难的,因为它的梯度通常会爆炸或者消失,即使只经过了几个时间步。为了解决这个问题,可以添加一些额外的连接来避免反向传播的时候对于梯度的指数操作。这种想法产生了两种主要的循环神经网络的变体:长短时记忆网络(LSTM)和门控循环单元(GRU)。
首先是LSTM,它引入了三个门:遗忘门、输入门和输出门。遗忘门决定了上一个时刻的隐状态中哪些信息需要被遗忘,输入门决定了当前时刻的输入中哪些信息需要被记忆,输出门决定了当前时刻的隐状态中哪些信息需要被输出。这些门通常使用sigmoid函数来产生0到1之间的值,“0”表示完全关闭,“1”表示完全打开。LSTM的公式如下:
f t = σ ( W x f x t + W y f y t − 1 + b f ) , i t = σ ( W x i x t + W y i y t − 1 + b i ) , o t = σ ( W x o x t + W y o y t − 1 + b o ) , c t = f t ⊙ c t − 1 + i t ⊙ σ ( W x c x t + W y c y t − 1 + b c ) , y t = o t ⊙ σ ( c t ) . f_t=\sigma(W_{xf}x_t+W_{yf}y_{t-1}+b_f),\\i_t=\sigma(W_{xi}x_t+W_{yi}y_{t-1}+b_i),\\o_t=\sigma(W_{xo}x_t+W_{yo}y_{t-1}+b_o),\\c_t=f_t\odot c_{t-1}+i_t\odot\sigma(W_{xc}x_t+W_{yc}y_{t-1}+b_c),\\y_t=o_t\odot\sigma(c_t). ft=σ(Wxfxt+Wyfyt−1+bf),it=σ(Wxixt+Wyiyt−1+bi),ot=σ(Wxoxt+Wyoyt−1+bo),ct=ft⊙ct−1+it⊙σ(Wxcxt+Wycyt−1+bc),yt=ot⊙σ(ct). 其中, f t f_t ft是遗忘门, i t i_t it是输入门, o t o_t ot是输出门, c t c_t ct是细胞状态, h t h_t ht是隐状态, ⊙ \odot ⊙表示逐元素相乘。LSTM的一个缺点是它的参数量较大,因此GRU被提出来减少参数量。

GRU只有两个门:更新门和重置门。重置门决定了之前的信息有多少需要被遗忘,更新门决定了新的信息有多少需要被记忆,又有多少是上一时刻信息的copy。GRU的公式如下:
r t = σ ( W x r x t + W y r y t − 1 + b r ) , z t = σ ( W x z x t + W y z y t − 1 + b z ) , h t = ( 1 − z t ) ⊙ y t − 1 + z t ⊙ σ ( W x h x t + W y h ( r t ⊙ y t − 1 ) + b h ) . r_t=\sigma(W_{xr}x_t+W_{yr}y_{t-1}+b_r),\\z_t=\sigma(W_{xz}x_t+W_{yz}y_{t-1}+b_z),\\h_t=(1-z_t)\odot y_{t-1}+z_t\odot\sigma(W_{xh}x_t+W_{yh}(r_t\odot y_{t-1})+b_h). rt=σ(Wxrxt+Wyryt−1+br),zt=σ(Wxzxt+Wyzyt−1+bz),ht=(1−zt)⊙yt−1+zt⊙σ(Wxhxt+Wyh(rt⊙yt−1)+bh). 其中, r t r_t rt是重置门, z t z_t zt是更新门, h t h_t ht是隐状态。
10.1.3 典型的神经网络
简单的来说,神经网络可以视为把一些层堆叠在一起。按照是否具有循环结构,神经网络可以分为前馈神经网络和循环神经网络。前馈神经网络是最简单的一种神经网络,每一层的输出都只与前一层的输出有关,没有循环结构,构成有向无环图;而循环神经网络则具有循环结构。
时至今日,已经提出了很多神经网络。其中最著名的有卷积神经网络(CNN)和循环神经网络(RNN):
-
卷积神经网络(CNN):
-
特点:卷积神经网络是一种专门用于处理具有空间结构的数据的神经网络。它的特点在于参数共享和局部连接,这使得它对于图像等数据具有很强的表达能力。
-
结构:卷积神经网络通常由若干个卷积层、池化层和全连接层组成。

-
代表模型:LeNet、AlexNet、VGG、GoogLeNet、ResNet等。


-
-
循环神经网络(RNN):
- 特点:循环神经网络是一种专门用于处理具有时间结构的数据的神经网络。它的特点在于具有循环结构,这使得它对于序列数据具有很强的表达能力,可以编码序列关系。
- 代表模型:stacked RNN、bidirectional RNNs、structural RNNs、 recursive NNs。
10.2 神经网络的训练
10.2.1 损失函数
10.2.1.1 交叉熵(CE)损失和均方误差(MSE)损失
- 交叉熵损失:
- 定义:
J = d e f H ( p t a r g e t , p ) = − ∑ i p i target log ( p i ) , J\overset{def}{=}\mathcal{H}(p^{\mathrm{target}},p)=-\sum_ip_i^\text{target}\log(p_i), J=defH(ptarget,p)=−i∑pitargetlog(pi), 其中, p t a r g e t p^{\mathrm{target}} ptarget是来自于真实分布的概率值, p p p是来自于模型的概率值。
交叉熵损失可以用来衡量两个分布之间的差异。 - 适用于:交叉熵损失通常用于分类问题,特别是多分类问题。
- 定义:
- 均方误差损失:
- 定义:
J = d e f MSE ( y target , y ) = 1 n ∑ i = 1 n ( y i target − y i ) 2 , J\overset{\mathrm{def}}{\operatorname*{=}}\operatorname{MSE}(y^\text{target},y)=\frac1n\sum_{i=1}^n\left(y_i^\text{target}-y_i\right)^2, J=defMSE(ytarget,y)=n1i=1∑n(yitarget−yi)2, 其中, y target y^\text{target} ytarget是真实值, y y y是预测值。 - 适用于:均方误差损失通常用于回归问题。
- 定义:
然而,在一些特殊的条件下,交叉熵损失和均方误差损失等价,比如当目标分布是高斯分布时。
10.2.1.2 偏差-方差权衡
先来看两组概念:
- 偏差与方差
- 偏差:偏差是模型的预测值与真实值之间的差异,即模型的拟合能力。偏差越大,模型的拟合能力越差。高偏差表示模型对于训练数据没有充分拟合,训练的误差很大。
- 方差:方差是模型在不同数据集上的预测值之间的差异,即模型的泛化能力。高方差说明魔性对于噪声很敏感,输入的细小变化都会导致输出的巨大变化。高方差表示模型对于训练数据过拟合,训练的误差很小,但是验证的误差很大。这表示模型的泛化能力很差。
- 欠拟合与过拟合
- 欠拟合:欠拟合是指模型的偏差很大,即模型的拟合能力很差。这通常是因为模型的复杂度不够,或者模型的训练数据不够多或者未充分训练。
- 过拟合:过拟合是指模型的方差很大,即模型的泛化能力很差。这通常是因为模型的复杂度太高,或者模型的训练数据太少。
在深度学习中,由于神经网络强大的拟合能力,过拟合通常比欠拟合更常见。为了解决过拟合问题,可以采用正则化技术。该技术通过对于模型的复杂度施加惩罚来降低过拟合:
J R e g ( w ) = J ( w ) + ρ Ω ( w ) , J_{\mathrm{Reg}}(w)=J(w)+\rho\Omega(w), JReg(w)=J(w)+ρΩ(w), 其中, J ( w ) J(w) J(w)是损失函数, Ω ( w ) \Omega(w) Ω(w)是正则化项,用于度量模型复杂度。 ρ \rho ρ是正则化系数( ρ ∈ [ 0 , ∞ ) \rho\in [0,\infty) ρ∈[0,∞))。常见的正则化项有 L 1 L_1 L1正则化和 L 2 L_2 L2正则化:
- L 1 L_1 L1正则化:
Ω ( w ) = ∥ w ∥ 1 = ∑ i ∣ w i ∣ . \Omega(w)=\|w\|_1=\sum_i|w_i|. Ω(w)=∥w∥1=i∑∣wi∣. 这里, w w w是权重向量。 - L 2 L_2 L2正则化:
Ω ( w ) = ∥ w ∥ 2 2 = ∑ i w i 2 . \Omega(w)=\|w\|_2^2=\sum_iw_i^2. Ω(w)=∥w∥22=i∑wi2.
有趣的是,研究发现, L 1 L_1 L1和 L 2 L_2 L2正则化对于模型的影响方式是不同的。 L 1 L_1 L1会通过将不重要的权重缩减至0来降低过拟合(这可能会导致一些我们关注的特征消失),而 L 2 L_2 L2则会通过减小权重的大小来降低过拟合(尽可能的减小,然而并不到0)。
10.2.2 训练算法
神经网络的训练过程可以被看做一个随机优化过程,而在随机优化的诸多方法中,一阶优化因其计算效率高而被广泛应用。一阶优化使得可训练的权重可以沿着梯度的反方向进行更新,直到达到损失函数的一个局部最小值。
10.2.2.1 反向传播算法(Backpropagation,BP)
BP算法从最后一层开始使得损失函数所表征的误差信息沿着网络向前传播来更新权重,这与网络输出时的信息流动方向正好是相反的。如下图所示:
现在我们以上图所示的单隐层全连接前馈网络为例,来推导BP算法的具体过程。先从后面往前看,假设最后一层的输出为 y m ( m = 1 , 2 ) y_m(m=1,2) ym(m=1,2),最后一层的激活函数统一记为 σ ( ⋅ ) \sigma(\cdot) σ(⋅),在经过激活函数激活之前输入最后一层的输入为 z m ( m = 1 , 2 ) z_m(m=1,2) zm(m=1,2),那么对于隐层与输出层之间的权重 w h j y m w_{h_jy_m} whjym,我们可以写出损失函数关于这个权重的梯度:
∂ J ∂ w h j y m = ∂ J ∂ z m y ∂ z m y ∂ w h j y m = ∂ J ∂ y m ∂ y m ∂ z m y ∂ z m y ∂ w h j y m = ∂ J ∂ y m σ ′ ( z m y ) h j , \frac{\partial J}{\partial w_{h_jy_m}}=\frac{\partial J}{\partial z_m^y}\frac{\partial z_m^y}{\partial w_{h_j}y_m}=\frac{\partial J}{\partial y_m}\frac{\partial y_m}{\partial z^y_m}\frac{\partial z_m^y}{\partial w_{h_jy_m}}=\frac{\partial J}{\partial y_m}\sigma^{\prime}\left(z_m^y\right)h_j, ∂whjym∂J=∂zmy∂J∂whjym∂zmy=∂ym∂J∂zmy∂ym∂whjym∂zmy=∂ym∂Jσ′(zmy)hj, 这里的 σ ′ \sigma^{\prime} σ′表示激活函数的导数,而 ∂ z m y ∂ w h j y m \frac{\partial z_m^y}{\partial w_{h_jy_m}} ∂whjym∂zmy之所以等于 h j h_j hj是因为 z m y = ∑ h j w h j y m z_m^y=\sum h_jw_{h_jy_m} zmy=∑hjwhjym。因为 J J J关于 y m y_m ym以及 σ \sigma σ都有显式的表达式,因此上式是容易计算的。同理,可以计算输入层与隐层之间的权重 w x i h j w_{x_ih_j} wxihj的梯度:
∂ J ∂ w x i h j = ∂ J ∂ z j h ∂ z j h ∂ w x i h j = ∂ J ∂ h j ∂ h j ∂ z j h ∂ z j h ∂ w x i h j = ∂ J ∂ h j σ ′ ( z j h ) x i = ( ∑ m w h j y m ∂ J ∂ z m y ) σ ′ ( z j h ) x i , \frac{\partial J}{\partial w_{x_ih_j}}=\frac{\partial J}{\partial z_j^h}\frac{\partial z_j^h}{\partial w_{x_ih_j}}= \frac{\partial J}{\partial h_j}\frac{\partial h_j}{\partial z_j^h}\frac{\partial z_j^h}{\partial w_{x_ih_j}} =\frac{\partial J}{\partial h_j}\sigma^{\prime}\left(z_j^h\right)x_i=\left(\sum_mw_{h_jy_m}\frac{\partial J}{\partial z_m^y}\right)\sigma^{\prime}\left(z_j^h\right)x_i, ∂wxihj∂J=∂zjh∂J∂wxihj∂zjh=∂hj∂J∂zjh∂hj∂wxihj∂zjh=∂hj∂Jσ′(zjh)xi=(m∑whjym∂zmy∂J)σ′(zjh)xi, 这里的 z j h z_j^h zjh是隐层的输入, h j h_j hj是隐层的输出。特别需要注意一下为什么 ∂ J ∂ z j h \frac{\partial J}{\partial z_j^h} ∂zjh∂J为什么等于 ∑ m w h j y m ∂ J ∂ z m y \sum_mw_{h_jy_m}\frac{\partial J}{\partial z_m^y} ∑mwhjym∂zmy∂J。另外, ∂ J ∂ z m y \frac{\partial J}{\partial z_m^y} ∂zmy∂J在上一步已经计算过了。
需要说明的是BP并不是唯一的计算方向,也可以从前向后计算,但是BP在计算较靠前的梯度时可以利用较靠后的许多中间计算结果,如 ∂ J ∂ z m y \frac{\partial J}{\partial z_m^y} ∂zmy∂J和 ∂ J ∂ z j h \frac{\partial J}{\partial z_j^h} ∂zjh∂J,这样可以减少计算量而不用重复计算。这也是BP算法被广泛应用的原因之一。
另外需要注意的是,BP并不等价于训练神经网络算法的全部,而只是其中关于按什么顺序怎么计算梯度的一种规则。真正用于更新的是梯度下降法,其中较为常用的是mini-batch SGD:
w ← w − η E D { ∂ J ∂ w } , w\leftarrow w-\eta\mathbb{E}_{\mathcal{D}}\left\{\frac{\partial J}{\partial w}\right\}, w←w−ηED{∂w∂J}, 在上例中,共有12个可训练的参数:
∂ J ∂ w = [ ∂ J ∂ w x i h j , ∂ J ∂ w h j y m ⏟ 12 = 2 × 3 + 3 × 2 ] T ∈ R 12 , \frac{\partial J}{\partial w}=\left[\underbrace{\frac{\partial J}{\partial w_{x_ih_j}},\frac{\partial J}{\partial w_{h_jy_m}}}_{12=2\times3+3\times2}\right]^\mathrm{T}\in\mathbb{R}^{12}, ∂w∂J=
12=2×3+3×2
∂wxihj∂J,∂whjym∂J
T∈R12, 这里的 η \eta η是学习率, D \mathcal{D} D是用于更新的mini-batch数据集。原始的SGD只使用一个样本来计算梯度,这样可能会导致梯度的方差很大,这可能导致训练时严重的震荡,降低训练稳定性。因此mini-batch SGD使用一个小的数据集来计算梯度。另外,还可通过动量法来降低训练的震荡,该方法既考虑了当前的梯度,又考虑了历史的梯度信息。
10.2.2.2 通过时间的反向传播算法(Backpropagation Through Time,BPTT)

通过将循环层沿着时间展开,就可以得到一个沿着时间维度,所有隐藏层的权重都相等的前馈网络。这也被称为沿着时间维度的反向传播算法(BPTT)。注意,这里展开的时间步数是有限的,其大小等于输入序列的长度。这样就可以通过类似于标准BP算法的方式来计算梯度。
然而,因为所有的权重在时间维度上都是相同的,因此反向传播时对于某个相同参数的梯度会发生很多连乘(沿着时间步分享累积),因此会导致梯度爆炸或者消失。为了解决这个问题,LSTM和GRU通过引入额外的直接连接来降低这种情况的影响。
10.3 深度强化学习的挑战与解决办法
与其他用于近似的函数(如多项式函数或者径向基函数)相比,神经网络提供了一种更为强大的近似方式。将RL与神经网络结合使得强化学习算法可以直接从来自于高位的复杂任务中的原始的图像或者视频数据中学习,而且不必借助于任何手工设计的特征或者领域的先验知识,最终还能获得比人类专家更好的效果。
然而,深度强化学习可不仅仅是将深度学习与强化学习结合这么简单,因为深度强化学习从二者继承了一些棘手的挑战亟待解决。而从2015年开始,一些empirical的tricks被提出来解决这些挑战。有关于这些挑战和对应的tirck的汇总如下:
10.3.1 挑战一:非独立同分布数据(Non-IID Data)及其解决办法
对于大部分统计学习算法,收集到的数据被假设为独立同分布(IID)的。然而,在深度强化学习中,由于局部探索、有限的采样时间等原因,当从一个动态的环境中每次以序列的形式采集数据时,这种假设便不再成立。非独立同分布数据会导致学到的数据分布与实际的分布有较大差异,从而导致了不准确的值函数估计,进而导致在策略的更新方向上造成较大的误差,从而最终导致了很差的策略。关于非独立同分布数据造成的分布估计的偏差可由下图形象的表示:
10.3.1.1 Trick1:经验回放(Experience Replay,ExR)
- 要解决的挑战:非独立同分布数据(Non-IID Data)。
- 适用于:off-policy的强化学习算法。
- 原理

对于最优的动作值函数来说,它对于各个状态-动作对来说,都满足贝尔曼方程。因此,Q-Learning和它的变体可以重复利用历史的sample,而不需要显式的IS Ratio。因此,每次在不同的behavior策略下采集到的各个sample ( s t , a t , s t + 1 ) (s_t,a_t,s_{t+1}) (st,at,st+1)都被储存在Replay Buffer中。之后,每次每次更新Q函数时可以从Buffer中随机抽取一个mini-batch的sample(可能来自于不同的behavior策略),然后用这个mini-batch来更新Q函数。随机抽样不仅能够减少样本之间的相关性,还能平均训练数据的分布,从而减少了非独立同分布数据带来的问题。
- 好处
-
减少样本之间的相关性
-
平均训练数据的分布,使分布变化地更平滑
-
提升样本效率:
定义1:样本效率
达到特定的策略表现需要的新样本的数量。显然,经验回放可以提升样本效率,加快策略更新。
-
- 变式
- 优先级经验回放(Prioritized Experience Replay,PExR):在经验回放的基础上,根据TD Error的大小来对样本进行优先级采样,从而提高样本效率。TD Error可以用来衡量样本中包含多少有用的信息,可以作为样本重要性的一个指标。
10.3.1.2 Trick2:平行探索(Parallel Exploration,PEx)
- 要解决的挑战:非独立同分布数据(Non-IID Data)。
- 适用于:on-policy、off-policy的强化学习算法。
- 原理

初始化多个环境实例和Sampler,每个Sampler都在各自对应的环境实例上进行探索。这样,采到的总的数据的分布就更接近于真实数据的分布,因为多个Sampler更衣覆盖到整个环境动力学的各个部分,且在off-policy算法中不同的Sampler可以采用不同的behavior策略,从而进一步扩大了对于环境的探索,减少了非独立同分布数据带来的问题。
10.3.2 挑战二:很容易发散(Easy Divergence)及其解决办法
当使用深度神经网络对于强化学习的值函数和策略网络进行近似的时候,很容易发生训练不稳定甚至发散的情况(此时目标值会发生震荡,策略更新也变得不稳定)。对于深度强化学习中经典的Actor-Critic架构来说,造成这种现象的首要原因是耦合的Critic和Actor的更新时的自激现象:对于值函数的很差的估计导致了策略更新方向的严重偏离,而策略的更新又会进一步加剧Critic(值函数)的不准确性,从而形成了一个恶性循环。
至于为什么一开始对于值函数的估计会很差,这有多方面原因,如偶然的低质量样本、函数近似的误差、以及不充足的Critic更新等。这里以偶然的低质量样本为例,来看看为什么会引起发散。
在上图中,首先,由于偏重于探索的策略或者环境的随机性等原因,Sampler采到了一个很差的样本,这个样本可能会导致值函数的估计质量恶化。而质量变低的值函数又为策略更新提供了一个错误的方向,从而导致了策略的更新的不可预测。而使用这样的策略对于环境进行探索又会导致采到的样本的分布出现跳变,进而导致了采到的样本质量更差,这样就形成了一个恶性循环。
造成发散的另一个原因是Actor更新的步长太大,这样会导致策略的更新来回震荡。
为了解决这个问题,可以采用稳定的值函数估计、降低值函数近似误差以及控制过快的策略更新等方法。
10.3.2.1 Trick3:目标网络(Separated Target Network,STN)
- 要解决的挑战:很容易发散(Easy Divergence)。
- 原理:

从Q网络中分离出一个目标网络,用于计算Target Q值,来降低Q值和Target Q值之间的相关性。具体来说,就是我们有两个Q网络,一个online Q网络和一个target Q网络。Target Q网络负责在计算TD Error的时候给出Target Q值:
Q w ‾ t a r g e t = r + γ Q W ‾ ( s ′ , a ′ ) , Q_{\overline{w}}^{\mathrm{target}}=r+\gamma Q_{\overline{W}}(s^{\prime},a^{\prime}), Qwtarget=r+γQW(s′,a′), 其中, Q w ‾ t a r g e t Q_{\overline{w}}^{\mathrm{target}} Qwtarget是Target Q值, Q W ‾ ( s ′ , a ′ ) Q_{\overline{W}}(s^{\prime},a^{\prime}) QW(s′,a′)是Target Q网络的输出, w ‾ \overline{w} w是Target Q网络的权重。这样,Target Q值就不再依赖于online Q值。而Target Q网络也不是像online Q网络一样每次都依赖BP更新,而是每隔一段时间才通过从在线网络复制权重的方式更新一次:
w ‾ ← ρ w + ( 1 − ρ ) w ‾ , \overline{w}\leftarrow \rho w+(1-\rho)\overline{w}, w←ρw+(1−ρ)w, 其中, ρ \rho ρ是一个权重,用于平衡更新时Target Q网络的历史权重和来自于online Q网络的新权重之间的关系。特别的,当 ρ = 1 \rho=1 ρ=1时,Target Q网络每次更新时直接从online Q网络中复制权重。
需要注意的是,尽管可以降低发散的风险,但是Target Q网络的低频更新也会增加训练时间。因此找到一个合适的更新间隔 n n n是非常重要的。
10.3.2.2 Trick4:延迟策略更新(Delayed Policy Update,DPU)
- 要解决的挑战:很容易发散(Easy Divergence)。
- 原理:在Actor-Critic架构中,值函数和策略函数在每轮迭代的时候都会更新,这也是造成发散的一个原因。但是其实两者对于更新频率的需求并不一样。Critic(值函数)需要高频的更新来获得准确的值函数估计,而Actor(策略函数)则不需要这么频繁的更新。因此一种简单的办法是,每次在若干次Critic更新之后再更新Actor。这背后的原理是,Critic的多次更新保证了近似误差足够小,只哟这样才能保证高质量的策略更新。
10.3.2.3 Trick5:受约束的策略更新(Constrained Policy Update,CPU)
- 要解决的挑战:很容易发散(Easy Divergence)。
- 原理:避免策略变化太快从而引起不稳定甚至震荡。具体来说,可以通过某种标准来衡量相邻两次策略的变化幅度,限制其不超过一个阈值:
∥ π k + 1 − π k ∥ ≤ δ π , \|\pi_{k+1}-\pi_k\|\leq\delta_\pi, ∥πk+1−πk∥≤δπ, 这里的 ∣ ∣ ⋅ ∣ ∣ ||\cdot|| ∣∣⋅∣∣是某种衡量标准,可以取为向量的范数、交叉熵、KL散度等。
10.3.2.4 Trick6:裁剪的Actor目标(Clipped Actor Criterion,CAC)
- 要解决的挑战:很容易发散(Easy Divergence)。
- 原理:与直接限制相邻两个策略之间的“距离”类似,也可以通过限制相邻两个策略在其Actor Cost Function的值之间的差值来限制策略的变化幅度:
0 ≤ J A c t o r ( π k + 1 ) − J A c t o r ( π k ) ≤ δ J , 0\leq J_{\mathrm{Actor}}(\pi_{k+1})-J_{\mathrm{Actor}}(\pi_k)\leq\delta_J, 0≤JActor(πk+1)−JActor(πk)≤δJ, 这里的 J A c t o r J_{\mathrm{Actor}} JActor是Actor的Cost Function, δ J \delta_J δJ是一个阈值,不超过这个阈值从而保证策略不会变化的太快,而大于等于0则保证了策略单调变好。
10.3.3 挑战三:过估计(Overestimation)及其解决办法
深度强化学习中的过估计问题指的是,算法会在某些状态-动作对时学到不切实际的过高的Q值,造成了对于Q值估计的严重失真和学到的策略的不可用。对于Q值过估计的原因在于Q-Learning系列算法中的max操作,只要使用了这个max操作,不管TD Error是正还是负,都会导致Q值的过估计。
其实,应该澄清的是,Q值的过估计本身并不是一个问题,只要对于所有的状态-动作对都均匀地高估,那么动作被选择的相对优先级并不会被破坏。这里坏就坏在,在实际的情况中,只有在少数的状态-动作对上才会被高估,这就导致了动作的相对优先级顺序被打乱,从而导致了学到的策略完全不可用。
下面就来看看过估计问题是如何造成的,这里的讲解参考了DSAC算法里的证明过程,详细的证明过程可以参考DSAC论文。首先,对于Q-Learning类算法,其参数更新可以写成如下形式:
w ′ ← w + α ( Q w t a r g e t ( s , a ) − Q w ( s , a ) ) ∇ Q w ( s , a ) , w^{\prime}\leftarrow w+\alpha\left(Q_{w}^{\mathrm{target}}(s,a)-Q_{w}(s,a)\right)\nabla Q_{w}(s,a), w′←w+α(Qwtarget(s,a)−Qw(s,a))∇Qw(s,a), 但是在实际中,不管是 Q w ( s , a ) Q_{w}(s,a) Qw(s,a)还是 ∇ Q w ( s , a ) \nabla Q_{w}(s,a) ∇Qw(s,a)都存在着由状态测量不准或者函数近似精度等导致的近似误差。我们可以把当前权重为 w w w的Q函数表示为其真实值与随机误差的和:
Q w ( s , a ) = Q w ^ ( s , a ) + ϵ ( s , a ) , Q_{w}(s,a)=Q_{\hat{w}}(s,a)+\epsilon(s,a), Qw(s,a)=Qw^(s,a)+ϵ(s,a), 其中, w ^ \hat{w} w^是真实的权重, ϵ ( s , a ) \epsilon(s,a) ϵ(s,a)是随机误差。接下俩,我们把 w ^ ′ \hat{w}' w^′记为从当前的 w w w更新得到的下一个真实权重,那么可证明关于Q值的估计值与真实值的误差 Δ ( s , a ) \Delta(s,a) Δ(s,a)可以写成如下形式:
Δ ( s , a ) = α γ ⋅ δ ( s , a ) ⋅ ∥ ∇ Q w ^ ′ ( s , a ) ∥ 2 , δ ( s , a ) = E s ′ ∼ P { E ϵ { max Q w ( s ′ , a ′ ) } − max E ϵ { Q w ( s ′ , a ′ ) } } , \begin{array}{c}{{\Delta(s,a)=\alpha\gamma\cdot\delta(s,a)\cdot\|\nabla Q_{\hat{w}'}(s,a)\|_{2},}}\\ {{\delta(s,a)=\mathbb{E}_{s^{\prime}\sim\mathcal{P}}\left\{\operatorname{E}_{\epsilon}\left\{\operatorname*{max}Q_{w}(s^{\prime},a^{\prime})\right\}-\operatorname*{max}\operatorname*{E}_{\epsilon}\{Q_{w}(s^{\prime},a^{\prime})\}\right\},}}\end{array} Δ(s,a)=αγ⋅δ(s,a)⋅∥∇Qw^′(s,a)∥2,δ(s,a)=Es′∼P{Eϵ{maxQw(s′,a′)}−maxEϵ{Qw(s′,a′)}}, 可证明 δ ( s , a ) ≥ 0 \delta(s,a)\ge0 δ(s,a)≥0,因此 Δ ( s , a ) ≥ 0 \Delta(s,a)\ge 0 Δ(s,a)≥0,即Q值的估计值总是高于真实值。又因为不管是Target Error还是Q函数的梯度都在不同的状态-动作对上都是高度不可预测的,因此这种过估计不是均匀的。在实际中,这种过估计还会随着计算Target的时候bootstrapping机制而传播累加,加剧了过估计的问题。
10.3.3.1 Trick7:双Q函数(Double Q-Functions,DQF)
- 要解决的挑战:过估计(Overestimation)。
- 原理:将计算Q-Target的过程解耦为两个独立的步骤:动作选择和动作评估。具体来说,我们需要维护两个Q函数 Q 1 Q_1 Q1和 Q 2 Q_2 Q2,这两个Q函数是独立训练的。在每次更新时,对于其中一个Q函数,先使用它自己来给出动作选择(以 Q 1 Q_1 Q1为例):
a 1 ∗ = arg max a ′ Q w 1 ( s ′ , a ′ ) , a_1^*=\arg\max_{a^{\prime}}Q_{w_1}\left(s^{\prime},a^{\prime}\right), a1∗=arga′maxQw1(s′,a′), 然后使用另一个Q函数来给出动作评估以更新Q函数:
Q w 1 ( s , a ) ← Q w 1 ( s , a ) + α ( r + γ Q w 2 ( s ′ , a 1 ∗ ) − Q w 1 ( s , a ) ) . Q_{w_1}(s,a)\leftarrow Q_{w_1}(s,a)+\alpha\left(r+\gamma Q_{w_2}(s^{\prime},a_1^*)-Q_{w_1}(s,a)\right). Qw1(s,a)←Qw1(s,a)+α(r+γQw2(s′,a1∗)−Qw1(s,a)).
为了实现上述过程,需要两个Q函数足够的相互独立。可以通过使用两个平行采样的包含不同样本的数据集来实现。
最后来解释一下为什么双Q函数可以降低过估计。这是因为这种方法可以提供一定程度的低估(underestimation),从而一定程度上抵消了过估计的影响。来简单证明一下。首先,假设 Q w 1 Q_{w_1} Qw1和 Q w 2 Q_{w_2} Qw2均是无偏估计,即:
E { Q w 1 ( s , a ) } = E { Q w 2 ( s , a ) } = q π ( s , a ) . \mathbb{E}\left\{Q_{w_1}(s,a)\right\}=\mathbb{E}\left\{Q_{w_2}(s,a)\right\}=q^{\pi}(s,a). E{Qw1(s,a)}=E{Qw2(s,a)}=qπ(s,a). 之后,定义集合 M \mathcal{M} M为各个状态下最优的动作选择集合:
M = d e f { a o p t ∣ a o p t = arg max a ′ q π ( s ′ , a ′ ) } . \mathcal{M}\overset{\mathrm{def}}{\operatorname*{=}}\left\{a_{\mathrm{opt}}|a_{\mathrm{opt}}=\arg\max_{a^{\prime}}q^{\pi}(s^{\prime},a^{\prime})\right\}. M=def{aopt∣aopt=arga′maxqπ(s′,a′)}. 注意,这里的 a o p t a_{\mathrm{opt}} aopt和 a ∗ a^* a∗的区别在于前者是能够最大化特定状态 s ′ s' s′下的q的真值,而后者是能够最大化特定状态 s ′ s' s′下用来拟合的Q函数网络。这样,对于状态 s ′ s' s′时最佳动作 a 1 ∗ a_1^* a1∗的Q求期望,可得:
E { Q w 2 ( s ′ , a 1 ∗ ) } = Pr { a 1 ∗ ∈ M } E { Q w 2 ( s ′ , a 1 ∗ ) ∣ a 1 ∗ ∈ M } + Pr { a 1 ∗ ∉ M } E { Q w 2 ( s ′ , a 1 ∗ ) ∣ a 1 ∗ ∉ M } = Pr { a 1 ∗ ∈ M } max a ′ q π ( s ′ , a ′ ) + Pr { a 1 ∗ ∉ M } E { Q w 2 ∗ ( s ′ , a 1 ∗ ∉ M } ≤ Pr { a 1 ∗ ∈ M } max a ′ q π ( s ′ , a ′ ) + Pr { a 1 ∗ ∉ M } max a ′ q π ( s ′ , a ′ ) = max a ′ q π ( s ′ , a ′ ) . \begin{aligned}&\mathbb{E}\{Q_{w_2}(s^{\prime},a_1^*)\}\\&=\Pr\{a_1^*\in\mathcal{M}\}\mathbb{E}\{Q_{w_2}(s^{\prime},a_1^*)|a_1^*\in\mathcal{M}\}+\Pr\{a_1^*\notin M\}\mathbb{E}\{Q_{w_2}(s^{\prime},a_1^*)|a_1^*\notin\mathcal{M}\}\\&=\Pr\{a_1^*\in\mathcal{M}\}\max_{a^{\prime}}q^\pi(s^{\prime},a^{\prime})+\Pr\{a_1^*\notin\mathcal{M}\}\mathbb{E}\{Q_{w_2}^*(s^{\prime},a_1^*\notin\mathcal{M}\}\\&\leq\Pr\{a_1^*\in\mathcal{M}\}\max_{a^{\prime}}q^\pi(s^{\prime},a^{\prime})+\Pr\{a_1^*\notin\mathcal{M}\}\max_{a^{\prime}}q^{\pi}(s^{\prime},a^{\prime})\\&=\max_{a^{\prime}}q^{\pi}(s^{\prime},a^{\prime}).\end{aligned} E{Qw2(s′,a1∗)}=Pr{a1∗∈M}E{Qw2(s′,a1∗)∣a1∗∈M}+Pr{a1∗∈/M}E{Qw2(s′,a1∗)∣a1∗∈/M}=Pr{a1∗∈M}a′maxqπ(s′,a′)+Pr{a1∗∈/M}E{Qw2∗(s′,a1∗∈/M}≤Pr{a1∗∈M}a′maxqπ(s′,a′)+Pr{a1∗∈/M}a′maxqπ(s′,a′)=a′maxqπ(s′,a′). 这里第一步主要是根据 a 1 ∗ a_1^* a1∗是否属于该状态下 a o p t a_{\mathrm{opt}} aopt的集合 M \mathcal{M} M来划分的。最后,即可证明Q函数在特定状态 s ′ s' s′下的最优动作的估计值的期望小于等于该状态下的真值的最大值,即发生了低估。
另外注意,这里的双生Q函数技巧(DQF)与之前的目标网络(STN)技巧可以融合在一起(也是现在的常用做法),即在线网络和目标网络可分别看做两个Q函数网络。
10.3.3.2 Trick8:双Q函数取最小值(Bounded Double Q-Functions,BDQ)
- 要解决的挑战:过估计(Overestimation)。
- 原理:进一步认为构造出低估。具体来说没在第一步通过各自的Q网络选择动作后,不使用另一个Q网络来构造目标,而是使用两个Q网络的最小值来构造目标:
Q W 1 target ( s , a ) = r + γ min i = 1 , 2 Q w i ( s ′ , a 1 ∗ ) , Q W 2 target ( s , a ) = r + γ min i = 1 , 2 Q w i ( s ′ , a 2 ∗ ) . Q_{W_1}^\text{target}(s,a)=r+\gamma\min_{i=1,2}Q_{w_i}(s^{\prime},a_1^*),\\Q_{W_2}^\text{target}(s,a)=r+\gamma\min_{i=1,2}Q_{w_i}(s^{\prime},a_2^*). QW1target(s,a)=r+γi=1,2minQwi(s′,a1∗),QW2target(s,a)=r+γi=1,2minQwi(s′,a2∗).
这样只要两个Q网络提供的估计值中至少有一个低于真值就可以提供低估的目标值。这样就可以进一步降低过估计的问题。
10.3.3.3 Trick9:分布式回报函数(Distributed Return Function,DRF)
- 要解决的挑战:过估计(Overestimation)。
- 原理:对两个独立Q函数的自然延伸。既然能够学习两个Q函数来降低过估计,为什么不能学习无穷多个呢?而无穷多个Q函数就构成了一个分布。

具体地,把状态-动作对的回报定义为:
Z ( s , a ) = r s s ′ a + γ G t + 1 , Z(s,a)=r_{ss^{\prime}}^a+\gamma G_{t+1}, Z(s,a)=rss′a+γGt+1, 这里的 G t + 1 G_{t+1} Gt+1是从 s ′ s' s′开始的长期回报。由于环境转移模型、策略等蕴含的随机性,这个回报是一个随机变量,因此 Z ( s , a ) Z(s,a) Z(s,a)也是一个随机变量。并且可证明,Q函数是 Z ( s , a ) Z(s,a) Z(s,a)的期望:
Q ( s , a ) = E Z ∼ Z π { Z ( s , a ) } . Q(s,a)=\mathbb{E}_{Z\sim\mathcal{Z}^{\pi}}\{Z(s,a)\}. Q(s,a)=EZ∼Zπ{Z(s,a)}. 其中 Z π \mathcal{Z}^{\pi} Zπ是 Z ( s , a ) Z(s,a) Z(s,a)的分布。这样的分布相当于学习得到了无穷个Q函数,这被证明可以有效的降低过估计。假如我们使用高斯分布来近似 Z ( s , a ) Z(s,a) Z(s,a)的分布,而高斯分布的均值和标准差分别记作 q ( s , a ) q(s,a) q(s,a)和 σ ( s , a ) \sigma(s,a) σ(s,a),那么可证明使用分布式回报函数前后的过估计误差 Δ ( s , a ) \Delta(s,a) Δ(s,a)和 Δ ˉ ( s , a ) \bar{\Delta}(s,a) Δˉ(s,a)之间的关系为:
Δ ‾ ( s , a ) = Δ ( s , a ) σ ( s , a ) 2 . \overline{\Delta}(s,a)=\frac{\Delta(s,a)}{\sigma(s,a)^2}. Δ(s,a)=σ(s,a)2Δ(s,a). 并且可证明在值估计不准确和未来状态不确定的区域, σ ( s , a ) \sigma(s,a) σ(s,a)更大,因此相对于原始的过估计误差,新的过估计误差能有效减小。
10.3.4 挑战四:样本效率低(Sample Inefficiency)及其解决办法
样本效率被定义为达到特定的策略表现需要的新样本的数量。强化学习中的样本指通过与环境交互得到的转移三元组 ( s t , a t , s t + 1 ) (s_t,a_t,s_{t+1}) (st,at,st+1)。由定义可知重复使用旧的样本不会影响样本效率,只有与环境交互得到的新样本才会影响。
样本效率取决于两个方面:探索效率(Exploration Efficiency)和利用效率(Exploitation Efficiency)。前者指RL Agent是否可以通过更少的样本来覆盖整个环境。后者则指怎么利用收集到的样本更有效率的来学习特定区域。
实现更高的探索效率的方式包含使用更多初始状态随机的Agent来进行探索、使用熵正则项和软值函数等方式来鼓励Agent进行探索等。
实现更高的利用效率的方式包含经验回放等、优先级经验回放等方式来更高效的利用收集到的样本。
10.3.4.1 Trick10:熵正则化(Entropy Regularization,EnR)
- 要解决的挑战:样本效率低(Sample Inefficiency)。
- 原理:在强化学习总的目标函数里面添加一个熵正则项来鼓励探索:
J ( θ ) = E π θ { v π θ ( s ) + α H ( π θ ( ⋅ ∣ s ) ) } , J(\theta)=\mathbb{E}_{\pi_\theta}\{v^{\pi_\theta}(s)+\alpha\mathcal{H}\left(\pi_\theta(\cdot|s)\right)\}, J(θ)=Eπθ{vπθ(s)+αH(πθ(⋅∣s))}, 这里的 H ( ⋅ ) \mathcal{H}(\cdot) H(⋅)是熵函数,用于衡量策略的随机性, α \alpha α是温度系数,用于平衡熵正则项和原始的目标函数之间的关系。
熵正则项技术有助于鼓励探索,捕捉更广泛的潜在动作模态病防治过早收敛到次优解。
10.3.4.2 Trick11:软值函数(Soft Value Function,SVF)
- 要解决的挑战:样本效率低(Sample Inefficiency)。
- 原理:与仅仅在优化目标中添加熵相比,把奖励信号直接使用熵项来进行增强是一个更好的方法。这也就是最大熵强化学习的思想。新的奖励信号为:
r a u g ( s , a , s ′ ) = r ( s , a , s ′ ) + α H ( π ( ⋅ ∣ s ) ) . r_\mathrm{aug}(s,a,s^{\prime})=r(s,a,s^{\prime})+\alpha\mathcal{H}\left(\pi(\cdot|s)\right). raug(s,a,s′)=r(s,a,s′)+αH(π(⋅∣s)). 那么对应的值函数如下:
v π ( s ) = E π { ∑ i = 0 ∞ γ i ( r t + i + α H ( π ( ⋅ ∣ s t + i ) ) ) ∣ s t = s } , q π ( s , a ) = E π { ∑ i = 0 ∞ γ i r t + i + α ∑ i = 1 ∞ γ i H ( π ( ⋅ ∣ s t + i ) ) ∣ s t = s , a t = a } . \begin{aligned} v^{\pi}(s)&=\mathbb{E}_\pi\left\{\sum_{i=0}^\infty\gamma^i\left(r_{t+i}+\alpha\mathcal{H}\left(\pi(\cdot|s_{t+i})\right)\right)\right|s_t=s\Bigg\},\\ q^\pi(s,a)&=\mathbb{E}_\pi\left\{\sum_{i=0}^\infty\gamma^ir_{t+i}+\alpha\sum_{i=1}^\infty\gamma^i\mathcal{H}\left(\pi(\cdot|s_{t+i})\right)\right|s_t=s,a_t=a\Big\}. \end{aligned} vπ(s)qπ(s,a)=Eπ{i=0∑∞γi(rt+i+αH(π(⋅∣st+i))) st=s},=Eπ{i=0∑∞γirt+i+αi=1∑∞γiH(π(⋅∣st+i)) st=s,at=a}. 进一步的,亦有下述self-consistency的关系:
v π ( s ) = E a ∼ π { q π ( s , a ) } + α H ( π ( ⋅ ∣ s ) ) . v^\pi(s)=\mathbb{E}_{a\sim\pi}\{q^\pi(s,a)\}+\alpha\mathcal{H}\left(\pi(\cdot|s)\right). vπ(s)=Ea∼π{qπ(s,a)}+αH(π(⋅∣s)). 在探索较少的区域,原本的reward信号比后面的熵正则项小得多,因此策略的方差会变大来增加熵项以促进探索。而在探索较多的区域,则会倾向于利用。这样就可以实现对于未充分探索的区域进行更多的探索的目的。
10.4 深度强化学习算法
深度强化学习算法(Deep Reinforcement Learning,DRL)将深度神经网络引入强化学习中。主流的深度强化学习算法及其利用的前述技巧如下表所示:
| Alg. | ExR | PEx | STN | DPU | CPU | CAC | DQF | BDQ | DRF | EnR | SVF | π \pi π |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DQN | ★ | ★ | off | |||||||||
| Dueling DQN | ● | ● | off | |||||||||
| DDQN | ● | ● | ★ | off | ||||||||
| TRPO | ★ | on | ||||||||||
| PPO | ★ | on | ||||||||||
| A3C | ★ | ★ | on | |||||||||
| DDPG | ● | ● | ● | off | ||||||||
| TD3 | ● | ● | ● | ● | ★ | off | ||||||
| SAC | ● | ● | ● | ● | ★ | off | ||||||
| DSAC | ● | ● | ● | ● | ● | ★ | ● | off |
★ Formally proposed for the first time
● Inherited tricks from previous DRLs
其中,上述各个Trick的缩写含义如下表所示:
| Trick | Full Name |
|---|---|
| ExR | Experience Replay |
| PEx | Parallel Exploration |
| STN | Separated Target Network |
| DPU | Delayed Policy Update |
| CPU | Constrained Policy Update |
| CAC | Clipped Actor Criterion |
| DQF | Double Q-Functions |
| BDQ | Bounded Double Q-Functions |
| DRF | Distributed Return Function |
| EnR | Entropy Regularization |
| SVF | Soft Value Function |
10.4.1 深度Q网络(Deep Q-Network,DQN)
DQN是第一个成功的深度强化学习算法。它的原始版本在2013年提出,但是存在容易发散的问题。2015年的改进版通过引入经验回放(ExR)和目标网络(STN)解决了不稳定的问题。
在DQN中,每条经验 e t e_t et被定义为:
e t = ( s t , a t , r t , s t + 1 ) . e_t=\left(s_t,a_t,r_t,s_{t+1}\right). et=(st,at,rt,st+1). 而负责储存经验的Replay Buffer被定义为:
D = { e 0 , … , e t , … , e N } . \mathcal{D}=\left\{e_0,\ldots,e_{t},\ldots,e_N\right\}. D={e0,…,et,…,eN}. DQN每次更新使用从Replay Buffer中随机抽取的mini-batch来进行。更新方式为最小化均方贝尔曼误差(单步TD Target与当前Q值之间的均方差):
J ( w ) = E s , a , s ′ ∼ D Replay { ( r + γ max a ′ Q W ‾ ( s ′ , a ′ ) − Q w ( s , a ) ) 2 } . J(w)=\mathbb{E}_{s,a,s^{\prime}\sim\mathcal{D}_{\text{Replay}}}\left\{\left(r+\gamma\max_{a^{\prime}}Q_{\overline{W}}(s^{\prime},a^{\prime})-Q_{w}(s,a)\right)^2\right\}. J(w)=Es,a,s′∼DReplay{(r+γa′maxQW(s′,a′)−Qw(s,a))2}.
值得指出的是,经验回放技巧是DQN成功的关键。直接学习连续的、来自同一条轨迹上的样本会导致训练的不稳定性。使用经验回放技巧后可以打破样本之间的相关性。另外,任何不依赖重要性比例(Importance Sampling Ratio,ISR)的off-policy算法都可以使用经验回放技巧来提升样本效率。因此,大部分具有动作值函数的算法的可使用这一技巧,而大部分基于状态值函数的算法则不能使用这一技巧。
10.4.2 Dueling DQN

Dueling DQN将DQN中的动作值函数的估计分解为两个并行的网络:状态值函数网络和优势函数网络。状态值函数网络只关注状态本身的价值而不在乎具体的动作的影响;优势函数网络则关注在指定状态下,选择特定动作的优势。之后,再通过这两者可以合成出动作值函数。这种设计有助于利用同一个状态下不同动作的Q值来学习V值(显然直接对于Q值进行学习的话就无法利用同状态下其它Q值的信息)。另外,同一状态下不同动作的Q值之间的差异比它们的幅值小得多,这样的学习方式也有助于算法对噪声更加鲁棒。下面来看看具体的原理。
我们把V值函数和优势函数分别记作 V ( s ; w V ) V(s;w_V) V(s;wV)、 A ( s , a ; w A ) A(s,a;w_A) A(s,a;wA),那么如何获得动作值函数呢?一个简单的想法是直接相加:
Q ( s , a ; w V , w A ) = V ( s ; w V ) + A ( s , a ; w A ) . Q(s,a;w_V,w_A)=V(s;w_V)+A(s,a;w_A). Q(s,a;wV,wA)=V(s;wV)+A(s,a;wA). 但是这里就存在一个问题,即可辨识性问题,具体来说,这样直接相加造成即使对于同一个状态-动作对 ( s , a ) (s,a) (s,a)的动作值函数,其分解也不是唯一的(只需要V值函数和优势函数分别加上和减去一个常数就可以了)。这样做的坏处有很多,比如网络可能退化为传统DQN,V值函数被学习为0,仅由优势函数表示Q值。
状态价值的估计失去意义,无法体现状态本身的“整体好坏”,导致模型无法有效泛化到相似状态。为了解决这个问题,主要有两种方法:
- 减去均值
- 做法
Q ( s , a ) = V ( s ) + ( A ( s , a ) − 1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) ) . Q(s,a)=V(s)+\left(A(s,a)-\frac1{|\mathcal{A}|}\sum_{a^{\prime}}A(s,a^{\prime})\right). Q(s,a)=V(s)+(A(s,a)−∣A∣1a′∑A(s,a′)). - 约束条件:优势函数的均值为零,即:
1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) = 0. \frac1{|\mathcal{A}|}\sum_{a^{\prime}}A(s,a^{\prime})=0. ∣A∣1a′∑A(s,a′)=0. - 唯一性证明:在这种情况下,对于 Q ( s , a ) Q(s,a) Q(s,a)的分解是唯一的( V ( s ) V(s) V(s)唯一),证明如下:
1 ∣ A ∣ ∑ a Q ( s , a ) = V ( s ) + 1 ∣ A ∣ ∑ a ( A ( s , a ) − 1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) ) = V ( s ) . \frac1{|\mathcal{A}|}\sum_aQ(s,a)=V(s)+\frac1{|\mathcal{A}|}\sum_a\left(A(s,a)-\frac1{|\mathcal{A}|}\sum_{a^{\prime}}A(s,a^{\prime})\right)=V(s). ∣A∣1a∑Q(s,a)=V(s)+∣A∣1a∑(A(s,a)−∣A∣1a′∑A(s,a′))=V(s). 此时 V ( s ) V(s) V(s)等于状态 s s s下所有动作的Q值的均值, A ( s , a ) A(s,a) A(s,a)则表示动作 a a a相对于均值的优势。
- 做法
- 减去最大值
- 做法
Q ( s , a ) = V ( s ) + ( A ( s , a ) − max a ′ A ( s , a ′ ) ) . Q(s,a)=V(s)+\left(A(s,a)-\max_{a^{\prime}}A(s,a^{\prime})\right). Q(s,a)=V(s)+(A(s,a)−a′maxA(s,a′)). - 约束条件:优势函数的最大值为零,即:
max a ′ A ( s , a ′ ) = 0. \max_{a^{\prime}}A(s,a^{\prime})=0. a′maxA(s,a′)=0. - 唯一性证明:在这种情况下,对于 Q ( s , a ) Q(s,a) Q(s,a)的分解是唯一的( V ( s ) V(s) V(s)唯一),证明如下:
max a Q ( s , a ) = V ( s ) + max a ( A ( s , a ) − max a ′ A ( s , a ′ ) ) = V ( s ) . \max_aQ(s,a)=V(s)+\max_a\left(A(s,a)-\max_{a^{\prime}}A(s,a^{\prime})\right)=V(s). amaxQ(s,a)=V(s)+amax(A(s,a)−a′maxA(s,a′))=V(s). 此时 V ( s ) V(s) V(s)等于状态 s s s下所有动作的Q值的最大值, A ( s , a ) A(s,a) A(s,a)则表示动作 a a a距离最大值的差距。
- 做法
10.4.3 Double DQN(DDQN)

DDQN与DQN几乎一模一样,只不过额外使用了双Q函数(DQF)来降低过估计的问题。它也是有两个网络,在线网络(Online Network)和目标网络(Target Network),但是在构造TD Error的时候与DQN不同,如下表所示:
| DQN | DDQN |
|---|---|
| Q w ‾ t a r g e t = r + γ max a ′ Q w ‾ ( s ′ , a ′ ) − Q w ( s , a ) Q_{\overline{w}}^{\mathrm{target}}=r+\gamma \max_{a^{\prime}} Q_{\overline{w}}(s^{\prime},a^{\prime})-Q_{w}(s,a) Qwtarget=r+γmaxa′Qw(s′,a′)−Qw(s,a) | r + γ Q w ‾ ( s ′ , argmax a ′ Q w ( s ′ , a ′ ) ) − Q w ( s , a ) r+\gamma Q_{\overline{w}}\left(s^{\prime},\underset{a^{\prime}}{\operatorname*{argmax}}Q_{w}\left(s^{\prime},a^{\prime}\right)\right)-Q_{w}\left(s,a\right) r+γQw(s′,a′argmaxQw(s′,a′))−Qw(s,a) |
可以看出,虽然二者在构造TD Error的时候都使用了目标网络,但是前者在构造TD Target的时候的最佳动作是通过目标网络来选择的(即 a ∗ = arg max a ′ Q w ‾ ( s ′ , a ′ ) a^*=\arg\max_{a^{\prime}}Q_{\overline{w}}(s^{\prime},a^{\prime}) a∗=argmaxa′Qw(s′,a′)),而后者则是通过在线网络来选择的(即 a ∗ = arg max a ′ Q w ( s ′ , a ′ ) a^*=\arg\max_{a^{\prime}}Q_{w}(s^{\prime},a^{\prime}) a∗=argmaxa′Qw(s′,a′))。这就相当于把STN和DQF结合在了一起。而除此之外DDQN的网络结构和训练目标与DQN完全一样。
10.4.4 TRPO
TRPO算法旨在解决原始的策略梯度算法在更新时参数变化过快的导致策略不稳定的问题。通过引入minorize-maximization (MM) 优化,TRPO算法可以解决策略变化过快的问题并从理论上保证策略单调变好。它使用了受约束的策略更新(CPU)技巧来限制策略的变化幅度,具有一个状态值函数网络(V函数)以及一个策略网络。
MM优化本质上是找到原目标函数的一个下界(lower bound)作为替代函数,然后优化这个下界函数。TRPO算法的优化过程如下:
θ ← arg max θ E s ∼ d π 0 l d ′ a ∼ π o l d { π θ ( a ∣ s ) π o l d ( a ∣ s ) A π o l d ( s , a ) } s.t. D ‾ K L ( π o l d , π θ ) ≤ δ π , \theta\leftarrow\arg\max_\theta\mathbb{E}_{s\sim d_{\pi_0\mathrm{ld}^{\prime}}a\sim\pi_{\mathrm{old}}}\left\{\frac{\pi_\theta(a|s)}{\pi_\mathrm{old}(a|s)}A^{\pi_\mathrm{old}}(s,a)\right\}\\\text{s.t.}\\\overline{D}_{\mathrm{KL}}(\pi_\mathrm{old},\pi_\theta)\leq\delta_\pi, θ←argθmaxEs∼dπ0ld′a∼πold{πold(a∣s)πθ(a∣s)Aπold(s,a)}s.t.DKL(πold,πθ)≤δπ, 这里的 A π o l d ( s , a ) A^{\pi_\mathrm{old}}(s,a) Aπold(s,a)是优势函数: A π o l d ( s , a ) = r + γ V π o l d ( s ′ ) − V π o l d ( s ) A^{\pi_\mathrm{old}}(s,a)=r+\gamma V^{\pi_\mathrm{old}}(s^{\prime})-V^{\pi_\mathrm{old}}(s) Aπold(s,a)=r+γVπold(s′)−Vπold(s)。而 D ‾ K L ( π o l d , π θ ) \overline{D}_{\mathrm{KL}}(\pi_\mathrm{old},\pi_\theta) DKL(πold,πθ)是新旧策略之间的KL散度: D ‾ K L ( π o l d , π θ ) = E s ∼ d π o l d { D K L ( π o l d ( ⋅ ∣ s ) , π θ ( ⋅ ∣ s ) ) } \overline{D}_{\mathrm{KL}}(\pi_\mathrm{old},\pi_\theta)=\mathbb{E}_{s\sim d_{\pi_\mathrm{old}}}\{D_\mathrm{KL}\big(\pi_\mathrm{old}(\cdot|s),\pi_\theta(\cdot|s)\big)\} DKL(πold,πθ)=Es∼dπold{DKL(πold(⋅∣s),πθ(⋅∣s))}。
TRPO算法在使用时需要调整的超参数比较少,因此具有一定实用性。且其单调改进的性质保证了算法的鲁棒性。但是,TRPO算法是on-policy算法,不能使用经验回放技巧,样本效率较低。且无法充分探索环境导致了算法容易陷入局部最优。
10.4.5 PPO
TRPO算法的计算负担很大。原始版本在求梯度时需要计算Hessian矩阵的逆,而即使改进后的版本仍然需要通过共轭梯度法来求解。因此,PPO算法被提出来解决上述问题。它的架构与TRPO完全一样(一个V函数网络和一个策略网络),但是将TRPO每次优化时需要求解的带约束优化问题转化为直接在优化目标中通过设置上下界来进行裁剪从而保证策略不会变化的太快。PPO算法使用了裁剪的Actor准则(CAC)技巧。
具体来说,PPO算法的优化目标为:
θ ← arg max θ E s ∼ d π o l d , a ∼ π o l d { min ( ρ t : t A π o l d ( s , a ) , ρ c l i p A π o l d ( s , a ) ) } , ρ c l i p = d e f clip ( ρ t : t , 1 − ϵ , 1 + ϵ ) , \theta\leftarrow\arg\max_{\theta}\mathbb{E}_{s\sim d_{\pi_{\mathrm{old}}},a\thicksim\pi_{\mathrm{old}}}\left\{\min\left(\rho_{t:t}A^{\pi_{\mathrm{old}}}(s,a),\rho_{\mathrm{clip}}A^{\pi_{\mathrm{old}}}(s,a)\right)\right\},\\\rho_{\mathrm{clip}}\overset{\mathrm{def}}{\operatorname*{=}}\operatorname{clip}(\rho_{t:t},1-\epsilon,1+\epsilon), θ←argθmaxEs∼dπold,a∼πold{min(ρt:tAπold(s,a),ρclipAπold(s,a))},ρclip=defclip(ρt:t,1−ϵ,1+ϵ), 这里的 ρ t : t = π θ ( a ∣ s ) π o l d ( a ∣ s ) \rho_{t:t}=\frac{\pi_\theta(a|s)}{\pi_{\mathrm{old}}(a|s)} ρt:t=πold(a∣s)πθ(a∣s)为IS Ratio, ρ c l i p \rho_{\mathrm{clip}} ρclip为裁剪后的IS Ratio, ϵ \epsilon ϵ为裁剪的范围。优化目标中min的括号里面的前面那项就是TRPO算法里原始的优化目标,而后面那项则是裁剪后的优化目标。
值得注意的是, min ( ρ t : t A π o l d ( s , a ) , ρ c l i p A π o l d ( s , a ) ) \min\left(\rho_{t:t}A^{\pi_{\mathrm{old}}}(s,a),\rho_{\mathrm{clip}}A^{\pi_{\mathrm{old}}}(s,a)\right) min(ρt:tAπold(s,a),ρclipAπold(s,a))仍然是原始的优化目标的下界,因此单调改进的性质仍然成立。由此可知PPO算法是一个计算上更高效的一阶优化算法。
10.4.6 A3C(Asynchronous Actor-Critic)
A3C算法是一个on-policy算法,其最主要的贡献在于提出了异步平行探索和更新的思想,这启发了后续的分布式强化学习算法。A3C算法使用了平行探索(PEx)和熵正则化(EnR)技巧。
A3C算法的Sampler和Learner都可以设计成并行的都需要独立的更新自己的参数。同时A3C算法还有一个全局的Learner(Global Learner)和若干局部的Learner(Local Learner),它们与全局Learner的结构相同(一个V函数网络和一个策略网络)。局部Learner独立地更新自己的参数,并定期将从全局Learner那里获取最新的参数版本;全局Learner则一旦发现有局部Learner发生了参数更新就会那个局部Learner那里获取参数。
A3C的优化目标为:
∇ θ J ( θ ) = E π { ∇ θ log π θ ( a ∣ s ) A w ( s , a ) + α ∇ θ H ( π θ ( ⋅ ∣ s ) ) } , \nabla_\theta J(\theta)=\mathbb{E}_\pi\begin{Bmatrix}\nabla_\theta\log\pi_\theta\left(a|s\right)A_w(s,a)+\alpha\nabla_\theta\mathcal{H}\big(\pi_\theta(\cdot|s)\big)\end{Bmatrix}, ∇θJ(θ)=Eπ{∇θlogπθ(a∣s)Aw(s,a)+α∇θH(πθ(⋅∣s))}, 这里加入了熵正则项来鼓励探索。里面的 A w ( s , a ) A_w(s,a) Aw(s,a)是优势函数:
A w ( s t , a t ) = ∑ i = 0 n − 1 γ i r t + i + γ n V w ( s t + n ) − V w ( s t ) . A_w(s_t,a_t)=\sum_{i=0}^{n-1}\gamma^ir_{t+i}+\gamma^nV_w(s_{t+n})-V_w(s_t). Aw(st,at)=i=0∑n−1γirt+i+γnVw(st+n)−Vw(st).
值得注意的是,因为A3C是on-policy算法,因此它不能利用历史样本,因此也无法使用经验回放技巧。它主要通过异步平行机制来取得较高的样本效率和较好的表现的。这种异步并行的方式尤其适合具有多个CPU核心的机器。
10.4.7 DDPG(Deep Deterministic Policy Gradient)
DQN和DDQN算法均不具有显式的策略函数,直接通过greedy search的方法,最大化动作值函数来选择动作。但是这样带来的坏处是这样*动作空间只能是离散的,而无法扩展到连续的动作空间。DDPG是对于DQN的扩展,可以处理连续的动作空间。它具有两个Q函数网络( Q o n l i n e Q^{online} Qonline和 Q t a r g e t Q^{target} Qtarget)和两个策略网络( Q o n l i n e Q^{online} Qonline和 Q t a r g e t Q^{target} Qtarget)。Target网络通过定期从Online网络那里获取来更新。具体地,DDPG算法使用了经验回放(ExR)、分离目标网络(STN)、双Q函数(DQF)技巧。
首先,因为DDPG是对于DQN的扩展,因此它自然也是off-policy算法,就可以使用经验回放技巧。
其二,DDPG算法使用了Slow Update的方法来更新目标网络:
w ‾ ← ρ w w + ( 1 − ρ w ) w ‾ , θ ˉ ← ρ θ θ + ( 1 − ρ θ ) θ ˉ , \overline{w}\leftarrow\rho_ww+(1-\rho_w)\overline{w},\\\bar{\theta}\leftarrow\rho_\theta\theta+(1-\rho_\theta)\bar{\theta}, w←ρww+(1−ρw)w,θˉ←ρθθ+(1−ρθ)θˉ, 这里的 w ‾ \overline{w} w和 θ ‾ \overline{\theta} θ分别是Q函数网络和策略网络的目标网络, w w w和 θ \theta θ分别是Q函数网络和策略网络的在线网络, ρ w \rho_w ρw和 ρ θ \rho_\theta ρθ分别是Q函数网络和策略网络的更新速率。这样做的好处是可以避免目标网络的参数变化过快导致的不稳定性。
其三,不同于DQN和DDQN构造TD Error时使用最大化online或者target Q函数的方式来选取动作,DDPG算法则是直接使用目标策略网络给出的动作 π θ ‾ ( s ′ ) \pi_{\overline{\theta}}(s^{\prime}) πθ(s′)来近似最优动作。这种动作选择与动作评估解耦的方式实际上就相当于双Q函数技巧(本质目的是一样的,即解耦)。其值函数网络(Critic)的优化目标为:
J ( w ) = E s , a , s ′ ∼ D Replay { ( r + γ Q w ‾ ′ , π θ ‾ ( s ′ ) ) − Q w ( s , a ) ) 2 } . J(w)=\mathbb{E}_{s,a,s^{\prime}\sim\mathcal{D}_{\text{Replay}}}\left\{\left(r+\gamma Q_{\overline{w}}^{\prime},\pi_{\overline{\theta}}(s^{\prime})\right)-Q_{w}(s,a)\right)^2\Big\}. J(w)=Es,a,s′∼DReplay{(r+γQw′,πθ(s′))−Qw(s,a))2}. 并且与DQN和DDQN不同,DDPG算法还有显式的策略网络(Actor)需要更新。其策略网络的优化目标为:
max θ E s ∼ D R e p l a y { Q w ( s , π θ ( s ) ) } . \max_{\theta}\mathbb{E}_{s\sim\mathcal{D}_{{\mathrm{Replay}}}}\{Q_{w}(s,\pi_{\theta}(s))\}. θmaxEs∼DReplay{Qw(s,πθ(s))}.
另外,因为DDPG的策略是确定性的,为了增强探索能力,在选择动作时会加入均值为0的高斯噪声来鼓励探索。并且在每次与环境交互时的初始状态随机从一个状态分布中采样得到。
10.4.8 TD3(Twin Delayed DDPG)
DDPG的一个问题是会对于值函数出现显著的高估,同时因为在PIM中又会用到值函数,从而导致了学到的策略的性能下降以及算法对于超参数设置十分敏感。TD3算法通过在DDPG使用的三个Trick基础上引入两个额外的技巧来缓解过估计问题。TD3算法具有四个Q函数网络和两个策略网络。
首先,TD3额外使用双Q函数取最小值(BDQ)技巧来降低过估计的问题。在构造TD Target的时候,使用两个Target Q函数网络的较小值来构造TD Target:
Q w ‾ t a r g e t = r + γ min i = 1 , 2 Q W ‾ i ( s ′ , π θ ‾ ( s ′ ) ) . Q_{{\overline{w}}}^{{\mathrm{target}}}=r+\gamma\min_{i=1,2}Q_{{\overline{W}_{i}}}(s^{\prime},\pi_{{\overline{\theta}}}(s^{\prime})). Qwtarget=r+γi=1,2minQWi(s′,πθ(s′)). 后续更新两个online Q函数网络时均使用这个相同的TD Target。两个online Q函数网络的更新方式为:
J ( w 1 ) = E s , a , s ′ ∼ D Replay { ( Q W ‾ t a r g e t − Q w 1 ( s , a ) ) 2 } , J ( w 2 ) = E s , a , s ′ ∼ D Replay { ( Q W ‾ t a r g e t − Q w 2 ( s , α ) ) 2 } . J(w_1)=\mathbb{E}_{s,a,s^{\prime}\sim\mathcal{D}_{\text{Replay}}}\left\{\left(Q_{\overline{W}}^{\mathrm{target}}-Q_{w_1}(s,a)\right)^2\right\},\\J(w_2)=\mathbb{E}_{s,a,s^{\prime}\sim\mathcal{D}_{\text{Replay}}}\left\{\left(Q_{\overline{W}}^{\mathrm{target}}-Q_{w_2}(s,\alpha)\right)^2\right\}. J(w1)=Es,a,s′∼DReplay{(QWtarget−Qw1(s,a))2},J(w2)=Es,a,s′∼DReplay{(QWtarget−Qw2(s,α))2}.
其次,TD3算法使用了延迟策略更新(DPU)技巧。在DDPG算法中,Q函数网络和策略网络在每轮迭代都需要更新一次,而TD3算法则降低了策略网络的更新频率,每隔几轮才更新一次策略网络参数。防止过于频繁的更新导致的Target不稳定。
另外,TD3还有一些额外的处理,比如使用了目标策略平滑性(Target Policy Smoothing)技巧。在构建TD Target的时候,里面的最优动作在DDPG通过策略网络直接给出动作的做法的基础上,引入如下操作作为目标动作:
α ∗ = c l i p ( π θ ‾ ( s ′ ) + c l i p ( ϵ , − ϵ b n d , ϵ b n d ) , a L o w , a H i g h ) , ϵ ∼ N ( 0 , σ ) , \begin{aligned}\alpha^*&=\mathrm{clip}\Big(\pi_{\overline{\theta}}(s^{\prime})+\mathrm{clip}(\epsilon,-\epsilon_{\mathrm{bnd}},\epsilon_{\mathrm{bnd}}),a_{\mathrm{Low}},a_{\mathrm{High}}\Big),\\\epsilon&\sim\mathcal{N}(0,\sigma),\end{aligned} α∗ϵ=clip(πθ(s′)+clip(ϵ,−ϵbnd,ϵbnd),aLow,aHigh),∼N(0,σ), 这里的 ϵ \epsilon ϵ是均值为0的高斯噪声, ϵ b n d \epsilon_{\mathrm{bnd}} ϵbnd是动作噪声的上下界, a L o w a_{\mathrm{Low}} aLow和 a H i g h a_{\mathrm{High}} aHigh是动作的上下界范围。这种技巧可以看做是一种特殊的策略正则化手段,可以平滑目标动作分布,来避免在Q函数的估计中出现不正确的异常尖峰,从而使Q函数的估计更加平滑。
10.4.9 SAC(Soft Actor-Critic)
SAC算法是一个off-policy算法且其策略为随机性的。它使用了随机策略来平衡累计回报和策略熵。SAC算法包含4个Q函数网络和一个随机策略网络(两个online Q函数网络均有对应的Target网络,而策略网络没有对应的Target网络)。它使用了经验回放(ExR)、分离目标网络(STN)、双Q函数(DQF)、双Q函数取最小值(BDQ)、软值函数(SVF)技巧。
根据SVF那里讲过的结合熵之后的self-consistency的关系 v π ( s ) = E a ∼ π { q π ( s , a ) } + α H ( π ( ⋅ ∣ s ) ) v^\pi(s)=\mathbb{E}_{a\sim\pi}\{q^\pi(s,a)\}+\alpha\mathcal{H}\left(\pi(\cdot|s)\right) vπ(s)=Ea∼π{qπ(s,a)}+αH(π(⋅∣s)),SAC算法构建了一个隐式的状态值函数:
V w ‾ ( s ′ ) = E a ′ ∼ π θ { min i = 1 , 2 Q W ‾ i ( s ′ , a ′ ) − α log π θ ( a ′ ∣ s ′ ) } . V_{\overline{w}}(s^{\prime})=\mathbb{E}_{a^{\prime}\sim\pi_\theta}\left\{\min_{i=1,2}Q_{\overline{W}_i}(s^{\prime},a^{\prime})-\alpha\log\pi_\theta(a^{\prime}|s^{\prime})\right\}. Vw(s′)=Ea′∼πθ{i=1,2minQWi(s′,a′)−αlogπθ(a′∣s′)}. 之后,根据这个隐式的状态值函数来构建TD Target并由此得出Q函数(Critic)的优化目标:
J C r i t i c ( w i ) = E s , a , s ′ ∼ D R e p l a y { ( r + γ V w ‾ ( s ′ ) − Q w i ( s , a ) ) 2 } , ∀ i = 1 , 2. J_{\mathrm{Critic}}(w_i)=\mathbb{E}_{s,a,s^{\prime}\sim\mathcal{D}_{\mathrm{Replay}}}\left\{\left(r+\gamma V_{\overline{w}}(s^{\prime})-Q_{w_i}(s,a)\right)^2\right\},\forall i=1,2. JCritic(wi)=Es,a,s′∼DReplay{(r+γVw(s′)−Qwi(s,a))2},∀i=1,2. 而策略网络(Actor)则是通过最大化隐式的状态值函数的期望来进行更新:
J A c t o r ( θ ) = E s ∼ D Replay , a ∼ π θ { Q π θ ( s , a ) − α log π θ ( a ∣ s ) } . J_{\mathrm{Actor}}(\theta)=\mathbb{E}_{s\sim\mathcal{D}_{\text{Replay},}a\sim\pi_\theta}\{Q^{\pi_\theta}(s,a)-\alpha\log\pi_\theta(a|s)\}. JActor(θ)=Es∼DReplay,a∼πθ{Qπθ(s,a)−αlogπθ(a∣s)}.
另外,SAC的熵项前面的温度系数 α \alpha α是自动调节的,通过构建一个优化问题来求解。该优化问题在保证策略熵大于等于一个目标值的前提下(保证策略具有一定的随机性)来最大化累计回报(保证策略性能):
max π 0 , ⋯ , π N E s t + i ∼ d π i , a t + i ∼ π i { ∑ i = 0 N r ( s t + i , a t + i ) } , s.t. H ( π i ( ⋅ ∣ s t ) ) ≥ H d e s , \max_{\boldsymbol{\pi}_0,\cdots,\boldsymbol{\pi}_N}\mathbb{E}_{s_{t+i}\sim d_{\pi_i},a_{t+i}\sim\pi_i}\left\{\sum_{i=0}^Nr(s_{t+i},a_{t+i})\right\},\\\text{s.t.}\\\mathcal{H}\left(\pi_i(\cdot|s_t)\right)\geq\mathcal{H}_{\mathrm{des}}, π0,⋯,πNmaxEst+i∼dπi,at+i∼πi{i=0∑Nr(st+i,at+i)},s.t.H(πi(⋅∣st))≥Hdes, 这里的 H d e s \mathcal{H}_{\mathrm{des}} Hdes是目标熵值,通常可取为动作空间大小的负值 − ∣ A ∣ -\left|\mathcal{A}\right| −∣A∣。这个优化问题可以通过对偶梯度下降的方式来求解。
总结一下,SAC算法具有高样本效率,能很好地平衡探索和利用,并且对于不同人wide普适性很强,不需要过多的任务/环境相关的超参数调节。
10.4.10 DSAC(Distributional Soft Actor-Critic)
DSAC算法是对SAC算法的扩展,对于累计回报的分布而不是累计回报的期望(即Q函数)进行建模,从而降低过估计。与之前一些值分布强化学习算法里离散的分布建模不同,DSAC使用连续的高斯分布对于累计回报分布进行建模。DSAC包含两个值分布函数网络(一个online网络和一个target网络)和两个策略网络(也是一个online网络和一个target网络)。它使用了经验回放(ExR)、平行探索(PEx)、分离目标网络(STN)、延迟策略更新(DPU)、双Q函数(DQF)、软值函数(SVF)、分布式回报函数(DRF)技巧。
DSAC借鉴了A3C算法的平行探索思想,具有多个Sampler和Learner来平行探索。同时,它的在线值分布函数网络和策略网络都具有对应的目标网络。同时,DSAC算法也与SAC相同,使用了最大熵强化学习框架,通过软值函数(SVF)来平衡探索与利用。DSAC对于策略网络及温度系数 α \alpha α均采用了延迟更新技术,其更新频率低于Critic(值分布函数网络)的更新频率。
DSAC算法的Critic(值分布函数网络)的优化目标为:
J C r i t i c ( w ) = E s , a ∼ D R e p l a y { D K L ( Z w ‾ t a r g e t ( ⋅ ∣ s , a ) , Z w ( ⋅ ∣ s , a ) ) } , J_{\mathrm{Critic}}(w)=\mathbb{E}_{\mathrm{s},a\sim\mathcal{D}_{\mathrm{Replay}}}\left\{D_{\mathrm{KL}}\left(\mathcal{Z}_{\overline{w}}^{\mathrm{target}}(\cdot|s,a),\mathcal{Z}_{w}(\cdot|s,a)\right)\right\}, JCritic(w)=Es,a∼DReplay{DKL(Zwtarget(⋅∣s,a),Zw(⋅∣s,a))}, 这里的 Z w ‾ t a r g e t ( ⋅ ∣ s , a ) \mathcal{Z}_{\overline{w}}^{\mathrm{target}}(\cdot|s,a) Zwtarget(⋅∣s,a)是目标分布, Z w ( ⋅ ∣ s , a ) \mathcal{Z}_{w}(\cdot|s,a) Zw(⋅∣s,a)是当前网络拟合出的分布。但是上述目标不方便直接优化,因为我们对于目标分布的信息并不清楚。,直接对于上述目标求梯度 ∇ w J C r i t i c ( w ) \nabla_w J_{\mathrm{Critic}}(w) ∇wJCritic(w)不可行。可证明优化目标等价于:
∇ J C r i t i c = − E s , a , s ′ ∼ D R e p l a y , a ′ ∼ π θ ‾ { ∇ W log Z W ( Z w ‾ t a r g e t ( s , a ) ∣ s , a ) } , \nabla J_{\mathrm{Critic}}=-\mathbb{E}_{s,a,s^{\prime}\thicksim\mathcal{D}_{\mathrm{Replay}},a^{\prime}\thicksim\pi_{\overline{\theta}}}\{\nabla_W\log\mathcal{Z}_W{\left(Z_{\overline{w}}^{\mathrm{target}}(s,a)|s,a\right)}\}, ∇JCritic=−Es,a,s′∼DReplay,a′∼πθ{∇WlogZW(Zwtarget(s,a)∣s,a)}, 这个式子的意思是在当前网络拟合出来的在线分布 Z W ( ⋅ ∣ s , a ) \mathcal{Z}_W(\cdot|s,a) ZW(⋅∣s,a)下取到目标值 Z w ‾ t a r g e t ( s , a ) Z_{\overline{w}}^{\mathrm{target}}(s,a) Zwtarget(s,a)的概率。而这个目标值符合目标分布:
Z w ‾ t a r g e t ( s , a ) ∼ Z w ‾ t a r g e t ( ⋅ ∣ s , a ) , Z_{\overline{w}}^{\mathrm{target}}(s,a){\sim}\mathcal{Z}_{\overline{w}}^{\mathrm{target}}(\cdot|s,a), Zwtarget(s,a)∼Zwtarget(⋅∣s,a), e而这个值本身又可以通过下述单步TD Target的形式来近似:
Z w ‾ t a r g e t ( s , a ) = r + γ Z w ‾ ( s ′ , π θ ‾ ( a ′ ∣ s ′ ) ) , Z_{{\overline{w}}}^{{\mathrm{target}}}(s,a)=r+\gamma Z_{{\overline{w}}}(s^{\prime},\pi_{{\overline{\theta}}}(a^{\prime}|s^{\prime})), Zwtarget(s,a)=r+γZw(s′,πθ(a′∣s′)),
DSAC输出的策略与SAC一样,都是随机策略。其优化目标为:
J A c t o r = E s ∼ D R e p l a y , a ∼ π θ { P e r c ( Z w ( ⋅ ∣ s , α ) ) − α log π θ ( α ∣ s ) } , J_{\mathrm{Actor}}=\mathbb{E}_{s\sim\mathcal{D}_{\mathrm{Replay}},a\sim\boldsymbol{\pi}_\theta}\{\mathrm{Perc}(\mathcal{Z}_w(\cdot|\mathrm{s},\alpha))-\alpha\log\pi_\theta(\alpha|s)\}, JActor=Es∼DReplay,a∼πθ{Perc(Zw(⋅∣s,α))−αlogπθ(α∣s)}, 这里的 P e r c ( Z ) \mathrm{Perc}(\mathcal{Z}) Perc(Z)是分布的分位数,具体是几分位数可以自行指定。这就为算法提供了更加灵活多变的选择。例如,若选择50%分位数(均值)则自动退化为SAC算法的Actor的优化目标:
J A c t o r = E s ∼ D R e p l a y , a ∼ π θ { Q w ( s , a ) − α log π θ ( a ∣ s ) } . J_{\mathrm{Actor}}=\mathbb{E}_{s\sim\mathcal{D}_{\mathrm{Replay}},a\sim\boldsymbol{\pi}_\theta}\{Q_w(s,a)-\alpha\log\pi_\theta(a|s)\}. JActor=Es∼DReplay,a∼πθ{Qw(s,a)−αlogπθ(a∣s)}.
除此之外,DSAC算法还使用了其它一些技巧来保证训练稳定,如裁剪Target和当前回报分布来避免梯度爆炸等。DSAC算法与之前的强化学习算法相比取得了更好的训练稳定性、值函数估计的准确度(降低了过估计)以及策略的表现,是新一代强化学习SOTA算法。
更多推荐
所有评论(0)