fix some errors

This commit is contained in:
qiwang067
2020-07-11 15:42:01 +08:00
parent d2ced89978
commit a783a07fee
4 changed files with 51 additions and 47 deletions

View File

@@ -20,7 +20,7 @@
在 reinforcement learning 里面environment 跟 reward function 不是你可以控制的environment 跟 reward function 是在开始学习之前,就已经事先给定的。你唯一能做的事情是调整 actor 里面的 policy使得 actor 可以得到最大的 reward。Actor 里面会有一个 policy 这个policy 决定了actor 的行为, policy 就是给一个外界的输入,然后它会输出 actor 现在应该要执行的行为。
![](img/1.2.png)
**Policy 一般写成 $\pi$**。假设你是用 deep learning 的技术来做 reinforcement learning 的话,**policy 就是一个 network**network 里面就有一堆参数, 我们用 $\theta$ 来代表 $\pi$ 的参数。Network 的 input 就是现在 machine 看到的东西,如果让 machine 打电玩的话, 那 machine 看到的东西就是游戏的画面。Machine 看到什么东西,会影响你现在 training 到底好不好 train。
**Policy 一般写成 $\pi$**。假设你是用 deep learning 的技术来做 reinforcement learning 的话,**policy 就是一个 network**。Network 里面就有一堆参数, 我们用 $\theta$ 来代表 $\pi$ 的参数。Network 的 input 就是现在 machine 看到的东西,如果让 machine 打电玩的话, 那 machine 看到的东西就是游戏的画面。Machine 看到什么东西,会影响你现在 training 到底好不好 train。
举例来说,在玩游戏的时候, 也许你觉得游戏的画面,前后是相关的,也许你觉得说,你应该让你的 policy看从游戏初始到现在这个时间点所有画面的总和。你可能会觉得你要用到 RNN 来处理它,不过这样子,你会比较难处理。要让你的 machine你的 policy 看到什么样的画面, 这个是你自己决定的。让你知道说给机器看到什么样的游戏画面可能是比较有效的。Output 的就是今天机器要采取什么样的行为。
@@ -41,7 +41,7 @@
一场游戏,叫做一个 `Episode`。把这个游戏里面,所有得到的 reward 都总合起来,就是 `Total reward`,我们称其为`Return(回报)`,用 R 来表示它。Actor 存在的目的就是想办法去 maximize 它可以得到的 reward。
![](img/1.5.png)
首先,`environment` 是一个`function`连那个游戏的主机也可以把它看作是一个 function虽然它不一定是 neural network可能是 rule-based 的规则,但你可以把它看作是一个 function。这个 function一开始就先吐出一个 state然后接下来呢,也就是游戏的画面,接下来你的 actor 看到这个游戏画面 $s_1$ 以后,它吐出 $a_1$,然后接下来 environment,把这个 $a_1$ 当作它的输入,然后它再吐出 $s_2$,吐出新的游戏画面。actor 看到新的游戏画面,又再决定新的行为 $a_2$,然后 environment 再看到 $a_2$,再吐出 $s_3$这个 process 一直下去,直到 environment 觉得说应该要停止为止。
首先,`environment` 是一个`function`,游戏的主机也可以把它看作是一个 function虽然它不一定是 neural network可能是 rule-based 的规则,但你可以把它看作是一个 function。这个 function一开始就先吐出一个 state也就是游戏的画面接下来你的 actor 看到这个游戏画面 $s_1$ 以后,它吐出 $a_1$,然后 environment $a_1$ 当作它的输入,然后它再吐出 $s_2$,吐出新的游戏画面。Actor 看到新的游戏画面,再采取新的行为 $a_2$,然后 environment 再看到 $a_2$,再吐出 $s_3$这个 process 一直持续下去,直到 environment 觉得说应该要停止为止。
在一场游戏里面,我们把 environment 输出的 $s$ 跟 actor 输出的行为 $a$,把这个 $s$ 跟 $a$ 全部串起来, 叫做一个 `Trajectory`,如下式所示。
$$
@@ -59,6 +59,7 @@ p_{\theta}(\tau)
$$
怎么算呢,如上式所示。在假设你 actor 的参数就是 $\theta$ 的情况下,某一个 trajectory $\tau$ 的概率就是这样算的,你先算 environment 输出 $s_1$ 的概率,再计算根据 $s_1$ 执行 $a_1$ 的概率,这是由你 policy 里面的 network 参数 $\theta$ 所决定的, 它是一个概率,因为你的 policy 的 network 的 output 是一个 distributionactor 是根据这个 distribution 去做 sample决定现在实际上要采取的 action是哪一个。接下来 environment 根据 $a_1$ 跟 $s_1$ 产生 $s_2$,因为 $s_2$ 跟$s_1$ 还是有关系的,下一个游戏画面,跟前一个游戏画面通常还是有关系的,至少要是连续的, 所以给定前一个游戏画面 $s_1$ 和现在 actor 采取的行为 $a_1$,就会产生 $s_2$。
这件事情可能是概率,也可能不是概率,这个取决于 environment就是主机它内部设定是怎样。看今天这个主机在决定要输出什么样的游戏画面的时候有没有概率。因为如果没有概率的话这个游戏的每次的行为都一样你只要找到一条 path 就可以过关了,这样感觉是蛮无聊的 。所以游戏里面,通常是还是有一些概率的,你做同样的行为,给同样的前一个画面, 下次产生的画面不见得是一样的。Process 就反复继续下去,你就可以计算一个 trajectory $s_1$,$a_1$, $s_2$ , $a_2$ 出现的概率有多大。
**这个概率取决于两部分**
@@ -70,33 +71,32 @@ $$
![](img/1.6.png)
在 reinforcement learning 里面,除了 environment 跟 actor 以外, 还有`reward function`。Reward function 根据在某一个 state 采取的某一个 action 决定说现在这个行为可以得到多少的分数。 它是一个 function给它 $s_1$$a_1$,它告诉你得到 $r_1$。给它 $s_2$ $a_2$,它告诉你得到 $r_2$。 把所有的 $r$ 都加起来,我们就得到了 R
在 reinforcement learning 里面,除了 environment 跟 actor 以外, 还有`reward function`。Reward function 根据在某一个 state 采取的某一个 action 决定说现在这个行为可以得到多少的分数。 它是一个 function给它 $s_1$$a_1$,它告诉你得到 $r_1$。给它 $s_2$ $a_2$,它告诉你得到 $r_2$。 把所有的 $r$ 都加起来,我们就得到了 $R(\tau)$ ,代表某一个 trajectory $\tau$ 的 reward。在某一场游戏里面 某一个 episode 里面,我们会得到 R。**我们要做的事情就是调整 actor 内部的参数 $\theta$ 使得 R 的值越大越好。** 但实际上 reward 并不只是一个 scalarreward 其实是一个 random variableR 其实是一个 random variable。 因为 actor 在给定同样的 state 会做什么样的行为这件事情是有随机性的。environment 在给定同样的 observation 要采取什么样的 action要产生什么样的 observation本身也是有随机性的。所以 R 是一个 random variable你能够计算的是它的期望值。你能够计算的是说在给定某一组参数 $\theta$ 的情况下,我们会得到的 R 的期望值是多少
这边写做 $R(\tau)$ ,代表说是某一个 trajectory $\tau$。在某一场游戏里面, 某一个 episode 里面,我们会得到 R。**我们要做的事情就是调整 actor 内部的参数 $\theta$ 使得 R 的值越大越好。** 但实际上 reward 并不只是一个 scalarreward 其实是一个 random variableR 其实是一个 random variable。 因为 actor 在给定同样的 state 会做什么样的行为这件事情是有随机性的。environment 在给定同样的 observation 要采取什么样的 action要产生什么样的 observation本身也是有随机性的。所以 R 是一个 random variable你能够计算的是它的期望值。你能够计算的是说在给定某一组参数 $\theta$ 的情况下,我们会得到的 R 的期望值是多少。
$$
\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)
$$
这个期望值的算法如上式所示,穷举所有可能的 trajectory $\tau$ 每一个 trajectory $\tau$ 都有一个概率。比如 $\theta$ 是一个很强的 model 那它都不会死。如果今天有一个 episode 很快就死掉了, 它的概率就很小;如果有一个 episode 都一直没有死, 那它的概率就很大。根据你的 $\theta$ 你可以算出某一个 trajectory $\tau$ 出现的概率,接下来你计算这个 $\tau$ 的 total reward 是多少。 Total reward weighted by 这个 $\tau$ 出现的概率,summation over 所有的 $\tau$,就是期望值。给定一个参数,你会得到的期望值。
这个期望值的算法如上式所示,穷举所有可能的 trajectory $\tau$ 每一个 trajectory $\tau$ 都有一个概率。比如 $\theta$ 是一个很强的 model 那它都不会死。如果有一个 episode 很快就死掉了, 它的概率就很小;如果有一个 episode 都一直没有死, 那它的概率就很大。根据你的 $\theta$ 你可以算出某一个 trajectory $\tau$ 出现的概率,接下来你计算这个 $\tau$ 的 total reward 是多少。 Total reward weighted by 这个 $\tau$ 出现的概率,所有的 $\tau$ 进行求和,就是期望值。给定一个参数,你会得到的期望值。
$$
\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]
$$
我们还可以写成上式那样,从 $p_{\theta}(\tau)$ 这个 distribution sample 一个 trajectory $\tau$,然后计算 $R(\tau)$ 的期望值,就是你的 expected reward。 我们要做的事情就是 maximize expected reward。
![](img/1.7.png)
怎么 maximize expected reward 呢?我们用的`gradient ascent`,因为要让它越大越好,所以是 gradient ascent。Gradient ascent 在 update 参数的时候要加。要进行 gradient ascent我们先要计算 expected reward $\bar{R}$ 的 gradient 。我们对 $\bar{R}$ 取一个 gradient这里面只有 $p_{\theta}(\tau)$ 是跟 $\theta$ 有关,所以 gradient 就放在 $p_{\theta}(\tau)$ 这个地方。$R(\tau)$ 这个 reward function 不需要是 differentiable我们也可以解接下来的问题。举例来说如果是在 GAN 里面,$R(\tau)$ 其实是一个 discriminator它就算是没有办法微分也无所谓你还是可以做接下来的运算。
怎么 maximize expected reward 呢?我们用的是 `gradient ascent`,因为要让它越大越好,所以是 gradient ascent。Gradient ascent 在 update 参数的时候要加。要进行 gradient ascent我们先要计算 expected reward $\bar{R}$ 的 gradient 。我们对 $\bar{R}$ 取一个 gradient这里面只有 $p_{\theta}(\tau)$ 是跟 $\theta$ 有关,所以 gradient 就放在 $p_{\theta}(\tau)$ 这个地方。$R(\tau)$ 这个 reward function 不需要是 differentiable我们也可以解接下来的问题。举例来说如果是在 GAN 里面,$R(\tau)$ 其实是一个 discriminator它就算是没有办法微分也无所谓你还是可以做接下来的运算。
取 gradient之后我们背一个公式
$$
\nabla f(x)=f(x)\nabla \log f(x)
$$
我们可以对$\nabla p_{\theta}(\tau)$ 使用这个公式,然后会得到 $\nabla p_{\theta}(\tau)=p_{\theta}(\tau) \nabla \log p_{\theta}(\tau)$。
我们可以对 $\nabla p_{\theta}(\tau)$ 使用这个公式,然后会得到 $\nabla p_{\theta}(\tau)=p_{\theta}(\tau) \nabla \log p_{\theta}(\tau)$。
接下来, 分子分母,上下同乘$p_{\theta}(\tau)$,然后我们可以得到下式:
$$
\frac{\nabla p_{\theta}(\tau)}{p_{\theta}(\tau)}=\log p_{\theta}(\tau)
$$
然后如下式所示, 对 $\tau$ 进行求和,把这个 R 跟这个 log 这两项 weighted by $p_{\theta}(\tau)$ 既然有 weighted by $p_{\theta}(\tau)$,它们就可以被写成这个 expected 的形式。也就是你从 $p_{\theta}(\tau)$ 这个 distribution 里面 sample $\tau$ 出来, 去计算 $R(\tau)$ 乘上 $\nabla\log p_{\theta}(\tau)$,然后把它对所有可能的 $\tau$ 进行求和,就是这个 expected value 。
然后如下式所示, 对 $\tau$ 进行求和,把 $R(\tau)$ 和 $\log p_{\theta}(\tau)$ 这两项 weighted by $ p_{\theta}(\tau)$ 既然有 weighted by $p_{\theta}(\tau)$,它们就可以被写成这个 expected 的形式。也就是你从 $p_{\theta}(\tau)$ 这个 distribution 里面 sample $\tau$ 出来, 去计算 $R(\tau)$ 乘上 $\nabla\log p_{\theta}(\tau)$,然后把它对所有可能的 $\tau$ 进行求和,就是这个 expected value 。
$$
\begin{aligned}
@@ -116,12 +116,15 @@ $$
注意 $p_{\theta}(\tau)$ 里面有两项,$p(s_{t+1}|s_t,a_t)$ 来自于 environment$p_\theta(a_t|s_t)$ 是来自于 agent。 $p(s_{t+1}|s_t,a_t)$ 由环境决定从而与 $\theta$ 无关,因此 $\nabla \log p(s_{t+1}|s_t,a_t) =0 $。因此 $\nabla p_{\theta}(\tau)=
\nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)$。
你可以非常直观的来理解这个部分,也就是在你 sample 到的 data 里面, 你 sample 到,在某一个 state $s_t$ 要执行某一个 action $a_t$ 这个 $s_t$ 跟 $a_t$ 它是在整个 trajectory $\tau$ 的里面的某一个 state and action 的 pair。 假设你在 $s_t$ 执行 $a_t$,最后发现 $\tau$ 的 reward 是正的, 那你就要增加这一项的概率,你就要增加在 $s_t$ 执行 $a_t$ 的概率。 反之,在 $s_t$ 执行 $a_t$ 会导致整个 trajectory 的 reward 变成负的, 你就要减少这一项的概率。
你可以非常直观的来理解这个部分,也就是在你 sample 到的 data 里面, 你 sample 到,在某一个 state $s_t$ 要执行某一个 action $a_t$ 这个 $s_t$ 跟 $a_t$ 它是在整个 trajectory $\tau$ 的里面的某一个 state and action 的 pair。
* 假设你在 $s_t$ 执行 $a_t$,最后发现 $\tau$ 的 reward 是正的, 那你就要增加这一项的概率,你就要增加在 $s_t$ 执行 $a_t$ 的概率。
* 反之,在 $s_t$ 执行 $a_t$ 会导致$\tau$ 的 reward 变成负的, 你就要减少这一项的概率。
![](img/1.8.png)
这个怎么实现呢? 你用 gradient ascent 的方法 来 update 你的参数,你原来有一个参数 $\theta$ ,把你的 $\theta$ 加上你的 gradient 这一项,那当然前面要有个 learning ratelearning rate 其实也是要调的,你可用 Adam、RMSProp 等方法对其进行调整。
这个怎么实现呢? 你用 gradient ascent 来 update 你的参数,你原来有一个参数 $\theta$ ,把你的 $\theta$ 加上你的 gradient 这一项,那当然前面要有个 learning ratelearning rate 其实也是要调的,你可用 Adam、RMSProp 等方法对其进行调整。
我们可以套下面这个公式来把 gradient 计算出来:
@@ -130,15 +133,17 @@ $$
$$
实际上,要套上面这个公式, 首先你要先收集一大堆的 s 跟 a 的 pair你还要知道这些 s 跟 a 在跟环境互动的时候,你会得到多少的 reward。 这些资料怎么收集呢?你要拿你的 agent它的参数是 $\theta$,去跟环境做互动, 也就是拿你已经 train 好的 agent 先去跟环境玩一下,先去跟那个游戏互动一下, 互动完以后,你就会得到一大堆游戏的纪录,你会记录说,今天先玩了第一场,在第一场游戏里面,我们在 state $s_1$ 采取 action $a_1$,在 state $s_2$ 采取 action $a_2$ 。
其实玩游戏的时候是有随机性的所以 agent 本身是有随机性的,在同样 state $s_1$,不是每次都会采取 $a_1$,所以你要记录下来在 state $s_1$ 采取 $a_1$,在 state $s_2$ 采取 $a_2$。整场游戏结束以后,得到的分数是$R(\tau^1)$。你会 sample 到另外一笔 data也就是另外一场游戏在另外一场游戏里面,你在第一个 state 采取这个 action在第二个 state 采取这个 action在第二个游戏画面采取这个 action,然后你 sample 到的就是$\tau^2$得到的 reward 是 $R(\tau^2)$。你就可以把 sample 到的东西代到这个 gradient 的式子里面,把 gradient 算出来。也就是把这边的每一个 s 跟 a 的 pair 拿进来,算一下它的 log probability 。你计算一下在某一个 state 采取某一个 action 的 log probability然后对它取 gradient然后这个 gradient 前面会乘一个 weightweight 就是这场游戏的 reward。 有了这些以后,你就会去 update 你的 model。
玩游戏的时候是有随机性的所以 agent 本身是有随机性的,在同样 state $s_1$,不是每次都会采取 $a_1$,所以你要记录下来在 state $s_1^1$ 采取 $a_1^1$,在 state $s_2^1$ 采取 $a_2^1$。整场游戏结束以后,得到的分数是$R(\tau^1)$。你会 sample 到另外一笔 data也就是另外一场游戏在另外一场游戏里面,你在 state $s_1^2$ 采取 $a_1^2$,在 state $s_2^2$ 采取 $a_2^2$,然后你 sample 到的就是 $\tau^2$,得到的 reward 是 $R(\tau^2)$。
Update 完你的 model 以后。你要重新再去收集你的 data再 update model。这边要注意一下一般 policy gradient sample 的 data 就只会用一次。你把这些 data sample 起来,然后拿去 update 参数,这些 data 就丢掉了,再重新 sample data才能够再重新去 update 参数, 等一下我们会解决这个问题
你就可以把 sample 到的东西代到这个 gradient 的式子里面,把 gradient 算出来。也就是把这边的每一个 s 跟 a 的 pair 拿进来,算一下它的 log probability 。你计算一下在某一个 state 采取某一个 action 的 log probability然后对它取 gradient然后这个 gradient 前面会乘一个 weightweight 就是这场游戏的 reward。 有了这些以后,你就会去 update 你的 model
Update 完你的 model 以后。你要重新去收集 data再 update model。这边要注意一下一般 policy gradient sample 的 data 就只会用一次。你把这些 data sample 起来,然后拿去 update 参数,这些 data 就丢掉了。接着再重新 sample data才能够去 update 参数, 等一下我们会解决这个问题。
![](img/1.9.png)
接下来讲一些实现细节。实现方法是这个样子,把它想成一个分类的问题,在 classification 里面就是 input 一个 image然后 output 决定说是 10 个 class 里面的哪一个。在做 classification 时,我们要收集一堆 training data要有 input 跟 output 的 pair。
接下来讲一些实现细节。实现方法是这个样子,把它想成一个分类的问题,在 classification 里面就是 input 一个 image然后 output 决定说是 10 个 class 里面的哪一个。在做 classification 时,我们要收集一堆 training data要有 input 跟 output 的 pair。
在实现的时候,你就把 state 当作是 classifier 的 input。 你就当在做 image classification 的 problem只是现在的 class 不是说 image 里面有什么 objects。 现在的 class 是说,看到这张 image 我们要采取什么样的行为,每一个行为就是一个 class。比如说第一个 class 叫做向左,第二个 class 叫做向右,第三个 class 叫做开火。
@@ -166,13 +171,13 @@ $$
但在很多游戏里面, reward 总是正的,就是说最低都是 0。比如说打乒乓球游戏 你的分数就是介于 0 到 21 分之间,所以这个 R 总是正的。假设你直接套用这个式子, 在 training 的时候,告诉 model 说,不管是什么 action 你都应该要把它的概率提升。 在理想上,这么做并不一定会有问题。因为虽然说 R 总是正的,但它正的量总是有大有小,你在玩乒乓球那个游戏里面,得到的 reward 总是正的,但它是介于 0~21分之间有时候你采取某些 action 可能是得到 0 分,采取某些 action 可能是得到 20 分。
![](img/1.12.png)
假设你有 3 个 action a/b/c 可以执行,在某一个 state 有 3 个 action a/b/c可以执行。根据这个式子你要把这 3 项的概率, log probability 都拉高。 但是它们前面 weight 的这个 R 是不一样的。 R 是有大有小的weight 小的它上升的就少weight 多的,它上升的就大一点。 因为这个 log probability它是一个概率所以action a、b、c 的和要是 0。 所以上升少的,在做完 normalize 以后, 它其实就是下降的,上升的多的,才会上升。
假设你有 3 个 action a/b/c 可以执行,在某一个 state 有 3 个 action a/b/c可以执行。根据这个式子你要把这 3 项的概率, log probability 都拉高。 但是它们前面 weight 的这个 R 是不一样的。 R 是有大有小的weight 小的它上升的就少weight 多的,它上升的就大一点。 因为这个 log probability它是一个概率所以action a、b、c 的和要是 0。 所以上升少的,在做完 normalize 以后, 它其实就是下降的,上升的多的,才会上升。
![1](img/1.13.png)
这个是一个理想上的状况,但是实际上,我们是在做 sampling 就本来这边应该是一个 expectation summation over 所有可能的 s 跟 a 的 pair。 但你真正在学的时候,当然不可能是这么做的,你只是 sample 了少量的 s 跟 a 的 pair 而已。 因为我们做的是 sampling有一些 action 可能从来都没有 sample 到。在某一个 state1虽然可以执行的 action 有 a/b/c 3 个,但你可能只 sample 到 action b你可能只 sample 到 action c你没有 sample 到 action a。但现在所有 action 的 reward 都是正的,所以根据这个式子,它的每一项的概率都应该要上升。你会遇到的问题是,因为 a 没有被 sample 到,其它 action 的概率如果都要上升a 的概率就下降。 所以 a 不一定是一个不好的 action 它只是没被 sample 到。但只是因为它没被 sample 到, 它的概率就会下降,这个显然是有问题的,要怎么解决这个问题呢?你会希望你的 reward 不要总是正的。
这个是一个理想上的状况,但是实际上,我们是在做 sampling 就本来这边应该是一个 expectation summation over 所有可能的 s 跟 a 的 pair。 但你真正在学的时候,当然不可能是这么做的,你只是 sample 了少量的 s 跟 a 的 pair 而已。 因为我们做的是 sampling有一些 action 可能从来都没有 sample 到。在某一个 state1虽然可以执行的 action 有 a/b/c 3 个,但你可能只 sample 到 action b你可能只 sample 到 action c你没有 sample 到 action a。但现在所有 action 的 reward 都是正的,所以根据这个式子,它的每一项的概率都应该要上升。你会遇到的问题是,因为 a 没有被 sample 到,其它 action 的概率如果都要上升a 的概率就下降。 所以 a 不一定是一个不好的 action 它只是没被 sample 到。但只是因为它没被 sample 到, 它的概率就会下降,这个显然是有问题的,要怎么解决这个问题呢?你会希望你的 reward 不要总是正的。
![1.](img/1.14.png)
@@ -198,7 +203,7 @@ $$
![](img/1.15.png)
举个例子, 假设现在这个游戏都很短,只有 3~4 个互动, 在 $s_a$ 这个 state 执行 $a_1$ 得到 5 分。在 $s_b$ 这个 state 执行 $a_2$ 得到 0 分。在 $s_c$这个 state 执行 $a_3$ 得到 -2 分。 整场游戏下来,你得到 +3 分,那今天你得到 +3 分 代表在 state $s_b$ 执行 action $a_2$ 是好的吗?并不见得代表 state $s_b$ 执行 $a_2$ 是好的。因为这个正的分数,主要来自于在state $s_a$ 执行了 $a_1$,跟在 state $s_b$ 执行 $a_2$ 是没有关系的,也许在 state $s_b$ 执行 $a_2$ 反而是不好的, 因为它导致你接下来会进入 state $s_c$,执行 $a_3$ 被扣分,所以今天整场游戏得到的结果是好的, 并不代表每一个行为都是对的。
举个例子, 假设这个游戏都很短,只有 3~4 个互动, 在 $s_a$ 执行 $a_1$ 得到 5 分。在 $s_b$ 执行 $a_2$ 得到 0 分。在 $s_c$ 执行 $a_3$ 得到 -2 分。 整场游戏下来,你得到 +3 分,那你得到 +3 分 代表在 state $s_b$ 执行 action $a_2$ 是好的吗?并不见得代表 state $s_b$ 执行 $a_2$ 是好的。因为这个正的分数,主要来自于在 state $s_a$ 执行了 $a_1$,跟在 state $s_b$ 执行 $a_2$ 是没有关系的,也许在 state $s_b$ 执行 $a_2$ 反而是不好的, 因为它导致你接下来会进入 state $s_c$,执行 $a_3$ 被扣分,所以整场游戏得到的结果是好的, 并不代表每一个行为都是对的。
![](img/1.16.png)
@@ -208,7 +213,7 @@ $$
![](img/1.17.png)
本来的 weight 是整场游戏的 reward 的总和。那现在改一下,改成从某个时间 $t$ 开始,假设这个 action 是在 t 这个时间点所执行的,从 $t$ 这个时间点,一直到游戏结束所有 reward 的总和,才真的代表这个 action 是好的还是不好的。
本来的 weight 是整场游戏的 reward 的总和。那现在改成从某个时间 $t$ 开始,假设这个 action 是在 t 这个时间点所执行的,从 $t$ 这个时间点,一直到游戏结束所有 reward 的总和,才真的代表这个 action 是好的还是不好的。
![](img/1.18.png)
**接下来再更进一步,我们把未来的 reward 做一个 discount**,由此得到的回报被称为 `Discounted Return(折扣回报)`。为什么要把未来的 reward 做一个 discount 呢?因为虽然在某一个时间点,执行某一个 action会影响接下来所有的结果有可能在某一个时间点执行的 action接下来得到的 reward 都是这个 action 的功劳。但在比较真实的情况下, 如果时间拖得越长,影响力就越小。 比如说在第二个时间点执行某一个 action 那我在第三个时间点得到的 reward 可能是在第二个时间点执行某个 action 的功劳,但是在 100 个 timestamp 之后,又得到 reward那可能就不是在第二个时间点执行某一个 action 得到的功劳。 所以我们实际上在做的时候,你会在 R 前面乘上一个 `discount factor` $\gamma$ $\gamma \in [0,1] $ ,一般会设个 0.9 或 0.99

View File

@@ -25,7 +25,7 @@ Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我
![](img/3.3.png)
第二个方法是`Temporal-difference(时序差分)` 的方法, `即 TD based ` 的方法。在 MC based 的方法中每次我们都要算accumulated reward也就是从某一个 state $s_a$ 一直玩到游戏结束的时候得到的所有reward 的总和。所以你要 apply MC based 的 approach你必须至少把这个游戏玩到结束。但有些游戏非常的长你要玩到游戏结束才能够 update network你可能根本收集不到太多的资料花的时间太长了。所以我们会采用 TD based 的方法。TD based 的方法不需要把游戏玩到底,只要在游戏的某一个情况,某一个 state $s_t$ 的时候,采取 action $a_t$ 得到 reward $r_t$ ,跳到 state $s_{t+1}$,就可以 apply TD 的方法。
第二个方法是`Temporal-difference(时序差分)` 的方法, `即 TD based ` 的方法。在 MC based 的方法中,每次我们都要算 accumulated reward也就是从某一个 state $s_a$ 一直玩到游戏结束的时候得到的所有reward 的总和。所以你要 apply MC based 的 approach你必须至少把这个游戏玩到结束。但有些游戏非常的长你要玩到游戏结束才能够 update network你可能根本收集不到太多的资料花的时间太长了。所以我们会采用 TD based 的方法。TD based 的方法不需要把游戏玩到底,只要在游戏的某一个情况,某一个 state $s_t$ 的时候,采取 action $a_t$ 得到 reward $r_t$ ,跳到 state $s_{t+1}$,就可以 apply TD 的方法。
怎么 apply TD 的方法呢?这边是基于以下这个式子:
$$
@@ -97,7 +97,7 @@ Q-function 有两种写法:
![](img/3.8.png)
上图是文献上的结果,你去 estimate Q-function 的话看到的结果可能会像是这个样子。这是什么意思呢它说假设我们有3 个 actions3 个actions 就是原地不动、向上、向下。
上图是文献上的结果,你去 estimate Q-function 的话,看到的结果可能会像是这个样子。这是什么意思呢?它说假设我们有 3 个 actions3 个 actions 就是原地不动、向上、向下。
* 假设是在第一个state不管是采取哪个action最后到游戏结束的时候得到的 expected reward 其实都差不多。因为球在这个地方就算是你向下接下来你其实应该还来的急救所以今天不管是采取哪一个action就差不了太多。
@@ -113,7 +113,7 @@ Q-function 有两种写法:
虽然表面上我们 learn 一个 Q-function它只能拿来评估某一个 actor $\pi$ 的好坏,但只要有了这个 Q-function我们就可以做 reinforcement learning。有了这个 Q-function我们就可以决定要采取哪一个 action我们就可以进行`策略改进(Policy Improvement)`
它的大原则是这样,假设你有一个初始的 actor也许一开始很烂 随机的也没有关系。初始的 actor 叫做 $\pi$,这个 $\pi$ 跟环境互动,会 collect data。接下来你 learn 一个 $\pi$ 这个 actor 的Q value你去衡量一下 $\pi$ 这个actor 在某一个 state 强制采取某一个 action接下来用 $\pi$ 这个 policy 会得到的 expected reward那用 TD 或 MC 也是可以的。你 learn 出一个 Q-function 以后,就保证你可以找到一个新的 policy $\pi'$ policy $\pi'$ 一定会比原来的 policy $\pi$ 还要好。那等一下会定义说,什么叫做好。所以这边神奇的地方是,假设你有一个 Q-function 和 某一个policy $\pi$,你根据 policy $\pi$ learn 出 policy $\pi$ 的 Q-function接下来保证你可以找到一个新的 policy $\pi'$ ,它一定会比 $\pi$ 还要好,然后你用 $\pi'$ 取代 $\pi$,再去找它的 Q-function得到新的以后再去找一个更好的 policy。 然后这个循环一直下去,你的 policy 就会越来越好。
它的大原则是这样,假设你有一个初始的 actor也许一开始很烂 随机的也没有关系。初始的 actor 叫做 $\pi$,这个 $\pi$ 跟环境互动,会 collect data。接下来你 learn 一个 $\pi$ 这个 actor 的 Q value你去衡量一下 $\pi$ 这个actor 在某一个 state 强制采取某一个 action接下来用 $\pi$ 这个 policy 会得到的 expected reward那用 TD 或 MC 也是可以的。你 learn 出一个 Q-function 以后,就保证你可以找到一个新的 policy $\pi'$ policy $\pi'$ 一定会比原来的 policy $\pi$ 还要好。那等一下会定义说,什么叫做好。所以这边神奇的地方是,假设你有一个 Q-function 和 某一个policy $\pi$,你根据 policy $\pi$ learn 出 policy $\pi$ 的 Q-function接下来保证你可以找到一个新的 policy $\pi'$ ,它一定会比 $\pi$ 还要好,然后你用 $\pi'$ 取代 $\pi$,再去找它的 Q-function得到新的以后再去找一个更好的 policy。 然后这个循环一直下去,你的 policy 就会越来越好。
![](img/3.10.png)
上图就是讲我们刚才讲的到底是什么。
@@ -133,9 +133,9 @@ $$
![](img/3.11.png)
上图想要跟大家讲的是说,为什么用 $Q^{\pi}(s,a)$ 这个Q-function 所决定出来的$\pi'$,一定会比 $\pi$ 还要好。
上图想要跟大家讲的是说,为什么用 $Q^{\pi}(s,a)$ 这个 Q-function 所决定出来的 $\pi'$,一定会比 $\pi$ 还要好。
假设现在呢,我们有一个policy 叫做 $\pi'$,它是由 $Q^{\pi}$ 决定的。我们要证对所有的 state s 而言,$V^{\pi^{\prime}}(s) \geq V^{\pi}(s)$。怎么证呢?我们先把$V^{\pi^{\prime}}(s)$写出来:
假设有一个policy 叫做 $\pi'$,它是由 $Q^{\pi}$ 决定的。我们要证对所有的 state s 而言,$V^{\pi^{\prime}}(s) \geq V^{\pi}(s)$。怎么证呢?我们先把$V^{\pi^{\prime}}(s)$写出来:
$$
V^{\pi}(s)=Q^{\pi}(s, \pi(s))
$$
@@ -259,7 +259,7 @@ Q(s, a_3)=0
\end{array}
$$
但是假设你在state s你sample 过某一个action $a_{2}$ 它得到的值是positive 的reward。那 $Q(s, a_2)$ 就会比其他的action 都要好。在采取action 的时候, 就看说谁的Q value 最大就采取谁所以之后你永远都只会sample 到$a_{2}$其他的action 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
但是假设你在state s你sample 过某一个action $a_{2}$ ,它得到的值是 positive 的 reward。那 $Q(s, a_2)$ 就会比其他的action 都要好。在采取action 的时候, 就看说谁的Q value 最大就采取谁所以之后你永远都只会sample 到$a_{2}$其他的action 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
如果你没有好的 exploration 的话, 你在training 的时候就会遇到这种问题。举一个实际的例子, 假设你今天是用 Q-learning 来玩比如说`slither.io`。在玩`slither.io` 你会有一个蛇,然后它在环境里面就走来走去, 然后就吃到星星它就加分。假设这个游戏一开始它采取往上走然后就吃到那个星星它就得到分数它就知道说往上走是positive。接下来它就再也不会采取往上走以外的action 了所以接下来就会变成每次游戏一开始它就往上冲然后就死掉再也做不了别的事。所以今天需要有exploration 的机制,需要让 machine 知道说虽然根据之前sample 的结果,$a_2$ 好像是不错的,但你至少偶尔也试一下$a_{1}$ 跟$a_{3}$,搞不好他们更好也说不定。
@@ -273,7 +273,7 @@ $$
第三个tip是`Experience Replay(经验回放)`。 Experience Replay 会构建一个 `Replay Buffer`replay buffer 是说现在会有某一个 policy $\pi$ 去跟环境做互动,然后它会去收集 data。我们会把所有的 data 放到一个buffer 里面buffer 里面就存了很多data。比如说 buffer 是 5 万,这样它里面可以存 5 万笔资料,每一笔资料就是记得说,我们之前在某一个 state $s_t$采取某一个action $a_t$,得到了 reward $r_t$。然后跳到 state $s_{t+1}$。那你用 $\pi$ 去跟环境互动很多次,把收集到的资料都放到这个 replay buffer 里面。
这边要注意的事情是 replay buffer 里面的 experience可能是来自于不同的 policy你每次拿 $\pi$ 去跟环境互动的时候,你可能只互动 10000 次,然后接下来你就更新你的$\pi$ 了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的 policy。Buffer 只有在它装满的时候才会把旧的资料丢掉。所以这个buffer 里面它其实装了很多不同的 policy 的 experiences。
这边要注意是 replay buffer 里面的 experience 可能是来自于不同的 policy你每次拿 $\pi$ 去跟环境互动的时候,你可能只互动 10000 次,然后接下来你就更新你的$\pi$ 了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的 policy。Buffer 只有在它装满的时候才会把旧的资料丢掉。所以这个buffer 里面它其实装了很多不同的 policy 的 experiences。
![](img/3.18.png)
@@ -298,10 +298,8 @@ A没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像,
上图就是一般的 `Deep Q-network(DQN)` 的算法。
这个算法是这样,我们需要一个 target network开始 initialize 的时候,你 initialize 2 个network一个是 Q一个是$\hat{Q}$,其实 $\hat{Q}$ 就等于 Q。一开始这个 target Q-network跟你原来的 Q-network 是一样的。在每一个episode就你拿你的 agent你拿你的 actor 去跟环境做互动,在每一次互动的过程中你都会得到一个state $s_t$一个游戏的画面,那你会采取某一个action $a_t$,那怎么知道采取哪一个action $a_t$ 呢?你就根据你现在的 Q-function。但是记得你要有exploration 的机制。比如说你用 Boltzmann exploration 或是 Epsilon Greedy 的 exploration。那接下来你得到reward $r_t$然后跳到state $s_{t+1}$。所以现在collect 到一笔data这笔data 是 $s_t$, $a_t$ ,$r_t$, $s_{t+1}$。结果这笔 data 就塞到你的buffer 里面去。如果buffer 满的话, 你就再把一些旧的资料丢掉。接下来你就从你的buffer 里面去sample data那你sample 到的是$s_{i}, a_{i}, r_{i}, s_{i+1}$。这笔data 跟你刚放进去的不一定是同一笔。你把这笔data 塞到buffer 里面再到buffer 里面去抽data抽出来并不是同一笔,你可能抽到一个旧的。
这个算法是这样的。开始 initialize 的时候,你 initialize 2 个network一个是 Q一个是 $\hat{Q}$,其实 $\hat{Q}$ 就等于 Q。一开始这个 target Q-network跟你原来的 Q-network 是一样的。在每一个 episode你拿你的 actor 去跟环境做互动,在每一次互动的过程中,你都会得到一个 state $s_t$那你会采取某一个action $a_t$怎么知道采取哪一个action $a_t$ 呢?你就根据你现在的 Q-function。但是你要有 exploration 的机制。比如说你用 Boltzmann exploration 或是 Epsilon Greedy 的 exploration。那接下来你得到 reward $r_t$,然后跳到 state $s_{t+1}$。所以现在 collect 到一笔 data这笔 data 是 ($s_t$, $a_t$ ,$r_t$, $s_{t+1}$)。这笔 data 就塞到你的 buffer 里面去。如果 buffer 满的话, 你就再把一些旧的资料丢掉。接下来你就从你的buffer 里面去 sample data那你 sample 到的是 $(s_{i}, a_{i}, r_{i}, s_{i+1})$。这笔data 跟你刚放进去的不一定是同一笔,你可能抽到一个旧的。要注意的是,其实你 sample 出来不是一笔 data你 sample 出来的是一个 batch 的 data你 sample 一个batch 出来sample 一把 experiences 出来。接下来就是计算你的 target。假设你 sample 出这么一笔 data。根据这笔 data 去算你的 target。你的 target 是什么呢target 记得要用 target network $\hat{Q}$ 来算。Target 是:
那这边另外要注意的是,其实你 sample 出来不是一笔 data你 sample 出来的是一个batch 的data你 sample 一个batch 出来sample 一把 experiences 出来接下来你要做的事情就是计算你的target。假设你 sample 出这么一笔data。根据这笔data 去算你的target。你的target 是什么呢target 记得要用target network也就是$\hat{Q}$ 来算。我们用$\hat{Q}$ 来代表target network。Target 就是:
$$
y=r_{i}+\max _{a} \hat{Q}\left(s_{i+1}, a\right)
$$

View File

@@ -1,32 +1,33 @@
# Tips of Q-learning
## Double DQN
![](img/4.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 估测出来的值。
接下来你真地去算它那怎么真地去算你有那个policy然后真的去玩那个游戏。就玩很多次玩个1 百万次。然后就去真的估说在某一个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 是比较低的
接下来要讲的是 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 是比较低的。
![](img/4.2.png)
Q: 为什么Q value 总是被高估了呢?
Q: 为什么 Q value 总是被高估了呢?
A: 因为实际上在做的时候,是要让左边这个式子跟右边我们这个target越接近越好。那你会发现说target 的值很容易一不小心就被设得太高。因为在算这个 target 的时候我们实际上在做的事情是看哪一个a 可以得到最大的Q value就把它加上去就变成我们的target。所以假设有某一个action得到的值是被高估的。
A: 因为实际上在做的时候,是要让左边这个式子跟右边这个 target 越接近越好。那你会发现说target 的值很容易一不小心就被设得太高。因为在算这个 target 的时候我们实际上在做的事情是看哪一个a 可以得到最大的Q value就把它加上去就变成我们的target。所以假设有某一个 action 得到的值是被高估的。
举例来说, 现在有4 个actions本来其实它们得到的值都是差不多的它们得到的reward 都是差不多的。但是在estimate 的时候那毕竟是个network。所以estimate 的时候是有误差的。所以假设今天是第一个action它被高估了假设绿色的东西代表是被高估的量它被高估了那这个target 就会选这个action。然后就会选这个高估的Q value来加上$r_t$来当作你的target。如果第4 个action 被高估了那就会选第4 个action 来加上$r_t$ 来当作你的target value。所以你总是会选那个Q value 被高估的你总是会选那个reward 被高估的action 当作这个max 的结果去加上$r_t$ 当作你的target。所以你的target 总是太大。
举例来说, 现在有 4 个 actions本来其实它们得到的值都是差不多的它们得到的reward 都是差不多的。但是在estimate 的时候那毕竟是个network。所以estimate 的时候是有误差的。所以假设今天是第一个action它被高估了假设绿色的东西代表是被高估的量它被高估了那这个target 就会选这个action。然后就会选这个高估的Q value来加上$r_t$来当作你的target。如果第4 个action 被高估了那就会选第4 个action 来加上$r_t$ 来当作你的target value。所以你总是会选那个Q value 被高估的你总是会选那个reward 被高估的action 当作这个max 的结果去加上$r_t$ 当作你的target。所以你的target 总是太大。
![](img/4.3.png)
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 呢?
A: 在实现上,你有两个Q network 一个是target 的Q network一个是真正你会update 的Q network。所以在 Double DQN 里面你的实现方法会是拿你会update 参数的那个Q network 去选action然后你拿target 的network那个固定住不动的network 去算value。而 Double DQN 相较于原来的DQN 的更改是最少的,它几乎没有增加任何的运算量连新的network 都不用因为你原来就有两个network 了。你唯一要做的事情只有本来你在找最大的a 的时候你在决定这个a 要放哪一个的时候,你是用$Q'$ 来算你是用target network 来算现在改成用另外一个会update 的Q network 来算。
A: 在实现上,你有两个 Q-network 一个是 target 的 Q-network一个是真正你会 update 的 Q-network。所以在 Double DQN 里面,你的实现方法会是拿你会 update 参数的那个 Q-network 去选action然后你拿target 的network那个固定住不动的network 去算value。而 Double DQN 相较于原来的 DQN 的更改是最少的,它几乎没有增加任何的运算量连新的network 都不用因为你原来就有两个network 了。你唯一要做的事情只有本来你在找最大的a 的时候你在决定这个a 要放哪一个的时候,你是用$Q'$ 来算你是用target network 来算,现在改成用另外一个会 update 的 Q-network 来算。
假如你今天只选一个tip 的话正常人都是implement Double DQN因为很容易实现。
假如你今天只选一个tip 的话,正常人都是 implement Double DQN因为很容易实现。
## Dueling DQN
![](img/4.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 的架构呢?
@@ -72,13 +73,13 @@ $$
![](img/4.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。
我们记录在$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 越接近越好。
你会发现说这个方法就是MC 跟TD 的结合。因为它就有 MC 的好处跟坏处,也有 TD 的好处跟坏处。如果看它的这个好处的话,因为我们现在 sample 了比较多的step之前是只sample 了一个step 所以某一个step 得到的data 是real 的接下来都是Q value 估测出来的。现在sample 比较多stepsample N 个step 才估测value所以估测的部分所造成的影响就会比小。当然它的坏处就跟MC 的坏处一样,因为你的 r 比较多项,你把 N 项的 r 加起来你的variance 就会比较大。但是你可以去调这个N 的值去在variance 跟不精确的 Q 之间取得一个平衡。N 就是一个hyper parameter你要调这个N 到底是多少,你是要多 sample 三步,还是多 sample 五步。
## Noisy Net
![](img/4.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/4.10.png)
@@ -91,7 +92,7 @@ $$
![](img/4.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

View File

@@ -1,7 +1,7 @@
# Sparse Reward
实际上我们用 reinforcement learning learn agent 的时候,多数的时候 agent 都是没有办法得到 reward 的。那在没有办法得到reward 的情况下对agent 来说它的训练是非常困难的。举例来说,假设你今天要训练一个机器手臂,然后桌上有一个螺丝钉跟螺丝起子,那你要训练它用螺丝起子把螺丝钉栓进去,那这个很难,为什么?因为你知道一开始你的 agent 是什么都不知道的它唯一能够做不同的action 的原因是 exploration。举例来说你在做Q learning 的时候,会有一些随机性,让它去采取一些过去没有采取过的 action那你要随机到说它把螺丝起子捡起来再把螺丝栓进去然后就会得到reward 1这件事情是永远不可能发生的。所以不管你的actor 做了什么事情它得到reward 永远都是 0对它来说不管采取什么样的 action 都是一样糟或者是一样得好。所以,它最后什么都不会学到。如果环境中的 reward 非常的 sparsereinforcement learning 的问题就会变得非常的困难。但是人类可以在非常 sparse 的reward 上面去学习我们的人生通常多数的时候我们就只是活在那里都没有得到什么reward 或者是penalty。但是人还是可以采取各种各式各样的行为。所以一个真正厉害的 AI 应该能够在 sparse reward 的情况下也学到要怎么跟这个环境互动。
实际上用 reinforcement learning learn agent 的时候,多数的时候 agent 都是没有办法得到 reward 的。那在没有办法得到 reward 的情况下,对 agent 来说它的训练是非常困难的。举例来说,假设你今天要训练一个机器手臂,然后桌上有一个螺丝钉跟螺丝起子,那你要训练它用螺丝起子把螺丝钉栓进去,那这个很难,为什么?因为你知道一开始你的 agent 是什么都不知道的,它唯一能够做不同的 action 的原因是 exploration。举例来说你在做 Q-learning 的时候,会有一些随机性,让它去采取一些过去没有采取过的 action那你要随机到说它把螺丝起子捡起来再把螺丝栓进去然后就会得到 reward 1这件事情是永远不可能发生的。所以不管你的 actor 做了什么事情,它得到 reward 永远都是 0对它来说不管采取什么样的 action 都是一样糟或者是一样得好。所以,它最后什么都不会学到。如果环境中的 reward 非常的 sparsereinforcement learning 的问题就会变得非常的困难。但是人类可以在非常 sparse 的reward 上面去学习我们的人生通常多数的时候我们就只是活在那里都没有得到什么reward 或者是penalty。但是人还是可以采取各种各式各样的行为。所以一个真正厉害的 AI 应该能够在 sparse reward 的情况下也学到要怎么跟这个环境互动。
怎么解决sparse reward 的这件事情呢?我们等一下会讲三个方向。
怎么解决 sparse reward 的这件事情呢?我们等一下会讲三个方向。
## Reward Shaping
![](img/7.1.png)
@@ -61,14 +61,14 @@ Reward Shaping 是有问题的因为我们需要domain knowledge举例来
![](img/7.9.png)
那最后一个 tip 叫做 `Hierarchical Reinforcement learning`阶层式的 reinforcement learning。
所谓阶层式的Reinforcement learning 是说,我们有好几个 agent。然后有一些agent 负责比较high level 的东西,它负责订目标,然后它订完目标以后,再分配给其他的 agent去把它执行完成。这样的想法其实也是很合理的。因为我们知道说我们人在一生之中并不是时时刻刻都在做决定。举例来说假设你想要写一篇paper你会说就我先想个梗这样子然后想完梗以后你还要跑个实验。跑完实验以后你还要写。写完以后呢你还要这个去发表。每一个动作下面又还会再细分比如说怎么跑实验呢你要先 collect datacollect 完data 以后,你要再 label你要弄一个network然后又 train 不起来,要 train 很多次。然后重新 design network 架构好几次最后才把network train 起来。
那最后一个 tip 叫做 `Hierarchical Reinforcement learning`分层的 reinforcement learning。
所谓分层的Reinforcement learning 是说,我们有好几个 agent。然后有一些agent 负责比较high level 的东西,它负责订目标,然后它订完目标以后,再分配给其他的 agent去把它执行完成。这样的想法其实也是很合理的。因为我们知道说我们人在一生之中并不是时时刻刻都在做决定。举例来说假设你想要写一篇paper你会说就我先想个梗这样子然后想完梗以后你还要跑个实验。跑完实验以后你还要写。写完以后呢你还要这个去发表。每一个动作下面又还会再细分比如说怎么跑实验呢你要先 collect datacollect 完data 以后,你要再 label你要弄一个network然后又 train 不起来,要 train 很多次。然后重新 design network 架构好几次最后才把network train 起来。
所以,我们要完成一个很大的 task 的时候,我们并不是从非常底层的那些 action 开始想起,我们其实是有个 plan。我们先想说如果要完成这个最大的任务那接下来要拆解成哪些小任务。每一个小任务要再怎么拆解成小小的任务。举例来说叫你直接写一本书可能很困难但叫你先把一本书拆成好几个章节每个章节拆成好几段每一段又拆成好几个句子每一个句子又拆成好几个词汇这样你可能就比较写得出来这个就是阶层式的 Reinforcement learning 的概念。
所以,我们要完成一个很大的 task 的时候,我们并不是从非常底层的那些 action 开始想起,我们其实是有个 plan。我们先想说如果要完成这个最大的任务那接下来要拆解成哪些小任务。每一个小任务要再怎么拆解成小小的任务。举例来说叫你直接写一本书可能很困难但叫你先把一本书拆成好几个章节每个章节拆成好几段每一段又拆成好几个句子每一个句子又拆成好几个词汇这样你可能就比较写得出来这个就是分层的 Reinforcement learning 的概念。
这边是举一个例子,就是假设校长、教授和研究生通通都是 agent。那今天假设我们的reward 就是只要进入百大就可以得到 reward。假设进入百大的话校长就要提出愿景告诉其他的agent 说现在你要达到什么样的目标。那校长的愿景可能就是说教授每年都要发三篇期刊。然后接下来这些agent 都是有阶层式的,所以上面的 agent他的动作就是提出愿景这样。那他把他的愿景传给下一层的agent下一层的 agent 就把这个愿景吃下去。如果他下面还有其他人的话它就会提出新的愿景。比如说校长要教授发期刊但其实教授自己也是不做实验的。所以教授也只能够叫下面的研究生做实验。所以教授就提出愿景就做出实验的规划然后研究生才是真的去执行这个实验的人。然后真的把实验做出来最后大家就可以得到reward。那现在是这样子的在 learn 的时候,其实每一个 agent 都会 learn。那他们的整体的目标就是要达到最后的reward。那前面的这些 agent他提出来的 actions 就是愿景这样。你如果是玩游戏的话,他提出来的就是,我现在想要产生这样的游戏画面。但是,假设他提出来的愿景是下面的 agent 达不到的那就会被讨厌。举例来说教授对研究生都一直逼迫研究生做一些很困难的实验研究生都做不出来的话研究生就会跑掉所以他就会得到一个penalty。所以如果今天下层的 agent 没有办法达到上层 agent 所提出来的 goal 的话,上层的 agent 就会被讨厌,它就会得到一个 negative reward。所以他要避免提出那些愿景是底下的agent 所做不到的。那每一个agent 都是把上层的 agent 所提出来的愿景当作输入,然后决定他自己要产生什么输出。
这边是举一个例子,就是假设校长、教授和研究生通通都是 agent。那今天假设我们的reward 就是只要进入百大就可以得到 reward。假设进入百大的话校长就要提出愿景告诉其他的agent 说现在你要达到什么样的目标。那校长的愿景可能就是说教授每年都要发三篇期刊。然后接下来这些agent 都是有分层的,所以上面的 agent他的动作就是提出愿景这样。那他把他的愿景传给下一层的agent下一层的 agent 就把这个愿景吃下去。如果他下面还有其他人的话它就会提出新的愿景。比如说校长要教授发期刊但其实教授自己也是不做实验的。所以教授也只能够叫下面的研究生做实验。所以教授就提出愿景就做出实验的规划然后研究生才是真的去执行这个实验的人。然后真的把实验做出来最后大家就可以得到reward。那现在是这样子的在 learn 的时候,其实每一个 agent 都会 learn。那他们的整体的目标就是要达到最后的reward。那前面的这些 agent他提出来的 actions 就是愿景这样。你如果是玩游戏的话,他提出来的就是,我现在想要产生这样的游戏画面。但是,假设他提出来的愿景是下面的 agent 达不到的那就会被讨厌。举例来说教授对研究生都一直逼迫研究生做一些很困难的实验研究生都做不出来的话研究生就会跑掉所以他就会得到一个penalty。所以如果今天下层的 agent 没有办法达到上层 agent 所提出来的 goal 的话,上层的 agent 就会被讨厌,它就会得到一个 negative reward。所以他要避免提出那些愿景是底下的agent 所做不到的。那每一个agent 都是把上层的 agent 所提出来的愿景当作输入,然后决定他自己要产生什么输出。
但是你知道说就算你看到上面的的愿景说叫你做这一件事情。你最后也不一定能做成这一件事情。假设本来教授目标是要写期刊但是不知道怎么回事他就要变成一个YouTuber。这个paper 里面的 solution我觉得非常有趣。给大家做一个参考这其实本来的目标是要写期刊但却变成 YouTuber那怎么办呢? 把原来的愿景改成变成 YouTuber 就行了在paper 里面就是这么做的,为什么这么做呢? 因为虽然本来的愿景是要写期刊但是后来变成YouTuber难道这些动作都浪费了吗? 不是这些动作是没有被浪费的。我们就假设说本来的愿景其实就是要成为YouTuber那你就知道成为 YouTuber 要怎做了。这个是阶层式 RL是可以做得起来的 tip。
但是你知道说就算你看到上面的的愿景说叫你做这一件事情。你最后也不一定能做成这一件事情。假设本来教授目标是要写期刊但是不知道怎么回事他就要变成一个YouTuber。这个paper 里面的 solution我觉得非常有趣。给大家做一个参考这其实本来的目标是要写期刊但却变成 YouTuber那怎么办呢? 把原来的愿景改成变成 YouTuber 就行了在paper 里面就是这么做的,为什么这么做呢? 因为虽然本来的愿景是要写期刊但是后来变成YouTuber难道这些动作都浪费了吗? 不是这些动作是没有被浪费的。我们就假设说本来的愿景其实就是要成为YouTuber那你就知道成为 YouTuber 要怎做了。这个是分层 RL是可以做得起来的 tip。
![](img/7.10.png)