From 25c65afaa390ed0b317daac75aac25602825417d Mon Sep 17 00:00:00 2001 From: johnjim0816 <39483938+johnjim0816@users.noreply.github.com> Date: Wed, 2 Aug 2023 01:01:51 +0800 Subject: [PATCH] format --- docs/ch11/main.md | 68 +++++++++++--------- docs/ch12/main.md | 42 +++++++----- docs/ch13/main.md | 160 +++++++++++++++++++++++++++++----------------- docs/ch2/main.md | 2 +- 4 files changed, 169 insertions(+), 103 deletions(-) diff --git a/docs/ch11/main.md b/docs/ch11/main.md index c286179..e0bbb82 100644 --- a/docs/ch11/main.md +++ b/docs/ch11/main.md @@ -1,104 +1,114 @@ # DDPG 与 TD3 算法 -本章开始到接下来的几章,我们将介绍一些非常典型的基于策略梯度的算法,包括 $\text{DDPG}$、$\text{PPO}$、$\text{SAC}$ 等。这些方法的实现方式各不相同,也各有各的特点,因此每个算法都单独形成一个章节来展开。同时它们是目前实践中最最常用的一些算法,甚至有 “遇事不决PPO” 之类的说法,因此读者一定要认真学习。那么本章将 $\text{DDPG}$ 算法作为开篇,严格来说,原论文作者提出 $\text{DDPG}$ 算法的初衷其实是 $\text{DQN}$ 算法的一个扩展,或者说一种连续动作版本的 $\text{DQN}$ 算法。但是由于当时 $\text{Actor-Critic}$ 架构还没有被提出( $\text{A3C}$ 算法是在 $\text{2016}$ 年发表的,比 $\text{DDPG}$ 算法晚了一年),只是后来我们回看 $\text{DDPG}$ 算法的时候发现其在形式上更像 $\text{Actor-Critic}$ 的架构,因此我们就将其归为 $\text{Actor-Critic}$ 算法的一种。 +$\qquad$ 本章开始到接下来的几章,我们将介绍一些非常典型的基于策略梯度的算法,包括 $\text{DDPG}$、$\text{PPO}$、$\text{SAC}$ 等。这些方法的实现方式各不相同,也各有各的特点,因此每个算法都单独形成一个章节来展开。同时它们是目前实践中最最常用的一些算法,甚至有 “遇事不决PPO” 之类的说法,因此读者一定要认真学习。那么本章将 $\text{DDPG}$ 算法作为开篇,严格来说,原论文作者提出 $\text{DDPG}$ 算法的初衷其实是 $\text{DQN}$ 算法的一个扩展,或者说一种连续动作版本的 $\text{DQN}$ 算法。但是由于当时 $\text{Actor-Critic}$ 架构还没有被提出( $\text{A3C}$ 算法是在 $\text{2016}$ 年发表的,比 $\text{DDPG}$ 算法晚了一年),只是后来我们回看 $\text{DDPG}$ 算法的时候发现其在形式上更像 $\text{Actor-Critic}$ 的架构,因此我们就将其归为 $\text{Actor-Critic}$ 算法的一种。 ## DPG 方法 -深度确定性策略梯度算法( $\text{deep deterministic policy gradient,DDPG}$),是一种确定性的策略梯度算法。为了让读者更好地理解 $\text{DDPG}$ 算法,我们先把 “深度“ 这两个字去掉,即先介绍一下 $\text{DPG}$ 算法,后面我们也会发现 $\text{DPG}$ 算法其实就是 $\text{DDPG}$ 算法的核心,也就是精髓所在。 +$\qquad$ 深度确定性策略梯度算法( $\text{deep deterministic policy gradient,DDPG}$),是一种确定性的策略梯度算法。为了让读者更好地理解 $\text{DDPG}$ 算法,我们先把 “深度“ 这两个字去掉,即先介绍一下 $\text{DPG}$ 算法,后面我们也会发现 $\text{DPG}$ 算法其实就是 $\text{DDPG}$ 算法的核心,也就是精髓所在。虽然 $\text{DDPG}$ 原论文作者是基于 $\text{DQN}$ 算法来展开的,目前很多相关资料也是如此。但是笔者认为,有了 $\text{Actor-Critic}$ 算法的铺垫之后,从策略梯度的角度来理解 DPG 算法是更容易的。首先我们知道 $\text{DQN}$ 算法的一个主要缺点就是不能用于连续动作空间,这是因为在 $\text{DQN}$ 算法中动作是通过贪心策略或者说 $\text{argmax}$ 的方式来从 $Q$ 函数间接得到的。 -虽然 $\text{DDPG}$ 原论文作者是基于 $\text{DQN}$ 算法来展开的,目前很多相关资料也是如此。但是笔者认为,有了 $\text{Actor-Critic}$ 算法的铺垫之后,从策略梯度的角度来理解 DPG 算法是更容易的。首先我们知道 $\text{DQN}$ 算法的一个主要缺点就是不能用于连续动作空间,这是因为在 $\text{DQN}$ 算法中动作是通过贪心策略或者说 `argmax` 的方式来从 $Q$ 函数间接得到的。要想适配连续动作空间,我们干脆就将选择动作的过程变成一个直接从状态映射到具体动作的函数 $\mu_\theta (s)$,其中 $\theta$ 表示模型的参数,这样一来就把求解 $Q$ 函数、贪心选择动作这两个过程合并成了一个函数,也就是我们常说的 `Actor`。有读者可能会问,为什么这里用 $\mu_\theta (s)$ 来表示策略而不是 $\text{Actor-Critic}$ 章节中提到的 $\pi_{\theta}(a|s)$ 呢?注意,这里 $\mu_\theta (s)$ 输出的是一个值,而 $\pi_{\theta}(a|s)$ 通常输出的是一个概率分布,这是两者的本质区别,与输出概率分布的随机性策略(`Stochastic Policy`)不同,这里输出一个值的策略我们就称作确定性策略( $\text{deterministic policy}$ )。有了这个策略函数之后,类似地,我们也可以推导出 $\text{DPG}$ 算法的目标函数,也就是策略梯度公式,如下: +$\qquad$ 要想适配连续动作空间,我们干脆就将选择动作的过程变成一个直接从状态映射到具体动作的函数 $\mu_\theta (s)$,其中 $\theta$ 表示模型的参数,这样一来就把求解 $Q$ 函数、贪心选择动作这两个过程合并成了一个函数,也就是我们常说的 $\text{Actor}$。有读者可能会问,为什么这里用 $\mu_\theta (s)$ 来表示策略而不是 $\text{Actor-Critic}$ 章节中提到的 $\pi_{\theta}(a|s)$ 呢?注意,这里 $\mu_\theta (s)$ 输出的是一个值,而 $\pi_{\theta}(a|s)$ 通常输出的是一个概率分布,这是两者的本质区别,与输出概率分布的随机性策略( $\text{stochastic policy}$ )不同,这里输出一个值的策略我们就称作确定性策略( $\text{deterministic policy}$ )。有了这个策略函数之后,类似地,我们也可以推导出 $\text{DPG}$ 算法的目标函数,也就是策略梯度公式,如式 $\text{(11.1)}$ 所示。 $$ +\tag{11.1} \nabla_\theta J(\theta) \approx \mathbb{E}_{s_t \sim \rho^\beta}\left[\left.\nabla_a Q\left(s_t, a\right)\right|_{a=\mu_\theta\left(s_t\right)} \nabla_\theta \mu_\theta\left(s_t\right)\right] $$ -其中 $\rho^\beta$ 是策略的初始分布,用于探索状态空间,在实际应用中相当于网络模型的初始参数,读者可以不用关注。另外注意这里的 $Q(s_t, a)$ 表示的不是 $Q$函数,跟 $\text{Actor-Critic}$ 算法一样,即作为一个 $\text{Critic}$ 网络,将状态和动作作为输入,并且输出一个值。$\text{DDPG}$ 策略梯度公式的推导过程与 $\text{Actor-Critic}$ 算法的推导过程虽然有所区别,但整体上是非常相似的,感兴趣的读者可以查询相关资料或者自行推导一下,这里就不再赘述了。 +$\qquad$ 其中 $\rho^\beta$ 是策略的初始分布,用于探索状态空间,在实际应用中相当于网络模型的初始参数,读者可以不用关注。另外注意这里的 $Q(s_t, a)$ 表示的不是 $Q$函数,跟 $\text{Actor-Critic}$ 算法一样,即作为一个 $\text{Critic}$ 网络,将状态和动作作为输入,并且输出一个值。$\text{DDPG}$ 策略梯度公式的推导过程与 $\text{Actor-Critic}$ 算法的推导过程虽然有所区别,但整体上是非常相似的,感兴趣的读者可以查询相关资料或者自行推导一下,这里就不再赘述了。 ## DDPG 算法 -有了 $\text{DPG}$ 算法的铺垫之后,我们再来看看 $\text{DDPG}$ 算法。$\text{DDPG}$ 算法的 “深度” 其实很简单,它就体现在于 $\text{DPG}$ 算法中使用 `Actor` 和 $\text{Critic}$ 两个网络来分别表示策略函数(确定性策略)和值函数,它们可以是线性模型或浅层神经网络。而DDPG算法采用深度神经网络来近似 `Actor` 和$\text{Critic}$,使得算法可以处理更复杂的任务和高维的状态空间。用现在更流行的话讲,$\text{DDPG}$ 算法同 $\text{DPG}$ 算法相比,就是使用了更大的模型。除此之外,$\text{DDPG}$ 算法还有一些其他的改进,例如使用了经验回放、目标网络等 $\text{DQN}$ 算法中的一些技巧。因此,$\text{DDPG}$ 算法更像是将 $\text{DPG}$ 思路引入到了 $\text{DQN}$ 算法中,而不是简单的将 $\text{DPG}$ 算法扩展到了深度神经网络上。另外,$\text{DDPG}$ 算法还有一项重要的贡献,就是引入了噪声网络来增加策略的探索性,即在训练过程中采用了一种确定性策略加噪声的方式。即在Actor网络的输出动作上加入一定的噪声,使得策略在训练过程中具有一定的探索性,有助于探索更广泛的动作空间。 +$\qquad$ 有了 $\text{DPG}$ 算法的铺垫之后,我们再来看看 $\text{DDPG}$ 算法。$\text{DDPG}$ 算法的 “深度” 其实很简单,它就体现在于 $\text{DPG}$ 算法中使用 $\text{Actor}$ 和 $\text{Critic}$ 两个网络来分别表示策略函数(确定性策略)和值函数,它们可以是线性模型或浅层神经网络。而DDPG算法采用深度神经网络来近似 $\text{Actor}$ 和$\text{Critic}$,使得算法可以处理更复杂的任务和高维的状态空间。用现在更流行的话讲,$\text{DDPG}$ 算法同 $\text{DPG}$ 算法相比,就是使用了更大的模型。除此之外,$\text{DDPG}$ 算法还有一些其他的改进,例如使用了经验回放、目标网络等 $\text{DQN}$ 算法中的一些技巧。因此,$\text{DDPG}$ 算法更像是将 $\text{DPG}$ 思路引入到了 $\text{DQN}$ 算法中,而不是简单的将 $\text{DPG}$ 算法扩展到了深度神经网络上。另外,$\text{DDPG}$ 算法还有一项重要的贡献,就是引入了噪声网络来增加策略的探索性,即在训练过程中采用了一种确定性策略加噪声的方式。即在Actor网络的输出动作上加入一定的噪声,使得策略在训练过程中具有一定的探索性,有助于探索更广泛的动作空间。 -这里读者顺便插一句题外话,回顾到目前为止的所有章节内容,不知道读者有没有发现,其实我们发现在强化学习基础算法的研究改进当中,无外乎几个亘古不变的主题:一是**如何提高对值函数的估计**,保证其准确性,即尽量无偏且低方差,例如最开始的用深度神经网络替代简单的 $Q$ 表、结合蒙特卡洛和时序差分的 $TD(\lambda)$ 、引入目标网络以及广义优势估计等等;二是**如何提高探索以及平衡探索-利用的问题**,尤其在探索性比较差的确定性策略中,例如$\text{DQN}$和$\text{DDPG}$算法都会利用各种技巧来提高探索,例如经验回放、$\varepsilon$-greedy 策略、噪声网络等等。这两个问题是强化学习算法的基础核心问题,希望能够给读者在学习和研究的过程中带来一定的启发。 +$\qquad$ 这里读者顺便插一句题外话,回顾到目前为止的所有章节内容,不知道读者有没有发现,其实我们发现在强化学习基础算法的研究改进当中,无外乎几个亘古不变的主题:一是**如何提高对值函数的估计**,保证其准确性,即尽量无偏且低方差,例如最开始的用深度神经网络替代简单的 $Q$ 表、结合蒙特卡洛和时序差分的 $\text{TD}(\lambda)$ 、引入目标网络以及广义优势估计等等;二是**如何提高探索以及平衡探索-利用的问题**,尤其在探索性比较差的确定性策略中,例如 $\text{DQN}$ 和 $\text{DDPG}$ 算法都会利用各种技巧来提高探索,例如经验回放、$\varepsilon-\text{greedy}$ 策略、噪声网络等等。这两个问题是强化学习算法的基础核心问题,希望能够给读者在学习和研究的过程中带来一定的启发。 -回到正题,由于目标网络、经验回放前面章节都讲过了,这里就略过,我们讲讲 $\text{DDPG}$ 引入的噪声。其实引入噪声的方法在前面 `Noisy DQN` 算法中就讲到了,只是 `Noisy DQN` 算法是在网络中引入噪声,而 $\text{DDPG}$ 算法是在输出动作上引入噪声。本质上来讲,引入噪声的作用就是为了在不破坏系统的前提下,提高系统运行的抗干扰性。这跟我们生活中打疫苗是类似的,通常我们会将灭活的病毒也就是疫苗注入到体内,引发免疫系统的警觉,从而提高免疫系统的抗干扰性,即提高我们身体的免疫力。这里疫苗就相当于轻微的噪声,如果免疫系统一直没见过这种噪声,那么一旦遇到真正的病毒之后是很有可能崩溃的,反之如果经常接触这种轻微的噪声,那么免疫系统就会逐渐适应,从而提高抗干扰性。又好比我们平时做的消防演练,虽然平时的演练都不是真正意义上的灾害,但经过熟练的演练之后一旦遇到真正的灾害不说从容应对,至少也不会过于慌乱了。再次回归正题,$\text{DDPG}$ 算法是在输出动作上引入噪声的,由于 $\mu_\theta (s)$ 输出的是单个值,其实最简单的方式就是在输出的值上加上一个随机数,这个随机数可以是正态分布的(即高斯噪声),也可以是均匀分布的,只要能够保证这个随机数的值不要过大就行。 +$\qquad$ 回到正题,由于目标网络、经验回放前面章节都讲过了,这里就略过,我们讲讲 $\text{DDPG}$ 引入的噪声。其实引入噪声的方法在前面 $\text{Noisy DQN}$ 算法中就讲到了,只是 $\text{Noisy DQN}$ 算法是在网络中引入噪声,而 $\text{DDPG}$ 算法是在输出动作上引入噪声。本质上来讲,引入噪声的作用就是为了在不破坏系统的前提下,提高系统运行的抗干扰性。这跟我们生活中打疫苗是类似的,通常我们会将灭活的病毒也就是疫苗注入到体内,引发免疫系统的警觉,从而提高免疫系统的抗干扰性,即提高我们身体的免疫力。这里疫苗就相当于轻微的噪声,如果免疫系统一直没见过这种噪声,那么一旦遇到真正的病毒之后是很有可能崩溃的,反之如果经常接触这种轻微的噪声,那么免疫系统就会逐渐适应,从而提高抗干扰性。又好比我们平时做的消防演练,虽然平时的演练都不是真正意义上的灾害,但经过熟练的演练之后一旦遇到真正的灾害不说从容应对,至少也不会过于慌乱了。 -当然简单的噪声引入除了简单这一个优点之外,可能剩下的全都是缺点了,因此在 $\text{DDPG}$ 算法中使用的其实是一种叫做 `Ornstein-Uhlenbeck` 的噪声,简称 `OU` 噪声。`OU` 噪声是一种具有回归特性的随机过程,其与高斯噪声相比的优点在于: +$\qquad$ 再次回归正题,$\text{DDPG}$ 算法是在输出动作上引入噪声的,由于 $\mu_\theta (s)$ 输出的是单个值,其实最简单的方式就是在输出的值上加上一个随机数,这个随机数可以是正态分布的(即高斯噪声),也可以是均匀分布的,只要能够保证这个随机数的值不要过大就行。 -* **探索性**:`OU` 噪声具有持续的、自相关的特性。相比于独立的高斯噪声,`OU` 噪声更加平滑,并且在训练过程中更加稳定。这种平滑特性使得OU噪声有助于探索更广泛的动作空间,并且更容易找到更好的策略。 -* **控制幅度**:`OU` 噪声可以通过调整其参数来控制噪声的幅度。在 $\text{DDPG}$ 算法中,可以通过调整 `OU` 噪声的方差来控制噪声的大小,从而平衡探索性和利用性。较大的方差会增加探索性,而较小的方差会增加利用性。 -* **稳定性**:`OU` 噪声的回归特性使得噪声在训练过程中具有一定的稳定性。相比于纯粹的随机噪声,在 $\text{DDPG}$ 算法中使用`OU` 噪声可以更好地保持动作的连续性,避免剧烈的抖动,从而使得训练过程更加平滑和稳定。 -* **可控性**:由于`OU` 噪声具有回归特性,它在训练过程中逐渐回归到均值,因此可以控制策略的探索性逐渐减小。这种可控性使得在训练的早期增加探索性,然后逐渐减小探索性,有助于更有效地进行训练。 +$\qquad$ 当然简单的噪声引入除了简单这一个优点之外,可能剩下的全都是缺点了,因此在 $\text{DDPG}$ 算法中使用的其实是一种叫做 $\text{Ornstein-Uhlenbeck}$ 的噪声,简称 $\text{OU}$ 噪声。$\text{OU}$ 噪声是一种具有回归特性的随机过程,其与高斯噪声相比的优点在于: -总的来说,`OU` 噪声作为 $\text{DDPG}$ 算法中的一种探索策略,具有平滑、可控、稳定等优点,使得算法能够更好地在连续动作空间中进行训练,探索更广泛的动作空间,并找到更优的策略。它是 $\text{DDPG}$ 算法成功应用于连续动作空间问题的重要因素之一。虽然它有这么多的优点,实际上在简单的环境中,它跟使用简单的高斯噪声甚至不用噪声的效果是差不多的,只有在复杂的环境中才会体现出来区别。因此,如果读者在实际应用中面临的问题比较简单,可以不用OU噪声,而是使用高斯噪声或者不用噪声即可,这样可以减少算法的复杂度,加快算法的收敛速度,正所谓 “杀鸡焉用牛刀”。 +* **探索性**:$\text{OU}$ 噪声具有持续的、自相关的特性。相比于独立的高斯噪声,$\text{OU}$ 噪声更加平滑,并且在训练过程中更加稳定。这种平滑特性使得OU噪声有助于探索更广泛的动作空间,并且更容易找到更好的策略。 +* **控制幅度**:$\text{OU}$ 噪声可以通过调整其参数来控制噪声的幅度。在 $\text{DDPG}$ 算法中,可以通过调整 $\text{OU}$ 噪声的方差来控制噪声的大小,从而平衡探索性和利用性。较大的方差会增加探索性,而较小的方差会增加利用性。 +* **稳定性**:$\text{OU}$ 噪声的回归特性使得噪声在训练过程中具有一定的稳定性。相比于纯粹的随机噪声,在 $\text{DDPG}$ 算法中使用$\text{OU}$ 噪声可以更好地保持动作的连续性,避免剧烈的抖动,从而使得训练过程更加平滑和稳定。 +* **可控性**:由于$\text{OU}$ 噪声具有回归特性,它在训练过程中逐渐回归到均值,因此可以控制策略的探索性逐渐减小。这种可控性使得在训练的早期增加探索性,然后逐渐减小探索性,有助于更有效地进行训练。 -`OU` 噪声主要由两个部分组成:随机高斯噪声和回归项,其数学定义如下: +$\qquad$ 总的来说,$\text{OU}$ 噪声作为 $\text{DDPG}$ 算法中的一种探索策略,具有平滑、可控、稳定等优点,使得算法能够更好地在连续动作空间中进行训练,探索更广泛的动作空间,并找到更优的策略。它是 $\text{DDPG}$ 算法成功应用于连续动作空间问题的重要因素之一。虽然它有这么多的优点,实际上在简单的环境中,它跟使用简单的高斯噪声甚至不用噪声的效果是差不多的,只有在复杂的环境中才会体现出来区别。因此,如果读者在实际应用中面临的问题比较简单,可以不用OU噪声,而是使用高斯噪声或者不用噪声即可,这样可以减少算法的复杂度,加快算法的收敛速度,正所谓 “杀鸡焉用牛刀”。 + +$\qquad$ $\text{OU}$ 噪声主要由两个部分组成:随机高斯噪声和回归项,其数学定义如式 $\text{(11.2)}$ 所示。 $$ +\tag{11.2} d x_t=\theta\left(\mu-x_t\right) d t+\sigma d W_t $$ -其中 $x_t$ 是OU过程在时间 $t$ 的值,即当前的噪声值,这个 $t$ 也是强化学习中的时步 (time step)。$\mu$ 是回归到的均值,表示噪声在长时间尺度上的平均值。$\theta$ 是 `OU` 过程的回归速率,表示噪声向均值回归的速率。$\sigma$ 是 `OU` 过程的扰动项,表示随机高斯噪声的标准差。$dW_t$ 是布朗运动(Brownian motion)或者维纳过程(Wiener process),是一个随机项,表示随机高斯噪声的微小变化。在实际应用中,我们只需要调整 $\mu$ 和 $\sigma$ 就可以了,$\theta$ 通常是固定的,而 $dW_t$ 是随机项,我们也不需要关注。尽管如此,需要调整的参数还是有点多,这也是为什么 $\text{DDPG}$ 算法的调参比较麻烦的原因之一。 +$\qquad$ 其中 $x_t$ 是 $\text{OU}$ 过程在时间 $t$ 的值,即当前的噪声值,这个 $t$ 也是强化学习中的时步( $\text{time step}$ )。$\mu$ 是回归到的均值,表示噪声在长时间尺度上的平均值。$\theta$ 是 $\text{OU}$ 过程的回归速率,表示噪声向均值回归的速率。$\sigma$ 是 $\text{OU}$ 过程的扰动项,表示随机高斯噪声的标准差。$dW_t$ 是布朗运动( $\text{Brownian motion}$ )或者维纳过程( $\text{Wiener process}$ ),是一个随机项,表示随机高斯噪声的微小变化。在实际应用中,我们只需要调整 $\mu$ 和 $\sigma$ 就可以了,$\theta$ 通常是固定的,而 $dW_t$ 是随机项,我们也不需要关注。尽管如此,需要调整的参数还是有点多,这也是为什么 $\text{DDPG}$ 算法的调参比较麻烦的原因之一。 ## DDPG 算法的优缺点 -总的来说,$\text{DDPG}$ 算法的优点主要有: +$\qquad$ 总的来说,$\text{DDPG}$ 算法的优点主要有: -* **适用于连续动作空间**:DDPG算法采用了确定性策略来选择动作,这使得它能够直接处理连续动作空间的问题。相比于传统的随机策略,确定性策略更容易优化和学习,因为它不需要进行动作采样,h缓解了在连续动作空间中的高方差问题。 -* **高效的梯度优化**:DDPG算法使用策略梯度方法进行优化,其梯度更新相对高效,并且能够处理高维度的状态空间和动作空间。同时,通过Actor-Critic结构,算法可以利用值函数来辅助策略的优化,提高算法的收敛速度和稳定性。 +* **适用于连续动作空间**:$\text{DDPG}$ 算法采用了确定性策略来选择动作,这使得它能够直接处理连续动作空间的问题。相比于传统的随机策略,确定性策略更容易优化和学习,因为它不需要进行动作采样,h缓解了在连续动作空间中的高方差问题。 +* **高效的梯度优化**:$\text{DDPG}$ 算法使用策略梯度方法进行优化,其梯度更新相对高效,并且能够处理高维度的状态空间和动作空间。同时,通过 $\text{Actor-Critic}$ 结构,算法可以利用值函数来辅助策略的优化,提高算法的收敛速度和稳定性。 * **经验回放和目标网络**:这是老生常谈的内容了,经验回放机制可以减少样本之间的相关性,提高样本的有效利用率,并且增加训练的稳定性。目标网络可以稳定训练过程,避免值函数估计和目标值之间的相关性问题,从而提高算法的稳定性和收敛性。 -而缺点在于: +$\qquad$ 而缺点在于: * **只适用于连续动作空间**:这既是优点,也是缺点。 -* **高度依赖超参数**:$\text{DDPG}$ 算法中有许多超参数需要进行调整,除了一些 $\text{DQN}$的算法参数例如学习率、批量大小、目标网络的更新频率等,还需要调整一些 `OU` 噪声的参数 +* **高度依赖超参数**:$\text{DDPG}$ 算法中有许多超参数需要进行调整,除了一些 $\text{DQN}$的算法参数例如学习率、批量大小、目标网络的更新频率等,还需要调整一些 $\text{OU}$ 噪声的参数 调整这些超参数并找到最优的取值通常是一个挑战性的任务,可能需要大量的实验和经验。 * **高度敏感的初始条件**:$\text{DDPG}$ 算法对初始条件非常敏感。初始策略和值函数的参数设置可能会影响算法的收敛性和性能,需要仔细选择和调整。 * 容易陷入局部最优:由于采用了确定性策略,可能会导致算法陷入局部最优,难以找到全局最优策略。为了增加探索性,需要采取一些措施,如加入噪声策略或使用其他的探索方法。 -可以看到,$\text{DDPG}$ 算法的优点可能掩盖不了它众多的缺点,尤其对于初学者来说,调参是一个非常头疼的问题,因此在实际应用中,同样情况下可能会选择更加简单的 $\text{PPO}$ 算法会来得更加容易一些。当然,对于一些熟练的调参大侠来说,$\text{DDPG}$ 算法以及相关改进版本的算法也是值得尝试的,毕竟它们在实际应用中的效果还是非常不错的。 +$\qquad$ 可以看到,$\text{DDPG}$ 算法的优点可能掩盖不了它众多的缺点,尤其对于初学者来说,调参是一个非常头疼的问题,因此在实际应用中,同样情况下可能会选择更加简单的 $\text{PPO}$ 算法会来得更加容易一些。当然,对于一些熟练的调参大侠来说,$\text{DDPG}$ 算法以及相关改进版本的算法也是值得尝试的,毕竟它们在实际应用中的效果还是非常不错的。 ## TD3 算法 -我们知道 $\text{DDPG}$ 算法的缺点太多明显,因此后来有人对其进行了改进,这就是我们接下来要介绍的 `TD3` 算法。`TD3` 算法,英文全称为 `Twin Delayed DDPG`,中文全称为双延迟确定性策略梯度算法。相对于 $\text{DDPG}$ 算法,`TD3` 算法的改进主要做了三点重要的改进,一是 双 $Q$ 网络,体现在名字中的 `Twin`,二是 延迟更新,体现在名字中的 `Delayed`,三是 躁声正则(`Noise Regularisation`),下面我们分别来看一下。 +$\qquad$ 我们知道 $\text{DDPG}$ 算法的缺点太多明显,因此后来有人对其进行了改进,这就是我们接下来要介绍的 $\text{TD3}$ 算法。$\text{TD3}$ 算法,英文全称为 $\text{twin delayed DDPG}$,中文全称为双延迟确定性策略梯度算法。相对于 $\text{DDPG}$ 算法,$\text{TD3}$ 算法的改进主要做了三点重要的改进,一是 双 $Q$ 网络,体现在名字中的 $\text{twin}$,二是 延迟更新,体现在名字中的 $\text{delayed}$,三是 躁声正则( $\text{noise regularisation}$ ),下面我们分别来看一下。 ### 双 Q 网络 -双 $Q$ 网络的思想其实很简单,就是在 $\text{DDPG}$ 算法中的 $\text{Critic}$ 网络上再加一层,这样就形成了两个 $\text{Critic}$ 网络,分别记为 $Q_{\omega_1}$ 和 $Q_{\omega_2}$,其中 $\omega_1$ 和 $\omega_2$ 分别表示两个网络的参数。这样一来,我们就可以得到两个 $Q$ 值,分别记为 $Q_{\omega_1}(s_t, a_t)$ 和 $Q_{\omega_2}(s_t, a_t)$, -然后我们在计算 `TD` 误差的时候,就可以取两个 $Q$ 值中较小的那个,即: +$\qquad$ 双 $Q$ 网络的思想其实很简单,就是在 $\text{DDPG}$ 算法中的 $\text{Critic}$ 网络上再加一层,这样就形成了两个 $\text{Critic}$ 网络,分别记为 $Q_{\omega_1}$ 和 $Q_{\omega_2}$,其中 $\omega_1$ 和 $\omega_2$ 分别表示两个网络的参数。这样一来,我们就可以得到两个 $Q$ 值,分别记为 $Q_{\omega_1}(s_t, a_t)$ 和 $Q_{\omega_2}(s_t, a_t)$。然后我们在计算 $\text{TD}$ 误差的时候,就可以取两个 $Q$ 值中较小的那个,如式 $\text{11.3}$ 所示。 $$ +\tag{11.3} \begin{aligned} L(\omega_1) &= \mathbb{E}_{s_t, a_t, r_{t+1}, s_{t+1} \sim D}\left[\left(Q_{\omega_1}(s_t, a_t) - y_t\right)^2\right] \\ y_t &= r_{t+1} + \gamma \min_{i=1,2} Q_{\omega_i}(s_{t+1}, \mu_{\theta}(s_{t+1})) \\ \end{aligned} $$ -其中 $L$ 表示损失函数,同理,我们也可以得到另一个 $\text{Critic}$ 网络的损失函数 $L(\omega_2)$,即: +$\qquad$ 其中 $L$ 表示损失函数,同理,我们也可以得到另一个 $\text{Critic}$ 网络的损失函数 $L(\omega_2)$,如式 $\text{(11.4)}$ 所示。 $$ +\tag{11.4} \begin{aligned} L(\omega_2) &= \mathbb{E}_{s_t, a_t, r_{t+1}, s_{t+1} \sim D}\left[\left(Q_{\omega_2}(s_t, a_t) - y_t\right)^2\right] \\ y_t &= r_{t+1} + \gamma \min_{i=1,2} Q_{\omega_i}(s_{t+1}, \mu_{\theta}(s_{t+1})) \\ \end{aligned} $$ -细心的读者会发现,这跟 `Double DQN` 的原理是一样的,只不过 `Double DQN` 是在 $Q$ 网络上做文章,而 `TD3` 算法是在 $\text{Critic}$ 网络上做文章。这样做的好处是可以减少 $Q$ 值的过估计,从而提高算法的稳定性和收敛性。 +$\qquad$ 细心的读者会发现,这跟 $\text{Double DQN}$ 的原理是一样的,只不过 $\text{Double DQN}$ 是在 $Q$ 网络上做文章,而 $\text{TD3}$ 算法是在 $\text{Critic}$ 网络上做文章。这样做的好处是可以减少 $Q$ 值的过估计,从而提高算法的稳定性和收敛性。 ### 延迟更新 -延迟更新更像是一种实验技巧,即在训练中 `Actor` 的更新频率要低于 $\text{Critic}$ 的更新频率。在学习过程中,$\text{Critic}$ 是不断更新的,可以想象一下,假设在某个时刻 `Actor` 好不容易达到一个最高点,这个时候 $\text{Critic}$ 又更新了,那么 `Actor` 的最高点就被打破了,这样一来 `Actor` 就会不断地追逐 $\text{Critic}$,这样就会造成误差的过分累积,进而导致 `Actor` 的训练不稳定,甚至可能会发散。因此,为了避免这种情况,我们就可以在训练中让 `Actor` 的更新频率低于 $\text{Critic}$ 的更新频率,这样一来 `Actor` 的更新就会比较稳定,不会受到 $\text{Critic}$ 的影响,从而提高算法的稳定性和收敛性。举个不太恰当的例子,$\text{Critic}$ 就好比领导,`Actor`则好比员工,领导不断给员工下达目标,员工不断地去完成目标,如果领导的决策经常失误,那么员工就很容易像无头苍蝇一样不知道该完成哪些目标。因此,一个好的解决方式就是让领导学得比员工更快,领导学得更快了之后下达目标的失误率就会更低,这样员工就能够更好地完成目标了,从而提高整个团队的效率。在实践中,`Actor` 的更新频率一般要比 $\text{Critic}$ 的更新频率低一个数量级,例如 $\text{Critic}$ 每更新 10 次,`Actor` 只更新 1 次。 +$\qquad$ 延迟更新更像是一种实验技巧,即在训练中 $\text{Actor}$ 的更新频率要低于 $\text{Critic}$ 的更新频率。在学习过程中,$\text{Critic}$ 是不断更新的,可以想象一下,假设在某个时刻 $\text{Actor}$ 好不容易达到一个最高点,这个时候 $\text{Critic}$ 又更新了,那么 $\text{Actor}$ 的最高点就被打破了,这样一来 $\text{Actor}$ 就会不断地追逐 $\text{Critic}$,这样就会造成误差的过分累积,进而导致 $\text{Actor}$ 的训练不稳定,甚至可能会发散。因此,为了避免这种情况,我们就可以在训练中让 $\text{Actor}$ 的更新频率低于 $\text{Critic}$ 的更新频率,这样一来 $\text{Actor}$ 的更新就会比较稳定,不会受到 $\text{Critic}$ 的影响,从而提高算法的稳定性和收敛性。 + +$\qquad$ 举个不太恰当的例子,$\text{Critic}$ 就好比领导,$\text{Actor}$ 则好比员工,领导不断给员工下达目标,员工不断地去完成目标,如果领导的决策经常失误,那么员工就很容易像无头苍蝇一样不知道该完成哪些目标。因此,一个好的解决方式就是让领导学得比员工更快,领导学得更快了之后下达目标的失误率就会更低,这样员工就能够更好地完成目标了,从而提高整个团队的效率。在实践中,$\text{Actor}$ 的更新频率一般要比 $\text{Critic}$ 的更新频率低一个数量级,例如 $\text{Critic}$ 每更新 $\text{10}$ 次,$\text{Actor}$ 只更新 $\text{1}$ 次。 ### 躁声正则 -更准确地说,在原论文中不叫噪声正则,而是目标策略平滑正则化(`Target Policy Smoothing Regularization`),意思都是一样的,只是笔者在表述的时候做了简化。在延迟更新中,我们的主要思想是通过提高 $\text{Critic}$ 的更新频率来减少值函数的估计误差,也就是“降低领导决策的失误率”。但是这样其实是治标不治本的做法,因为它只是让 $\text{Critic}$ 带来的误差不要过分地影响到了 `Actor`,而没有考虑改进 $\text{Critic}$ 本身的稳定性。因此,我们也可以给 $\text{Critic}$ 引入一个噪声提高其抗干扰性,这样一来就可以在一定程度上提高 $\text{Critic}$ 的稳定性,从而进一步提高算法的稳定性和收敛性。注意,这里的噪声是在 $\text{Critic}$ 网络上引入的,而不是在输出动作上引入的,因此它跟 $\text{DDPG}$ 算法中的噪声是不一样的。具体来说,我们可以在计算 `TD` 误差的时候,给目标值 $y$ 加上一个噪声,并且为了让噪声不至于过大,还增加了一个裁剪(clip),即: +$\qquad$ 更准确地说,在原论文中不叫噪声正则,而是目标策略平滑正则化( $\text{Target Policy Smoothing Regularization}$ ),意思都是一样的,只是笔者在表述的时候做了简化。在延迟更新中,我们的主要思想是通过提高 $\text{Critic}$ 的更新频率来减少值函数的估计误差,也就是“降低领导决策的失误率”。但是这样其实是治标不治本的做法,因为它只是让 $\text{Critic}$ 带来的误差不要过分地影响到了 $\text{Actor}$,而没有考虑改进 $\text{Critic}$ 本身的稳定性。 + +$\qquad$ 因此,我们也可以给 $\text{Critic}$ 引入一个噪声提高其抗干扰性,这样一来就可以在一定程度上提高 $\text{Critic}$ 的稳定性,从而进一步提高算法的稳定性和收敛性。注意,这里的噪声是在 $\text{Critic}$ 网络上引入的,而不是在输出动作上引入的,因此它跟 $\text{DDPG}$ 算法中的噪声是不一样的。具体来说,我们可以在计算 $\text{TD}$ 误差的时候,给目标值 $y$ 加上一个噪声,并且为了让噪声不至于过大,还增加了一个裁剪( $\text{clip}$ ),如式 $\text{(11.5)}$ 所示。 $$ +\tag{11.5} y=r+\gamma Q_{\theta^{\prime}}\left(s^{\prime}, \pi_{\phi^{\prime}}\left(s^{\prime}\right)+\epsilon\right) \epsilon \sim \operatorname{clip}(N(0, \sigma),-c, c) $$ -其中 $N(0, \sigma)$ 表示均值为 0,方差为 $\sigma$ 的高斯噪声,$\epsilon$ 表示噪声,$\operatorname{clip}$ 表示裁剪函数,即将噪声裁剪到 $[-c, c]$ 的范围内,$c$ 是一个超参数,用于控制噪声的大小。可以看到,这里噪声更像是一种正则化的方式,使得值函数更新更加平滑,因此笔者称之为噪声正则。 +$\qquad$ 其中 $N(0, \sigma)$ 表示均值为 $\text{0}$,方差为 $\sigma$ 的高斯噪声,$\epsilon$ 表示噪声,$\operatorname{clip}$ 表示裁剪函数,即将噪声裁剪到 $[-c, c]$ 的范围内,$c$ 是一个超参数,用于控制噪声的大小。可以看到,这里噪声更像是一种正则化的方式,使得值函数更新更加平滑,因此笔者称之为噪声正则。 ## 实战:DDPG 算法 diff --git a/docs/ch12/main.md b/docs/ch12/main.md index b70bd68..2bfd917 100644 --- a/docs/ch12/main.md +++ b/docs/ch12/main.md @@ -1,76 +1,86 @@ # PPO 算法 -本章我们开始讲解强化学习中最最最泛用的 `PPO` 算法,这个算法在强化学习领域的研究和应用中有着非常重要的地位,可以说是强化学习领域的一个里程碑式的算法。`PPO` 算法的全称是 `Proximal Policy Optimization`,中文全称为近端策略优化算法,是一种基于策略梯度的强化学习算法,由 `OpenAI` 的研究人员 `Schulman` 等人在2017年提出。`PPO` 算法的主要思想是通过在策略梯度的优化过程中引入一个重要性比率来限制策略更新的幅度,从而提高算法的稳定性和收敛性。`PPO` 算法的优点在于简单、易于实现、易于调参,而且在实际应用中的效果也非常好,因此在强化学习领域得到了广泛的应用。`PPO` 的前身是 `TRPO` 算法,旨在克服 `TRPO` 算法中的一些计算上的困难和训练上的不稳定性。`TRPO` 是一种基于策略梯度的算法,它通过定义策略更新的信赖域来保证每次更新的策略不会太远离当前的策略,以避免过大的更新引起性能下降。然而,`TRPO` 算法需要解决一个复杂的约束优化问题,计算上较为繁琐。本书主要出于实践考虑,这种太复杂且几乎已经被淘汰的 `TRPO` 算法就不再赘述了,需要深入研究或者工作面试的读者可以自行查阅相关资料。 接下来将详细讲解 `PPO` 算法的原理和实现,希望能够帮助读者更好地理解和掌握这个算法。 +$\qquad$ 本章我们开始讲解强化学习中最最最泛用的 $\text{PPO}$ 算法($\text{proximal policy optimization}$),这个算法在强化学习领域的研究和应用中有着非常重要的地位,可以说是强化学习领域的一个里程碑式的算法。$\text{PPO}$ 算法是一种基于策略梯度的强化学习算法,由 $\text{OpenAI}$ 的研究人员 $\text{Schulman}$ 等人在 $\text{2017}$ 年提出。$\text{PPO}$ 算法的主要思想是通过在策略梯度的优化过程中引入一个重要性比率来限制策略更新的幅度,从而提高算法的稳定性和收敛性。$\text{PPO}$ 算法的优点在于简单、易于实现、易于调参,而且在实际应用中的效果也非常好,因此在强化学习领域得到了广泛的应用。 + +$\qquad$ $\text{PPO}$ 的前身是 $\text{TRPO}$ 算法,旨在克服 $\text{TRPO}$ 算法中的一些计算上的困难和训练上的不稳定性。$\text{TRPO}$ 是一种基于策略梯度的算法,它通过定义策略更新的信赖域来保证每次更新的策略不会太远离当前的策略,以避免过大的更新引起性能下降。然而,$\text{TRPO}$ 算法需要解决一个复杂的约束优化问题,计算上较为繁琐。本书主要出于实践考虑,这种太复杂且几乎已经被淘汰的 $\text{TRPO}$ 算法就不再赘述了,需要深入研究或者工作面试的读者可以自行查阅相关资料。 接下来将详细讲解 $\text{PPO}$ 算法的原理和实现,希望能够帮助读者更好地理解和掌握这个算法。 ## 重要性采样 -在将 `PPO` 算法之前,我们需要铺垫一个概念,那就是重要性采样(importance sampling)。重要性采样是一种估计随机变量的期望或者概率分布的统计方法。它的原理也很简单,假设有一个函数 $f(x)$ ,需要从分布 $p(x)$ 中采样来计算其期望值,但是在某些情况下我们可能很难从 $p(x)$ 中采样,这个时候我们可以从另一个比较容易采样的分布 $q(x)$ 中采样,来间接地达到从 $p(x)$ 中采样的效果。这个过程的数学表达式如下: +$\qquad$ 在将 $\text{PPO}$ 算法之前,我们需要铺垫一个概念,那就是重要性采样( $\text{importance sampling}$ )。重要性采样是一种估计随机变量的期望或者概率分布的统计方法。它的原理也很简单,假设有一个函数 $f(x)$ ,需要从分布 $p(x)$ 中采样来计算其期望值,但是在某些情况下我们可能很难从 $p(x)$ 中采样,这个时候我们可以从另一个比较容易采样的分布 $q(x)$ 中采样,来间接地达到从 $p(x)$ 中采样的效果。这个过程的数学表达式如式 $\text{(12.1)}$ 所示。 $$ +\tag{12.1} E_{p(x)}[f(x)]=\int_{a}^{b} f(x) \frac{p(x)}{q(x)} q(x) d x=E_{q(x)}\left[f(x) \frac{p(x)}{q(x)}\right] $$ -对于离散分布的情况,可以表达为: +$\qquad$ 对于离散分布的情况,可以表达为式 $\text{(12.2)}$ 。 $$ +\tag{12.2} E_{p(x)}[f(x)]=\frac{1}{N} \sum f\left(x_{i}\right) \frac{p\left(x_{i}\right)}{q\left(x_{i}\right)} $$ -这样一来原问题就变成了只需要从 $q(x)$ 中采样,然后计算两个分布之间的比例 $\frac{p(x)}{q(x)}$ 即可,这个比例称之为**重要性权重**。换句话说,每次从 $q(x)$ 中采样的时候,都需要乘上对应的重要性权重来修正采样的偏差,即两个分布之间的差异。当然这里可能会有一个问题,就是当 $p(x)$ 不为 $0$ 的时候,$q(x)$ 也不能为 $0$,但是他们可以同时为 $0$ ,这样 $\frac{p(x)}{q(x)}$ 依然有定义,具体的原理由于并不是很重要,因此就不展开讲解了。 +$\qquad$ 这样一来原问题就变成了只需要从 $q(x)$ 中采样,然后计算两个分布之间的比例 $\frac{p(x)}{q(x)}$ 即可,这个比例称之为**重要性权重**。换句话说,每次从 $q(x)$ 中采样的时候,都需要乘上对应的重要性权重来修正采样的偏差,即两个分布之间的差异。当然这里可能会有一个问题,就是当 $p(x)$ 不为 $\text{0}$ 的时候,$q(x)$ 也不能为 $\text{0}$,但是他们可以同时为 $\text{0}$ ,这样 $\frac{p(x)}{q(x)}$ 依然有定义,具体的原理由于并不是很重要,因此就不展开讲解了。 -通常来讲,我们把这个 $p(x)$ 叫做目标分布, $q(x)$ 叫做提议分布(`Proposal Distribution`), 那么重要性采样对于提议分布有什么要求呢? 其实理论上 $q(x)$ 可以是任何比较好采样的分布,比如高斯分布等等,但在实际训练的过程中,聪明的读者也不难想到我们还是希望 $q(x)$ 尽可能 $p(x)$,即重要性权重尽可能接近于 $1$ 。我们可以从方差的角度来具体展开讲讲为什么需要重要性权重尽可能等于 $1$,回忆一下方差公式: +$\qquad$ 通常来讲,我们把这个 $p(x)$ 叫做目标分布, $q(x)$ 叫做提议分布( $\text{Proposal Distribution}$ ), 那么重要性采样对于提议分布有什么要求呢? 其实理论上 $q(x)$ 可以是任何比较好采样的分布,比如高斯分布等等,但在实际训练的过程中,聪明的读者也不难想到我们还是希望 $q(x)$ 尽可能 $p(x)$,即重要性权重尽可能接近于 $\text{1}$ 。我们可以从方差的角度来具体展开讲讲为什么需要重要性权重尽可能等于 $1$ ,回忆一下方差公式,如式 $\text{(12.3)}$ 所示。 $$ +\tag{12.3} Var_{x \sim p}[f(x)]=E_{x \sim p}\left[f(x)^{2}\right]-\left(E_{x \sim p}[f(x)]\right)^{2} $$ -结合重要性采样公式,我们可以得到: +$\qquad$ 结合重要性采样公式,我们可以得到式 $\text{(12.4)}$ 。 $$ +\tag{12.4} Var_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]=E_{x \sim q}\left[\left(f(x) \frac{p(x)}{q(x)}\right)^{2}\right]-\left(E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]\right)^{2} \\ =E_{x \sim p}\left[f(x)^{2} \frac{p(x)}{q(x)}\right]-\left(E_{x \sim p}[f(x)]\right)^{2} $$ -不难看出,当 $q(x)$ 越接近 $p(x)$ 的时候,方差就越小,也就是说重要性权重越接近于 $1$ 的时候,反之越大。 +$\qquad$ 不难看出,当 $q(x)$ 越接近 $p(x)$ 的时候,方差就越小,也就是说重要性权重越接近于 $1$ 的时候,反之越大。 -其实重要性采样也是蒙特卡洛估计的一部分,只不过它是一种比较特殊的蒙特卡洛估计,允许我们在复杂问题中利用已知的简单分布进行采样,从而避免了直接采样困难分布的问题,同时通过适当的权重调整,可以使得蒙特卡洛估计更接近真实结果。 +$\qquad$ 其实重要性采样也是蒙特卡洛估计的一部分,只不过它是一种比较特殊的蒙特卡洛估计,允许我们在复杂问题中利用已知的简单分布进行采样,从而避免了直接采样困难分布的问题,同时通过适当的权重调整,可以使得蒙特卡洛估计更接近真实结果。 ## PPO 算法 -既然重要性采样本质上是一种在某些情况下更优的蒙特卡洛估计,再结合前面 Actor-Critic 章节中我们讲到策略梯度算法的高方差主要来源于 `Actor` 的策略梯度采样估计,读者应该不难猜出 `PPO` 算法具体是优化在什么地方了。没错,`PPO` 算法的核心思想就是通过重要性采样来优化原来的策略梯度估计,其目标函数表示如下: +$\qquad$ 既然重要性采样本质上是一种在某些情况下更优的蒙特卡洛估计,再结合前面 $\text{Actor-Critic}$ 章节中我们讲到策略梯度算法的高方差主要来源于 $\text{Actor}$ 的策略梯度采样估计,读者应该不难猜出 $\text{PPO}$ 算法具体是优化在什么地方了。没错,$\text{PPO}$ 算法的核心思想就是通过重要性采样来优化原来的策略梯度估计,其目标函数表示如式 $\text{(12.5)}$ 所示。 $$ +\tag{12.5} \begin{gathered} J^{\mathrm{TRPO}}(\theta)=\mathbb{E}\left[r(\theta) \hat{A}_{\theta_{\text {old }}}(s, a)\right] \\ r(\theta)=\frac{\pi_\theta(a \mid s)}{\pi_{\theta_{\text {old }}}(a \mid s)} \end{gathered} $$ -这个损失就是置信区间的部分,一般称作 `TRPO` 损失。这里旧策略分布 $\pi_{\theta_{\text {old }}}(a \mid s)$ 就是重要性权重部分的目标分布 $p(x)$ ,目标分布是很难采样的,所以在计算重要性权重的时候这部分通常用上一次与环境交互采样中的概率分布来近似。相应地, $\pi_\theta(a \mid s)$ 则是提议分布,即通过当前网络输出的 `probs` 形成的 `Catagorical` 分布(离散动作)或者 `Gaussian` 分布(连续动作)。 +$\qquad$ 这个损失就是置信区间的部分,一般称作 $\text{TRPO}$ 损失。这里旧策略分布 $\pi_{\theta_{\text {old }}}(a \mid s)$ 就是重要性权重部分的目标分布 $p(x)$ ,目标分布是很难采样的,所以在计算重要性权重的时候这部分通常用上一次与环境交互采样中的概率分布来近似。相应地, $\pi_\theta(a \mid s)$ 则是提议分布,即通过当前网络输出的 `probs` 形成的类别分布 $\text{Catagorical}$ 分布(离散动作)或者 $\text{Gaussian}$ 分布(连续动作)。 -读者们可能对这个写法感到陌生,似乎少了 `Actor-Critic` 算法中的 `logit_p`,但其实这个公式等价于: +$\qquad$ 读者们可能对这个写法感到陌生,似乎少了 $\text{Actor-Critic}$ 算法中的 `logit_p`,但其实这个公式等价于式 $\text{(12.6)}$ 。 $$ +\tag{12.6} J^{\mathrm{TRPO}}(\theta)=E_{\left(s_t, a_t\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_\theta\left(a_t \mid s_t\right)}{p_{\theta^{\prime}}\left(a_t \mid s_t\right)} A^{\theta^{\prime}}\left(s_t, a_t\right) \nabla \log p_\theta\left(a_t^n \mid s_t^n\right)\right] $$ -换句话说,本质上 `PPO` 算法就是在 `Actor-Critic` 算法的基础上增加了重要性采样的约束而已,从而确保每次的策略梯度估计都不会过分偏离当前的策略,也就是减少了策略梯度估计的方差,从而提高算法的稳定性和收敛性。 +$\qquad$ 换句话说,本质上 $\text{PPO}$ 算法就是在 $\text{Actor-Critic}$ 算法的基础上增加了重要性采样的约束而已,从而确保每次的策略梯度估计都不会过分偏离当前的策略,也就是减少了策略梯度估计的方差,从而提高算法的稳定性和收敛性。 -前面我们提到过,重要性权重最好尽可能地等于 $1$,而在训练过程中这个权重它是不会自动地约束到 $1$ 附近的,因此我们需要在损失函数中加入一个约束项或者说正则项,保证重要性权重不会偏离 $1$ 太远。具体的约束方法有很多种,比如 `KL` 散度、`JS` 散度等等,但通常我们会使用两种约束方法,一种是 `Clip` 约束 ,另一种是 `KL` 散度。`Clip` 约束定义如下: +$\qquad$ 前面我们提到过,重要性权重最好尽可能地等于 $\text{1}$ ,而在训练过程中这个权重它是不会自动地约束到 $1$ 附近的,因此我们需要在损失函数中加入一个约束项或者说正则项,保证重要性权重不会偏离 $\text{1}$ 太远。具体的约束方法有很多种,比如 $\text{KL}$ 散度、$\text{JS}$ 散度等等,但通常我们会使用两种约束方法,一种是 $\text{clip}$ 约束 ,另一种是 $\text{KL}$ 散度。$\text{clip}$ 约束定义如式 $\text{(12.7)}$ 所示。 $$ +\tag{12.7} J_{\text {clip }}(\theta)=\hat{\mathbb{E}}_{t}\left[\min \left(r_{t}(\theta) \hat{A}_{t}, \operatorname{clip}\left(r_{t}(\theta), 1-\epsilon, 1+\epsilon\right) \hat{A}_{t}\right)\right] $$ -其中 $\epsilon$ 是一个较小的超参,一般取 $0.1$ 左右。这个 `Clip` 约束的意思就是始终将重要性权重 $r(\theta)$ 裁剪在 $1$ 的邻域范围内,实现起来非常简单。 +$\qquad$ 其中 $\epsilon$ 是一个较小的超参,一般取 $\text{0.1}$ 左右。这个 $\text{clip}$ 约束的意思就是始终将重要性权重 $r(\theta)$ 裁剪在 $1$ 的邻域范围内,实现起来非常简单。 -另一种 `KL` 约束定义如下: +$\qquad$ 另一种 $\text{KL}$ 约束定义如式 $\text{(12.8)}$ 所示。 $$ +\tag{12.8} J^{KL}(\theta)=\hat{\mathbb{E}}_t\left[\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old }}}\left(a_t \mid s_t\right)} \hat{A}_t-\beta \mathrm{KL}\left[\pi_{\theta_{\text {old }}}\left(\cdot \mid s_t\right), \pi_\theta\left(\cdot \mid s_t\right)\right]\right] $$ -`KL` 约束一般也叫 `KL-Penalty`,它的意思是在 `TRPO` 损失的基础上,加上一个 `KL` 散度的惩罚项,这个惩罚项的系数 $\beta$ 一般取 $0.01$ 左右。这个惩罚项的作用也是保证每次更新的策略分布都不会偏离上一次的策略分布太远,从而保证重要性权重不会偏离 $1$ 太远。在实践中,我们一般用 `Clip` 约束,因为它更简单,计算成本较低,而且效果也更好。 +$\text{KL}$ 约束一般也叫 $\text{KL-penalty}$,它的意思是在 $\text{TRPO}$ 损失的基础上,加上一个 $\text{KL}$ 散度的惩罚项,这个惩罚项的系数 $\beta$ 一般取 $0.01$ 左右。这个惩罚项的作用也是保证每次更新的策略分布都不会偏离上一次的策略分布太远,从而保证重要性权重不会偏离 $1$ 太远。在实践中,我们一般用 $\text{clip}$ 约束,因为它更简单,计算成本较低,而且效果也更好。 ## 一个常见的误区 diff --git a/docs/ch13/main.md b/docs/ch13/main.md index 0c4a78b..2b64b97 100644 --- a/docs/ch13/main.md +++ b/docs/ch13/main.md @@ -1,134 +1,151 @@ # SAC 算法 -本章开始介绍最后一种经典的策略梯度算法,即 `Soft Actor-Critic` 算法,简写为 `SAC`。`SAC` 算法是一种基于最大熵强化学习的策略梯度算法,它的目标是最大化策略的熵,从而使得策略更加鲁棒。SAC 算法的核心思想是,通过最大化策略的熵,使得策略更加鲁棒,经过超参改良后的 `SAC` 算法在稳定性方面是可以与 `PPO` 算法华山论剑的。 +$\qquad$ 本章开始介绍最后一种经典的策略梯度算法,即 $\text{Soft Actor-Critic}$ 算法,简写为 $\text{SAC}$ 。$\text{SAC}$ 算法是一种基于最大熵强化学习的策略梯度算法,它的目标是最大化策略的熵,从而使得策略更加鲁棒。$\text{SAC}$ 算法的核心思想是,通过最大化策略的熵,使得策略更加鲁棒,经过超参改良后的 $\text{SAC}$ 算法在稳定性方面是可以与 $\text{PPO}$ 算法华山论剑的。注意,由于 $\text{SAC}$ 算法理论相对之前的算法要复杂一些,因此推导过程要多很多,但是最后的结果还是相对简洁的,因此读者可以根据自己的需求选择性阅读,只需要关注伪代码中变量的涵义以及结果公式即可。 ## 最大熵强化学习 -由于 `SAC` 算法相比于之前的策略梯度算法独具一路,它走的是最大熵强化学习的路子,为了让读者更好地搞懂什么是 `SAC`。我们先介绍一下最大熵强化学习,然后从基于价值的 `Soft Q-Learning` 算法开始讲起。我们先回忆一下确定性策略和随机性策略,确定性策略是指在给定相同状态下,总是选择相同的动作,随机性策略则是在给定状态下可以选择多种可能的动作,不知道读者们有没有想过这两种策略在实践中有什么优劣呢?或者说哪种更好呢?这里我们先架空实际的应用场景,只总结这两种策略本身的优劣,首先看确定性策略: +$\qquad$ 由于 $\text{SAC}$ 算法相比于之前的策略梯度算法独具一路,它走的是最大熵强化学习的路子。为了让读者更好地搞懂什么是 $\text{SAC}$ ,我们先介绍一下最大熵强化学习,然后从基于价值的 $\text{Soft Q-Learning}$ 算法开始讲起。我们先回忆一下确定性策略和随机性策略,确定性策略是指在给定相同状态下,总是选择相同的动作,随机性策略则是在给定状态下可以选择多种可能的动作,不知道读者们有没有想过这两种策略在实践中有什么优劣呢?或者说哪种更好呢?这里我们先架空实际的应用场景,只总结这两种策略本身的优劣,首先看确定性策略: * 优势:**稳定性且可重复性**。由于策略是确定的,因此可控性也比较好,在一些简单的环境下,会更容易达到最优解,因为不会产生随机性带来的不确定性,实验也比较容易复现。 -* 劣势:**缺乏探索性**。由于策略是确定的,因此在一些复杂的环境下,可能会陷入局部最优解,无法探索到全局最优解,所以读者会发现目前所有的确定性策略算法例如 `DQN`、`DDPG` 等等,都会增加一些随机性来提高探索。此外,面对不确定性和噪音的环境时,确定性策略可能显得过于刻板,无法灵活地适应环境变化。 +* 劣势:**缺乏探索性**。由于策略是确定的,因此在一些复杂的环境下,可能会陷入局部最优解,无法探索到全局最优解,所以读者会发现目前所有的确定性策略算法例如 $\text{DQN}$ 、$\text{DDPG}$ 等等,都会增加一些随机性来提高探索。此外,面对不确定性和噪音的环境时,确定性策略可能显得过于刻板,无法灵活地适应环境变化。 -再看看随机性策略: +$\qquad$ 再看看随机性策略: * 优势:**更加灵活**。由于策略是随机的,这样能够在一定程度上探索未知的状态和动作,有助于避免陷入局部最优解,提高全局搜索的能力。在具有不确定性的环境中,随机性策略可以更好地应对噪音和不可预测的情况。 * 劣势:**不稳定**。正是因为随机,所以会导致策略的可重复性太差。另外,如果随机性太高,可能会导致策略的收敛速度较慢,影响效率和性能。 -不知道读者有没有发现,这里字里行间都透露着随机性策略相对于确定性策略来说存在碾压性的优势。为什么这么说呢?首先我们看看确定性策略的优点,其实这个优点也不算很大的优点,因为所有可行的算法虽然可能不能保证每次的结果都是一模一样的,但是也不会偏差得太过离谱,而且我们一般也不会对可复现性要求那么高,一定要精确到每个小数点都正确,因此容易复现本身就是个伪命题。其次,这里也说了在一些简单的环境中更容易达到最优解,简单的环境是怎么简单呢?可能就是在九宫格地图里面寻找最短路径或者石头剪刀布的那种程度,而实际的应用环境是不可能有这么简单的场景的。再看看随机性策略的缺点,其实也不算是什么缺点,因为在随机性策略中随机性是我们人为赋予的,换句话说就是可控的,反而相对来说是可控的稳定性。结合我们实际的生活经验,比如在和别人玩游戏对战的时候,是不是通常会觉得招式和套路比较多的人更难对付呢?因为即使是相同的情况,高手可能会有各种各样的方式来应对,反之如果对方只会一种打法,这样会很快让我们抓住破绽并击败对方。在强化学习中也是如此,我们会发现实际应用中,如果有条件的话,我们会尽量使用随机性策略,诸如`A2C`、`PPO`等等,因为它更加灵活,更加鲁棒,更加稳定。 +$\qquad$ 不知道读者有没有发现,这里字里行间都透露着随机性策略相对于确定性策略来说存在碾压性的优势。为什么这么说呢?首先我们看看确定性策略的优点,其实这个优点也不算很大的优点,因为所有可行的算法虽然可能不能保证每次的结果都是一模一样的,但是也不会偏差得太过离谱,而且我们一般也不会对可复现性要求那么高,一定要精确到每个小数点都正确,因此容易复现本身就是个伪命题。其次,这里也说了在一些简单的环境中更容易达到最优解,简单的环境是怎么简单呢?可能就是在九宫格地图里面寻找最短路径或者石头剪刀布的那种程度,而实际的应用环境是不可能有这么简单的场景的。 -然而,最大熵强化学习认为,即使我们目前有了成熟的随机性策略,即 `Actor-Critic`一类的算法,但是还是没有达到最优的随机。因此,它引入了一个信息熵的概念,在最大化累积奖励的同时最大化策略的熵,使得策略更加鲁棒,从而达到最优的随机性策略。我们先回顾一下标准的强化学习框架,其目标是得到最大化累积奖励的策略,即: +$\qquad$ 再看看随机性策略的缺点,其实也不算是什么缺点,因为在随机性策略中随机性是我们人为赋予的,换句话说就是可控的,反而相对来说是可控的稳定性。结合我们实际的生活经验,比如在和别人玩游戏对战的时候,是不是通常会觉得招式和套路比较多的人更难对付呢?因为即使是相同的情况,高手可能会有各种各样的方式来应对,反之如果对方只会一种打法,这样会很快让我们抓住破绽并击败对方。在强化学习中也是如此,我们会发现实际应用中,如果有条件的话,我们会尽量使用随机性策略,诸如 $\text{A2C}$ 、$\text{PPO}$ 等等,因为它更加灵活,更加鲁棒,更加稳定。 + +$\qquad$ 然而,最大熵强化学习认为,即使我们目前有了成熟的随机性策略,即 $\text{Actor-Critic}$ 一类的算法,但是还是没有达到最优的随机。因此,它引入了一个信息熵的概念,在最大化累积奖励的同时最大化策略的熵,使得策略更加鲁棒,从而达到最优的随机性策略。我们先回顾一下标准的强化学习框架,其目标是得到最大化累积奖励的策略,如式 $\text{(13.1)}$ 所示。 $$ +\tag{13.1} \pi^*=\arg \max _\pi \sum_t \mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \rho_\pi}\left[\gamma^t r\left(\mathbf{s}_t, \mathbf{a}_t\right)\right] $$ -而最大熵强化学习则是在这个基础上加上了一个信息熵的约束,即: +$\qquad$ 而最大熵强化学习则是在这个基础上加上了一个信息熵的约束,如式 $\text{(13.2)}$ 所示。 $$ +\tag{13.2} \pi_{\mathrm{MaxEnt}}^*=\arg \max _\pi \sum_t \mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \rho_\pi}\left[\gamma^t\left(r\left(\mathbf{s}_t, \mathbf{a}_t\right)+\alpha \mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right)\right)\right] $$ -其中 $\alpha$ 是一个超参,称作温度因子(`temperature`),用于平衡累积奖励和策略熵的比重。这里的 $\mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right)$ 就是策略的信息熵,定义如下: +$\qquad$ 其中 $\alpha$ 是一个超参,称作温度因子( $\text{temperature}$ ),用于平衡累积奖励和策略熵的比重。这里的 $\mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right)$ 就是策略的信息熵,定义如式 $\text{(13.3)}$ 所示。 $$ +\tag{13.3} \mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right)=-\sum_{\mathbf{a}_t} \pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \log \pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) $$ -它表示了随机策略 $\pi\left(\cdot \mid \mathbf{s}_t\right)$ 对应概率分布的随机程度,策略越随机,熵越大。后面我们可以发现,虽然理论推导起来比较复杂,但实际实践起来是比较简单的。 +$\qquad$ 它表示了随机策略 $\pi\left(\cdot \mid \mathbf{s}_t\right)$ 对应概率分布的随机程度,策略越随机,熵越大。后面我们可以发现,虽然理论推导起来比较复杂,但实际实践起来是比较简单的。 + ## Soft Q-Learning -前面小节中我们引入了带有熵的累积奖励期望,接下来我们需要基于这个重新定义的奖励来重新推导一下相关的量。后面我们会发现虽然推导起来比较复杂,但用代码实现起来是比较简单的,因为几乎跟传统的 `Q-Learning` 算法没有多大区别。因此着重于实际应用的同学可以直接跳过本小节的推导部分,直接看后面的算法实战部分。 +$\qquad$ 前面小节中我们引入了带有熵的累积奖励期望,接下来我们需要基于这个重新定义的奖励来重新推导一下相关的量。后面我们会发现虽然推导起来比较复杂,但用代码实现起来是比较简单的,因为几乎跟传统的 $\text{Q-Learning}$ 算法没有多大区别。因此着重于实际应用的同学可以直接跳过本小节的推导部分,直接看后面的算法实战部分。 -现在我们开始进行枯燥地推导过程了,首先是 `Q` 值函数和 `V` 值函数,我们先回顾一下传统的最优 `Q` 值函数的定义: +$\qquad$ 现在我们开始进行枯燥地推导过程了,首先是 $Q$ 值函数和 $V$ 值函数,我们先回顾一下传统的最优 $Q$ 值函数的定义,如式 $\text{(13.4)}$ 所示。 $$ +\tag{13.4} Q^*\left(\mathbf{s}_t, \mathbf{a}_t\right)=r_t+\mathbb{E}_{\left(\mathbf{s}_{t+1}, \ldots\right) \sim \rho_{\pi^*}}\left[\sum_{l=1}^{\infty} \gamma^l r_{t+l}\right] $$ -相应地,最优的 `V` 值函数只需要根据最优 `Q` 值函数取 `argmax` 即可: +$\qquad$ 相应地,最优的 $V$ 值函数只需要根据最优 $Q$ 值函数取 $\text{argmax}$ 即可,如式 $\text{(13.5)}$ 所示。 $$ +\tag{13.5} V^*\left(\mathbf{s}_t\right)=\max _{\mathbf{a}_t} Q^*\left(\mathbf{s}_t, \mathbf{a}_t\right) $$ -在最大熵强化学习中,我们需要重新定义最优 `Q` 值函数需要改成: +$\qquad$ 在最大熵强化学习中,我们需要重新定义最优 $Q$ 值函数需要改成式 $\text{(13.6)}$ 。 $$ +\tag{13.6} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)=r_t+\mathbb{E}_{\left(\mathbf{s}_{t+1}, \ldots\right) \sim \rho_{\pi_{\text {MaxEnt }}^*}}\left[\sum_{l=1}^{\infty} \gamma^l\left(r_{t+l}+\alpha \mathcal{H}\left(\pi_{\mathrm{MaxEnt}}^*\left(\cdot \mid \mathbf{s}_{t+l}\right)\right)\right)\right] $$ -即增加了一个熵的项,但是对应地最优 `V` 值函数就不能简单地取 `argmax` 了。但是根据贝尔曼方程,我们可以得到: - +$\qquad$ 即增加了一个熵的项,但是对应地最优 $V$ 值函数就不能简单地取 $\text{argmax}$ 了。但是根据贝尔曼方程,我们可以得到如式 $\text{(13.7)}$ 所示的关系。 $$ +\tag{13.7} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)=r_t+\gamma \mathbb{E}_{\mathbf{s}_{t+1} \sim p_{\mathrm{s}}, \mathbf{a}_{t+1} \sim p_{\mathrm{a}}}\left[Q_{\mathrm{soft}}^*\left(\mathbf{s}_{t+1}, \mathbf{a}_{t+1}\right)-\alpha \log \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_{t+1} \mid \mathbf{s}_{t+1}\right)\right] $$ -注意 `Q` 和 `V` 之间存在着线性关系,即: +$\qquad$ 注意 $Q$ 和 $V$ 之间存在着线性关系,如式 $\text{(13.8)}$ 所示。 $$ +\tag{13.8} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)=r_t+\gamma \mathbb{E}_{\mathbf{s}_{t+1} \sim p_{\mathrm{s}}}\left[V_{\mathrm{soft}}^*\left(\mathbf{s}_{t+1}\right)\right] $$ -根据这个关系就可以得到: +$\qquad$ 根据这个关系就可以得到式 $\text{(13.9)}$ 。 $$ +\tag{13.9} V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right)=\mathbb{E}_{\mathbf{a}_t \sim \pi_{\mathrm{MaxEnt}}^*}\left[Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)-\alpha \log \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_t \mid \mathbf{s}_t\right)\right] $$ -进一步地,可以得到: +$\qquad$ 进一步地,可以得到式 $\text{(13.10)}$ 。 $$ +\tag{13.10} V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right) \propto \alpha \log \int_{\mathcal{A}} \exp \left(\frac{1}{\alpha} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}^{\prime}\right)\right) d \mathbf{a}^{\prime} $$ -可能这一步的求解读者们理解起来有点困难,其实是这样的,在 `V`值到达最优即最大的时候,也就是$V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right)$,相当于 - -$Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)-\alpha \log \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$ 也是最大的,我们设这个最大值为 `c`,那么就可以得到: +$\qquad$ 可能这一步的求解读者们理解起来有点困难,其实是这样的,在 $V$ 值到达最优即最大的时候,也就是 $V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right)$ ,相当于 $Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right)-\alpha \log \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$ 也是最大的,我们设这个最大值为 $c$,那么就可以得到式 $\text{(13.11)}$ 。 $$ +\tag{13.11} \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_t \mid \mathbf{s}_t\right) = \exp \frac{1}{\alpha} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right) - \exp \frac{c}{\alpha} $$ -两边都对动作 $\mathbf{a}_t$ 积分之后,就可以得到: +$\qquad$ 两边都对动作 $\mathbf{a}_t$ 积分之后,就可以得到式 $\text{(13.12)}$ 。 $$ +\tag{13.12} \int_{\mathcal{A}} \pi_{\mathrm{MaxEnt}}^*\left(\mathbf{a}_t \mid \mathbf{s}_t\right) d \mathbf{a}_t = V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right) = \int_{\mathcal{A}} \exp \frac{1}{\alpha} Q_{\mathrm{soft}}^*\left(\mathbf{s}_t, \mathbf{a}_t\right) - \exp \frac{c}{\alpha} d \mathbf{a}_t $$ -这里策略分布对动作的积分其实就是等于值函数,去掉一些无关的常数项,就是上面我们得到的最终式子了。注意到,这里求解出来的 `V` 函数其实是一种 `SoftMax` 的形式,即: +$\qquad$ 这里策略分布对动作的积分其实就是等于值函数,去掉一些无关的常数项,就是上面我们得到的最终式子了。注意到,这里求解出来的 $V$ 函数其实是一种 $\text{softmax}$ 的形式,如式 $\text{(13.13)}$ 所示。 $$ +\tag{13.13} \operatorname{softmax}_{\mathbf{a}} f(\mathbf{a}):=\log \int \exp f(\mathbf{a}) d \mathbf{a} $$ -意思就是需要平滑地取最大值,而当 $\alpha \rightarrow 0$ 的时候,就退化成了传统的 `Q` 函数,对应的 `SoftMax` 也就变成了 `HardMax`,这也是为什么叫 `Soft` 的原因。这其实就是玻尔兹曼分布的一种形式,即给所有动作赋予一个非零的概率,让智能体倾向于学习到能够处理相应任务的所有行为,注意是所有。针对这个玻尔兹曼分布,原论文提出了一个 `energy-based policy` 的模型,感兴趣的读者可以深入了解,但由于对我们理解 `SAC` 算法并不是很重要,因此这里就不展开讲解了。 +$\qquad$ 意思就是需要平滑地取最大值,而当 $\alpha \rightarrow 0$ 的时候,就退化成了传统的 $Q$ 函数,对应的 $\text{softmax}$ 也就变成了 $\text{hardmax}$,这也是为什么叫 $\text{soft}$ 的原因。这其实就是玻尔兹曼分布的一种形式,即给所有动作赋予一个非零的概率,让智能体倾向于学习到能够处理相应任务的所有行为,注意是所有。针对这个玻尔兹曼分布,原论文提出了一个 $\text{energy-based policy}$ 的模型,感兴趣的读者可以深入了解,但由于对我们理解 $\text{SAC}$ 算法并不是很重要,因此这里就不展开讲解了。 -另外注意,其实这里的 $V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right)$ 是不太好算的,因为需要对整个动作空间积分然后进行 `SoftMax`,这个计算量是非常大的,因此也可以借助于 `PPO` 中用到的重要性采样,将其转化为一个包含 `Q` 函数的期望的形式,即: +$\qquad$ 另外注意,其实这里的 $V_{\mathrm{soft}}^*\left(\mathbf{s}_t\right)$ 是不太好算的,因为需要对整个动作空间积分然后进行 $\text{softmax}$,这个计算量是非常大的,因此也可以借助于 $\text{PPO}$ 中用到的重要性采样,将其转化为一个包含 $Q$ 函数的期望的形式,如式 $\text{(13.14)}$ 所示。 $$ +\tag{13.14} V_{\text {soft }}^\theta\left(\mathbf{s}_t\right)=\alpha \log \mathbb{E}_{q_{\mathrm{a}^{\prime}}}\left[\frac{\exp \left(\frac{1}{\alpha} Q_{\text {soft }}^\theta\left(\mathbf{s}_t, \mathbf{a}^{\prime}\right)\right)}{q_{\mathrm{a}^{\prime}}\left(\mathbf{a}^{\prime}\right)}\right] $$ -其中 $q_{\mathrm{a}^{\prime}}$ 一般用 `Categorical` 分布来表示,即:最后我们就可以得到 `Soft Q-Learning` 的损失函数了,即: +$\qquad$ 其中 $q_{\mathrm{a}^{\prime}}$ 一般用 $\text{Categorica}$ 分布来表示,最后我们就可以得到 $\text{Soft Q-Learning}$ 的损失函数了,如式 $\text{(13.15)}$ 所示。 $$ +\tag{13.15} J_Q(\theta)=\mathbb{E}_{\mathrm{s}_t \sim q_{s_t}, \mathrm{a}_t \sim q_{\mathrm{a}_t}}\left[\frac{1}{2}\left(\hat{Q}_{\mathrm{soft}}^{\bar{\theta}}\left(\mathrm{s}_t, \mathrm{a}_t\right)-Q_{\mathrm{soft}}^\theta\left(\mathrm{s}_t, \mathrm{a}_t\right)\right)^2\right] $$ -其中 $\hat{Q}_{\mathrm{soft}}^{\bar{\theta}}\left(\mathrm{s}_t, \mathrm{a}_t\right)=r_t+\gamma \mathbb{E}_{\mathrm{s}_{t+1} \sim p_{\mathrm{s}}}\left[V_{\mathrm{soft}}^{\bar{\theta}}\left(\mathrm{s}_{t+1}\right)\right]$ 表示目标网络的 `Q` 值。 +$\qquad$ 其中 $\hat{Q}_{\mathrm{soft}}^{\bar{\theta}}\left(\mathrm{s}_t, \mathrm{a}_t\right)=r_t+\gamma \mathbb{E}_{\mathrm{s}_{t+1} \sim p_{\mathrm{s}}}\left[V_{\mathrm{soft}}^{\bar{\theta}}\left(\mathrm{s}_{t+1}\right)\right]$ 表示目标网络的 $Q$ 值。 -这里还有一个问题,就是理论上直接从当前策略分布 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \propto \exp \left(\frac{1}{\alpha} Q_{\mathrm{soft}}^\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)\right)$ 中采样也是比较困难的,此时我们可以借助一个额外的采样网络。首先构建一个参数为 $\phi$ 的 $\mathbf{a}_t=f^\phi\left(\xi ; \mathbf{s}_t\right)$,这个网络可以在状态 $s_t$ 下,将一个服从任意分布的噪声样本 $\xi$ 映射到 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \propto \exp \left(\frac{1}{\alpha} Q_{\mathrm{soft}}^\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)\right)$,将 $\mathbf{a}_t=f^\phi\left(\xi ; \mathbf{s}_t\right)$ 的动作分布记为 $\pi^\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$,那么参数 $\phi$ 的更新目标就是让 $\pi^\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$ 尽可能接近 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$,这种方式很容易想到用 KL 散度来做,即: +$\qquad$ 这里还有一个问题,就是理论上直接从当前策略分布 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \propto \exp \left(\frac{1}{\alpha} Q_{\mathrm{soft}}^\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)\right)$ 中采样也是比较困难的,此时我们可以借助一个额外的采样网络。首先构建一个参数为 $\phi$ 的 $\mathbf{a}_t=f^\phi\left(\xi ; \mathbf{s}_t\right)$,这个网络可以在状态 $s_t$ 下,将一个服从任意分布的噪声样本 $\xi$ 映射到 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \propto \exp \left(\frac{1}{\alpha} Q_{\mathrm{soft}}^\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)\right)$,将 $\mathbf{a}_t=f^\phi\left(\xi ; \mathbf{s}_t\right)$ 的动作分布记为 $\pi^\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$,那么参数 $\phi$ 的更新目标就是让 $\pi^\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$ 尽可能接近 $\pi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)$,这种方式很容易想到用 KL 散度来做,如式 $\text{(13.16)}$ 所示。 $$ +\tag{13.16} J_\pi\left(\phi ; \mathbf{s}_t\right)=\mathrm{D}_{\mathrm{KL}}\left(\pi^\phi\left(\cdot \mid \mathbf{s}_t\right) \| \exp \left(\frac{1}{\alpha}\left(Q_{\mathrm{soft}}^\theta\left(\mathbf{s}_t, \cdot\right)-V_{\mathrm{soft}}^\theta\right)\right)\right) $$ -其梯度为: +$\qquad$ 其梯度如式 $\text{(13.17)}$ 所示。 $$ +\tag{13.17} \begin{aligned} \Delta f^\phi\left(\cdot ; \mathrm{s}_t\right)= & \mathbb{E}_{\mathbf{a}_t \sim \pi^\phi}\left[\left.\kappa\left(\mathbf{a}_t, f^\phi\left(\cdot ; \mathrm{s}_t\right)\right) \nabla_{\mathbf{a}^{\prime}} Q_{\mathrm{soft}}^\theta\left(\mathrm{s}_t, \mathrm{a}^{\prime}\right)\right|_{\mathbf{a}^{\prime}=\mathbf{a}_t}\right. \\ & \left.+\left.\alpha \nabla_{\mathbf{a}^{\prime}} \kappa\left(\mathbf{a}^{\prime}, f^\phi\left(\cdot ; \mathbf{s}_t\right)\right)\right|_{\mathbf{a}^{\prime}=\mathbf{a}_t}\right] @@ -137,43 +154,51 @@ $$ ## SAC -实际上 `SAC` 算法有两个版本,第一个版本是由 Tuomas Haarnoja 于 2018 年提出来的,论文名叫做 《Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor》,第二个版本是由 Tuomas Haarnoja 于 2019 年提出来的,论文名叫做《Soft Actor-Critic Algorithms and Applications》,一般称作 `SAC v2`。第二个版本主要在前一版本的基础上做了简化,并且实现了温度因子的自动调节,从而使得算法更加简单稳定。 +$\qquad$ 实际上 $\text{SAC}$ 算法有两个版本,第一个版本是由 $\text{Tuomas Haarnoja}$ 于 $\text{2018}$ 年提出来的,,第二个版本也是由 $\text{Tuomas Haarnoja}$ 于 $\text{2019}$ 年提出来的,一般称作 $\text{SAC v2}$。第二个版本主要在前一版本的基础上做了简化,并且实现了温度因子的自动调节,从而使得算法更加简单稳定。 -我们先讲讲第一版,第一版的 `SAC` 算法思想基本上是和 `Soft Q-Learning` 是特别相似的,只是额外增加了两个 `V` 值网络(即包含目标网络和当前网络)来估计价值。 +> ① Haarnoja T , Zhou A , Abbeel P ,et al.Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor.2018[2023-08-02].DOI:10.48550/arXiv.1801.01290. -`V` 网络的目标函数定义如下: +> ② Haarnoja T , Zhou A , Hartikainen K ,et al.Soft Actor-Critic Algorithms and Applications.2018[2023-08-02].DOI:10.48550/arXiv.1812.05905. + +$\qquad$ 我们先讲讲第一版,第一版的 $\text{SAC}$ 算法思想基本上是和 $\text{Soft Q-Learning} 是特别相似的,只是额外增加了两个 $V$ 值网络(即包含目标网络和当前网络)来估计价值。$V$ 网络的目标函数定义如式 $\text{(13.18)}$ 所示。 $$ +\tag{13.18} J_V(\psi)=\mathbb{E}_{\mathbf{s}_t \sim \mathcal{D}}\left[\frac{1}{2}\left(V_\psi\left(\mathbf{s}_t\right)-\mathbb{E}_{\mathbf{a}_t \sim \pi_\phi}\left[Q_\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)-\log \pi_\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)\right]\right)^2\right] $$ -其中 $\mathcal{D}$ 主要来自经验回放中的样本分布,其梯度为: +$\qquad$ 其中 $\mathcal{D}$ 主要来自经验回放中的样本分布,其梯度如式 $\text{(13.19)}$ 所示。 $$ +\tag{13.19} \hat{\nabla}_\psi J_V(\psi)=\nabla_\psi V_\psi\left(\mathbf{s}_t\right)\left(V_\psi\left(\mathbf{s}_t\right)-Q_\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)+\log \pi_\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)\right) $$ -`Soft Q` 函数的目标函数定义如下: +$\qquad$ $\text{Soft Q}$ 函数的目标函数定义如式 $\text{(13.20)}$ 所示。 $$ +\tag{13.20} J_Q(\theta)=\mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \mathcal{D}}\left[\frac{1}{2}\left(Q_\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)-\hat{Q}\left(\mathbf{s}_t, \mathbf{a}_t\right)\right)^2\right] $$ -对应梯度为: +$\qquad$ 对应梯度如式 $\text{(13.21)}$ 所示。 $$ +\tag{13.21} \hat{\nabla}_\theta J_Q(\theta)=\nabla_\theta Q_\theta\left(\mathbf{a}_t, \mathbf{s}_t\right)\left(Q_\theta\left(\mathbf{s}_t, \mathbf{a}_t\right)-r\left(\mathbf{s}_t, \mathbf{a}_t\right)-\gamma V_{\bar{\psi}}\left(\mathbf{s}_{t+1}\right)\right) $$ -策略的目标函数相比于 `Soft Q-Learning` 要更简洁一些,即: +$\qquad$ 策略的目标函数相比于 $\text{Soft Q-Learning}$ 要更简洁一些,如式 $\text{(13.22)}$ 所示。 $$ +\tag{13.22} J_\pi(\phi)=\mathbb{E}_{\mathbf{s}_t \sim \mathcal{D}, \epsilon_t \sim \mathcal{N}}\left[\log \pi_\phi\left(f_\phi\left(\epsilon_t ; \mathbf{s}_t\right) \mid \mathbf{s}_t\right)-Q_\theta\left(\mathbf{s}_t, f_\phi\left(\epsilon_t ; \mathbf{s}_t\right)\right)\right] $$ -对应梯度为: +$\qquad$ 其梯度如式 $\text{(13.23)}$ 所示。 $$ +\tag{13.23} \begin{aligned} & \hat{\nabla}_\phi J_\pi(\phi)=\nabla_\phi \log \pi_\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right) \\ & \quad+\left(\nabla_{\mathbf{a}_t} \log \pi_\phi\left(\mathbf{a}_t \mid \mathbf{s}_t\right)-\nabla_{\mathbf{a}_t} Q\left(\mathbf{s}_t, \mathbf{a}_t\right)\right) \nabla_\phi f_\phi\left(\epsilon_t ; \mathbf{s}_t\right) @@ -182,39 +207,47 @@ $$ ## 自动调节温度因子 -注意第一个版本和 `Soft Q-learning` 都存在一个温度因子 $\alpha$ 的超参,并且这个超参是比较敏感的,第二个版本则设计了一个可以自动调节温度因子的方法。首先回顾一下累积奖励期望公式: +$\qquad$ 本小节主要讲解如何推导出自动调节因子的版本,整体推导的思路其实很简单,就是转换成规划问题,然后用动态规划、拉格朗日乘子法等方法简化求解,只关注结果的读者可以直接跳到本小节最后一个关于温度调节因子 $\alpha$ 的梯度下降公式即可。 + +$\qquad$ 注意第一个版本和 $\text{Soft Q-Learning}$ 都存在一个温度因子 $\alpha$ 的超参,并且这个超参是比较敏感的,第二个版本则设计了一个可以自动调节温度因子的方法。首先回顾一下累积奖励期望公式,如式 $\text{(13.24)}$ 所示。 $$ +\tag{13.24} \pi_{\mathrm{MaxEnt}}^*=\arg \max _\pi \sum_t \mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \rho_\pi}\left[\gamma^t\left(r\left(\mathbf{s}_t, \mathbf{a}_t\right)+\alpha \mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right)\right)\right] $$ -其中左边项是奖励部分,右边项是熵部分,我们的目标是同时最大化这两个部分,但是由于这两个部分的量纲不同,因此需要引入一个温度因子 $\alpha$ 来平衡这两个部分。第二版 `SAC` 的思路就是,我们可以把熵的部分转换成一个约束项,即只需要满足: +$\qquad$ 其中左边项是奖励部分,右边项是熵部分,我们的目标是同时最大化这两个部分,但是由于这两个部分的量纲不同,因此需要引入一个温度因子 $\alpha$ 来平衡这两个部分。第二版 $\text{SAC}$ 的思路就是,我们可以把熵的部分转换成一个约束项,即只需要满足式 $\text{(13.25)}$ 即可。 $$ +\tag{13.25} \mathcal{H}\left(\pi\left(\cdot \mid \mathbf{s}_t\right)\right) = \mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \rho_\pi}\left[-\log \left(\pi_t\left(\mathbf{a}_t \mid \mathbf{s}_t\right)\right)\right] \geq \mathcal{H}_0 $$ -换句话说,我们只需要让策略的熵大于一个固定的值 $\mathcal{H}_0$ 即可,这样就可以不需要温度因子了。这样一来我们的目标就变成了在最小期望熵的约束条件下最大化累积奖励期望,即: +$\qquad$ 换句话说,我们只需要让策略的熵大于一个固定的值 $\mathcal{H}_0$ 即可,这样就可以不需要温度因子了。这样一来我们的目标就变成了在最小期望熵的约束条件下最大化累积奖励期望,如式 $\text{(13.26)}$ 所示。 $$ +\tag{13.26} \max _{\pi_{0: T}} \mathbb{E}_{\rho_\pi}\left[\sum_{t=0}^T r\left(\mathbf{s}_t, \mathbf{a}_t\right)\right] \text { s.t. } \mathbb{E}_{\left(\mathbf{s}_t, \mathbf{a}_t\right) \sim \rho_\pi}\left[-\log \left(\pi_t\left(\mathbf{a}_t \mid \mathbf{s}_t\right)\right)\right] \geq \mathcal{H}_0 \quad \forall t $$ -可以看出,当我们忽略掉这个约束条件时,就变成了一个标准的强化学习问题。这里将策略 $\pi$ 拆分成了每一时刻的策略 $\pi_{o: T}=\left\{\pi_1, \ldots, \pi_T\right\}$,以便于求解每一时刻 $t$ 的最优温度因子 $\alpha^*_t$。由于每一时刻 $t$ 的策略只会对未来奖励造成影响(马尔可夫性质),因此可以利用动态规划的思想,自顶向下(从后往前)对策略进行求解,即分解为: +$\qquad$ 可以看出,当我们忽略掉这个约束条件时,就变成了一个标准的强化学习问题。这里将策略 $\pi$ 拆分成了每一时刻的策略 $\pi_{o: T}=\left\{\pi_1, \ldots, \pi_T\right\}$,以便于求解每一时刻 $t$ 的最优温度因子 $\alpha^*_t$。由于每一时刻 $t$ 的策略只会对未来奖励造成影响(马尔可夫性质),因此可以利用动态规划的思想,自顶向下(从后往前)对策略进行求解,即分解为式 $\text{(13.27)}$ 。 $$ +\tag{13.27} \underbrace{\max _{\pi_0}(\mathbb{E}\left[r\left(s_0, a_0\right)\right]+\underbrace{\max _{\pi_1}(\mathbb{E}[\ldots]+\underbrace{\max _{\pi_T} \mathbb{E}\left[r\left(s_T, a_T\right)\right]}_{ \text { 第一次最大(子问题一) }})}_{\text { 倒数第二次最大 }})}_{\text { 倒数第一次最大 }} $$ -这样一来我们只需要求出第一个子问题,即: +$\qquad$ 这样一来我们只需要求出第一个子问题,即式 $\text{(13.28)}$ 。 $$ +\tag{13.28} \max _{\pi_T} \mathbb{E}_{\left(\mathbf{s}_T, \mathbf{a}_T\right) \sim \rho_{\pi_T}}\left[r\left(\mathbf{s}_T, \mathbf{a}_T\right)\right] \text { s.t. } \mathbb{E}_{\left(\mathbf{s}_T, \mathbf{a}_T\right) \sim \rho_{\pi_T}}\left[-\log \left(\pi_t\left(\mathbf{a}_T \mid \mathbf{s}_T\right)\right)\right] \geq \mathcal{H}_0 \quad \forall t $$ -这个问题可以通过拉格朗日乘子法求解,首先我们做一个简化,即: +$\qquad$ 这个问题可以通过拉格朗日乘子法求解,首先我们做一个简化,如式 $\text{(13.29)}$ 所示。 $$ +\tag{13.29} \begin{aligned} & h\left(\pi_T\right)=\mathcal{H}\left(\pi_T\right)-\mathcal{H}_0=\mathbb{E}_{\left(s_T, a_T\right) \sim \rho_\pi}\left[-\log \pi_T\left(a_T \mid s_T\right)\right]-\mathcal{H}_0 \\ & f\left(\pi_T\right)= \begin{cases}\mathbb{E}_{\left(s_T, a_T\right) \sim \rho_\pi}\left[r\left(s_T, a_T\right)\right], & \text { if } h\left(\pi_T\right) \geq 0 \\ @@ -222,29 +255,33 @@ $$ \end{aligned} $$ -进而原问题简化为: +$\qquad$ 进而原问题简化为式 $\text{(13.30)}$ 。 $$ +\tag{13.30} \operatorname{maximize} f\left(\pi_T\right) \text { s.t. } h\left(\pi_T\right) \geq 0 $$ -通过乘上一个拉格朗日乘子 $\alpha_T$ (也叫做对偶变量,也相当于温度因子),我们可以得到: +$\qquad$ 通过乘上一个拉格朗日乘子 $\alpha_T$ (也叫做对偶变量,也相当于温度因子),我们可以得到式 $\text{(13.31)}$ 。 $$ +\tag{13.31} L\left(\pi_T, \alpha_T\right)=f\left(\pi_T\right)+\alpha_T h\left(\pi_T\right) $$ -当 $\alpha_T=0$ 时,可得到 $L(\pi_T, 0) = f\left(\pi_T\right)$,当 $\alpha_T \rightarrow \infty$ 时,可得到 $L\left(\pi_T, \alpha_T\right) = \alpha_T h\left(\pi_T\right)$,一般来说 $h\left(\pi_T\right) < 0$, 因此 $L\left(\pi_T, \alpha_T\right) = \alpha_T h\left(\pi_T\right) = f\left(\pi_T\right)$。 +$\qquad$ 当 $\alpha_T=0$ 时,可得到 $L(\pi_T, 0) = f\left(\pi_T\right)$,当 $\alpha_T \rightarrow \infty$ 时,可得到 $L\left(\pi_T, \alpha_T\right) = \alpha_T h\left(\pi_T\right)$,一般来说 $h\left(\pi_T\right) < 0$, 因此 $L\left(\pi_T, \alpha_T\right) = \alpha_T h\left(\pi_T\right) = f\left(\pi_T\right)$。 -我们的目标是最大化 $f\left(\pi_T\right)$,即: +$\qquad$ 我们的目标是最大化 $f\left(\pi_T\right)$,如式 $\text{(13.32)}$ 所示。 $$ +\tag{13.32} \max _{\pi_T} f\left(\pi_T\right)=\min _{\alpha_T \geq 0} \max _{\pi_T} L\left(\pi_T, \alpha_T\right) $$ -因此原问题可以转化为以下的对偶问题: +$\qquad$ 因此原问题可以转化为相对易解的对偶问题,如式 $\text{(13.33)}$ 所示。 $$ +\tag{13.33} \begin{aligned} \max _{\pi_T} \mathbb{E}\left[r\left(s_T, a_T\right)\right] & =\max _{\pi_T} f\left(\pi_T\right) \\ & =\min _{\alpha_T \geq 0} \max _{\pi_T} L\left(\pi_T, \alpha_T\right) \\ @@ -255,42 +292,48 @@ $$ \end{aligned} $$ -首先固定住温度因子 $\alpha_T$,就能够得到最佳策略 $\pi_T^*$ 使得 $f\left(\pi_T^*\right)$ 最大化,即: +$\qquad$ 首先固定住温度因子 $\alpha_T$,就能够得到最佳策略 $\pi_T^*$ 使得 $f\left(\pi_T^*\right)$ 最大化,如式 $\text{(13.34)}$ 所示。 $$ +\tag{13.34} \pi_T^*=\arg \max _{\pi_T} \mathbb{E}_{\left(s_T, a_T\right) \sim \rho_\pi}\left[r\left(s_T, a_T\right)+\alpha_T \mathcal{H}\left(\pi_T\right)-\alpha_T \mathcal{H}_0\right] $$ -求出最佳策略之后,就可以求出最佳的温度因子 $\alpha_T^*$,即: +$\qquad$ 求出最佳策略之后,就可以求出最佳的温度因子 $\alpha_T^*$,如式 $\text{(13.35)}$ 所示。 $$ +\tag{13.35} \alpha_T^*=\arg \min _{\alpha_T \geq 0} \mathbb{E}_{\left(s_T, a_T\right) \sim \rho_\pi}\left[r\left(s_T, a_T\right)+\alpha_T \mathcal{H}\left(\pi_T^*\right)-\alpha_T \mathcal{H}_0\right] $$ -这样回到第一个子问题,即在时刻 $T$ 下的奖励期望: +$\qquad$ 这样回到第一个子问题,即在时刻 $T$ 下的奖励期望,如式 $\text{(13.36)}$ 所示。 $$ +\tag{13.36} \max _{\pi_T} \mathbb{E}\left[r\left(s_T, a_T\right)\right]=\mathbb{E}_{\left(s_T, a_T\right) \sim \rho_{\pi^*}}\left[r\left(s_T, a_T\right)+\alpha_T^* \mathcal{H}\left(\pi_T^*\right)-\alpha_T^* \mathcal{H}_0\right] $$ -接下来我们就可以求解第二个子问题,即在时刻 $T-1$ 下的奖励期望。回顾一下 `Soft Q` 函数公式,即: +$\qquad$ 接下来我们就可以求解第二个子问题,即在时刻 $T-1$ 下的奖励期望。回顾一下 $\text{Soft Q}$ 函数公式,如式 $\text{(13.37)}$ 所示。 $$ +\tag{13.37} \begin{aligned} Q_{T-1}\left(s_{T-1}, a_{T-1}\right) & =r\left(s_{T-1}, a_{T-1}\right)+\mathbb{E}\left[Q\left(s_T, a_T\right)-\alpha_T \log \pi\left(a_T \mid s_T\right)\right] \\ & =r\left(s_{T-1}, a_{T-1}\right)+\mathbb{E}\left[r\left(s_T, a_T\right)\right]+\alpha_T \mathcal{H}\left(\pi_T\right) \end{aligned} $$ -代入第一个子问题的最优策略 $\pi_T^*$ 之后,就可以得到: +$\qquad$ 代入第一个子问题的最优策略 $\pi_T^*$ 之后,就可以得到式 $\text{(13.38)}$ 。 $$ +\tag{13.38} Q_{T-1}^*\left(s_{T-1}, a_{T-1}\right)=r\left(s_{T-1}, a_{T-1}\right)+\max _{\pi_T} \mathbb{E}\left[r\left(s_T, a_T\right)\right]+\alpha_T \mathcal{H}\left(\pi_T^*\right) $$ -同样地,利用拉格朗日乘子法,就能得到第二个子问题即 $T-1$ 下的奖励期望最大化为: +$\qquad$ 同样地,利用拉格朗日乘子法,就能得到第二个子问题即 $T-1$ 下的奖励期望最大化为式 $\text{(13.39)}$ 。 $$ +\tag{13.39} \begin{aligned} & \max _{\pi_{T-1}}\left(\mathbb{E}\left[r\left(s_{T-1}, a_{T-1}\right)\right]+\max _{\pi_T} \mathbb{E}\left[r\left(s_T, a_T\right]\right)\right. \\ & =\max _{\pi_{T-1}}\left(Q_{T-1}^*\left(s_{T-1}, a_{T-1}\right)-\alpha_T^* \mathcal{H}\left(\pi_T^*\right)\right) \\ @@ -299,20 +342,23 @@ $$ \end{aligned} $$ -进而得到: +$\qquad$ 进而得到式 $\text{(13.40)}$ 。 $$ +\tag{13.40} \begin{aligned} & \pi_{T-1}^*=\arg \max _{\pi_{T-1}} \mathbb{E}_{\left(s_{T-1}, a_{T-1}\right) \sim \rho_\pi}\left[Q_{T-1}^*\left(s_{T-1}, a_{T-1}\right)+\alpha_{T-1} \mathcal{H}\left(\pi_{T-1}\right)-\alpha_{T-1} \mathcal{H}_0\right] \\ & \alpha_{T-1}^*=\arg \min _{\alpha_{T-1} \geq 0} \mathbb{E}_{\left(s_{T-1}, a_{T-1}\right) \sim \rho_{\pi^*}}\left[\alpha_{T-1} \mathcal{H}\left(\pi_{T-1}^*\right)-\alpha_{T-1} \mathcal{H}_0\right] \end{aligned} $$ -我们会发现第二个子问题的答案形式其实和第一个子问题是一样的,依此类推,我们就可以得到温度因子的损失函数为: +$\qquad$ 我们会发现第二个子问题的答案形式其实和第一个子问题是一样的,依此类推,我们就可以得到温度因子的损失函数,如式 $\text{(13.41)}$ 所示。 $$ +\tag{13.41} J(\alpha)=\mathbb{E}_{a_t \sim \pi_t}\left[-\alpha \log \pi_t\left(a_t \mid s_t\right)-\alpha \mathcal{H}_0\right] $$ -这样一来就能实现温度因子的自动调节了。这一版本由于引入了温度因子的自动调节,因此不需要额外的 `V` 值网络,直接使用两个 `Q` 网络(包含目标网络和当前网络)来作为 `Critic` 估计价值即可。 +$\qquad$ 这样一来就能实现温度因子的自动调节了。这一版本由于引入了温度因子的自动调节,因此不需要额外的 $V$ 值网络,直接使用两个 $Q$ 网络(包含目标网络和当前网络)来作为 $\text{Critic}$ 估计价值即可。 + ## 实战:SAC 算法 \ No newline at end of file diff --git a/docs/ch2/main.md b/docs/ch2/main.md index 17130fd..90b33a5 100644 --- a/docs/ch2/main.md +++ b/docs/ch2/main.md @@ -12,7 +12,7 @@
图 2.1 马尔可夫决策过程中智能体与环境的交互过程
-如图 2.1 所示,它描述了马尔可夫决策过程中智能体与环境的交互过程。确切地说,智能体与环境之间是在一系列**离散的时步** (time step)交互的,一般用 $t$ 来表示,$t=0,1,2,\cdots$。在每个时步 $t$, 智能体会观测或者接收到当前环境的状态 $s_t$,根据这个状态 $s_t$ 执行动作 $a_t$。执行完动作之后会收到一个奖励 $r_{t+1}$,同时环境也会收到动作 $a_t$ 的影响会变成新的状态 $s_{t+1}$,并且在 $t+1$时步被智能体观测到。如此循环下去,我们就可以在这个交互过程中得到一串轨迹,可表示为: +如图 2.1 所示,它描述了马尔可夫决策过程中智能体与环境的交互过程。确切地说,智能体与环境之间是在一系列**离散的时步** ( $\text{time step}$ )交互的,一般用 $t$ 来表示,$t=0,1,2,\cdots$。在每个时步 $t$, 智能体会观测或者接收到当前环境的状态 $s_t$,根据这个状态 $s_t$ 执行动作 $a_t$。执行完动作之后会收到一个奖励 $r_{t+1}$,同时环境也会收到动作 $a_t$ 的影响会变成新的状态 $s_{t+1}$,并且在 $t+1$时步被智能体观测到。如此循环下去,我们就可以在这个交互过程中得到一串轨迹,可表示为: $$ s_0,a_0,r_1,s_1,a_1,r_2,\cdots,s_t,a_t,r_{t+1},\cdots