fix ch9 typos
This commit is contained in:
@@ -61,9 +61,11 @@ $$
|
||||
E\left[G_{t}^{n}\right]=Q^{\pi_{\theta}} \left(s_{t}^{n}, a_{t}^{n}\right)
|
||||
$$
|
||||
|
||||
因为这个就是 Q 的定义。Q-function 的定义就是在某一个状态 s,采取某一个动作 a,假设 policy 就是 $\pi$ 的情况下会得到的累积奖励的期望值有多大,而这个东西就是 G 的期望值。累积奖励的期望值就是 G 的期望值。所以假设用期望值来代表 $\sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n}$ 这一项的话,把 Q-function 套在这里就结束了。我们就可以 Actor 跟 Critic 这两个方法结合起来。
|
||||
因为这个就是 Q 的定义。Q-function 的定义就是在某一个状态 s,采取某一个动作 a,假设 policy 就是 $\pi$ 的情况下会得到的累积奖励的期望值有多大,而这个东西就是 G 的期望值。累积奖励的期望值就是 G 的期望值。
|
||||
|
||||
有不同的方法来表示 baseline,但一个常见的做法是用 value function $V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 来表示 baseline。Value function 是说,假设 policy 是 $\pi$,在某一个状态 s 一直互动到游戏结束,期望奖励(expected reward)有多大。 $V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 没有涉及到动作,$Q^{\pi_{\theta}}\left(s_{t}^{n}, a_{t}^{n}\right)$ 涉及到动作。
|
||||
所以假设用 $E\left[G_{t}^{n}\right]$ 来代表 $\sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n}$ 这一项的话,把 Q-function 套在这里就结束了,我们就可以把 Actor 跟 Critic 这两个方法结合起来。
|
||||
|
||||
有不同的方法来表示 baseline,但一个常见的做法是用价值函数 $V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 来表示 baseline。价值函数是说,假设 policy 是 $\pi$,在某一个状态 s 一直互动到游戏结束,期望奖励(expected reward)有多大。 $V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 没有涉及到动作,$Q^{\pi_{\theta}}\left(s_{t}^{n}, a_{t}^{n}\right)$ 涉及到动作。
|
||||
|
||||
其实 $V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 会是 $Q^{\pi_{\theta}}\left(s_{t}^{n}, a_{t}^{n}\right)$ 的期望值,所以 $Q^{\pi_{\theta}}\left(s_{t}^{n}, a_{t}^{n}\right)-V^{\pi_{\theta}}\left(s_{t}^{n}\right)$ 会有正有负,所以 $\sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n}-b$ 这一项就会是有正有负的。
|
||||
|
||||
@@ -99,11 +101,11 @@ A: 原始的 A3C paper 试了各种方法,最后做出来就是这个最好。
|
||||
|
||||
因为 $r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)-V^{\pi}\left(s_{t}^{n}\right)$ 叫做 `Advantage function`。所以这整个方法就叫 `Advantage Actor-Critic`。
|
||||
|
||||
整个流程是这样子的。我们有一个 $\pi$,有个初始的 actor 去跟环境做互动,先收集资料。在 policy gradient 方法里面收集资料以后,你就要拿去更新 policy。但是在 actor-critic 方法里面,你不是直接拿那些资料去更新 policy。你先拿这些资料去估计 value function,你可以用 TD 或 MC 来估计 value function 。接下来,你再基于 value function,套用下面这个式子去更新 $\pi$。
|
||||
整个流程是这样子的。我们有一个 $\pi$,有个初始的 actor 去跟环境做互动,先收集资料。在 policy gradient 方法里面收集资料以后,你就要拿去更新 policy。但是在 actor-critic 方法里面,你不是直接拿那些资料去更新 policy。你先拿这些资料去估计价值函数,你可以用 TD 或 MC 来估计价值函数 。接下来,你再基于价值函数,套用下面这个式子去更新 $\pi$。
|
||||
$$
|
||||
\nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}\left(r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)-V^{\pi}\left(s_{t}^{n}\right)\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right)
|
||||
$$
|
||||
然后你有了新的 $\pi$ 以后,再去跟环境互动,再收集新的资料,去估计 value function。然后再用新的 value function 去更新 policy,去更新 actor。
|
||||
然后你有了新的 $\pi$ 以后,再去跟环境互动,再收集新的资料,去估计价值函数。然后再用新的价值函数 去更新 policy,去更新 actor。
|
||||
|
||||
整个 actor-critic 的算法就是这么运作的。
|
||||
|
||||
@@ -118,19 +120,30 @@ $$
|
||||
* 如果动作是连续的,输出就是一个连续的向量。
|
||||
* 上图是举的是离散的例子,但连续的情况也是一样的。输入一个状态,然后它决定你现在要采取哪一个动作。**这两个网络,actor 和 critic 的输入都是 s,所以它们前面几个层(layer),其实是可以共享的。**
|
||||
* 尤其是假设你今天是玩 Atari 游戏,输入都是图像。输入的图像都非常复杂,图像很大,通常你前面都会用一些 CNN 来处理,把那些图像抽象成高级(high level)的信息。把像素级别的信息抽象成高级信息这件事情,其实对 actor 跟 critic 来说是可以共用的。所以通常你会让 actor 跟 critic 的共享前面几个层,你会让 actor 跟 critic 的前面几个层共用同一组参数,那这一组参数可能是 CNN 的参数。
|
||||
* 先把输入的像素变成比较高级的信息,然后再给 actor 去决定说它要采取什么样的行为,给这个 critic,给 value function 去计算期望奖励。
|
||||
* **第二个 tip 是我们一样需要 exploration 的机制。**在做 Actor-Critic 的时候,有一个常见的 exploration 的方法是你会对你的 $\pi$ 的输出的分布下一个约束。这个约束是希望这个分布的熵(entropy)不要太小,希望这个分布的熵可以大一点,也就是希望不同的动作它的被采用的机率平均一点。这样在测试的时候,它才会多尝试各种不同的动作,才会把这个环境探索的比较好,才会得到比较好的结果。这个就是 Advantage Actor-Critic。
|
||||
* 先把输入的像素变成比较高级的信息,然后再给 actor 去决定说它要采取什么样的行为,给这个 critic,给价值函数去计算期望奖励。
|
||||
* **第二个 tip 是我们一样需要探索(exploration)的机制。**在做 Actor-Critic 的时候,有一个常见的探索的方法是你会对你的 $\pi$ 的输出的分布下一个约束。这个约束是希望这个分布的熵(entropy)不要太小,希望这个分布的熵可以大一点,也就是希望不同的动作它的被采用的概率平均一点。这样在测试的时候,它才会多尝试各种不同的动作,才会把这个环境探索的比较好,才会得到比较好的结果。
|
||||
|
||||
这个就是 Advantage Actor-Critic。
|
||||
|
||||
## A3C
|
||||

|
||||
|
||||
什么是 A3C 呢?强化学习有一个问题就是它很慢,那怎么增加训练的速度呢?这个可以讲到火影忍者就是有一次鸣人说,他想要在一周之内打败晓,所以要加快修行的速度,他老师就教他一个方法,这个方法是说你只要用影分身进行同样修行。那两个一起修行的话呢?经验值累积的速度就会变成 2 倍,所以,鸣人就开了 1000 个影分身,开始修行了。这个其实就是 `Asynchronous(异步的) Advantage Actor-Critic`,也就是 A3C 这个方法的精神。
|
||||
强化学习有一个问题就是它很慢,那怎么增加训练的速度呢?举个例子,火影忍者就是有一次鸣人说,他想要在一周之内打败晓,所以要加快修行的速度,他老师就教他一个方法:用影分身进行同样修行。两个一起修行的话,经验值累积的速度就会变成 2 倍,所以鸣人就开了 1000 个影分身来进行修行。这个其实就是 `Asynchronous(异步的) Advantage Actor-Critic`,也就是 A3C 这个方法的精神。
|
||||
|
||||

|
||||
|
||||
A3C 这个方法就是同时开很多个 worker,那每一个 worker 其实就是一个影分身。那最后这些影分身会把所有的经验,通通集合在一起。首先你如果没有很多个 CPU,可能也是不好实现的,你可以实现 A2C 就好。
|
||||
**A3C 这个方法就是同时开很多个 worker,那每一个 worker 其实就是一个影分身。那最后这些影分身会把所有的经验,通通集合在一起。**你如果没有很多个 CPU,可能也是不好实现的,你可以实现 A2C 就好。
|
||||
|
||||
这个 A3C 是怎么运作的呢?A3C 是这样子,一开始有一个 global network。那我们刚才有讲过说,其实 policy network 跟 value network 是 tie 在一起的,它们的前几个层会被 tie 一起。我们有一个 global network,它们有包含 policy 的部分和 value 的部分。假设它的参数就是 $\theta_1$,你会开很多个 worker。每一个 worker 就用一张 CPU 去跑,比如你就开 8 个 worker ,那你至少 8 张 CPU。第一个 worker 就把 global network 的参数复制过来,每一个 worker 工作前都会 global network 的参数复制过来。接下来你就去跟环境做互动,每一个 actor 去跟环境做互动的时候,为了要收集到比较 diverse 的数据,所以举例来说如果是走迷宫的话,可能每一个 actor 起始的位置都会不一样,这样它们才能够收集到比较多样性的数据。每一个 actor 就自己跟环境做互动,互动完之后,你就会计算出梯度。那计算出梯度 以后,你要拿梯度去更新你的参数。你就计算一下你的梯度,然后用你的梯度去更新 global network 的参数。就是这个 worker 算出梯度以后,就把梯度传回给中央的控制中心。然后中央的控制中心,就会拿这个梯度去更新原来的参数。但是要注意一下,所有的 actor 都是平行跑的,就每一个 actor 就是各做各的,互相之间就不要管彼此。所以每个人都是去要了一个参数以后,做完就把参数传回去。所以当第一个 worker 做完想要把参数传回去的时候,本来它要的参数是 $\theta_1$,等它要把梯度传回去的时候。可能别人已经把原来的参数覆盖掉,变成 $\theta_2$了。但是没有关系,它一样会把这个梯度就覆盖过去就是了。Asynchronous actor-critic 就是这么做的,这个就是 A3C。
|
||||
Q: A3C 是怎么运作的?
|
||||
|
||||
A:
|
||||
|
||||
* A3C 一开始有一个 global network。那我们刚才有讲过,其实 policy network 跟 value network 是绑(tie)在一起的,它们的前几个层会被绑一起。我们有一个 global network,它们有包含 policy 的部分和 value 的部分。
|
||||
|
||||
* 假设 global network 的参数是 $\theta_1$,你会开很多个 worker。每一个 worker 就用一张 CPU 去跑。比如你就开 8 个 worker,那你至少 8 张 CPU。每一个 worker 工作前都会 global network 的参数复制过来。
|
||||
* 接下来你就去跟环境做互动,每一个 actor 去跟环境做互动的时候,要收集到比较多样性的数据。举例来说,如果是走迷宫的话,可能每一个 actor 起始的位置都会不一样,这样它们才能够收集到比较多样性的数据。
|
||||
* 每一个 actor 跟环境做互动,互动完之后,你就会计算出梯度。计算出梯度以后,你要拿梯度去更新你的参数。你就计算一下你的梯度,然后用你的梯度去更新 global network 的参数。就是这个 worker 算出梯度以后,就把梯度传回给中央的控制中心,然后中央的控制中心就会拿这个梯度去更新原来的参数。
|
||||
* 注意,所有的 actor 都是平行跑的,每一个 actor 就是各做各的,不管彼此。所以每个人都是去要了一个参数以后,做完就把参数传回去。所以当第一个 worker 做完想要把参数传回去的时候,本来它要的参数是 $\theta_1$,等它要把梯度传回去的时候。可能别人已经把原来的参数覆盖掉,变成 $\theta_2$了。但是没有关系,它一样会把这个梯度就覆盖过去就是了。Asynchronous actor-critic 就是这么做的,这个就是 A3C。
|
||||
|
||||
## Pathwise Derivative Policy Gradient
|
||||

|
||||
@@ -167,7 +180,7 @@ A3C 这个方法就是同时开很多个 worker,那每一个 worker 其实就
|
||||
|
||||

|
||||
|
||||
上图是原来 Q-learning 的算法。你有一个 Q-function Q,你有另外一个目标的 Q-function 叫做 $\hat{Q}$。然后在每一次 训练,在每一个回合的每一个时间点里面,你会看到一个状态 $s_t$,你会采取某一个动作 $a_{t}$。至于采取哪一个动作是由 Q-function 所决定的,因为解一个 arg max 的问题。如果是离散的话没有问题,你就看说哪一个 a 可以让 Q 的 value 最大,就采取哪一个动作。那你需要加一些探索,这样 performance 才会好。你会得到奖励 $r_t$,跳到新的状态 $s_{t+1}$。你会把 $s_t$, $a_{t}$, $r_t$, $s_{t+1}$ 塞到你的 buffer 里面去。你会从你的 buffer 里面采样一个批量的数据,在这个批量数据里面,可能某一笔是 $s_i, a_i, r_i, s_{i+1}$。接下来你会算一个目标,这个目标叫做 $y$ ,$y=r_{i}+\max _{a} \hat{Q}\left(s_{i+1}, a\right)$。然后怎么学习你的 Q 呢?你希望 $Q(s_i,a_i)$ 跟 y 越接近越好,这是一个回归的问题,最后每 C 个步骤,你要把用 Q 替代 $\hat{Q}$ 。
|
||||
上图是原来 Q-learning 的算法。你有一个 Q-function Q,你有另外一个目标的 Q-function 叫做 $\hat{Q}$。然后在每一次 训练,在每一个回合的每一个时间点里面,你会看到一个状态 $s_t$,你会采取某一个动作 $a_{t}$。至于采取哪一个动作是由 Q-function 所决定的,因为解一个 arg max 的问题。如果是离散的话没有问题,你就看说哪一个 a 可以让 Q 的 value 最大,就采取哪一个动作。那你需要加一些探索,这样表现才会好。你会得到奖励 $r_t$,跳到新的状态 $s_{t+1}$。你会把 $s_t$, $a_{t}$, $r_t$, $s_{t+1}$ 塞到你的 buffer 里面去。你会从你的 buffer 里面采样一个批量的数据,在这个批量数据里面,可能某一笔是 $s_i, a_i, r_i, s_{i+1}$。接下来你会算一个目标,这个目标叫做 $y$ ,$y=r_{i}+\max _{a} \hat{Q}\left(s_{i+1}, a\right)$。然后怎么学习你的 Q 呢?你希望 $Q(s_i,a_i)$ 跟 y 越接近越好,这是一个回归的问题,最后每 C 个步骤,你要把用 Q 替代 $\hat{Q}$ 。
|
||||
|
||||

|
||||
|
||||
|
||||
Reference in New Issue
Block a user