fix some errors
This commit is contained in:
@@ -3,25 +3,37 @@
|
||||
|
||||

|
||||
|
||||
在reinforcement learning 中有3 个components,一个`actor`,一个`environment`,一个`reward function`。
|
||||
在 reinforcement learning 中有 3 个components,一个`actor`,一个`environment`,一个`reward function`。
|
||||
|
||||
让机器玩video game时,actor 做的事情就是去操控游戏的摇杆, 比如说向左、向右、开火等操作,environment 就是游戏的主机, 负责控制游戏的画面负责控制说,怪物要怎么移动, 你现在要看到什么画面等等。reward function就是当你做什么事情,发生什么状况的时候,你可以得到多少分数, 比如说杀一只怪兽得到20分等等。
|
||||
让机器玩 video game 时,
|
||||
|
||||
同样的概念用在围棋上也是一样的,actor 就是alpha Go,它要决定下哪一个位置,environment 就是对手,reward function 就是按照围棋的规则, 赢就是得一分,输就是负一分等等。在reinforcement 里面,environment 跟 reward function 不是你可以控制的,environment 跟reward function 是在开始学习之前,就已经事先给定的。你唯一能做的事情,是调整你的actor,调整你actor 里面的policy,使得它可以得到最大的reward。这个actor 里面会有一个policy, 这个policy 决定了actor 的行为, policy 就是给一个外界的输入,然后它会输出actor 现在应该要执行的行为。
|
||||
* actor 做的事情就是去操控游戏的摇杆, 比如说向左、向右、开火等操作;
|
||||
* environment 就是游戏的主机, 负责控制游戏的画面负责控制说,怪物要怎么移动, 你现在要看到什么画面等等;
|
||||
* reward function 就是当你做什么事情,发生什么状况的时候,你可以得到多少分数, 比如说杀一只怪兽得到20分等等。
|
||||
|
||||
同样的概念用在围棋上也是一样的,
|
||||
|
||||
* actor 就是 alpha Go,它要决定下哪一个位置;
|
||||
* environment 就是对手;
|
||||
* reward function 就是按照围棋的规则, 赢就是得一分,输就是负一分等等。
|
||||
|
||||
在 reinforcement learning 里面,environment 跟 reward function 不是你可以控制的,environment 跟 reward function 是在开始学习之前,就已经事先给定的。你唯一能做的事情是调整 actor 里面的 policy,使得 actor 可以得到最大的 reward。Actor 里面会有一个 policy, 这个policy 决定了actor 的行为, policy 就是给一个外界的输入,然后它会输出 actor 现在应该要执行的行为。
|
||||
|
||||

|
||||
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 的就是今天机器要采取什么样的行为。
|
||||
上图就是具体的例子,
|
||||
* policy 就是一个 network;
|
||||
* input 就是游戏的画面,它通常就是由 pixels 所组成的;
|
||||
* output 就是看看说现在有那些选项是你可以去执行的,你的 output layer 就有几个 neurons。
|
||||
|
||||
假设你现在可以做的行为就是有 3 个, 你的 output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。input 一个东西后,network 就会给每一个可以采取的行为一个分数。接下来,你把这个分数,当作是概率。 actor 就是看这个概率的分布,根据这个机率的分布,决定它要采取的行为。比如说 70% 会走 left,20% 走 right,10% 开火等等。概率分布不同,你的 actor 采取的行为,就会不一样。
|
||||
上图就是具体的例子,
|
||||
|
||||
* policy 就是一个 network;
|
||||
* input 就是游戏的画面,它通常是由 pixels 所组成的;
|
||||
* output 就是看看说有那些选项是你可以去执行的,output layer 就有几个 neurons。
|
||||
|
||||
假设你现在可以做的行为就是有 3 个,output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。Input 一个东西后,network 就会给每一个可以采取的行为一个分数。接下来,你把这个分数当作是概率。 actor 就是看这个概率的分布,根据这个机率的分布,决定它要采取的行为。比如说 70% 会走 left,20% 走 right,10% 开火等等。概率分布不同,你的 actor 采取的行为,就会不一样。
|
||||
|
||||

|
||||
接下来用一个例子来说明 actor 是怎么样跟环境互动的。 首先 actor 会看到一个游戏画面,我们用 $s_1$ 来表示这个游戏画面,它代表游戏初始的画面。接下来 actor 看到这个游戏的初始画面以后,根据它内部的 network,根据它内部的 policy,它就会决定一个 action。那假设它现在决定的 action 是向右。那它决定完 action 以后,它就会得到一个 reward 代表它采取这个 action 以后,它会得到多少的分数。
|
||||
接下来用一个例子来说明 actor 是怎么样跟环境互动的。 首先 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 决定这个游戏结束了。比如说,如果在这个游戏里面,你是控制绿色的船去杀怪,如果你被杀死的话,游戏就结束,或是你把所有的怪都清空,游戏就结束了。
|
||||
|
||||
@@ -57,13 +69,13 @@ $$
|
||||

|
||||
|
||||
|
||||
在 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。
|
||||
|
||||
这边写做 $R(\tau)$ ,代表说是某一个 trajectory $\tau$。在某一场游戏里面, 某一个 episode 里面,我们会得到大 R。**我们要做的事情就是调整 actor 内部的参数 $\theta$, 使得 R 的值越大越好。** 但实际上 reward 并不只是一个 scalar,reward 其实是一个 random variable,R 其实是一个 random variable。 因为 actor 在给定同样的 state 会做什么样的行为,这件事情是有随机性的。environment 在给定同样的 observation 要采取什么样的 action,要产生什么样的 observation,本身也是有随机性的。所以 R 是一个 random variable,你能够计算的,是它的期望值。你能够计算的是说,在给定某一组参数 $\theta$ 的情况下,我们会得到的 R 的期望值是多少。
|
||||
这边写做 $R(\tau)$ ,代表说是某一个 trajectory $\tau$。在某一场游戏里面, 某一个 episode 里面,我们会得到 R。**我们要做的事情就是调整 actor 内部的参数 $\theta$, 使得 R 的值越大越好。** 但实际上 reward 并不只是一个 scalar,reward 其实是一个 random variable,R 其实是一个 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$ 出现的概率,summation over 所有的 $\tau$,就是期望值。给定一个参数,你会得到的期望值。
|
||||
$$
|
||||
\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]
|
||||
$$
|
||||
@@ -198,7 +210,12 @@ $$
|
||||
本来的 weight 是整场游戏的 reward 的总和。那现在改一下,改成从某个时间 $t$ 开始,假设这个 action 是在 t 这个时间点所执行的,从 $t$ 这个时间点,一直到游戏结束所有 reward 的总和,才真的代表这个 action 是好的还是不好的。
|
||||
|
||||

|
||||
接下来再更进一步,我们把未来的 reward 做一个 discount。为什么要把未来的 reward 做一个 discount 呢?因为虽然在某一个时间点,执行某一个 action,会影响接下来所有的结果。有可能在某一个时间点执行的 action,接下来得到的 reward 都是这个 action 的功劳。但在比较真实的情况下, 如果时间拖得越长,影响力就越小。 比如说在第二个时间点执行某一个 action, 那我在第三个时间点得到 reward 可能是在第二个时间点执行某个 action 的功劳,但是在 100 个 timestamp 之后,又得到 reward,那可能就不是在第二个时间点执行某一个 action 得到的功劳。 所以我们实际上在做的时候,你会在你的 R 前面 乘上一个 term 叫做 $\gamma$, $\gamma$ 它是小于 1 的,它会设个 0.9 或 0.99。 如果 time stamp $t'$ 越大,它前面就乘上越多次的 $\gamma$,就代表说现在在某一个 state $s_t$, 执行某一个 action $a_t$ 的时候,它真正的 credit 是在执行这个 action 之后 所有 reward 的总和,而且你还要乘上 $\gamma$。
|
||||
**接下来再更进一步,我们把未来的 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,
|
||||
|
||||
* $\gamma = 0$ : Only care about the immediate reward;
|
||||
* $\gamma = 1$ : Future reward is equal to the immediate reward。
|
||||
|
||||
如果 time stamp $t'$ 越大,它前面就乘上越多次的 $\gamma$,就代表说现在在某一个 state $s_t$, 执行某一个 action $a_t$ 的时候,它真正的 credit 是在执行这个 action 之后所有 reward 的总和,而且你还要乘上 $\gamma$。
|
||||
|
||||
举一个例子, 你就想成说,这是游戏的第 1、2、3、4 回合,那你在游戏的第二回合的某一个 $s_t$ 你执行 $a_t$,它真正的 credit 得到的分数应该是,假设你这边得到 +1 分 这边得到 +3 分,这边得到 -5 分,它的真正的 credit,应该是 1 加上一个 discount 的 credit 叫做 $\gamma$ 乘上 3,再加上 $\gamma^2$ 乘上 -5。
|
||||
|
||||
@@ -209,3 +226,9 @@ $$
|
||||
把 $R-b$ 这一项合起来,我们统称为` advantage function`, 用 `A` 来代表 advantage function。Advantage function 是 dependent on s and a,我们就是要计算的是在某一个 state s 采取某一个 action a 的时候,advantage function 有多大。
|
||||
|
||||
这个 advantage function 它的上标是 $\theta$, $\theta$ 是什么意思呢? 因为在算 advantage function时,你要计算$\sum_{t^{\prime}=t}^{T_{n}} r_{t^{\prime}}^{n}$ ,你会需要有一个 interaction 的结果。你会需要有一个 model 去跟环境做 interaction,你才知道你接下来得到的 reward 会有多少。这个 $\theta$ 就是代表说是用 $\theta$ 这个 model 跟环境去做 interaction,然后你才计算出这一项。从时间 t 开始到游戏结束为止,所有 R 的 summation 把这一项减掉 b,然后这个就叫 advantage function。它的意义就是,假设我们在某一个 state $s_t$ 执行某一个 action $a_t$,相较于其他可能的 action,它有多好。它真正在意的不是一个绝对的好, 而是说在同样的 state 的时候 是采取某一个 action $a_t$ 相较于其它的 action 它有多好,它是相对的好。因为会减掉一个 b,减掉一个 baseline, 所以这个东西是相对的好,不是绝对的好。 $A^{\theta}\left(s_{t}, a_{t}\right)$ 通常可以是由一个 network estimate 出来的,这个 network 叫做 critic。
|
||||
|
||||
## References
|
||||
|
||||
* [Intro to Reinforcement Learning (强化学习纲要)](https://github.com/zhoubolei/introRL)
|
||||
* [神经网络与深度学习](https://nndl.github.io/)
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 162 KiB |
BIN
docs/chapter1/img/Presentation4.pptx
Normal file
BIN
docs/chapter1/img/Presentation4.pptx
Normal file
Binary file not shown.
BIN
docs/chapter1/img/~$Presentation4.pptx
Normal file
BIN
docs/chapter1/img/~$Presentation4.pptx
Normal file
Binary file not shown.
@@ -1,10 +1,10 @@
|
||||
# PPO
|
||||
## From On-policy to Off-policy
|
||||
在讲 PPO 之前,我们先讲一下 on-policy and off-policy 这两种 training 方法的区别。
|
||||
在讲 PPO 之前,我们先讲一下 on-policy 和 off-policy 这两种 training 方法的区别。
|
||||
在 reinforcement learning 里面,我们要 learn 的就是一个agent。
|
||||
|
||||
* 如果要 learn 的 agent 跟和环境互动的 agent 是同一个的话, 这个叫做`on-policy`。
|
||||
* 如果要 learn 的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做`off-policy`。
|
||||
* 如果要 learn 的 agent 跟和环境互动的 agent 是同一个的话, 这个叫做`on-policy(同策略)`。
|
||||
* 如果要 learn 的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做`off-policy(异策略)`。
|
||||
|
||||
比较拟人化的讲法是如果要学习的那个 agent,一边跟环境互动,一边做学习这个叫 on-policy。 如果它在旁边看别人玩,通过看别人玩来学习的话,这个叫做 off-policy。
|
||||
|
||||
@@ -18,10 +18,10 @@ $$
|
||||
\nabla \bar{R}_{\theta}=E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right]
|
||||
$$
|
||||
|
||||
问题是上面这个 update 的式子中的 $E_{\tau \sim p_{\theta}(\tau)}$ 应该是你现在的 policy $\theta$ 所 sample 出来的 trajectory $\tau$ 做 expectation。一旦 update 了参数,从 $\theta$ 变成 $\theta'$ ,$p_\theta(\tau)$这个概率就不对了,之前sample 出来的 data 就变的不能用了。所以 policy gradient 是一个会花很多时间来 sample data 的 algorithm,你会发现大多数时间都在 sample data,agent 去跟环境做互动以后,接下来就要 update 参数。你只能 update 参数一次。接下来你就要重新再去 collect data, 然后才能再次update 参数,这显然是非常花时间的。所以我们想要从on-policy 变成off-policy。 这样做就可以用另外一个policy, 另外一个actor $\theta'$ 去跟环境做互动。用 $\theta'$ collect 到的data 去训练 $\theta$。假设我们可以用 $\theta'$ collect 到的data 去训练 $\theta$,意味着说我们可以把$\theta'$ collect 到的data 用非常多次。我们可以执行 gradient ascent 好几次,我们可以 update 参数好几次, 都只要用同一笔data 就好了。因为假设 $\theta$ 有能力学习另外一个actor $\theta'$ 所 sample 出来的 data 的话, 那$\theta'$ 就只要sample 一次,也许sample 多一点的data, 让$\theta$ 去update 很多次,这样就会比较有效率。
|
||||
问题是上面这个 update 的式子中的 $E_{\tau \sim p_{\theta}(\tau)}$ 应该是你现在的 policy $\theta$ 所 sample 出来的 trajectory $\tau$ 做 expectation。一旦 update 了参数,从 $\theta$ 变成 $\theta'$ ,$p_\theta(\tau)$这个概率就不对了,之前sample 出来的 data 就变的不能用了。所以 policy gradient 是一个会花很多时间来 sample data 的 algorithm,你会发现大多数时间都在 sample data,agent 去跟环境做互动以后,接下来就要 update 参数。你只能 update 参数一次。接下来你就要重新再去 collect data, 然后才能再次update 参数,这显然是非常花时间的。所以我们想要从 on-policy 变成 off-policy。 这样做就可以用另外一个policy, 另外一个actor $\theta'$ 去跟环境做互动。用 $\theta'$ collect 到的data 去训练 $\theta$。假设我们可以用 $\theta'$ collect 到的data 去训练 $\theta$,意味着说我们可以把$\theta'$ collect 到的data 用非常多次。我们可以执行 gradient ascent 好几次,我们可以 update 参数好几次, 都只要用同一笔data 就好了。因为假设 $\theta$ 有能力学习另外一个actor $\theta'$ 所 sample 出来的 data 的话, 那$\theta'$ 就只要sample 一次,也许sample 多一点的data, 让$\theta$ 去update 很多次,这样就会比较有效率。
|
||||

|
||||
|
||||
具体怎么做呢?这边就需要介绍 important sampling 的概念。假设你有一个function $f(x)$,你要计算从 p 这个 distribution sample x,再把 x 带到 f 里面,得到$f(x)$。你要该怎么计算这个 $f(x)$ 的期望值?假设你不能对 p 这个distribution 做积分的话,那你可以从 p 这个 distribution 去 sample 一些data $x^i$。把 $x^i$ 代到 $f(x)$ 里面,然后取它的平均值,就可以近似 $f(x)$ 的期望值。
|
||||
具体怎么做呢?这边就需要介绍 `important sampling` 的概念。假设你有一个function $f(x)$,你要计算从 p 这个 distribution sample x,再把 x 带到 f 里面,得到$f(x)$。你要该怎么计算这个 $f(x)$ 的期望值?假设你不能对 p 这个distribution 做积分的话,那你可以从 p 这个 distribution 去 sample 一些data $x^i$。把 $x^i$ 代到 $f(x)$ 里面,然后取它的平均值,就可以近似 $f(x)$ 的期望值。
|
||||
|
||||
现在有另外一个问题,我们没有办法从 p 这个 distribution 里面 sample data。假设我们不能从 p sample data,只能从另外一个 distribution q 去 sample data,q 可以是任何 distribution。我们不能够从 p 去sample data,但可以从 q 去 sample $x$。我们从 q 去 sample $x^i$ 的话就不能直接套下面的式子。
|
||||
$$
|
||||
@@ -33,7 +33,7 @@ $$
|
||||
$$
|
||||
我们就可以写成对 q 里面所 sample 出来的 x 取期望值。我们从q 里面 sample x,然后再去计算$f(x) \frac{p(x)}{q(x)}$,再去取期望值。所以就算我们不能从 p 里面去 sample data,只要能够从 q 里面去sample data,然后代入上式,你就可以计算从 p 这个distribution sample x 代入 f 以后所算出来的期望值。
|
||||
|
||||
这边是从 q 做 sample,所以从 q 里 sample 出来的每一笔data,你需要乘上一个 weight 来修正这两个 distribution 的差异,weight 就是$\frac{p(x)}{q(x)}$。$q(x)$是任何distribution 都可以,唯一的限制就是 $q(x)$ 的概率是0 的时候,$p(x)$ 的概率不为 0,不然这样会没有定义。假设 $q(x)$ 的概率是0 的时候,$p(x)$ 的概率也都是 0 的话,那这样 $p(x)$ 除以$q(x)$是有定义的。所以这个时候你就可以 apply important sampling 这个技巧。你就可以从 p 做sample 换成从 q 做sample。
|
||||
这边是从 q 做 sample,所以从 q 里 sample 出来的每一笔data,你需要乘上一个 weight 来修正这两个 distribution 的差异,weight 就是$\frac{p(x)}{q(x)}$。$q(x)$ 可以是任何 distribution,唯一的限制就是 $q(x)$ 的概率是 0 的时候,$p(x)$ 的概率不为 0,不然这样会没有定义。假设 $q(x)$ 的概率是 0 的时候,$p(x)$ 的概率也都是 0 的话,那这样 $p(x)$ 除以 $q(x)$是有定义的。所以这个时候你就可以 apply important sampling 这个技巧。你就可以从 p 做 sample 换成从 q 做 sample。
|
||||
|
||||

|
||||
|
||||
@@ -76,20 +76,20 @@ $\operatorname{Var}_{x \sim p}[f(x)]$ 和 $\operatorname{Var}_{x \sim q}\left[f(
|
||||
|
||||

|
||||
|
||||
实际在做policy gradient 的时候,我们并不是给整个 trajectory $\tau$ 都一样的分数,而是每一个state-action 的pair 会分开来计算。实际上update gradient 的时候,我们的式子是长这样子的。
|
||||
实际在做 policy gradient 的时候,我们并不是给整个 trajectory $\tau$ 都一样的分数,而是每一个state-action 的pair 会分开来计算。实际上 update gradient 的时候,我们的式子是长这样子的。
|
||||
$$
|
||||
=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta}}\left[A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right]
|
||||
$$
|
||||
|
||||
我们用 $\theta$ 这个actor 去sample 出$s_t$ 跟$a_t$,sample 出state 跟action 的pair,我们会计算这个state 跟action pair 它的advantage, 就是它有多好。$A^{\theta}\left(s_{t}, a_{t}\right)$就是 accumulated 的 reward 减掉 bias,这一项就是估测出来的。它要估测的是,在state $s_t$ 采取action $a_t$ 是好的,还是不好的。那接下来后面会乘上$\nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)$,也就是说如果$A^{\theta}\left(s_{t}, a_{t}\right)$是正的,就要增加概率, 如果是负的,就要减少概率。
|
||||
|
||||
那现在用了 importance sampling 的技术把 on-policy 变成 off-policy,就从 $\theta$ 变成 $\theta'$。所以现在$s_t$、$a_t$ 是$\theta'$ ,另外一个actor 跟环境互动以后所sample 到的data。 但是拿来训练要调整参数是 model $\theta$。因为$\theta'$ 跟 $\theta$ 是不同的model,所以你要做一个修正的项。这项修正的项,就是用 importance sampling 的技术,把$s_t$、$a_t$ 用 $\theta$ sample 出来的概率除掉$s_t$、$a_t$ 用 $\theta'$ sample 出来的概率。
|
||||
那现在用了 importance sampling 的技术把 on-policy 变成 off-policy,就从 $\theta$ 变成 $\theta'$。所以现在$s_t$、$a_t$ 是$\theta'$ ,另外一个actor 跟环境互动以后所 sample 到的data。 但是拿来训练要调整参数是 model $\theta$。因为 $\theta'$ 跟 $\theta$ 是不同的model,所以你要做一个修正的项。这项修正的项,就是用 importance sampling 的技术,把$s_t$、$a_t$ 用 $\theta$ sample 出来的概率除掉$s_t$、$a_t$ 用 $\theta'$ sample 出来的概率。
|
||||
|
||||
$$
|
||||
=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{P_{\theta}\left(s_{t}, a_{t}\right)}{P_{\theta^{\prime}}\left(s_{t}, a_{t}\right)} A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right]
|
||||
$$
|
||||
|
||||
这边 A 有一个上标 $\theta$,$\theta$ 代表说这个是 actor $\theta$ 跟环境互动的时候所计算出来的 A。但是实际上从 $\theta$ 换到 $\theta'$ 的时候,$A^{\theta}(s_t,a_t)$ 应该改成 $A^{\theta'}(s_t,a_t)$,为什么?A 这一项是想要估测说现在在某一个 state 采取某一个 action,接下来会得到 accumulated reward 的值减掉base line 。你怎么估 A 这一项,你就会看在 state $s_t$,采取 action $a_t$,接下来会得到的reward 的总和,再减掉baseline。之前是 $\theta$ 在跟环境做互动,所以你观察到的是 $\theta$ 可以得到的reward。但现在是 $\theta'$ 在跟环境做互动,所以你得到的这个advantage, 其实是根据 $\theta'$ 所estimate 出来的advantage。但我们现在先不要管那么多, 我们就假设这两项可能是差不多的。
|
||||
这边 $A^{\theta}(s_t,a_t)$ 有一个上标 $\theta$,$\theta$ 代表说这个是 actor $\theta$ 跟环境互动的时候所计算出来的 A。但是实际上从 $\theta$ 换到 $\theta'$ 的时候,$A^{\theta}(s_t,a_t)$ 应该改成 $A^{\theta'}(s_t,a_t)$,为什么?A 这一项是想要估测说现在在某一个 state 采取某一个 action,接下来会得到 accumulated reward 的值减掉base line 。你怎么估 A 这一项,你就会看在 state $s_t$,采取 action $a_t$,接下来会得到的reward 的总和,再减掉baseline。之前是 $\theta$ 在跟环境做互动,所以你观察到的是 $\theta$ 可以得到的reward。但现在是 $\theta'$ 在跟环境做互动,所以你得到的这个advantage, 其实是根据 $\theta'$ 所estimate 出来的advantage。但我们现在先不要管那么多, 我们就假设这两项可能是差不多的。
|
||||
|
||||
那接下来,我们可以拆解 $p_{\theta}\left(s_{t}, a_{t}\right)$ 和 $p_{\theta'}\left(s_{t}, a_{t}\right)$,即
|
||||
$$
|
||||
@@ -140,7 +140,7 @@ $$
|
||||
|
||||

|
||||
|
||||
我们可以把 on-policy 换成off-policy,但 importance sampling 有一个 issue,如果 $p_{\theta}\left(a_{t} | s_{t}\right)$ 跟$p_{\theta'}\left(a_{t} | s_{t}\right)$ 差太多的话,这两个distribution 差太多的话,importance sampling 的结果就会不好。怎么避免它差太多呢?这个就是PPO 在做的事情。它实际上做的事情就是这样,在 off-policy 的方法里要optimize 的是 $J^{\theta^{\prime}}(\theta)$。但是这个objective function 又牵涉到 importance sampling。在做importance sampling 的时候,$p_{\theta}\left(a_{t} | s_{t}\right)$ 不能跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$差太多。你做 demonstration 的model 不能够跟真正的model 差太多,差太多的话 importance sampling 的结果就会不好。我们在 training 的时候,多加一个constrain。这个constrain 是 $\theta$ 跟 $\theta'$ output 的 action 的 KL divergence,简单来说,这一项的意思就是要衡量说 $\theta$ 跟 $\theta'$ 有多像。
|
||||
我们可以把 on-policy 换成 off-policy,但 importance sampling 有一个 issue,如果 $p_{\theta}\left(a_{t} | s_{t}\right)$ 跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$ 差太多的话,这两个 distribution 差太多的话,importance sampling 的结果就会不好。怎么避免它差太多呢?这个就是 `Proximal Policy Optimization (PPO) ` 在做的事情。它实际上做的事情就是这样,在 off-policy 的方法里要optimize 的是 $J^{\theta^{\prime}}(\theta)$。但是这个 objective function 又牵涉到 importance sampling。在做 importance sampling 的时候,$p_{\theta}\left(a_{t} | s_{t}\right)$ 不能跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$差太多。你做 demonstration 的 model 不能够跟真正的 model 差太多,差太多的话 importance sampling 的结果就会不好。我们在 training 的时候,多加一个 constrain。这个constrain 是 $\theta$ 跟 $\theta'$ output 的 action 的 KL divergence,简单来说,这一项的意思就是要衡量说 $\theta$ 跟 $\theta'$ 有多像。
|
||||
|
||||
然后我们希望在 training 的过程中,learn 出来的 $\theta$ 跟 $\theta'$ 越像越好。因为如果 $\theta$ 跟 $\theta'$ 不像的话,最后的结果就会不好。所以在 PPO 里面有两个式子,一方面是 optimize 本来要 optimize 的东西,但再加一个 constrain。这个 constrain 就好像那个 regularization 的 term 一样,在做 machine learning 的时候不是有 L1/L2 的regularization。这一项也很像 regularization,这样 regularization 做的事情就是希望最后 learn 出来的 $\theta$ 不要跟 $\theta'$ 太不一样。
|
||||
|
||||
@@ -154,7 +154,7 @@ $$
|
||||
|
||||
它与PPO不一样的地方 是 constrain 摆的位置不一样,PPO是直接把 constrain 放到你要 optimize 的那个式子里面,然后你就可以用 gradient ascent 的方法去 maximize 这个式子。但 TRPO 是把 KL divergence 当作constrain,它希望 $\theta$ 跟 $\theta'$ 的 KL divergence 小于一个$\delta$。如果你是用 gradient based optimization 时,有 constrain 是很难处理的。
|
||||
|
||||
PPO是很难处理的,因为它是把 KL divergence constrain 当做一个额外的constrain,没有放objective 里面,所以它很难算。所以不想搬石头砸自己的脚的话, 你就用PPO 不要用TRPO。看文献上的结果是,PPO 跟TRPO 可能 performance 差不多,但 PPO 在实现上比 TRPO 容易的多。
|
||||
PPO是很难处理的,因为它是把 KL divergence constrain 当做一个额外的 constrain,没有放 objective 里面,所以它很难算。所以不想搬石头砸自己的脚的话, 你就用PPO 不要用TRPO。看文献上的结果是,PPO 跟TRPO 可能 performance 差不多,但 PPO 在实现上比 TRPO 容易的多。
|
||||
|
||||
KL divergence 到底指的是什么?这边我是直接把 KL divergence 当做一个 function,input 是 $\theta$ 跟 $\theta'$,但我的意思并不是说把 $\theta$ 或 $\theta'$ 当做一个distribution,算这两个distribution 之间的距离,我不是这个意思。所谓的 $\theta$ 跟 $\theta'$ 的距离并不是参数上的距离,而是 behavior 上的距离。
|
||||
|
||||
@@ -168,7 +168,7 @@ KL divergence 到底指的是什么?这边我是直接把 KL divergence 当做
|
||||
|
||||

|
||||
|
||||
在PPO 的paper 里面还有一个 `adaptive 的KL divergence`,这边会遇到一个问题就是 $\beta$ 要设多少,它就跟那个regularization 一样。regularization 前面也要乘一个weight,所以这个 KL divergence 前面也要乘一个 weight,但 $\beta$ 要设多少呢?所以有个动态调整 $\beta$ 的方法。在这个方法里面呢,你先设一个 KL divergence,你可以接受的最大值。然后假设你发现说你 optimize 完这个式子以后,KL divergence 的项太大,那就代表说后面这个 penalize 的 term 没有发挥作用,那就把 $\beta$ 调大。那另外你定一个 KL divergence 的最小值。如果发现 optimize 完上面这个式子以后,KL divergence 比最小值还要小,那代表后面这一项的效果太强了,你怕他只弄后面这一项,那$\theta$ 跟$\theta^k$ 都一样,这不是你要的,所以你这个时候你叫要减少 $\beta$。所以 $\beta$ 是可以动态调整的。这个叫做 adaptive 的 KL penalty。
|
||||
在PPO 的paper 里面还有一个 `adaptive KL divergence`,这边会遇到一个问题就是 $\beta$ 要设多少,它就跟那个regularization 一样。regularization 前面也要乘一个weight,所以这个 KL divergence 前面也要乘一个 weight,但 $\beta$ 要设多少呢?所以有个动态调整 $\beta$ 的方法。在这个方法里面呢,你先设一个 KL divergence,你可以接受的最大值。然后假设你发现说你 optimize 完这个式子以后,KL divergence 的项太大,那就代表说后面这个 penalize 的 term 没有发挥作用,那就把 $\beta$ 调大。那另外你定一个 KL divergence 的最小值。如果发现 optimize 完上面这个式子以后,KL divergence 比最小值还要小,那代表后面这一项的效果太强了,你怕他只弄后面这一项,那$\theta$ 跟$\theta^k$ 都一样,这不是你要的,所以你这个时候你叫要减少 $\beta$。所以 $\beta$ 是可以动态调整的。这个叫做 adaptive KL penalty。
|
||||
|
||||

|
||||
|
||||
@@ -219,7 +219,7 @@ $$
|
||||
* 假设这个 advantage 是正的,我们希望$p_{\theta}(a_{t} | s_{t})$ 越大越好。假设这个 action 是好的,我们当然希望这个 action 被采取的概率越大越好。所以假设 $p_{\theta}(a_{t} | s_{t})$ 还比 $p_{\theta^k}(a_{t} | s_{t})$ 小,那就尽量把它挪大,但只要大到$1+\varepsilon$ 就好。
|
||||
* 负的时候也是一样,如果某一个state-action pair 是不好的,我们希望把 $p_{\theta}(a_{t} | s_{t})$ 减小。如果 $p_{\theta}(a_{t} | s_{t})$ 比$p_{\theta^k}(a_{t} | s_{t})$ 还大,那你就尽量把它压小,压到$\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)}$是$1-\epsilon$ 的时候就停了,就不要再压得更小。
|
||||
|
||||
这样的好处就是, 你不会让 $p_{\theta}(a_{t} | s_{t})$ 跟 $p_{\theta^k}(a_{t} | s_{t})$ 差距太大。要implement 这个东西,很简单。
|
||||
这样的好处就是, 你不会让 $p_{\theta}(a_{t} | s_{t})$ 跟 $p_{\theta^k}(a_{t} | s_{t})$ 差距太大。要 implement 这个东西,很简单。
|
||||
|
||||
|
||||

|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||

|
||||
|
||||
Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我们 learn 的不是 policy,我们要 learn 的是一个 `critic`。Critic 并不直接采取行为,它想要做的事情是评价现在的行为有多好或者是有多不好。假设有一个 actor $\pi$ ,那 critic 的工作就是来评价这个 actor $\pi$ 做得有多好或者有多不好。
|
||||
Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我们 learn 的不是 policy,我们要 learn 的是一个 `critic`。Critic 并不直接采取行为,它想要做的事情是评价现在的行为有多好或是有多不好。假设有一个 actor $\pi$ ,critic 的工作就是来评价这个 actor 的 policy $\pi$ 好还是不好,即 `Policy Evaluation(策略评估)`。
|
||||
|
||||
举例来说,有一种 critic 叫做 `state value function`。State value function 的意思就是说,假设 actor 叫做 $\pi$,拿 $\pi$ 跟环境去做互动。假设 $\pi$ 看到了某一个state s,如果在玩 Atari 游戏的话,state s 是某一个画面,看到某一个画面的时候,接下来一直玩到游戏结束,累积的 reward 的期望值有多大。所以 $V^{\pi}$ 是一个function,这个 function input 一个 state,然后它会 output 一个 scalar。这个 scalar 代表说,$\pi$ 这个 actor 看到 state s 的时候,接下来预期到游戏结束的时候,它可以得到多大的 value。
|
||||
|
||||
@@ -25,7 +25,7 @@ Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我
|
||||
|
||||

|
||||
|
||||
第二个方法是`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 的方法呢?这边是基于以下这个式子:
|
||||
$$
|
||||
@@ -111,23 +111,25 @@ Q-function 有两种写法:
|
||||
|
||||

|
||||
|
||||
虽然表面上我们 learn 一个Q-function,它只能拿来评估某一个actor $\pi$ 的好坏,但只要有了这个 Q-function,我们就可以做 reinforcement learning。有这个Q-function,我们就可以决定要采取哪一个action。它的大原则是这样,假设你有一个初始的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,得到新的以后,再去找一个更好的policy。 然后这个循环一直下去,你的policy 就会越来越好。
|
||||
虽然表面上我们 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 就会越来越好。
|
||||
|
||||

|
||||
上图就是讲我们刚才讲的到底是什么。
|
||||
|
||||
* 首先要定义的是什么叫做比较好?我们说$\pi'$ 一定会比$\pi$ 还要好,什么叫做好呢?这边所谓好的意思是说,对所有可能的state s 而言,对同一个state s 而言,$\pi$ 的 value function 一定会小于$\pi'$ 的value function。也就是说我们走到同一个 state s 的时候,如果拿 $\pi$ 继续跟环境互动下去,我们得到的 reward 一定会小于用$\pi'$ 跟环境互动下去得到的reward。所以不管在哪一个state,你用$\pi'$ 去做interaction,得到的expected reward 一定会比较大。所以 $\pi'$ 是比 $\pi$ 还要好的一个policy。
|
||||
|
||||
* 有了这个 Q 以后,怎么找这个$\pi'$ 呢?事实上这个$\pi'$ 是什么?这个$\pi'$ 就是, 如果你根据以下的这个式子去决定你的action,
|
||||
* 有了这个 Q-function 以后,怎么找这个 $\pi'$ 呢?事实上这个 $\pi'$ 是什么?这个$\pi'$ 就是, 如果你根据以下的这个式子去决定你的action,
|
||||
|
||||
$$
|
||||
\pi^{\prime}(s)=\arg \max _{a} Q^{\pi}(s, a)
|
||||
$$
|
||||
|
||||
根据上式去决定你的action 的步骤叫做 $\pi'$ 的话,那这个 $\pi'$ 一定会比$\pi$ 还要好。这个意思是说,假设你已经learn 出 $\pi$ 的Q-function,今天在某一个state s,你把所有可能的action a 都一一带入这个Q-function,看看说那一个 a 可以让 Q-function 的value 最大。那这一个action,就是$\pi'$ 会采取的action。这边要注意一下,今天given 这个state s,你的policy $\pi$ 并不一定会采取action a。今天是 given 某一个state s 强制采取 action a,用$\pi$ 继续互动下去得到的expected reward,才是这个Q-function 的定义。所以在state s 里面不一定会采取action a。假设用这一个 $\pi'$ 在state s 采取action a 跟 $\pi$ 所谓采取action 是不一定会一样的。然后 $\pi'$ 所采取的action 会让他得到比较大的reward。
|
||||
根据上式去决定你的action 的步骤叫做 $\pi'$ 的话,那这个 $\pi'$ 一定会比$\pi$ 还要好。这个意思是说,假设你已经 learn 出 $\pi$ 的Q-function,今天在某一个state s,你把所有可能的 action a 都一一带入这个 Q-function,看看说那一个 a 可以让 Q-function 的 value 最大,那这一个 action,就是 $\pi'$ 会采取的 action。这边要注意一下,given 这个 state s,你的 policy $\pi$ 并不一定会采取 action a。我们是 given 某一个 state s 强制采取 action a,用 $\pi$ 继续互动下去得到的 expected reward,这个才是 Q-function 的定义。所以在 state s 里面不一定会采取 action a。假设用这一个 $\pi'$ 在 state s 采取action a 跟 $\pi$ 所谓采取 action 是不一定会一样的。然后 $\pi'$ 所采取的 action 会让他得到比较大的 reward。
|
||||
|
||||
* 所以根本就没有一个policy 叫做 $\pi'$,这个$\pi'$ 其实就是用 Q-function 推出来的。所以没有另外一个 network 决定 $\pi'$ 怎么interaction,有Q 就可以找出$\pi'$。
|
||||
* 但是这边有另外一个问题就是,在这边要解一个 arg max 的 problem。所以a 如果是continuous 的就会有问题,如果是discrete 的,a 只有3 个选项,一个一个带进去, 看谁的Q 最大,没有问题。但如果是 continuous 要解 arg max problem,你就会有问题,但这个是之后才会解决的。
|
||||
* 所以根本就没有一个 policy 叫做 $\pi'$,这个$\pi'$ 是用 Q-function 推出来的。所以没有另外一个 network 决定 $\pi'$ 怎么interaction,有 Q-function 就可以找出$\pi'$。
|
||||
* 但是这边有另外一个问题就是,在这边要解一个 arg max 的 problem。所以 a 如果是continuous 的就会有问题,如果是discrete 的,a 只有3 个选项,一个一个带进去, 看谁的 Q 最大,没有问题。但如果是 continuous 要解 arg max problem,你就会有问题,但这个是之后才会解决的。
|
||||
|
||||

|
||||
|
||||
@@ -154,7 +156,7 @@ $$
|
||||
$$
|
||||
V^{\pi}(s) \leq Q^{\pi}\left(s, \pi^{\prime}(s)\right)
|
||||
$$
|
||||
也就是说某一个state,如果你按照policy $\pi$,一直做下去,你得到的reward 一定会小于等于,在这个state s。你故意不按照 $\pi$ 所给你指示的方向,而是按照 $\pi'$ 的方向走一步,但之后只有第一步是按照 $\pi'$ 的方向走,只有在state s 这个地方,你才按照 $\pi'$ 的指示走,但接下来你就按照 $\pi$ 的指示走。虽然只有一步之差, 但是我从上面这个式子知道说,只有一步之差,你得到的 reward 一定会比完全 follow $\pi$ 得到的 reward 还要大。
|
||||
也就是说某一个 state,如果你按照policy $\pi$,一直做下去,你得到的 reward 一定会小于等于,在这个 state s。你故意不按照 $\pi$ 所给你指示的方向,而是按照 $\pi'$ 的方向走一步,但之后只有第一步是按照 $\pi'$ 的方向走,只有在state s 这个地方,你才按照 $\pi'$ 的指示走,但接下来你就按照 $\pi$ 的指示走。虽然只有一步之差, 但是我从上面这个式子知道说,只有一步之差,你得到的 reward 一定会比完全 follow $\pi$ 得到的 reward 还要大。
|
||||
|
||||
那接下来你想要证的东西就是:
|
||||
$$
|
||||
@@ -211,7 +213,7 @@ $$
|
||||
V^{\pi}(s)\le V^{\pi'}(s)
|
||||
$$
|
||||
|
||||
这边告诉我们的事情如下,你可以estimate 某一个policy 的Q-function,接下来你就一定可以找到另外一个policy 叫做$\pi'$,它一定比原来的policy 还要更好。
|
||||
**从这边我们可以知道,你可以 estimate 某一个 policy 的 Q-function,接下来你就一定可以找到另外一个 policy $\pi'$,它一定比原来的 policy 还要更好。**
|
||||
|
||||
## Target Network
|
||||
|
||||
@@ -223,7 +225,7 @@ $$
|
||||
=r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)
|
||||
$$
|
||||
|
||||
所以你在learn 的时候,你会说我们有Q-function,input $s_t$, $a_t$ 得到的value,跟input $s_{t+1}$, $\pi (s_{t+1})$ 得到的value 中间,我们希望它差了一个$r_t$, 这跟刚才讲的TD 的概念是一样的。但是实际上在learn 的时候,你会发现这样的一个function 并不好 learn。因为假设你说这是一个regression 的problem,$\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $是你network 的output,$r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$是你的target,你会发现 target 是会动的。当然你要implement 这样的training,其实也没有问题。就是你在做 back propagation 的时候, $Q^{\pi}$ 的参数会被 update,你会把两个update 的结果加在一起。它们是同一个model $Q^{\pi}$, 所以两个update 的结果会加在一起。但是实际上在做的时候,你的training 会变得不太稳定,因为假设你把 $\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $ 当作你model 的output, $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 当作target 的话。你要去 fit 的 target 是一直在变的,这种一直在变的target 的training 是不太好train 的。所以实际上你会把其中一个 Q,通常是你就选择下面这个 Q,把它固定住。也就是说你在training 的时候,你并不 update 这个Q 的参数,你只update 左边这个Q 的参数,而右边这个Q 的参数,它会被固定住,我们叫它 `target network`。它负责产生target,所以叫做target network。因为target network 是固定的,所以你现在得到的target,也就是 $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 的值也是固定的。
|
||||
所以你在learn 的时候,你会说我们有Q-function,input $s_t$, $a_t$ 得到的value,跟input $s_{t+1}$, $\pi (s_{t+1})$ 得到的value 中间,我们希望它差了一个$r_t$, 这跟刚才讲的TD 的概念是一样的。但是实际上在learn 的时候,你会发现这样的一个function 并不好 learn。因为假设这是一个 regression 的 problem,$\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $ 是 network 的output,$r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$是你的target,你会发现 target 是会动的。当然你要implement 这样的training,其实也没有问题。就是你在做 back propagation 的时候, $Q^{\pi}$ 的参数会被 update,你会把两个update 的结果加在一起。它们是同一个model $Q^{\pi}$, 所以两个update 的结果会加在一起。但是实际上在做的时候,你的training 会变得不太稳定,因为假设你把 $\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $ 当作你model 的output, $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 当作target 的话。你要去 fit 的 target 是一直在变的,这种一直在变的target 的training 是不太好train 的。所以实际上你会把其中一个 Q,通常是你就选择下面这个 Q,把它固定住。也就是说你在training 的时候,你并不 update 这个Q 的参数,你只update 左边这个Q 的参数,而右边这个Q 的参数,它会被固定住,我们叫它 `target network`。它负责产生target,所以叫做 target network。因为 target network 是固定的,所以你现在得到的target,也就是 $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 的值也是固定的。
|
||||
|
||||
因为 target network 是固定的,我们只调左边network 的参数,它就变成是一个regression 的problem。我们希望 model 的output,它的值跟你的目标越接近越好,你会minimize 它的 mean square error。你会 minimize 它们 L2 的distance。这个东西就是regression。在实现上,你会把这个Q update 好几次以后,再去用 update 过的 Q 替换这个 target network 。但它们两个不要一起动,它们两个一起动的话, 你的结果会很容易坏掉。一开始这两个network 是一样的,然后接下来在train 的时候,你会把右边的 network fix 住。你在做 gradient decent 的时候,只调左边这个network 的参数,那你可能update 100 次以后才把这个参数,复制到右边的 network 去,把它盖过去。把它盖过去以后,你这个target 的value 就变了。就好像说你今天本来在做一个regression 的problem,那你train后把这个regression problem 的loss 压下去以后,接下来你把这边的参数把它copy 过去以后,你的target 就变掉了。 那你接下来就要重新再train。
|
||||
|
||||
@@ -266,22 +268,22 @@ $$
|
||||
|
||||
* 第二个好处,在train network 的时候,其实我们希望一个batch 里面的data 越diverse 越好。如果你的batch 里面的data 都是同样性质的,你train 下去,其实是容易坏掉的。如果你batch 里面都是一样的data,你train 的时候,performance 会比较差。我们希望batch data 越diverse 越好。那如果你今天,你的这个buffer 里面的那些experience 通通来自于不同的policy ,那你sample 到的一个batch 里面的data 会是比较diverse 。
|
||||
|
||||
Q:我们明明是要观察 $\pi$ 的value, 我们要量的是 $\pi$ 的value ,里面混杂了一些不是$\pi$ 的experience 到底有没有关系?
|
||||
Q:我们明明是要观察 $\pi$ 的value, 我们要量的是 $\pi$ 的value ,里面混杂了一些不是$\pi$ 的 experience 到底有没有关系?
|
||||
|
||||
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的$\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去sample 一个trajectory,我们只sample 了一笔experience,所以跟是不是 off-policy 这件事是没有关系的。就算是off-policy,就算是这些 experience 不是来自于 $\pi$,我们其实还是可以拿这些 experience 来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 replay buffer 这招在理论上也是没有问题的。
|
||||
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的$\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去sample 一个trajectory,我们只sample 了一笔experience,所以跟是不是 off-policy 这件事是没有关系的。就算是off-policy,就算是这些 experience 不是来自于 $\pi$,我们其实还是可以拿这些 experience 来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 Experience Replay 在理论上也是没有问题的。
|
||||
|
||||
## Typical Q-learing Algorithm
|
||||
## DQN
|
||||
|
||||

|
||||
|
||||
|
||||
上图就是一般的 Q-learning 的算法。
|
||||
上图就是一般的 `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,抽出来并不是同一笔,你可能抽到一个旧的。
|
||||
这个算法是这样,我们需要一个 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,抽出来并不是同一笔,你可能抽到一个旧的。
|
||||
|
||||
|
||||
那这边另外要注意的是,其实你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)
|
||||
$$
|
||||
其中 a 就是看现在哪一个 a 可以让$\hat{Q}$ 的值最大,你就选那一个a。因为我们在 state $s_{i+1}$会采取的action a,其实就是那个可以让 Q value 的值最大的那一个 a。接下来我们要update Q 的值,那就把它当作一个regression 的problem。希望$Q(s_i,a_i)$ 跟你的target 越接近越好。然后假设已经update 了某一个数目的次,比如说 C 次,设 C = 100, 那你就把 $\hat{Q}$ 设成 Q,这就是Q-learning。
|
||||
其中 a 就是让 $\hat{Q}$ 的值最大的 a。因为我们在 state $s_{i+1}$会采取的action a,其实就是那个可以让 Q value 的值最大的那一个 a。接下来我们要update Q 的值,那就把它当作一个regression 的problem。希望$Q(s_i,a_i)$ 跟你的target 越接近越好。然后假设已经 update 了某一个数量的次,比如说 C 次,设 C = 100, 那你就把 $\hat{Q}$ 设成 Q,这就是 DQN。
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 193 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 424 KiB After Width: | Height: | Size: 280 KiB |
@@ -1,6 +1,6 @@
|
||||
# Imitation Learning
|
||||

|
||||
Imitation learning 讨论的问题是,假设我们连 reward 都没有,那要怎么办呢?Imitation learning 又叫做 `learning from demonstration(示范学习)` ,`apprenticeship learning(学徒学习)`,`learning by watching(观察学习)`。在 Imitation learning 里面,你有一些 expert 的 demonstration,那 machine 也可以跟环境互动,但它没有办法从环境里面得到任何的 reward,它只能看着 expert 的 demonstration 来学习什么是好,什么是不好。其实,多数的情况,我们都没有办法真的从环境里面得到非常明确的 reward。举例来说,如果是棋类游戏或者是电玩,你有非常明确的 reward。但是其实多数的任务,都是没有 reward 的。以 chat-bot 为例,机器跟人聊天,聊得怎么样算是好,聊得怎么样算是不好,你无法给出明确的 reward。所以很多 task 是根本就没有办法给出 reward 的。
|
||||
`Imitation learning` 讨论的问题是,假设我们连 reward 都没有,那要怎么办呢?Imitation learning 又叫做 `learning from demonstration(示范学习)` ,`apprenticeship learning(学徒学习)`,`learning by watching(观察学习)`。在 Imitation learning 里面,你有一些 expert 的 demonstration,那 machine 也可以跟环境互动,但它没有办法从环境里面得到任何的 reward,它只能看着 expert 的 demonstration 来学习什么是好,什么是不好。其实,多数的情况,我们都没有办法真的从环境里面得到非常明确的 reward。举例来说,如果是棋类游戏或者是电玩,你有非常明确的 reward。但是其实多数的任务,都是没有 reward 的。以 chat-bot 为例,机器跟人聊天,聊得怎么样算是好,聊得怎么样算是不好,你无法给出明确的 reward。所以很多 task 是根本就没有办法给出 reward 的。
|
||||
|
||||
虽然没有办法给出 reward,但是收集 expert 的 demonstration 是可以做到的。举例来说,在自动驾驶汽车里面,虽然你没有办法给出自动驾驶汽车的 reward,但你可以收集很多人类开车的纪录。在 chat-bot 里面,你可能没有办法定义什么叫做好的对话,什么叫做不好的对话。但是收集很多人的对话当作范例,这一件事情也是可行的。所以 imitation learning 的使用性非常高。假设你不知道该怎么定义 reward,你就可以收集到 expert 的 demonstration,你可以收集到一些范例的话,你可以收集到一些很厉害的 agent,比如说人跟环境实际上的互动的话,那你就可以考虑 imitation learning 这个技术。在 imitation learning 里面,我们介绍两个方法。第一个叫做 `Behavior Cloning`,第二个叫做 `Inverse Reinforcement Learning` 或者又叫做 `Inverse Optimal Control`。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user