update ch8

This commit is contained in:
qiwang067
2022-09-19 20:30:56 +08:00
parent 0ba6ea8c6b
commit a71a2e2d04
5 changed files with 34 additions and 36 deletions

View File

@@ -1,54 +1,52 @@
# 针对连续动作的 DQN
# 第8章 针对连续动作的深度Q网络
## 方案 1 & 方案 2
跟基于策略梯度的方法比起来DQN 是比较稳的。策略梯度是没有太多游戏是玩得起来的,策略梯度比较不稳,在没有 近端策略优化 之前我们很难用策略梯度做什么事情。DQN 相对而言是比较稳的。最早 DeepMind 的论文拿深度强化学习来玩雅达利的游戏,用的就是 DQN。DQN 比较容易训练的一个理由是:在 DQN 里面你只要能够估计出Q函数就保证你一定可以找到一个比较好的策略。也就是你只要能够估计出Q函数就保证你可以改进策略。而估计Q函数这件事情是比较容易的因为它就是一个回归问题。在回归问题里面 你可以轻易地知道模型学习得是不是越来越好只要看那个回归的损失有没有下降你就知道说模型学习得好不好所以估计Q函数相较于学习一个策略是比较容易的。你只要估计Q函数就可以保证说现在一定会得到比较好的策略。所以一般而言 DQN 比较容易操作。
与基于策略梯度的方法相比深度Q网络比较稳定策略梯度比较不稳定玩大部分游戏不能使用策略梯度。
DQN 其实存在一些问题,最大的问题是它不太容易处理连续动作。很多时候动作是连续的,比如我们玩雅达利的游戏,智能体只需要决定比如说上下左右,这种动作是离散的。那很多时候动作是连续的。举例来说假设智能体要做的事情是开自驾车,它要决定说它方向盘要左转几度, 右转几度,这是连续的。假设智能体是一个机器人,它身上有 50 个 关节,它的每一个动作就对应到它身上的这 50 个关节的角度。而那些角度也是连续的。所以很多时候动作并不是一个离散的东西,它是一个向量。在这个向量里面,它的每一个维度都有一个对应的值,都是实数,它是连续的。假设动作是连续的,做 DQN 就会有困难。因为在做 DQN 里面一个很重要的一步是你要能够解这个优化问题。估计出 Q函数$Q(s,a)$ 以后,必须要找到一个 $a$,它可以让 $Q(s,a)$ 最大,如下式所示
在没有近端策略优化之前,我们很难用策略梯度做什么事情。最早 DeepMind 的论文拿深度强化学习来玩雅达利的游戏用的就是深度Q网络。深度Q网络比较容易训练的一个原因是在深度Q网络里面我们只要能够估计出Q函数就保证一定可以找到一个比较好的策略。也就是我们只要能够估计出Q函数就保证可以改进策略。而估计Q函数是比较容易的因为它就是一个回归问题。在回归问题里面我们可以通过观察回归的损失有没有下降就可以知道模型学习得好不好所以估计Q函数相较于学习一个策略是比较容易的。我们只要估计Q函数就可以保证现在一定会得到比较好的策略所以一般而言深度Q网络比较容易操作
但深度Q网络其实存在一些问题最大的问题是它很难处理连续动作。很多时候动作是连续的比如我们玩雅达利的游戏时智能体只需要决定如上、下、左、右这4个动作这种动作是离散的。很多时候动作是连续的例如假设智能体要开车它要决定方向盘要左转几度、右转几度这种动作就是连续的。假设智能体是一个机器人身上有 50 个 关节,它的每一个动作就对应身上 50 个关节的角度而这些角度也是连续的。所以很多时候动作并不是离散的它是一个向量这个向量的每一个维度都有一个对应的值这些值都是实数它是连续的。如果动作是连续的我们使用深度Q网络就会有困难。因为在使用深度Q网络时很重要的一步是我们要能够解决优化问题也就是估计出 Q函数$Q(s,a)$ 以后,我们必须要找到一个 $a$,它可以让 $Q(s,a)$ 最大,即
$$
a=\arg \max _{a} Q(s, a)
\label{eq:max_q_ch8}
a=\underset{a}{\arg \max} Q(s, a)
$$
假设$a$是离散的,即$a$的可能性是有限的。举例来说,雅达利的小游戏里面,$a$ 就是上下左右跟开火,它是有限的,我们可以把每一个可能的动作都带到 Q 里面算它的 Q 值。但假如$a$是连续的,无法穷举所有可能的连续动作,试试看哪一个连续动作可以让 Q 值最大。
假设$a$是离散的,即$a$的可能性是有限的。例如,在雅达利的小游戏里面,$a$ 就是上、下、左、右与开火,它是有限的,我们可以把每一个可能的动作都代入 Q 里面算它的 Q 值。但假如$a$是连续的,我们无法穷举所有可能的连续动作,试试看哪一个连续动作可以让 Q 值最大。
怎么解这个问题呢?就有各种不同的方案。
怎么解这个问题呢?我们有多种不同的方案,下面一一介绍
## 8.1 方案 1对动作进行采样
第1个方案是什么呢我们可以采样出 $N$ 个可能的 $a$$\left\{a_{1}, a_{2}, \cdots, a_{N}\right\}$ ,把它们一个一个地代入 Q函数看谁的Q值最大。这个方案不会太低效因为我们在运算的时候会使用 GPU一次把 $N$ 个连续动作都代入 Q函数一次得到 $N$ 个 Q 值,看谁最大。当然这不是一个非常精确的方案,因为我们没有办法进行太多的采样, 所以估计出来的 Q 值、最后决定的动作可能不是非常精确。
## 8.2 方案 2梯度上升
第2个方案是什么呢既然要解决的是一个优化问题optimization problem我们就要最大化目标函数objective function。要最大化目标函数 我们就可以用梯度上升。我们把$a$当作参数,要找一组$a$去最大化Q函数就用梯度上升去更新 $a$ 的值,最后看看能不能找到一个$a$最大化Q函数目标函数。但我们会遇到全局最大值global maximum的问题不一定能够找到最优的结果而且运算量显然很大 因为要迭代地更新 $a$,训练一个网络就很花时间了。如果我们使用梯度上升的方案来处理连续的问题,每次决定采取哪一个动作的时候,还要训练一次网络,显然运算量是很大的。
第一个方案是假设你不知道怎么解这个问题,因为$a$是没有办法穷举的,怎么办?我们可以采样出 $N$ 个可能的 $a$$\left\{a_{1}, a_{2}, \cdots, a_{N}\right\}$ ,一个一个带到 Q函数里面看谁最大。这个方法其实也不会太不高效 因为你在运算的时候会使用 GPU一次会把 $N$ 个连续动作都丢到 Q函数里面一次得到 $N$ 个 Q 值,然后看谁最大。当然这不是一个非常精确的做法,因为你没有办法做太多的采样, 所以你估计出来的 Q 值,最后决定的动作可能不是非常的精确,这是第一个方案。
## 8.3 方案 3设计网络架构
第3个方案是特别设计网络的架构特别设计Q函数来使得解决 arg max 操作的问题变得非常容易。
第二个方案是什么呢既然要解的是一个优化问题optimization problem其实是要最大化目标函数objective function要最大化一个东西 就可以用梯度上升。我们就把$a$当作是参数,然后要找一组$a$去最大化Q函数就用梯度上升去更新 $a$ 的值,最后看看能不能找到一个$a$去最大化Q函数也就是目标函数。当然这样子你会遇到全局最大值global maximum的问题 就不见得能够真的找到最优的结果,而且这个运算量显然很大, 因为你要迭代地更新 $a$。我们训练一个网络就很花时间了。如果你用梯度上升的方法来处理连续的问题, 等于是你每次要决定采取哪一个动作的时候,都还要做一次训练网络的过程,显然运算量是很大的。这是第二个方案。
## 方案 3设计网络
第三个方案是特别设计一个网络的架构特别设计Q函数使得解 arg max 的问题变得非常容易。也就是这边的Q函数不是一个一般的Q函数特别设计一下它的样子让你要找让这个Q函数最大的 $a$ 的时候非常容易。
下图是一个例子这边有Q函数这个Q函数的做法是这样。
通常输入状态 $s$ 就是一个图像,可以用一个向量或一个矩阵来表示。
输入 $s$Q函数会输出 3 个东西。它会输出 $\mu(s)$,这是一个向量。它会输出 $\Sigma(s)$ ,这是一个矩阵。它会输出 $V(s)$,这是一个标量。
输出这 3 个东西以后我们知道Q函数其实是吃一个$s$跟 $a$然后决定一个值。Q函数意思是说在某一个状态采取某一个动作的时候你期望的奖励有多大。到目前为止这个Q函数只吃 $s$,它还没有吃$a$进来,$a$ 在哪里呢当这个Q函数吐出 $\mu$、 $\Sigma$ 跟 $V$ 的时候,我们才把$a$引入,用$a$跟 $\mu(s)、\Sigma(s)、V$ 互相作用一下,你才算出最终的 Q 值。
![](img/8.2.png)
$a$怎么和这 3 个东西互相作用呢?实际上 $Q(s,a)$Q函数的运作方式是先输入 $s$,让你得到 $\mu,\Sigma$ 跟 $V$。然后再输入 $a$,然后接下来把$a$跟 $\mu$ 相减。注意一下$a$现在是连续的动作,所以它也是一个向量。假设你现在是要操作机器人的话,这个向量的每一个维度,可能就对应到机器人的某一个关节,它的数值就是关节的角度,所以$a$是一个向量。把向量 $a$ 减掉向量 $\mu$,取转置,所以它是一个横的向量。$\Sigma$ 是一个矩阵。然后$a$减掉 $\mu(s)$ $a$ 和 $\mu(s)$ 都是向量,减掉以后还是一个竖的向量。所以 $-(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))+V(s)$ 是一个标量,这个数值就是 Q 值 $Q(s,a)$。
假设 $Q(s,a)$ 定义成这个样子,我们要怎么找到一个$a$去最大化这个 Q 值呢?这个方案非常简单。因为 $(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))$ 一定是正的,它前面乘上一个负号,所以第一项就假设我们不看这个负号的话,第一项的值越小,最终的 Q 值就越大。因为我们是把 $V(s)$ 减掉第一项,所以第一项的值越小,最后的 Q 值就越大。怎么让第一项的值最小呢?你直接把$a$代入 $\mu$ 的值,让它变成 0就会让第一项的值最小。
$\Sigma$ 一定是正定的。因为这个东西就像是高斯分布Gaussian distribution所以 $\mu$ 就是高斯分布的均值,$\Sigma$ 就是高斯分布的方差。但方差是一个正定positive definite的矩阵怎么样让这个 $\Sigma$ 一定是正定的矩阵呢?其实在 $Q^{\pi}$ 里面,它不是直接输出 $\Sigma$,如果直接输出 一个 $\Sigma$ 它不一定是正定的矩阵。它其实是输出 一个矩阵,然后再把那个矩阵跟另外一个矩阵做转置相乘, 然后可以确保 $\Sigma$ 是正定的。这边要强调的点就是说,实际上它不是直接输出一个矩阵。你再去那个论文里面查看一下它的技巧,它可以保证说 $\Sigma$ 是正定的。
你把$a$代入 $\mu(s)$ 以后,你可以让 Q 的值最大。所以假设要你 arg max Q 函数,如下式所示。
如图 8.1 所示,通常输入状态 $\boldsymbol{s}$ 是图像,我们可以用向量或矩阵来表示它。输入 $\boldsymbol{s}$Q函数会输出向量$\pmb{\mu}(\boldsymbol{s})$、矩阵$\pmb{\varSigma}(\boldsymbol{s})$ 和标量 $V(\boldsymbol{s})$。Q函数根据输入$\boldsymbol{s}$与 $\boldsymbol{a}$ 来决定输出值。到目前为止Q函数只有输入 $\boldsymbol{s}$,它还没有输入$\boldsymbol{a}$$\boldsymbol{a}$ 在哪里呢?接下来我们可以输入 $\boldsymbol{a}$,用$\boldsymbol{a}$与 $\pmb{\mu}(\boldsymbol{s})$、$\pmb{\varSigma}(\boldsymbol{s})$和$V(\boldsymbol{s})$ 互相作用。Q函数$Q(\boldsymbol{s},\boldsymbol{a})$可定义为
$$
\mu(s)=\arg \max _{a} Q(s, a)
\label{eq:}
Q(\boldsymbol{s},\boldsymbol{a})=-(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))^{\mathrm{T}} \pmb{\varSigma}(\boldsymbol{s})(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))+V(\boldsymbol{s})
$$
虽然一般而言,若 Q 是一个一般的函数, 你很难算,但是我们这边设计了 Q 这个函数,$a$ 只要设 $\mu(s)$,我们就得到最大值。你在解这个 arg max 的问题的时候就变得非常容易。所以 DQN 也可以用在连续的情况,只是有一些局限,就是函数不能够随便乱设,它必须有一些限制
注意,$\boldsymbol{a}$现在是连续的动作,所以它是一个向量。假设我们要操作机器人,向量$\boldsymbol{a}$的每一个维度可能就对应机器人的每一个关节,它的数值就是关节的角度。假设 $\boldsymbol{a}$ 和 $\pmb{\mu}(\boldsymbol{s})$ 是列向量,那么 $(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))^{\mathrm{T}}$ 是一个行向量。$\pmb{\varSigma}(\boldsymbol{s})$ 是一个正定矩阵positive-definite matrix因为 $\pmb{\varSigma}(\boldsymbol{s}) = \boldsymbol{L}\boldsymbol{L}^{\mathrm{T}}$,其中 $\boldsymbol{L}$ 为下三角矩阵lower-triangular matrix。 $\boldsymbol{a}$-$\pmb{\mu}(\boldsymbol{s})$也是一个列向量。所以Q值即 $-(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))^{\mathrm{T}} \pmb{\varSigma}(\boldsymbol{s})(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))+V(\boldsymbol{s})$ 是标量
## 方案 4不使用DQN
第 4 招就是不要用 DQN。用 DQN 处理连续动作还是比较麻烦。
基于策略的方法 PPO 和基于价值的方法 DQN这两者其实是可以结合在一起的如下图所示也就是演员-评论员的方法。
![](img/8.3.png)
我们要怎么找到一个$\boldsymbol{a}$来最大化 Q 值呢?因为 $(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))^{\mathrm{T}} \pmb{\varSigma}(\boldsymbol{s})(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))$ 一定是正的,它前面有一个负号,假设我们不看负号,所以第一项 $(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))^{\mathrm{T}} \pmb{\varSigma}(\boldsymbol{\boldsymbol{s}})(\boldsymbol{a}-\pmb{\mu}(\boldsymbol{s}))$ 的值越小,最终的 Q 值就越大。因为我们是把 $V(\boldsymbol{s})$ 减掉第一项,所以第一项的值越小,最后的 Q 值就越大。怎么让第一项的值最小呢?我们直接令 $\pmb{\mu}(\boldsymbol{s})$ 等于$\boldsymbol{a}$,让第一项变成 0就可以让第一项的值最小。 因此,令 $\pmb{\mu}(\boldsymbol{s})$ 等于$\boldsymbol{a}$,我们就可以得到最大值,解决 arg max 操作的问题就变得非常容易。所以深度Q网络也可以用在连续的情况中只是有一些局限函数不能随便设置。
>如果 $n$阶对称矩阵$\boldsymbol{A}$ 对于任意非零的$n$维向量$\boldsymbol{x}$都有 $\boldsymbol{x}^\mathrm{T}\boldsymbol{A}\boldsymbol{x}>0$,则称矩阵$\boldsymbol{A}$为正定矩阵。
<div align=center>
<img width="550" src="../img/ch8/8.2.png"/>
</div>
<div align=center>图 8.1 方案 3设计网络架构</div>
## 8.4 方案 4不使用深度Q网络
第4个方案就是不使用深度Q网络用深度Q网络处理连续动作是比较麻烦的。如图 8.2 所示我们将基于策略的方法————PPO 和基于价值的方法————深度Q网络结合在一起就可以得到演员-评论员的方法。
<div align=center>
<img width="550" src="../img/ch8/8.3.png"/>
</div>
<div align=center>图 8.2 方案 4不使用深度Q网络</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 KiB

BIN
docs/img/ch8/8.2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
docs/img/ch8/8.3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB