fix ch7 typos

This commit is contained in:
qiwang067
2020-10-16 21:35:29 +08:00
parent 0bcba4fa1e
commit 630a771bb9

View File

@@ -2,7 +2,9 @@
## Double DQN ## Double DQN
![](img/7.1.png) ![](img/7.1.png)
接下来要讲的是 train Q-learning 的一些 tip。第一个 tip 是做 `Double DQN`。那为什么要有 Double DQN 呢?因为在实现上,你会发现 Q value 往往是被高估的。上图来自于 Double DQN 的原始 paper它想要显示的结果就是 Q value 往往是被高估的。这边有 4 个不同的小游戏,横轴是 training 的时间,红色锯齿状一直在变的线就是 Q-function 对不同的 state estimate 出来的平均 Q value有很多不同的 state每个 state 你都 sample 一下,然后算它们的 Q value把它们平均起来。红色这一条线它在 training 的过程中会改变,但它是不断上升的,为什么它不断上升,因为 Q-function 是 depend on 你的 policy 的。learn 的过程中你的 policy 越来越强,所以你得到 Q value 会越来越大。在同一个 state 你得到 expected reward 会越来越大,所以 general 而言,这个值都是上升的,但这是 Q-network 估测出来的值。 接下来要讲的是 train Q-learning 的一些 tip。第一个 tip 是做 `Double DQN`。那为什么要有 Double DQN 呢?因为在实现上,你会发现 Q value 往往是被高估的。上图来自于 Double DQN 的原始 paper它想要显示的结果就是 Q value 往往是被高估的。
这边有 4 个不同的小游戏,横轴是 training 的时间,红色锯齿状一直在变的线就是 Q-function 对不同的 state estimate 出来的平均 Q value有很多不同的 state每个 state 你都 sample 一下,然后算它们的 Q value把它们平均起来。红色这一条线它在 training 的过程中会改变,但它是不断上升的,为什么它不断上升,因为 Q-function 是 depend on 你的 policy 的。learn 的过程中你的 policy 越来越强,所以你得到 Q value 会越来越大。在同一个 state 你得到 expected reward 会越来越大,所以 general 而言,这个值都是上升的,但这是 Q-network 估测出来的值。
接下来你真地去算它,那怎么真地去算?你有那个 policy然后真的去玩那个游戏。就玩很多次玩个一百万次。然后就去真地估说在某一个 state 你会得到的 Q value 到底有多少。你会得到说在某一个 state采取某一个 action。你接下来会得到 accumulated reward 是多少。你会发现估测出来的值是远比实际的值大。在每一个游戏都是这样,都大很多。所以今天要 propose Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。我们先看它的结果,蓝色的锯齿状的线是 Double DQN 的 Q-network 所估测出来的 Q value蓝色的无锯齿状的线是真正的 Q value你会发现它们是比较接近的。 用 network 估测出来的就不用管它,比较没有参考价值。用 Double DQN 得出来真正的 accumulated reward在这 3 个 case 都是比原来的 DQN 高的,代表 Double DQN learn 出来那个 policy 比较强。所以它实际上得到的 reward 是比较大的。虽然一般的 DQN 的 Q-network 高估了自己会得到的 reward但实际上它得到的 reward 是比较低的。 接下来你真地去算它,那怎么真地去算?你有那个 policy然后真的去玩那个游戏。就玩很多次玩个一百万次。然后就去真地估说在某一个 state 你会得到的 Q value 到底有多少。你会得到说在某一个 state采取某一个 action。你接下来会得到 accumulated reward 是多少。你会发现估测出来的值是远比实际的值大。在每一个游戏都是这样,都大很多。所以今天要 propose Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。我们先看它的结果,蓝色的锯齿状的线是 Double DQN 的 Q-network 所估测出来的 Q value蓝色的无锯齿状的线是真正的 Q value你会发现它们是比较接近的。 用 network 估测出来的就不用管它,比较没有参考价值。用 Double DQN 得出来真正的 accumulated reward在这 3 个 case 都是比原来的 DQN 高的,代表 Double DQN learn 出来那个 policy 比较强。所以它实际上得到的 reward 是比较大的。虽然一般的 DQN 的 Q-network 高估了自己会得到的 reward但实际上它得到的 reward 是比较低的。
@@ -17,7 +19,7 @@ A: 因为实际上在做的时候,是要让左边这个式子跟右边这个 t
![](img/7.3.png) ![](img/7.3.png)
Q: 怎么解决这target 总是太大的问题呢? Q: 怎么解决这target 总是太大的问题呢?
A: 在 Double DQN 里面,选 action 的 Q-function 跟算 value 的 Q-function不是同一个。在原来的DQN 里面,你穷举所有的 a把每一个 a 都带进去, 看哪一个 a 可以给你的 Q value 最高,那你就把那个 Q value 加上 $r_t$。但是在 Double DQN 里面,你有两个 Q-network第一个 Q-network决定哪一个 action 的 Q value 最大你用第一个 Q-network 去带入所有的 a去看看哪一个 Q value 最大。然后你决定你的 action 以后,你的 Q value 是用 $Q'$ 算出来的,这样子有什么好处呢?为什么这样就可以避免 over estimate 的问题呢?因为今天假设我们有两个 Q-function假设第一个 Q-function 高估了它现在选出来的 action a那没关系只要第二个 Q-function $Q'$ 没有高估这个 action a 的值,那你算出来的就还是正常的值。假设反过来是 $Q'$ 高估了某一个 action 的值,那也没差, 因为反正只要前面这个 Q 不要选那个 action 出来就没事了这个就是 Double DQN 神奇的地方。 A: 在 Double DQN 里面,选 action 的 Q-function 跟算 value 的 Q-function不是同一个。在原来的DQN 里面,你穷举所有的 a把每一个 a 都带进去, 看哪一个 a 可以给你的 Q value 最高,那你就把那个 Q value 加上 $r_t$。但是在 Double DQN 里面,你有两个 Q-network第一个 Q-network决定哪一个 action 的 Q value 最大你用第一个 Q-network 去带入所有的 a去看看哪一个 Q value 最大。你决定你的 action 以后,你的 Q value 是用 $Q'$ 算出来的,这样子有什么好处呢?为什么这样就可以避免 over estimate 的问题呢?因为假设我们有两个 Q-function假设第一个 Q-function 高估了它现在选出来的 action a那没关系只要第二个 Q-function $Q'$ 没有高估这个 action a 的值,那你算出来的就还是正常的值。假设反过来是 $Q'$ 高估了某一个 action 的值,那也没差, 因为反正只要前面这个 Q 不要选那个 action 出来就没事了这个就是 Double DQN 神奇的地方。
Q: 哪来 Q 跟 $Q'$ 呢?哪来两个 network 呢? Q: 哪来 Q 跟 $Q'$ 呢?哪来两个 network 呢?
@@ -27,7 +29,7 @@ A: 在实现上,你有两个 Q-network 一个是 target 的 Q-network
## Dueling DQN ## Dueling DQN
![](img/7.4.png) ![](img/7.4.png)
第二个 tip 是 `Dueling DQN`。其实 Dueling DQN 也蛮好做的,相较于原来的 DQN它唯一的差别是改了 network 的架构Dueling DQN 唯一做的事情是改 network 的架构。Q-network 就是 input stateoutput 就是每一个 action 的Q value。Dueling DQN 唯一做的事情是改了 network 的架构,其它的算法,你都不要去动它。 第二个 tip 是 `Dueling DQN`。其实 Dueling DQN 也蛮好做的,相较于原来的 DQN它唯一的差别是改了 network 的架构Dueling DQN 唯一做的事情是改 network 的架构。Q-network 就是 input stateoutput 就是每一个 action 的Q value。Dueling DQN 唯一做的事情是改了 network 的架构,其它的算法,你都不要去动它。
Q: Dueling DQN 是怎么改了 network 的架构呢? Q: Dueling DQN 是怎么改了 network 的架构呢?
@@ -71,7 +73,7 @@ $$
## Balance between MC and TD ## Balance between MC and TD
![](img/7.8.png) ![](img/7.8.png)
另外一个可以做的方法是,你可以 balance MC 跟 TD。MC 跟 TD 的方法各自有各自的优劣。我们怎么在 MC 跟 TD 里面取得一个平衡呢?我们的做法是这样,在 TD 里面,在某一个 state $s_t$ 采取某一个 action $a_t$ 得到 reward $r_t$,接下来跳到那一个 state $s_{t+1}$。但是我们可以不要只存一个 step 的data我们存 N 个 step 的 data。 **另外一个可以做的方法是 balance MC 跟 TD。**MC 跟 TD 的方法各自有各自的优劣怎么在 MC 跟 TD 里面取得一个平衡呢?我们的做法是这样,在 TD 里面,在某一个 state $s_t$ 采取某一个 action $a_t$ 得到 reward $r_t$,接下来跳到那一个 state $s_{t+1}$。但是我们可以不要只存一个 step 的data我们存 N 个 step 的 data。
我们记录在 $s_t$ 采取 $a_t$,得到 $r_t$,会跳到什么样 $s_t$。一直纪录到在第 N 个 step 以后,在 $s_{t+N}$采取 $a_{t+N}$得到 reward $r_{t+N}$,跳到 $s_{t+N+1}$ 的这个经验,通通把它存下来。实际上你今天在做 update 的时候, 在做 Q-network learning 的时候,你的 learning 的方法会是这样,你 learning 的时候,要让 $Q(s_t,a_t)$ 跟你的 target value 越接近越好。$\hat{Q}$ 所计算的不是 $s_{t+1}$,而是 $s_{t+N+1}$的。你会把 N 个 step 以后的 state 丢进来,去计算 N 个 step 以后,你会得到的 reward。要算 target value 的话,要再加上 multi-step 的 reward $\sum_{t^{\prime}=t}^{t+N} r_{t^{\prime}}$ multi-step 的 reward 是从时间 t 一直到 t+N 的 N 个reward 的和。然后希望你的 $Q(s_t,a_t)$ 和 target value 越接近越好。 我们记录在 $s_t$ 采取 $a_t$,得到 $r_t$,会跳到什么样 $s_t$。一直纪录到在第 N 个 step 以后,在 $s_{t+N}$采取 $a_{t+N}$得到 reward $r_{t+N}$,跳到 $s_{t+N+1}$ 的这个经验,通通把它存下来。实际上你今天在做 update 的时候, 在做 Q-network learning 的时候,你的 learning 的方法会是这样,你 learning 的时候,要让 $Q(s_t,a_t)$ 跟你的 target value 越接近越好。$\hat{Q}$ 所计算的不是 $s_{t+1}$,而是 $s_{t+N+1}$的。你会把 N 个 step 以后的 state 丢进来,去计算 N 个 step 以后,你会得到的 reward。要算 target value 的话,要再加上 multi-step 的 reward $\sum_{t^{\prime}=t}^{t+N} r_{t^{\prime}}$ multi-step 的 reward 是从时间 t 一直到 t+N 的 N 个reward 的和。然后希望你的 $Q(s_t,a_t)$ 和 target value 越接近越好。
@@ -79,7 +81,7 @@ $$
## Noisy Net ## Noisy Net
![](img/7.9.png) ![](img/7.9.png)
有一个技术是要 improve 这个 exploration 这件事,我们之前讲的 Epsilon Greedy 这样的 exploration 是在 action 的space 上面加 noise但是有另外一个更好的方法叫做`Noisy Net`,它是在参数的 space 上面加 noise。Noisy Net 的意思是说,每一次在一个 episode 开始的时候,在你要跟环境互动的时候,你就把你的 Q-function 拿出来Q-function 里面其实就是一个 network ,就变成你把那个 network 拿出来,在 network 的每一个参数上面加上一个 Gaussian noise。那你就把原来的 Q-function 变成$\tilde{Q}$ 。因为$\hat{Q}$ 已经用过,$\hat{Q}$ 是那个 target network我们用 $\tilde{Q}$ 来代表一个`Noisy Q-function`。我们把每一个参数都可能都加上一个 Gaussian noise就得到一个新的 network 叫做 $\tilde{Q}$。这边要注意在每个episode 开始的时候,开始跟环境互动之前,我们就 sample network。接下来你就会用这个固定住的 noisy network 去玩这个游戏,直到游戏结束,你才重新再去 sample 新的 noise。OpenAI 跟 Deep mind 又在同时间 propose 一模一样的方法,通通都 publish 在 ICLR 2018两篇 paper 的方法就是一样的。不一样的地方是他们用不同的方法去加noise。OpenAI 加的方法好像比较简单,他就直接加一个 Gaussian noise 就结束了,就你把每一个参数,每一个 weight都加一个 Gaussian noise 就结束了。Deep mind 做比较复杂,他们的 noise 是由一组参数控制的,也就是说 network 可以自己决定说它那个 noise 要加多大,但是概念就是一样的。总之就是把你的 Q-function 的里面的那个 network 加上一些 noise把它变得有点不一样跟原来的 Q-function 不一样,然后拿去跟环境做互动。两篇 paper 里面都有强调说,你这个参数虽然会加 noise但在同一个 episode 里面你的参数就是固定的,你是在换 episode 玩第二场新的游戏的时候,你才会重新 sample noise在同一场游戏里面就是同一个 noisy Q-network 在玩那一场游戏,这件事非常重要。为什么这件事非常重要呢?因为这是导致了 Noisy Net 跟原来的 Epsilon Greedy 或其它在 action 做 sample 方法的本质上的差异。 有一个技术是要 improve exploration 这件事,我们之前讲的 Epsilon Greedy 这样的 exploration 是在 action 的 space 上面加 noise但是有另外一个更好的方法叫做`Noisy Net`,它是在参数的 space 上面加 noise。Noisy Net 的意思是说,每一次在一个 episode 开始的时候,在你要跟环境互动的时候,你就把你的 Q-function 拿出来Q-function 里面其实就是一个 network ,就变成你把那个 network 拿出来,在 network 的每一个参数上面加上一个 Gaussian noise。那你就把原来的 Q-function 变成$\tilde{Q}$ 。因为$\hat{Q}$ 已经用过,$\hat{Q}$ 是那个 target network我们用 $\tilde{Q}$ 来代表一个`Noisy Q-function`。我们把每一个参数都可能都加上一个 Gaussian noise就得到一个新的 network 叫做 $\tilde{Q}$。这边要注意在每个episode 开始的时候,开始跟环境互动之前,我们就 sample network。接下来你就会用这个固定住的 noisy network 去玩这个游戏,直到游戏结束,你才重新再去 sample 新的 noise。OpenAI 跟 Deep mind 又在同时间 propose 一模一样的方法,通通都 publish 在 ICLR 2018两篇 paper 的方法就是一样的。不一样的地方是他们用不同的方法去加noise。OpenAI 加的方法好像比较简单,他就直接加一个 Gaussian noise 就结束了,就你把每一个参数,每一个 weight都加一个 Gaussian noise 就结束了。Deep mind 做比较复杂,他们的 noise 是由一组参数控制的,也就是说 network 可以自己决定说它那个 noise 要加多大,但是概念就是一样的。总之就是把你的 Q-function 的里面的那个 network 加上一些 noise把它变得有点不一样跟原来的 Q-function 不一样,然后拿去跟环境做互动。两篇 paper 里面都有强调说,你这个参数虽然会加 noise但在同一个 episode 里面你的参数就是固定的,你是在换 episode 玩第二场新的游戏的时候,你才会重新 sample noise在同一场游戏里面就是同一个 noisy Q-network 在玩那一场游戏,这件事非常重要。为什么这件事非常重要呢?因为这是导致了 Noisy Net 跟原来的 Epsilon Greedy 或其它在 action 做 sample 方法的本质上的差异。
![](img/7.10.png) ![](img/7.10.png)
@@ -92,13 +94,19 @@ $$
![](img/7.12.png) ![](img/7.12.png)
Distributional Q-function 它想要做的事情是 model distribution怎么做呢在原来的 Q-function 里面,假设你只能够采取 $a_1$, $a_2$, $a_3$, 3 个 actions那你就是 input 一个 stateoutput 3 个 values。3 个 values 分别代表 3 个 actions 的 Q value但是这个 Q value 是一个 distribution 的期望值。所以 Distributional Q-function 的想法就是何不直接 output 那个 distribution。但是要直接 output 一个 distribution 也不知道怎么做。实际上的做法是说, 假设 distribution 的值就分布在某一个 range 里面,比如说 -10 到10那把 -10 到10 中间拆成一个一个的 bin拆成一个一个的长条图。举例来说在这个例子里面每一个 action 的 reward 的 space 就拆成 5 个bin。假设 reward 可以拆成 5 个 bin 的话,今天你的 Q-function 的 output 是要预测说,你在某一个 state采取某一个 action你得到的 reward落在某一个 bin 里面的概率。所以其实这边的概率的和,这些绿色的 bar 的和应该是 1它的高度代表说在某一个 state采取某一个 action 的时候,它落在某一个 bin 的机率。这边绿色的代表 action 1红色的代表 action 2蓝色的代表 action 3。所以今天你就可以真的用 Q-function 去 estimate $a_1$ 的 distribution$a_2$ 的 distribution$a_3$ 的 distribution。那实际上在做 testing 的时候, 我们还是要选某一个 action去执行嘛那选哪一个 action 呢?实际上在做的时候,还是选这个 mean 最大的那个 action 去执行。但假设我们今天可以 model distribution 的话,除了选 mean 最大的以外,也许在未来你可以有更多其他的运用。举例来说,你可以考虑它的 distribution 长什么样子。若 distribution variance 很大代表说采取这个action 虽然mean 可能平均而言很不错但也许风险很高你可以train一个network 它是可以规避风险的。就在 2 个action mean 都差不多的情况下,也许可以选一个风险比较小的 action 来执行,这是 Distributional Q-function 的好处。关于怎么 train 这样的 Q-network 的细节,我们就不讲,你只要记得说 Q-network 有办法 output 一个 distribution 就对了。我们可以不只是估测得到的期望 reward mean 的值。我们其实是可以估测一个 distribution 的。 Distributional Q-function 它想要做的事情是 model distribution怎么做呢在原来的 Q-function 里面,假设你只能够采取 $a_1$, $a_2$, $a_3$3 个 actions那你就是 input 一个 stateoutput 3 个 values。3 个 values 分别代表 3 个 actions 的 Q value但是这个 Q value 是一个 distribution 的期望值。所以 Distributional Q-function 的想法就是何不直接 output 那个 distribution。但是要直接 output 一个 distribution 也不知道怎么做。
实际上的做法是说, 假设 distribution 的值就分布在某一个 range 里面,比如说 -10 到 10那把 -10 到 10 中间拆成一个一个的 bin拆成一个一个的长条图。举例来说在这个例子里面每一个 action 的 reward 的 space 就拆成 5 个 bin。假设 reward 可以拆成 5 个 bin 的话,今天你的 Q-function 的 output 是要预测说,你在某一个 state采取某一个 action你得到的 reward落在某一个 bin 里面的概率。
所以其实这边的概率的和,这些绿色的 bar 的和应该是 1它的高度代表说在某一个 state 采取某一个 action 的时候,它落在某一个 bin 的机率。这边绿色的代表 action 1红色的代表 action 2蓝色的代表 action 3。所以今天你就可以真的用 Q-function 去 estimate $a_1$ 的 distribution$a_2$ 的 distribution$a_3$ 的 distribution。那实际上在做 testing 的时候, 我们还是要选某一个 action 去执行,那选哪一个 action 呢?实际上在做的时候,还是选这个 mean 最大的那个 action 去执行。
但假设我们可以 model distribution 的话,除了选 mean 最大的以外,也许在未来你可以有更多其他的运用。举例来说,你可以考虑它的 distribution 长什么样子。如果 distribution variance 很大,代表说采取这个 action 虽然 mean 可能平均而言很不错,但也许风险很高,你可以 train一个 network 它是可以规避风险的。就在 2 个 action mean 都差不多的情况下,也许可以选一个风险比较小的 action 来执行,这是 Distributional Q-function 的好处。关于怎么 train 这样的 Q-network 的细节,我们就不讲,你只要记得说 Q-network 有办法 output 一个 distribution 就对了。我们可以不只是估测得到的期望 reward mean 的值。我们其实是可以估测一个 distribution 的。
## Rainbow ## Rainbow
![](img/7.13.png) ![](img/7.13.png)
最后一个技巧叫做 rainbow把刚才所有的方法都综合起来就变成 rainbow 。因为刚才每一个方法,就是有一种自己的颜色,把所有的颜色通通都合起来,就变成 rainbow它把原来的 DQN 也算是一种方法,故有 7 色。 **最后一个技巧叫做 rainbow把刚才所有的方法都综合起来就变成 rainbow 。**因为刚才每一个方法,就是有一种自己的颜色,把所有的颜色通通都合起来,就变成 rainbow它把原来的 DQN 也算是一种方法,故有 7 色。
那我们来看看这些不同的方法。横轴是 training process纵轴是玩了 10 几个 Atari 小游戏的平均的分数的和,但它取的是 median 的分数,为什么是取 median 不是直接取平均呢?因为它说每一个小游戏的分数,其实差很多。如果你取平均的话,到时候某几个游戏就 dominate 你的结果,所以它取 median 的值。 那我们来看看这些不同的方法。横轴是 training process纵轴是玩了 10 几个 Atari 小游戏的平均的分数的和,但它取的是 median 的分数,为什么是取 median 不是直接取平均呢?因为它说每一个小游戏的分数,其实差很多。如果你取平均的话,到时候某几个游戏就 dominate 你的结果,所以它取 median 的值。