fix ch4
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
* 环境就是对手;
|
||||
* 奖励函数就是按照围棋的规则, 赢就是得一分,输就是负一分。
|
||||
|
||||
在强化学习里面,环境跟奖励函数不是你可以控制的,环境跟奖励函数是在开始学习之前,就已经事先给定的。你唯一能做的事情是调整演员里面的策略(policy),使得演员可以得到最大的奖励。演员里面会有一个策略, 这个策略决定了演员的行为。策略就是给一个外界的输入,然后它会输出演员现在应该要执行的行为。
|
||||
在强化学习里面,环境跟奖励函数不是你可以控制的,环境跟奖励函数是在开始学习之前,就已经事先给定的。你唯一能做的事情是调整演员里面的策略(policy),使得演员可以得到最大的奖励。演员里面会有一个策略,这个策略决定了演员的行为。给定一个外界的输入,策略会输出演员现在应该要执行的行为。
|
||||
|
||||

|
||||
|
||||
@@ -68,10 +68,10 @@ $$
|
||||
|
||||
这件事情可能是概率,也可能不是概率,这个取决于环境,就是主机它内部设定是怎样。看今天这个主机在决定,要输出什么样的游戏画面的时候,有没有概率。因为如果没有概率的话,这个游戏的每次的行为都一样,你只要找到一条路径就可以过关了,这样感觉是蛮无聊的 。所以游戏里面通常还是有一些概率的,你做同样的行为,给同样的前一个画面, 下次产生的画面不见得是一样的。过程就反复继续下去,你就可以计算一个轨迹 $s_1$,$a_1$, $s_2$ , $a_2$ 出现的概率有多大。
|
||||
|
||||
**这个概率取决于两部分**,
|
||||
**这个概率取决于两部分:环境的行为和 agent 的行为**,
|
||||
|
||||
* 一部分是 `环境的行为`, 环境的函数内部的参数或内部的规则长什么样子。 $p(s_{t+1}|s_t,a_t)$这一项代表的是环境,环境这一项通常你是无法控制它的,因为那个是人家写好的,你不能控制它。
|
||||
* 另一部分是 `agent 的行为`。你能控制的是 $p_\theta(a_t|s_t)$。给定一个 $s_t$,演员要采取什么样的 $a_t$ 会取决于演员的参数 $\theta$, 所以这部分是演员可以自己控制的。随着演员的行为不同,每个同样的轨迹, 它就会有不同的出现的概率。
|
||||
* `环境的行为` 。环境的函数内部的参数或内部的规则长什么样子。 $p(s_{t+1}|s_t,a_t)$这一项代表的是环境,环境这一项通常你是无法控制它的,因为那个是人家写好的,你不能控制它。
|
||||
* `agent 的行为`。你能控制的是 $p_\theta(a_t|s_t)$。给定一个 $s_t$,演员要采取什么样的 $a_t$ 会取决于演员的参数 $\theta$, 所以这部分是演员可以自己控制的。随着演员的行为不同,每个同样的轨迹, 它就会有不同的出现的概率。
|
||||
|
||||
|
||||

|
||||
@@ -202,6 +202,7 @@ $$
|
||||
**第一个 tip 是 add 一个 baseline。** 如果给定状态 s 采取动作 a 会给你整场游戏正的奖励,就要增加它的概率。如果状态 s 执行动作 a,整场游戏得到负的奖励,就要减少这一项的概率。
|
||||
|
||||
但在很多游戏里面,奖励总是正的,就是说最低都是 0。比如说打乒乓球游戏, 你的分数就是介于 0 到 21 分之间,所以 R 总是正的。假设你直接套用这个式子, 在训练的时候告诉模型说,不管是什么动作你都应该要把它的概率提升。 在理想上,这么做并不一定会有问题。因为虽然说 R 总是正的,但它正的量总是有大有小,你在玩乒乓球那个游戏里面,得到的奖励总是正的,但它是介于 0~21分之间,有时候你采取某些动作可能是得到 0 分,采取某些动作可能是得到 20 分。
|
||||
|
||||

|
||||
|
||||
假设你在某一个状态有 3 个动作 a/b/c可以执行。根据下式,
|
||||
@@ -261,7 +262,8 @@ $$
|
||||
* $\gamma = 0$ : 只关心即时奖励;
|
||||
* $\gamma = 1$ : 未来奖励等同于即时奖励。
|
||||
|
||||
如果时间点 $t'$ 越大,它前面就乘上越多次的 $\gamma$,就代表说现在在某一个状态 $s_t$, 执行某一个动作 $a_t$ 的时候,它真正的分数是在执行这个动作之后所有奖励的总和,而且你还要乘上 $\gamma$。
|
||||
|
||||
如果时间点 $t'$ 越大,它前面就乘上越多次的 $\gamma$,就代表说现在在某一个状态 $s_t$, 执行某一个动作 $a_t$ 的时候,它真正的分数是在执行这个动作之后所有奖励的总和,而且你还要乘上 $\gamma$。
|
||||
|
||||
举一个例子, 你就想成说,这是游戏的第 1、2、3、4 回合,假设你在游戏的第二回合的某一个 $s_t$ 执行 $a_t$ 得到 +1 分,在 $s_{t+1}$ 执行 $a_{t+1}$ 得到 +3 分,在 $s_{t+2}$ 执行 $a_{t+2}$ 得到 -5 分,然后第二回合结束。$a_t$ 的分数应该是:
|
||||
$$
|
||||
@@ -333,7 +335,7 @@ REINFORCE 的伪代码主要看最后四行,先产生一个回合的数据,
|
||||
|
||||

|
||||
|
||||
实际上我们在计算这个 loss 的时候,我们要拿到那个 $\ln \pi(A_t|S_t,\theta)$。我就拿实际执行的这个动作,先取个 one-hot 向量,然后再拿到神经网络预测的动作概率,这两个一相乘,我就可以拿到算法里面的那个 $\ln \pi(A_t|S_t,\theta)$。这个就是我们要构造的 loss。因为我们会拿到整个回合的所有的轨迹,所以我们可以对这一条整条轨迹里面的每个动作 都去计算一个 loss。把所有的 loss 加起来之后,我们再扔给 adam 的优化器去自动更新参数就好了。
|
||||
实际上我们在计算这个 loss 的时候,我们要拿到那个 $\ln \pi(A_t|S_t,\theta)$。我就拿实际执行的这个动作,先取个 one-hot 向量,然后再拿到神经网络预测的动作概率,这两个一相乘,我就可以拿到算法里面的那个 $\ln \pi(A_t|S_t,\theta)$。这个就是我们要构造的 loss。因为我们会拿到整个回合的所有的轨迹,所以我们可以对这一条整条轨迹里面的每个动作都去计算一个 loss。把所有的 loss 加起来之后,我们再扔给 adam 的优化器去自动更新参数就好了。
|
||||
|
||||

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