Files
easy-rl/docs/chapter8/chapter8.md
qiwang067 1adddca46d fix ch8
2021-09-21 11:06:09 +08:00

55 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 针对连续动作的 DQN
## 方案 1 & 方案 2
跟基于策略梯度的方法比起来DQN 是比较稳的。策略梯度是没有太多游戏是玩得起来的,策略梯度比较不稳,在没有 近端策略优化 之前我们很难用策略梯度做什么事情。DQN 相对而言是比较稳的。最早 DeepMind 的论文拿深度强化学习来玩雅达利的游戏,用的就是 DQN。DQN 比较容易训练的一个理由是:在 DQN 里面你只要能够估计出Q函数就保证你一定可以找到一个比较好的策略。也就是你只要能够估计出Q函数就保证你可以改进策略。而估计Q函数这件事情是比较容易的因为它就是一个回归问题。在回归问题里面 你可以轻易地知道模型学习得是不是越来越好只要看那个回归的损失有没有下降你就知道说模型学习得好不好所以估计Q函数相较于学习一个策略是比较容易的。你只要估计Q函数就可以保证说现在一定会得到比较好的策略。所以一般而言 DQN 比较容易操作。
DQN 其实存在一些问题,最大的问题是它不太容易处理连续动作。很多时候动作是连续的,比如我们玩雅达利的游戏,智能体只需要决定比如说上下左右,这种动作是离散的。那很多时候动作是连续的。举例来说假设智能体要做的事情是开自驾车,它要决定说它方向盘要左转几度, 右转几度,这是连续的。假设智能体是一个机器人,它身上有 50 个 关节,它的每一个动作就对应到它身上的这 50 个关节的角度。而那些角度也是连续的。所以很多时候动作并不是一个离散的东西,它是一个向量。在这个向量里面,它的每一个维度都有一个对应的值,都是实数,它是连续的。假设动作是连续的,做 DQN 就会有困难。因为在做 DQN 里面一个很重要的一步是你要能够解这个优化问题。估计出 Q函数$Q(s,a)$ 以后,必须要找到一个 $a$,它可以让 $Q(s,a)$ 最大,如下式所示。
$$
a=\arg \max _{a} Q(s, a)
$$
假设$a$是离散的,即$a$的可能性都是有限的。举例来说,雅达利的小游戏里面,$a$ 就是上下左右跟开火,它是有限的,我们可以把每一个可能的动作都带到 Q 里面算它的 Q 值。但假如$a$是连续的,你无法穷举所有可能的连续动作,试试看哪一个连续动作可以让 Q 的值最大。
怎么解这个问题呢?就有各种不同的方案。
第一个方案是假设你不知道怎么解这个问题,因为$a$是没有办法穷举的,怎么办?我们可以采样出 $N$ 个可能的 $a$$\left\{a_{1}, a_{2}, \cdots, a_{N}\right\}$ ,一个一个带到 Q函数里面看谁最大。这个方法其实也不会太不高效 因为你在运算的时候会使用 GPU一次会把 $N$ 个连续动作都丢到 Q函数里面一次得到 $N$ 个 Q 值,然后看谁最大。当然这不是一个非常精确的做法,因为你没有办法做太多的采样, 所以你估计出来的 Q 值,最后决定的动作可能不是非常的精确,这是第一个方案。
第二个方案是什么呢既然要解的是一个优化问题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 函数,如下式所示。
$$
\mu(s)=\arg \max _{a} Q(s, a)
$$
虽然一般而言,若 Q 是一个一般的函数, 你很难算,但是我们这边设计了 Q 这个函数,$a$ 只要设 $\mu(s)$,我们就得到最大值。你在解这个 arg max 的问题的时候就变得非常容易。所以 DQN 也可以用在连续的情况,只是有一些局限,就是函数不能够随便乱设,它必须有一些限制。
## 方案 4不使用DQN
第 4 招就是不要用 DQN。用 DQN 处理连续动作还是比较麻烦。
基于策略的方法 PPO 和基于价值的方法 DQN这两者其实是可以结合在一起的如下图所示也就是演员-评论员的方法。
![](img/8.3.png)