fix some typos

This commit is contained in:
qiwang067
2020-10-27 16:51:03 +08:00
parent 15adab3c7d
commit f4b4ff901e
3 changed files with 62 additions and 17 deletions

View File

@@ -612,14 +612,21 @@ print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))
* [百面深度学习](https://book.douban.com/subject/35043939/)
* [强化学习原理与Python实现](https://book.douban.com/subject/34478302/)
* [白话强化学习与PyTorch](https://book.douban.com/subject/34809676/)
* [OpenAI Spinning Up ](https://spinningup.openai.com/en/latest/spinningup/rl_intro.html#)
* [神经网络与深度学习](https://nndl.github.io/)
* [机器学习](https://book.douban.com/subject/26708119//)
* [强化学习基础 David Silver 笔记](https://zhuanlan.zhihu.com/c_135909947)
* [David Silver 强化学习公开课中文讲解及实践](https://zhuanlan.zhihu.com/reinforce)
* [UCL Course on RL(David Silver)](https://www.davidsilver.uk/teaching/)
* [白话强化学习与PyTorch](https://book.douban.com/subject/34809676/)
* [OpenAI Spinning Up ](https://spinningup.openai.com/en/latest/spinningup/rl_intro.html#)
* [神经网络与深度学习](https://nndl.github.io/)
* [机器学习](https://book.douban.com/subject/26708119//)

View File

@@ -35,9 +35,11 @@
假设你现在可以做的行为有 3 个output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。Input 一个东西后network 就会给每一个可以采取的行为一个分数。接下来,你把这个分数当作是概率。 actor 就是看这个概率的分布,根据这个机率的分布,决定它要采取的行为。比如说 70% 会走 left20% 走 right10% 开火等等。概率分布不同actor 采取的行为就会不一样。
![](img/4.3.png)
接下来用一个例子来说明 actor 是怎么样跟环境互动的。 首先 actor 会看到一个游戏画面,我们用 $s_1$ 来表示这个游戏画面,它代表游戏初始的画面。接下来 actor 看到这个游戏的初始画面以后,根据它内部的 network根据它内部的 policy 来决定一个 action。假设它现在决定的 action 是向右,它决定完 action 以后,它就会得到一个 reward ,代表它采取这个 action 以后得到的分数。
**接下来用一个例子来说明 actor 是怎么样跟环境互动的。**
我们把一开始的初始画面记作 $s_1$ 把第一次执行的动作记作 $a_1$,把第一次执行动作完以后得到的 reward 记作 $r_1$。不同的书会有不同的定义,有人会觉得说这边应该要叫做 $r_2$这个都可以你自己看得懂就好。Actor 决定一个的行为以后, 就会看到一个新的游戏画面,这边是 $s_2$。然后把这个 $s_2$ 输入给 actor这个 actor 决定要开火,然后它可能杀了一只怪,就得到五分。这个 process 就反复地持续下去,直到今天走到某一个 timestamp 执行某一个 action得到 reward 之后, 这个 environment 决定这个游戏结束了。比如说,如果在这个游戏里面,你是控制绿色的船去杀怪,如果你被杀死的话,游戏就结束,或是你把所有的怪都清空,游戏就结束了
首先 actor 会看到一个游戏画面,我们用 $s_1$ 来表示游戏初始的画面。接下来 actor 看到这个游戏的初始画面以后,根据它内部的 network根据它内部的 policy 来决定一个 action。假设它现在决定的 action 是向右,它决定完 action 以后,它就会得到一个 reward ,代表它采取这个 action 以后得到的分数
我们把一开始的初始画面记作 $s_1$ 把第一次执行的动作记作 $a_1$,把第一次执行动作完以后得到的 reward 记作 $r_1$。不同的书会有不同的定义,有人会觉得说这边应该要叫做 $r_2$这个都可以你自己看得懂就好。Actor 决定一个行为以后, 就会看到一个新的游戏画面,这边是 $s_2$。然后把这个 $s_2$ 输入给 actor这个 actor 决定要开火,然后它可能杀了一只怪,就得到五分。这个 process 就反复地持续下去,直到今天走到某一个 timestamp 执行某一个 action得到 reward 之后, 这个 environment 决定这个游戏结束了。比如说,如果在这个游戏里面,你是控制绿色的船去杀怪,如果你被杀死的话,游戏就结束,或是你把所有的怪都清空,游戏就结束了。
![](img/4.4.png)
一场游戏叫做一个 `episode(回合)` 或者 `trial(试验)`。把这个游戏里面,所有得到的 reward 都总合起来,就是 `total reward`,我们称其为`return(回报)`,用 R 来表示它。Actor 要想办法去 maximize 它可以得到的 reward。
@@ -143,7 +145,9 @@ Update 完你的 model 以后。你要重新去收集 data再 update model。
![](img/4.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 叫做开火。
@@ -243,7 +247,7 @@ Advantage function 的意义就是,假设我们在某一个 state $s_t$ 执行
相比蒙特卡洛还是一个 episode 更新一次这样子的方式,时序差分就是每个 step 都更新一下。每走一步,我就更新下,这样的更新频率会更高一点。它拿的是 Q-function 来去近似地表示我的未来总收益 $G_t$。
举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别,
**举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别,**
* 时序差分强化学习是指在不清楚马尔可夫状态转移概率的情况下,以采样的方式得到不完整的状态序列,估计某状态在该状态序列完整后可能得到的收益,并通过不断地采样持续更新价值。
* 蒙特卡洛强化学习则需要经历完整的状态序列后,再来更新状态的真实价值。

View File

@@ -2,8 +2,22 @@
## Actor-Critic
在 REINFORCE 算法中,每次需要根据一个策略采集一条完整的轨迹,并计算这条轨迹上的回报。这种采样方式的方差比较大,学习效率也比较低。我们可以借鉴时序差分学习的思想,使用动态规划方法来提高采样的效率,即从状态 $s$ 开始的总回报可以通过当前动作的即时奖励 $r(s,a,s')$ 和下一个状态 $s'$ 的值函数来近似估计。
`演员-评论员算法(Actor-Critic Algorithm)`是一种结合`策略梯度``时序差分学习`的强化学习方法,其中:
* 演员(Actor)是指策略函数 $\pi_{\theta}(a|s)$,即学习一个策略来得到尽量高的回报。
* 评论员(Critic)是指值函数 $V^{\pi}(s)$,对当前策略的值函数进行估计,即评估演员的好坏。
* 借助于值函数,演员-评论员算法可以进行单步更新参数,不需要等到回合结束才进行更新。
在 Actor-Critic 算法 里面,最知名的方法就是 `A3C(Asynchronous Advantage Actor-Critic)`
* 如果去掉前面这个 Asynchronous只有 `Advantage Actor-Critic`,就叫做 `A2C`
* 如果前面加了 Asynchronous变成 Asynchronous Advantage Actor-Critic就变成 A3C。
### Review: Policy Gradient
![](img/9.1.png)
`Actor-Critic` 里面,最知名的方法就是 `A3C(Asynchronous Advantage Actor-Critic)`。如果去掉前面这个 Asynchronous只有 `Advantage Actor-Critic`,就叫做 `A2C`。如果前面加了 Asynchronous变成 Asynchronous Advantage Actor-Critic就变成 A3C。
那我们复习一下 policy gradient在 policy gradient我们在 update policy 的参数 $\theta$ 的时候,我们是用了下面这个式子来算出我们的 gradient。
$$
@@ -13,13 +27,21 @@ $$
我们把用 G 来表示 accumulated reward。但 G 这个值,其实是非常的 unstable 的。因为互动的 process 本身是有随机性的,所以在某一个 state s 采取某一个 action a然后计算 accumulated reward每次算出来的结果都是不一样的所以 G 其实是一个 random variable。给同样的 state s给同样的 action aG 可能有一个固定的 distribution。但我们是采取 sample 的方式,我们在某一个 state s 采取某一个 action a然后玩到底我们看看得到多少的 reward我们就把这个东西当作 G。把 G 想成是一个 random variable 的话,我们实际上是对这个 G 做一些 sample然后拿这些 sample 的结果,去 update 我们的参数。但实际上在某一个 state s 采取某一个 action a接下来会发生什么事它本身是有随机性的。虽然说有个固定的 distribution但它本身是有随机性的而这个 random variable 的 variance 可能会非常大。你在同一个 state 采取同一个 action你最后得到的结果可能会是天差地远的。假设我们可以 sample 足够的次数,在每次 update 参数之前,我们都可以 sample 足够的次数,那其实没有什么问题。但问题就是我们每次做 policy gradient每次 update 参数之前都要做一些 sample这个 sample 的次数其实是不可能太多的,我们只能够做非常少量的 sample。如果你正好 sample 到差的结果,比如说你 sample 到 G = 100sample 到 G = -10那显然你的结果会是很差的。
### Review: Q-learning
![](img/9.2.png)
能不能让整个 training process 变得比较 stable 一点,能不能够直接估测 G 这个 random variable 的期望值?我们在 state s 采取 action a 的时候,直接用一个 network 去估测在 state s 采取 action a 的时候G 的期望值。如果这件事情是可行的,那之后 training 的时候,就用期望值来代替 sample 的值,这样会让 training 变得比较 stable。
Q: 能不能让整个 training process 变得比较稳定一点,能不能够直接估测 G 这个 random variable 的期望值?
怎么拿期望值代替 sample 的值呢?这边就需要引入 value based 的方法。value based 的方法就是 Q-learning。Q-learning 有两种 functions有两种 critics。第一种 critic 我们写作 $V^{\pi}(s)$,它的意思是说,假设 actor 是 $\pi$,拿 $\pi$ 去跟环境做互动,当今天我们看到 state s 的时候,接下来 accumulated reward 的期望值有多少。还有一个 critic 叫做 $Q^{\pi}(s,a)$。$Q^{\pi}(s,a)$ 把 s 跟 a 当作 input它的意思是说在 state s 采取 action a接下来都用 actor $\pi$ 来跟环境进行互动accumulated reward 的期望值是多少
A: 我们在 state s 采取 action a 的时候,直接用一个 network 去估测在 state s 采取 action a 的时候G 的期望值。如果这件事情是可行的,那之后 training 的时候,就用期望值来代替 sample 的值,这样会让 training 变得比较稳定
$V^{\pi}$ input soutput 一个 scalar。$Q^{\pi}$ input s然后它会给每一个 a 都 assign 一个 Q value。这个 estimate 的时候,你可以用 TD 也可以用 MC。用TD 比较稳,用 MC 比较精确。
Q: 怎么拿期望值代替 sample 的值呢?
A: 这边就需要引入 value based 的方法。value based 的方法就是 Q-learning。Q-learning 有两种 functions有两种 critics。第一种 critic 我们写作 $V^{\pi}(s)$,它的意思是说,假设 actor 是 $\pi$,拿 $\pi$ 去跟环境做互动,当今天我们看到 state s 的时候,接下来 accumulated reward 的期望值有多少。还有一个 critic 叫做 $Q^{\pi}(s,a)$。$Q^{\pi}(s,a)$ 把 s 跟 a 当作 input它的意思是说在 state s 采取 action a接下来都用 actor $\pi$ 来跟环境进行互动accumulated reward 的期望值是多少。
$V^{\pi}$ input soutput 一个 scalar。$Q^{\pi}$ input s然后它会给每一个 a 都 assign 一个 Q value。这个 estimate 的时候,你可以用 TD 也可以用 MC。用 TD 比较稳,用 MC 比较精确。
### Actor-Critic
![](img/9.3.png)
@@ -34,9 +56,11 @@ $$
所以我们就把 policy gradient 里面 $\sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n}-b$ 这一项换成了 $Q^{\pi_{\theta}\left(s_{t}^{n}, a_{t}^{n}\right)}-V^{\pi_{\theta}}\left(s_{t}^{n}\right)$。
### Advantage Actor-Critic
![](img/9.4.png)
如果你这么实现的话,有一个缺点是,你要 estimate 2 个 networks而不是一个 network。你要 estimate Q-network你也要 estimate V-network你 estimate 估测不准的风险就变成两倍。所以我们何不只估测一个 network 就好了呢?事实上在这个 Actor-Critic 方法里面。你可以只估测 V 这个 network你可以用 V 的值来表示 Q 的值,什么意思呢?$Q^{\pi}\left(s_{t}^{n}, a_{t}^{n}\right)$可以写成$r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)$的期望值,即
如果你这么实现的话,有一个缺点是,你要 estimate 2 个 networks而不是一个 network。你要 estimate Q-network你也要 estimate V-network你 estimate 估测不准的风险就变成两倍。所以我们何不只估测一个 network 就好了呢?事实上在这个 Actor-Critic 方法里面。你可以只估测 V 这个 network你可以用 V 的值来表示 Q 的值,什么意思呢?$Q^{\pi}\left(s_{t}^{n}, a_{t}^{n}\right)$可以写成 $r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)$的期望值,即
$$
Q^{\pi}\left(s_{t}^{n}, a_{t}^{n}\right)=E\left[r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)\right]
@@ -85,8 +109,9 @@ A3C 这个方法就是同时开很多个 worker那每一个 worker 其实就
## Pathwise Derivative Policy Gradient
![](img/9.9.png)
讲完 A3C 之后,我们要讲另外一个方法叫做 `Pathwise Derivative Policy Gradient`这个方法很神奇,它可以成是 Q-learning 解 continuous action 的一种特别的方法。那它也可以成是一种特别的 Actor-Critic 的方法。
用棋灵王来比喻的话,阿光是一个 actor佐为是一个 critic。阿光落某一子以后呢如果佐为是一般的 Actor-Critic他会告诉他说这时候不应该下小马步飞他会告诉你你现在采取的这一步算出来的 value 到底是好还是不好,但这样就结束了,他只告诉你说好还是不好。因为一般的这个 Actor-Critic 里面那个 critic 就是 input state 或 input state 跟 action 的 pair然后给你一个 value 就结束了。所以对 actor 来说它只知道它做的这个行为到底是好还是不好。但如果是在pathwise derivative policy gradient 里面,这个 critic 会直接告诉 actor 说采取什么样的 action 才是好的。所以今天佐为不只是告诉阿光说这个时候不要下小马步飞同时还告诉阿光说这个时候应该要下大马步飞所以这个就是Pathwise Derivative Policy Gradient 中的 critic。critic 会直接告诉 actor 做什么样的 action 才可以得到比较大的 value。
讲完 A3C 之后,我们要讲另外一个方法叫做 `Pathwise Derivative Policy Gradient`这个方法很神奇,它可以成是 Q-learning 解 continuous action 的一种特别的方法也可以成是一种特别的 Actor-Critic 的方法。
用棋灵王来比喻的话,阿光是一个 actor佐为是一个 critic。阿光落某一子以后呢如果佐为是一般的 Actor-Critic他会告诉他说这时候不应该下小马步飞他会告诉你你现在采取的这一步算出来的 value 到底是好还是不好,但这样就结束了,他只告诉你说好还是不好。因为一般的这个 Actor-Critic 里面那个 critic 就是 input state 或 input state 跟 action 的 pair然后给你一个 value 就结束了。所以对 actor 来说它只知道它做的这个行为到底是好还是不好。但如果是在pathwise derivative policy gradient 里面,这个 critic 会直接告诉 actor 说采取什么样的 action 才是好的。所以今天佐为不只是告诉阿光说这个时候不要下小马步飞同时还告诉阿光说这个时候应该要下大马步飞所以这个就是Pathwise Derivative Policy Gradient 中的 critic。critic 会直接告诉 actor 做什么样的 action 才可以得到比较大的 value。
从 Q-learning 的观点来看Q-learning 的一个问题是你没有办法在用 Q-learning 的时候,考虑 continuous vector。其实也不是完全没办法就是比较麻烦比较没有 general solution我们怎么解这个 optimization problem 呢?我们用一个 actor 来解这个 optimization 的 problem。本来在 Q-learning 里面,如果是一个 continuous action我们要解这个 optimization problem。但是现在这个 optimization problem 由 actor 来解,我们假设 actor 就是一个 solver这个 solver 的工作就是给你 state, s然后它就去解解告诉我们说哪一个 action 可以给我们最大的 Q value这是从另外一个观点来看 pathwise derivative policy gradient 这件事情。这个说法,你有没有觉得非常的熟悉呢?我们在讲 GAN 的时候,不是也讲过一个说法。我们 learn 一个 discriminator它是要 evaluate 东西好不好discriminator 要自己生成东西,非常的困难,那怎么办?因为要解一个 arg max 的 problem 非常的困难,所以用 generator 来生所以今天的概念其实是一样的。Q 就是那个 discriminator要根据这个 discriminator 决定 action 非常困难,怎么办?另外 learn 一个 network 来解这个 optimization problem这个东西就是 actor。所以两个不同的观点是同一件事从两个不同的观点来看一个观点是说我们可以对原来的 Q-learning 加以改进,怎么改进呢?我们 learn 一个 actor 来决定 action 以解决 arg max 不好解的问题。或是另外一个观点是,原来的 actor-critic 的问题是 critic 并没有给 actor 足够的信息,它只告诉它好或不好,没有告诉它说什么样叫好,那现在有新的方法可以直接告诉 actor 说,什么样叫做好。
@@ -104,7 +129,7 @@ A3C 这个方法就是同时开很多个 worker那每一个 worker 其实就
![](img/9.13.png)
接下来我们把改成 Pathwise Derivative Policy Gradient这边就是只要做四个改变就好
接下来我们把 Q-learning 改成 Pathwise Derivative Policy Gradient这边要做四个改变。
* 第一个改变是,你要把 Q 换成 $\pi$,本来是用 Q 来决定在 state $s_t$ 产生那一个 action, $a_{t}$ 现在是直接用 $\pi$ 。我们不用再解 arg max 的 problem 了,我们直接 learn 了一个 actor。这个 actor input $s_t$ 就会告诉我们应该采取哪一个 $a_{t}$。所以本来 input $s_t$,采取哪一个 $a_t$,是 Q 决定的。在 Pathwise Derivative Policy Gradient 里面,我们会直接用 $\pi$ 来决定,这是第一个改变。
* 第二个改变是,本来这个地方是要计算在 $s_{i+1}$,根据你的 policy 采取某一个 action a 会得到多少的 Q value。那你会采取让 $\hat{Q}$ 最大的那个 action a。那现在因为我们其实不好解这个 arg max 的 problem所以 arg max problem其实现在就是由 policy $\pi$ 来解了,所以我们就直接把 $s_{i+1}$ 代到 policy $\pi$ 里面,你就会知道说 given $s_{i+1}$ ,哪一个 action 会给我们最大的 Q value那你在这边就会 take 那一个 action。在 Q-function 里面,有两个 Q network一个是真正的 Q network另外一个是 target Q network。那实际上你在 implement 这个 algorithm 的时候,你也会有两个 actor你会有一个真正要 learn 的 actor $\pi$,你会有一个 target actor $\hat{\pi}$ 。这个原理就跟为什么要有 target Q network 一样,我们在算 target value 的时候,我们并不希望它一直的变动,所以我们会有一个 target 的 actor 和一个 target 的 Q-function它们平常的参数就是固定住的这样可以让你的这个 target 的 value 不会一直地变化。所以本来到底是要用哪一个 action a你会看说哪一个 action a 可以让 $\hat{Q}$ 最大。但现在因为哪一个 action a 可以让 $\hat{Q}$ 最大这件事情已经被用那个 policy 取代掉了,所以我们要知道哪一个 action a 可以让 $\hat{Q}$ 最大,就直接把那个 state 带到 $\hat{\pi}$ 里面,看它得到哪一个 a就用那一个 a那一个 a 就是会让 $\hat{Q}(s,a)$ 的值最大的那个 a 。其实跟原来的这个 Q-learning 也是没什么不同,只是原来你要解 arg max 的地方,通通都用 policy 取代掉了,那这个是第二个不同。
@@ -114,4 +139,13 @@ A3C 这个方法就是同时开很多个 worker那每一个 worker 其实就
## Connection with GAN
![](img/9.14.png)
其实 GAN 跟 Actor-Critic 的方法是非常类似的。这边就不细讲,你可以去找到一篇 paper 叫做 `Connecting Generative Adversarial Network and Actor-Critic Methods`知道 GAN 跟 Actor-Critic 非常像有什么帮助呢?一个很大的帮助就是 GAN 跟 Actor-Critic 都是以难 train 而闻名的。所以在文献上就会收集各式各样的方法,告诉你说怎么样可以把 GAN train 起来。怎么样可以把 Actor-Critic train 起来。但是因为做 GAN 跟 Actor-Critic 的人是两群人,所以这篇 paper 里面就列出说在 GAN 上面有哪些技术是有人做过的,在 Actor-Critic 上面,有哪些技术是有人做过的。也许在 GAN 上面有试过的技术,你可以试着 apply 在 Actor-Critic 上,在 Actor-Critic 上面做过的技术,你可以试着 apply 在 GAN 上面,看看是否 work。
其实 GAN 跟 Actor-Critic 的方法是非常类似的。这边就不细讲,你可以去找到一篇 paper 叫做 `Connecting Generative Adversarial Network and Actor-Critic Methods`
Q: 知道 GAN 跟 Actor-Critic 非常像有什么帮助呢?
A: 一个很大的帮助就是 GAN 跟 Actor-Critic 都是以难 train 而闻名的。所以在文献上就会收集各式各样的方法,告诉你说怎么样可以把 GAN train 起来。怎么样可以把 Actor-Critic train 起来。但是因为做 GAN 跟 Actor-Critic 的人是两群人,所以这篇 paper 里面就列出说在 GAN 上面有哪些技术是有人做过的,在 Actor-Critic 上面,有哪些技术是有人做过的。也许在 GAN 上面有试过的技术,你可以试着 apply 在 Actor-Critic 上,在 Actor-Critic 上面做过的技术,你可以试着 apply 在 GAN 上面,看看是否 work。
## References
* [神经网络与深度学习](https://nndl.github.io/)