This commit is contained in:
qiwang067
2021-02-27 10:37:02 +08:00
parent 314dfae7c1
commit ea0989d976
9 changed files with 14 additions and 15 deletions

View File

@@ -10,11 +10,9 @@ $$
## State Value Function
![](img/6.1.png)
**Q-learning 是 `value-based` 的方法。在 value-based 的方法里面,我们学习的不是策略,我们要学习的是一个 `critic(评论家)`。**评论家要做的事情是评价现在的行为有多好或是有多不好。假设有一个演员(actor) $\pi$ ,评论家就是来评价这个演员的策略 $\pi$ 好还是不好,即 `Policy Evaluation(策略评估)`
> 注:「李宏毅深度强化学习」课程提到的 Q-learning其实是 DQN。
> 注:「李宏毅深度强化学习」课程提到的 Q-learning其实是 DQN(Deep Q-network)
>
> DQN 是指基于深度学习的 Q-learning 算法,主要结合了`价值函数近似(Value Function Approximation)`与神经网络技术,并采用了目标网络和经历回放的方法进行网络的训练。
>
@@ -22,6 +20,8 @@ $$
举例来说,有一种评论家叫做 `state value function(状态价值函数)`。状态价值函数的意思就是说,假设演员叫做 $\pi$,拿 $\pi$ 跟环境去做互动。假设 $\pi$ 看到了某一个状态 s如果在玩 Atari 游戏的话,状态 s 是某一个画面,看到某一个画面的时候,接下来一直玩到游戏结束,期望的累积奖励有多大。所以 $V^{\pi}$ 是一个函数,这个函数输入一个状态,然后它会输出一个标量( scalar)。这个标量代表说,$\pi$ 这个演员看到状态 s 的时候,接下来预期到游戏结束的时候,它可以得到多大的值。
![](img/6.1.png)
举个例子,假设你是玩 space invader 的话,
* 左边这个状态 s这个游戏画面$V^{\pi}(s)$ 也许会很大,因为还有很多的怪可以杀, 所以你会得到很大的分数。一直到游戏结束的时候,你仍然有很多的分数可以吃。
@@ -33,7 +33,7 @@ $$
### State Value Function Estimation
![](img/6.2.png)
**怎么衡量这个状态价值函数 $V^{\pi}(s)$ 呢?**有两种不同的做法MC-based 的方法和 TD-based 的方法。
@@ -44,6 +44,8 @@ $$
但是实际上,你不可能把所有的状态通通都扫过。如果你是玩 Atari 游戏的话,状态是图像,你没有办法把所有的状态通通扫过。所以实际上 $V^{\pi}(s)$ 是一个网络。对一个网络来说,就算输入状态是从来都没有看过的,它也可以想办法估测一个值的值。
![](img/6.2.png)
怎么训练这个网络呢?因为如果在状态 $s_a$,接下来的累积奖励就是 $G_a$。也就是说,对这个价值函数来说,如果输入是状态 $s_a$,正确的输出应该是 $G_a$。如果输入状态 $s_b$,正确的输出应该是值 $G_b$。**所以在训练的时候, 它就是一个 `回归问题(regression problem)`。**网络的输出就是一个值,你希望在输入 $s_a$ 的时候,输出的值跟 $G_a$ 越近越好,输入 $s_b$ 的时候,输出的值跟 $G_b$ 越近越好。接下来把网络训练下去,就结束了。这是 MC-based 的方法。
![](img/6.3.png)
@@ -74,7 +76,8 @@ $$
$$
\operatorname{Var}[k X]=k^{2} \operatorname{Var}[X]
$$
Var 是指 variance。
> Var 是指 variance。
通过这个式子,我们知道 $G_a$ 的方差相较于某一个状态的奖励,它会是比较大的。
如果用 TD 的话,你是要去最小化这样的一个式子:
@@ -113,8 +116,6 @@ $$
## State-action Value Function(Q-function)
![](img/6.7.png)
还有另外一种评论家叫做 `Q-function`。它又叫做`state-action value function(状态-动作价值函数)`
* 状态价值函数的输入是一个状态,它是根据状态去计算出,看到这个状态以后的期望的累积奖励( expected accumulated reward)是多少。
@@ -122,6 +123,8 @@ $$
Q-function 有一个需要注意的问题是,这个演员 $\pi$,在看到状态 s 的时候,它采取的动作不一定是 a。Q-function 假设在状态 s 强制采取动作 a。不管你现在考虑的这个演员 $\pi$ 它会不会采取动作 a这不重要。在状态 s 强制采取动作 a。接下来都用演员 $\pi$ 继续玩下去,就只有在状态 s我们才强制一定要采取动作 a接下来就进入自动模式让演员 $\pi$ 继续玩下去,得到的期望奖励才是 $Q^{\pi}(s,a)$ 。
![](img/6.7.png)
Q-function 有两种写法:
* 输入是状态跟动作,输出就是一个标量;
@@ -133,7 +136,7 @@ Q-function 有两种写法:
![](img/6.8.png)
上图是文献上的结果,你去估计 Q-function 的话,看到的结果可能会像是这个样子。这是什么意思呢?它说假设我们有 3 个动作:原地不动、向上、向下。
上图是文献上的结果,你去估计 Q-function 的话,看到的结果可能如上图所示。假设我们有 3 个动作:原地不动、向上、向下。
* 假设是在第一个状态,不管是采取哪个动作,最后到游戏结束的时候,得到的期望奖励其实都差不多。因为球在这个地方,就算是你向下,接下来你应该还可以急救。所以不管采取哪个动作,都差不了太多。
@@ -151,13 +154,9 @@ Q-function 有两种写法:
它的大原则是这样,假设你有一个初始的演员,也许一开始很烂,随机的也没有关系。初始的演员叫做 $\pi$,这个 $\pi$ 跟环境互动,会收集数据。接下来你学习一个 $\pi$ 这个演员的 Q 值,你去衡量一下 $\pi$ 在某一个状态强制采取某一个动作,接下来用 $\pi$ 这个策略 会得到的期望奖励,用 TD 或 MC 都是可以的。你学习出一个 Q-function 以后,就保证你可以找到一个新的策略 $\pi'$ policy $\pi'$ 一定会比原来的策略 $\pi$ 还要好。那等一下会定义说,什么叫做好。所以假设你有一个 Q-function 和某一个策略 $\pi$,你根据策略 $\pi$ 学习出策略 $\pi$ 的 Q-function接下来保证你可以找到一个新的策略 $\pi'$ ,它一定会比 $\pi$ 还要好,然后你用 $\pi'$ 取代 $\pi$,再去找它的 Q-function得到新的以后再去找一个更好的策略。**这样一直循环下去policy 就会越来越好。**
![](img/6.10.png)
上图就是讲我们刚才讲的到底是什么。
* 首先要定义的是什么叫做比较好?我们说 $\pi'$ 一定会比 $\pi$ 还要好,什么叫做好呢?这边好是说,对所有可能的状态 s 而言,$\pi$ 的价值函数 一定会小于 $\pi'$ 的价值函数。也就是说我们走到同一个状态 s 的时候,如果拿 $\pi$ 继续跟环境互动下去,我们得到的奖励一定会小于用 $\pi'$ 跟环境互动下去得到的奖励。所以不管在哪一个状态,你用 $\pi'$ 去做交互,得到的期望奖励一定会比较大。所以 $\pi'$ 是比 $\pi$ 还要好的一个策略。
* 有了这个 Q-function 以后,怎么找这个 $\pi'$ 呢?如果你根据以下的这个式子去决定你的 动作,
首先要定义的是什么叫做比较好?我们说 $\pi'$ 一定会比 $\pi$ 还要好,什么叫做好呢?这边好是说,对所有可能的状态 s 而言,$V^{\pi^{\prime}}(s) \geq V^{\pi}(s)$。也就是说我们走到同一个状态 s 的时候,如果拿 $\pi$ 继续跟环境互动下去,我们得到的奖励一定会小于用 $\pi'$ 跟环境互动下去得到的奖励。所以不管在哪一个状态,你用 $\pi'$ 去做交互,得到的期望奖励一定会比较大。所以 $\pi'$ 是比 $\pi$ 还要好的一个策略。
有了这个 Q-function 以后,怎么找这个 $\pi'$ 呢?如果你根据以下的这个式子去决定你的 动作,
$$
\pi^{\prime}(s)=\arg \max _{a} Q^{\pi}(s, a)
$$
@@ -319,7 +318,7 @@ A: 因为 Q 值是有正有负的,所以可以它弄成一个概率,你先
![](img/6.18.png)
有了这个 buffer 以后,你是怎么训练这个 Q 的模型呢,怎么估 Q-function你的做法是这样你会迭代地去训练 这个 Q-function在每次迭代里面你从这个 buffer 里面随机挑一个 batch 出来,就跟一般的网络训练一样,你从那个训练集里面,去挑一个 batch 出来。你去采样一个 batch 出来,里面有一把的经验,根据这把经验去更新你的 Q-function。就跟 TD learning 要有一个目标网络是一样的。你去采样一堆 batch采样一个 batch 的数据,采样一堆经验,然后再去更新你的 Q-function。
有了这个 buffer 以后,你是怎么训练这个 Q 的模型呢,怎么估 Q-function你的做法是这样你会迭代地去训练这个 Q-function在每次迭代里面你从这个 buffer 里面随机挑一个 batch 出来,就跟一般的网络训练一样,你从那个训练集里面,去挑一个 batch 出来。你去采样一个 batch 出来,里面有一把的经验,根据这把经验去更新你的 Q-function。就跟 TD learning 要有一个目标网络是一样的。你去采样一堆 batch采样一个 batch 的数据,采样一堆经验,然后再去更新你的 Q-function。
当我们这么做的时候, 它变成了一个 `off-policy` 的做法。因为本来我们的 Q 是要观察 $\pi$ 的经验,但实际上存在你的 replay buffer 里面的这些经验不是通通来自于 $\pi$,有些是过去其他的 $\pi$ 所遗留下来的经验。因为你不会拿某一个 $\pi$ 就把整个 buffer 装满,然后拿去测 Q-function这个 $\pi$ 只是采样一些数据塞到那个 buffer 里面去,然后接下来就让 Q 去训练。所以 Q 在采样的时候, 它会采样到过去的一些资料。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 559 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 KiB

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 852 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 836 KiB

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 KiB

After

Width:  |  Height:  |  Size: 499 KiB