From f4b4ff901e29a0b94dfe751b4229661f4ba233d8 Mon Sep 17 00:00:00 2001 From: qiwang067 Date: Tue, 27 Oct 2020 16:51:03 +0800 Subject: [PATCH] fix some typos --- docs/chapter1/chapter1.md | 15 ++++++++--- docs/chapter4/chapter4.md | 12 ++++++--- docs/chapter9/chapter9.md | 52 ++++++++++++++++++++++++++++++++------- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/docs/chapter1/chapter1.md b/docs/chapter1/chapter1.md index 038907c..d5aee15 100644 --- a/docs/chapter1/chapter1.md +++ b/docs/chapter1/chapter1.md @@ -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//) + + + diff --git a/docs/chapter4/chapter4.md b/docs/chapter4/chapter4.md index e8b6986..bd25f43 100644 --- a/docs/chapter4/chapter4.md +++ b/docs/chapter4/chapter4.md @@ -35,9 +35,11 @@ 假设你现在可以做的行为有 3 个,output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。Input 一个东西后,network 就会给每一个可以采取的行为一个分数。接下来,你把这个分数当作是概率。 actor 就是看这个概率的分布,根据这个机率的分布,决定它要采取的行为。比如说 70% 会走 left,20% 走 right,10% 开火等等。概率分布不同,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$。 -举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别, +**举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别,** * 时序差分强化学习是指在不清楚马尔可夫状态转移概率的情况下,以采样的方式得到不完整的状态序列,估计某状态在该状态序列完整后可能得到的收益,并通过不断地采样持续更新价值。 * 蒙特卡洛强化学习则需要经历完整的状态序列后,再来更新状态的真实价值。 diff --git a/docs/chapter9/chapter9.md b/docs/chapter9/chapter9.md index 5f6f49d..328d2e8 100644 --- a/docs/chapter9/chapter9.md +++ b/docs/chapter9/chapter9.md @@ -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 a,G 可能有一个固定的 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 = 100,sample 到 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 s,output 一个 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 s,output 一个 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。 \ No newline at end of file +其实 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/) +