fix ch5 typos

This commit is contained in:
qiwang067
2021-01-10 19:54:10 +08:00
parent e594e3b378
commit 3fd61e2991

View File

@@ -39,7 +39,7 @@ $$
$$
\int f(x) p(x) d x=\int f(x) \frac{p(x)}{q(x)} q(x) d x=E_{x \sim q}[f(x){\frac{p(x)}{q(x)}}]
$$
我们就可以写成对 q 里面所采样出来的 x 取期望值。我们从 q 里面采样 $x$,然后再去计算 $f(x) \frac{p(x)}{q(x)}$,再去取期望值。所以就算我们不能从 p 里面去采样数据,只要能够从 q 里面去采样数据,然后代入上式,你就可以计算从 p 这个分布采样 $x$ 代入 $f$ 以后所算出来的期望值。
我们就可以写成对 q 里面所采样出来的 $x$ 取期望值。我们从 q 里面采样 $x$,然后再去计算 $f(x) \frac{p(x)}{q(x)}$,再去取期望值。所以就算我们不能从 p 里面去采样数据,只要能够从 q 里面去采样数据,然后代入上式,你就可以计算从 p 这个分布采样 $x$ 代入 $f$ 以后所算出来的期望值。
这边是从 q 做采样,所以从 q 里采样出来的每一笔数据,你需要乘上一个`重要性权重(importance weight)` $\frac{p(x)}{q(x)}$ 来修正这两个分布的差异。$q(x)$ 可以是任何分布,唯一的限制就是 $q(x)$ 的概率是 0 的时候,$p(x)$ 的概率不为 0不然这样会没有定义。假设 $q(x)$ 的概率是 0 的时候,$p(x)$ 的概率也都是 0 的话,那这样 $p(x)$ 除以 $q(x)$是有定义的。所以这个时候你就可以使用重要性采样这个技巧。你就可以从 p 做采样换成从 q 做采样。
@@ -87,22 +87,22 @@ A: 因为现在跟环境做互动是 $\theta'$ 而不是 $\theta$。所以采样
![](img/5.6.png)
实际在做 policy gradient 的时候,我们并不是给整个轨迹 $\tau$ 都一样的分数,而是每一个状态-动作的对会分开来计算。实际上更新 gradient 的时候,我们的式子是长这样子的
实际在做 policy gradient 的时候,我们并不是给整个轨迹 $\tau$ 都一样的分数,而是每一个状态-动作的对(pair)会分开来计算。实际上更新梯度的时候,如下式所示
$$
=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 去采样出 $s_t$ 跟 $a_t$,采样出状态跟动作的对(pair),我们会计算这个状态跟动作对的 advantage 就是它有多好。$A^{\theta}\left(s_{t}, a_{t}\right)$ 就是累积奖励减掉 bias这一项就是估测出来的。它要估测的是在状态$s_t$ 采取动作$a_t$ 是好的,还是不好的。那接下来后面会乘上 $\nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)$,也就是说如果 $A^{\theta}\left(s_{t}, a_{t}\right)$ 是正的,就要增加概率, 如果是负的,就要减少概率。
我们用 $\theta$ 这个 actor 去采样出 $s_t$ 跟 $a_t$,采样出状态跟动作的对,我们会计算这个状态跟动作对的 advantage 就是它有多好。$A^{\theta}\left(s_{t}, a_{t}\right)$ 就是累积奖励减掉 bias这一项就是估测出来的。它要估测的是在状态 $s_t$ 采取动作 $a_t$ 是好的,还是不好的。那接下来后面会乘上 $\nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)$,也就是说如果 $A^{\theta}\left(s_{t}, a_{t}\right)$ 是正的,就要增加概率, 如果是负的,就要减少概率。
那现在用了重要性采样的技术把 on-policy 变成 off-policy从 $\theta$ 变成 $\theta'$。所以现在 $s_t$、$a_t$ 是 $\theta'$ ,另外一个 actor 跟环境互动以后所采样到的数据。 但是拿来训练要调整参数是模型 $\theta$。因为 $\theta'$ 跟 $\theta$ 是不同的模型,所以你要做一个修正的项。这项修正的项,就是用重要性采样的技术,把 $s_t$、$a_t$ 用 $\theta$ 采样出来的概率除掉 $s_t$、$a_t$ 用 $\theta'$ 采样出来的概率。
我们通过重要性采样把 on-policy 变成 off-policy从 $\theta$ 变成 $\theta'$。所以现在 $s_t$、$a_t$ 是 $\theta'$ 跟环境互动以后所采样到的数据。 但是拿来训练要调整参数是模型 $\theta$。因为 $\theta'$ 跟 $\theta$ 是不同的模型,所以你要做一个修正的项。这项修正的项,就是用重要性采样的技术,把 $s_t$、$a_t$ 用 $\theta$ 采样出来的概率除掉 $s_t$、$a_t$ 用 $\theta'$ 采样出来的概率。
$$
=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]
=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}(s_t,a_t)$ 有一个上标 $\theta$$\theta$ 代表说这个是 actor $\theta$ 跟环境互动的时候所计算出来的 A。但是实际上从 $\theta$ 换到 $\theta'$ 的时候,$A^{\theta}(s_t,a_t)$ 应该改成 $A^{\theta'}(s_t,a_t)$为什么A 这一项是想要估测说现在在某一个状态采取某一个动作,接下来会得到累积奖励的值减掉 baseline 。你怎么估 A 这一项,你就会看在状态$s_t$,采取动作$a_t$,接下来会得到的奖励的总和,再减掉 baseline。之前是 $\theta$ 在跟环境做互动,所以你观察到的是 $\theta$ 可以得到的奖励。但现在是 $\theta'$ 在跟环境做互动,所以你得到的这个 advantage 其实是根据 $\theta'$ 所估计出来的 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 这一项是想要估测说现在在某一个状态采取某一个动作,接下来会得到累积奖励的值减掉 baseline 。你怎么估 A 这一项,你就会看在状态 $s_t$,采取动作 $a_t$,接下来会得到的奖励的总和,再减掉 baseline。之前是 $\theta$ 在跟环境做互动,所以你观察到的是 $\theta$ 可以得到的奖励。但现在是 $\theta'$ 在跟环境做互动,所以你得到的这个 advantage 其实是根据 $\theta'$ 所估计出来的 advantage。但我们现在先不要管那么多我们就假设这两项可能是差不多的。
接下来,我们可以拆解 $p_{\theta}\left(s_{t}, a_{t}\right)$ 和 $p_{\theta'}\left(s_{t}, a_{t}\right)$,即
接下来,我们可以拆解 $p_{\theta}\left(s_{t}, a_{t}\right)$ 和 $p_{\theta'}\left(s_{t}, a_{t}\right)$,即
$$
\begin{aligned}
p_{\theta}\left(s_{t}, a_{t}\right)&=p_{\theta}\left(a_{t}|s_{t}\right) p_{\theta}(s_t) \\
@@ -115,14 +115,16 @@ $$
$$
然后这边需要做一件事情是,假设模型是 $\theta$ 的时候,你看到 $s_t$ 的概率,跟模型是 $\theta'$ 的时候,你看到 $s_t$ 的概率是差不多的,即 $p_{\theta}(s_t)=p_{\theta'}(s_t)$。因为它们是一样的,所以你可以把它删掉,即
这边需要做一件事情是,假设模型是 $\theta$ 的时候,你看到 $s_t$ 的概率,跟模型是 $\theta'$ 的时候,你看到 $s_t$ 的概率是差不多的,即 $p_{\theta}(s_t)=p_{\theta'}(s_t)$。因为它们是一样的,所以你可以把它删掉,即
$$
=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \tag{1}
$$
为什么可以假设它是差不多的。举例来说,会看到什么状态往往跟你会采取什么样的动作是没有太大的关系的。比如说你玩不同的 Atari 的游戏,其实你看到的游戏画面都是差不多的,所以也许不同的 $\theta$ 对 $s_t$ 是没有影响的。但是有一个更直觉的理由就是这一项到时候真的要你算,你会算吗?因为想想看这项要怎么算,这一项你还要说我有一个参数 $\theta$,然后拿 $\theta$ 去跟环境做互动,算 $s_t$ 出现的概率,这个你根本很难算。尤其是你如果输入是图片的话, 同样的 $s_t$ 根本就不会出现第二次。你根本没有办法估这一项, 所以干脆就无视这个问题。
Q: 为什么可以假设 $p_{\theta}(s_t)$ 和 $p_{\theta'}(s_t)$ 是差不多的?
但是 $p_{\theta}(a_t|s_t)$很好算。你手上有 $\theta$ 这个参数,它就是个网络。你就把$s_t$ 带进去,$s_t$ 就是游戏画面,你把游戏画面带进去,它就会告诉你某一个状态的 $a_t$ 概率是多少。我们其实有个 policy 的网络,把 $s_t$ 带进去,它会告诉我们每一个 $a_t$ 的概率是多少。所以 $\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)}$ 这一项,你只要知道$\theta$ $\theta'$ 的参数就可以算
A: 因为你会看到什么状态往往跟你会采取什么样的动作是没有太大的关系的。比如说你玩不同的 Atari 的游戏,其实你看到的游戏画面都是差不多的,所以也许不同的 $\theta$ 对 $s_t$ 是没有影响的。但更直觉的理由就是 $p_{\theta}(s_t)$ 很难算,想想看这项要怎么算,这一项你还要说我有一个参数 $\theta$,然后拿 $\theta$ 去跟环境做互动,算 $s_t$ 出现的概率,这个你很难算。尤其如果输入是图片的话, 同样的 $s_t$ 根本就不会出现第二次。你根本没有办法估这一项, 所以干脆就无视这个问题
但是 $p_{\theta}(a_t|s_t)$很好算。你手上有 $\theta$ 这个参数,它就是个网络。你就把 $s_t$ 带进去,$s_t$ 就是游戏画面,你把游戏画面带进去,它就会告诉你某一个状态的 $a_t$ 概率是多少。我们有个 policy 的网络,把 $s_t$ 带进去,它会告诉我们每一个 $a_t$ 的概率是多少。所以 $\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)}$ 这一项,你只要知道$\theta$ 和 $\theta'$ 的参数就可以算。
现在我们得到一个新的目标函数。
@@ -131,7 +133,7 @@ J^{\theta^{\prime}}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prim
$$
式(1)是 gradient其实我们可以从 gradient 去反推原来的目标函数。我们可以用如下的公式来反推目标函数:
式(1)是梯度,其实我们可以从梯度去反推原来的目标函数。我们可以用如下的公式来反推目标函数:
$$
\nabla f(x)=f(x) \nabla \log f(x)
@@ -148,11 +150,11 @@ $$
![](img/5.7.png)
我们可以把 on-policy 换成 off-policy但重要性采样有一个问题如果 $p_{\theta}\left(a_{t} | s_{t}\right)$ 跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$ 差太多的话,这两个分布差太多的话,重要性采样的结果就会不好。怎么避免它差太多呢?这个就是 `Proximal Policy Optimization (PPO) ` 在做的事情。
我们可以通过重要性采样把 on-policy 换成 off-policy但重要性采样有一个问题如果 $p_{\theta}\left(a_{t} | s_{t}\right)$ 跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$ 差太多的话,这两个分布差太多的话,重要性采样的结果就会不好。怎么避免它差太多呢?这个就是 `Proximal Policy Optimization (PPO) ` 在做的事情。
PPO 实际上做的事情就是这样,在 off-policy 的方法里要优化的是 $J^{\theta^{\prime}}(\theta)$。但是这个目标函数又牵涉到重要性采样。在做重要性采样的时候,$p_{\theta}\left(a_{t} | s_{t}\right)$ 不能跟 $p_{\theta'}\left(a_{t} | s_{t}\right)$差太多。你做示范的模型不能够跟真正的模型差太多,差太多的话,重要性采样的结果就会不好。我们在训练的时候,多加一个约束(constrain)。这个约束是 $\theta$ 跟 $\theta'$ 输出的动作的 KL 散度(KL divergence),简单来说,这一项的意思就是要衡量说 $\theta$ 跟 $\theta'$ 有多像。
然后我们希望在训练的过程中,学习出来的 $\theta$ 跟 $\theta'$ 越像越好。因为如果 $\theta$ 跟 $\theta'$ 不像的话,最后的结果就会不好。所以在 PPO 里面有两个式子,一方面是优化本来要优化的东西,但再加一个约束。这个约束就好像正则化(regularization) 的项(term) 一样,在做机器学习的时候不是有 L1/L2 的正则化。这一项也很像正则化,这样正则化 做的事情就是希望最后学习出来的 $\theta$ 不要跟 $\theta'$ 太不一样。
然后我们希望在训练的过程中,学习出来的 $\theta$ 跟 $\theta'$ 越像越好。因为如果 $\theta$ 跟 $\theta'$ 不像的话,最后的结果就会不好。所以在 PPO 里面有两个式子,一方面是优化本来要优化的东西,但再加一个约束。这个约束就好像正则化(regularization) 的项(term) 一样,在做机器学习的时候不是有 L1/L2 的正则化。这一项也很像正则化,这样正则化做的事情就是希望最后学习出来的 $\theta$ 不要跟 $\theta'$ 太不一样。
PPO 有一个前身叫做`信任区域策略优化(Trust Region Policy OptimizationTRPO)`TRPO 的式子如下式所示:
@@ -167,11 +169,17 @@ $$
TRPO 是很难处理的,因为它是把 KL 散度约束当做一个额外的约束,没有放目标(objective)里面,所以它很难算。所以不想搬石头砸自己的脚的话, 你就用 PPO 不要用 TRPO。看文献上的结果是PPO 跟 TRPO 可能性能差不多,但 PPO 在实现上比 TRPO 容易的多。
Q: KL 散度 到底指的是什么?
Q: KL 散度到底指的是什么?
A: 这边我是直接把 KL 散度 当做一个函数,输入是 $\theta$ 跟 $\theta'$,但我的意思并不是说把 $\theta$ 或 $\theta'$ 当做一个分布,算这两个分布之间的距离,我不是这个意思。所谓的 $\theta$ 跟 $\theta'$ 的距离并不是参数上的距离,而是 behavior 上的距离。
A:
假设你有一个模型,有一个 actor 它是 $\theta$,你有另外一个 actor 的参数是 $\theta'$ ,所谓参数上的距离就是你算这两组参数有多像。这里讲的不是参数上的距离, 而是它们行为上的距离。就是你先带进去一个状态 s它会对这个动作的空间输出一个分布。假设你有 3 个动作3 个可能的动作就输出 3 个值。那今天所指的距离是行为距离(behavior distance)。也就是说,给定同样的状态的时候,输出动作之间的差距。这两个动作的分布都是一个概率分布。所以就可以计算这两个概率分布的 KL 散度。把不同的状态输出的这两个分布的 KL 散度平均起来才是我这边所指的两个 actor 间的 KL 散度。你可能说怎么不直接算这个 $\theta$ 或 $\theta'$ 之间的距离,甚至不要用 KL 散度算L1 跟 L2 的范数(norm)也可以保证 $\theta$ 跟 $\theta'$ 很接近。在做强化学习的时候,之所以我们考虑的不是参数上的距离,而是动作上的距离,是因为很有可能对 actor 来说,参数的变化跟动作的变化不一定是完全一致的。有时候你参数小小变了一下,它可能输出的行为就差很多。或是参数变很多,但输出的行为可能没什么改变。**所以我们真正在意的是这个 actor 的行为上的差距,而不是它们参数上的差距。**所以在做 PPO 的时候,所谓的 KL 散度并不是参数的距离,而是动作的距离。
这边我是直接把 KL 散度当做一个函数,输入是 $\theta$ 跟 $\theta'$,但我的意思并不是说把 $\theta$ 或 $\theta'$ 当做一个分布,算这两个分布之间的距离。所谓的 $\theta$ 跟 $\theta'$ 的距离并不是参数上的距离,而是行为(behavior)上的距离。
假设你有两个 actor它们的参数分别为 $\theta$ 和 $\theta'$,所谓参数上的距离就是你算这两组参数有多像。这里讲的不是参数上的距离, 而是它们行为上的距离。你先代进去一个状态 s它会对这个动作的空间输出一个分布。假设你有 3 个动作3 个可能的动作就输出 3 个值。今天所指的距离是行为距离(behavior distance),也就是说,给定同样的状态,输出动作之间的差距。这两个动作的分布都是一个概率分布,所以就可以计算这两个概率分布的 KL 散度。把不同的状态输出的这两个分布的 KL 散度平均起来才是我这边所指的两个 actor 间的 KL 散度。
Q: 为什么不直接算 $\theta$ 和 $\theta'$ 之间的距离?算这个距离的话,甚至不要用 KL 散度算L1 跟 L2 的范数(norm)也可以保证 $\theta$ 跟 $\theta'$ 很接近。
A: 在做强化学习的时候,之所以我们考虑的不是参数上的距离,而是动作上的距离,是因为很有可能对 actor 来说,参数的变化跟动作的变化不一定是完全一致的。有时候你参数小小变了一下,它可能输出的行为就差很多。或者是参数变很多,但输出的行为可能没什么改变。**所以我们真正在意的是这个 actor 的行为上的差距,而不是它们参数上的差距。**所以在做 PPO 的时候,所谓的 KL 散度并不是参数的距离,而是动作的距离。
### PPO-Penalty
@@ -187,8 +195,8 @@ A: 这边我是直接把 KL 散度 当做一个函数,输入是 $\theta$ 跟 $
在 PPO 的论文里面还有一个 `adaptive KL divergence`。这边会遇到一个问题就是 $\beta$ 要设多少,它就跟正则化一样。正则化前面也要乘一个权重,所以这个 KL 散度前面也要乘一个权重,但 $\beta$ 要设多少呢?所以有个动态调整 $\beta$ 的方法。
* 在这个方法里面呢,你先设一个 KL 散度,你可以接受的最大值。然后假设你发现说你优化完这个式子以后KL 散度的项太大,那就代表说后面这个惩罚的项没有发挥作用,那就把 $\beta$ 调大。
* 另外你定一个 KL 散度的最小值。如果发现优化完上面这个式子以后KL 散度比最小值还要小,那代表后面这一项的效果太强了,你怕他只弄后面这一项,那 $\theta$ 跟 $\theta^k$ 都一样,这不是你要的,所以你这个时候你叫要减少 $\beta$。
* 在这个方法里面呢,你先设一个你可以接受的 KL 散度的最大值。假设优化完这个式子以后,你发现 KL 散度的项太大,那就代表说后面这个惩罚的项没有发挥作用,那就把 $\beta$ 调大。
* 另外,你设一个 KL 散度的最小值。如果优化完上面这个式子以后,你发现 KL 散度比最小值还要小,那代表后面这一项的效果太强了,你怕他只弄后面这一项,那 $\theta$ 跟 $\theta^k$ 都一样,这不是你要的,所以你要减少 $\beta$。
所以 $\beta$ 是可以动态调整的。这个叫做 `adaptive KL penalty`
@@ -196,7 +204,7 @@ A: 这边我是直接把 KL 散度 当做一个函数,输入是 $\theta$ 跟 $
![](img/5.10.png)
如果你觉得算 KL 散度 很复杂,有一个`PPO2`PPO2 即 `PPO-Clip`。PPO2 要去最大化的目标函数如下式所示,它的式子里面就没有 KL 散度 。
如果你觉得算 KL 散度很复杂,有一个`PPO2`PPO2 即 `PPO-Clip`。PPO2 要去最大化的目标函数如下式所示,它的式子里面就没有 KL 散度 。
$$
\begin{aligned}
J_{P P O 2}^{\theta^{k}}(\theta) \approx \sum_{\left(s_{t}, a_{t}\right)} \min &\left(\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)} A^{\theta^{k}}\left(s_{t}, a_{t}\right),\right.\\
@@ -207,7 +215,7 @@ $$
* Min 这个操作符(operator)做的事情是第一项跟第二项里面选比较小的那个。
* 第二项前面有个 clip 函数clip 函数的意思是说,
* 在括号里面有 3 项,如果第一项小于第二项的话,那就输出 $1-\varepsilon$ 。
* 在括号里面有项,如果第一项小于第二项的话,那就输出 $1-\varepsilon$ 。
* 第一项如果大于第三项的话,那就输出 $1+\varepsilon$。
* $\varepsilon$ 是一个超参数,你要 tune 的,你可以设成 0.1 或 设 0.2 。
@@ -241,7 +249,7 @@ $$
如果 A 小于 0 的话,取最小的以后,就得到红色的这一条线。
![](img/5.14.png)
![](img/5.14.png ':size=500')
虽然这个式子看起来有点复杂,实现起来是蛮简单的,**因为这个式子想要做的事情就是希望 $p_{\theta}(a_{t} | s_{t})$ 跟 $p_{\theta^k}(a_{t} | s_{t})$,也就是你拿来做示范的模型跟你实际上学习的模型,在优化以后不要差距太大。**
**怎么让它做到不要差距太大呢?**