fix some typos
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# 表格型方法
|
||||
# Tabular Methods
|
||||
|
||||
这节课我们通过最简单的`表格型的方法(tabular methods)`来讲解如何使用 value-based 方法去求解强化学习。
|
||||
|
||||
@@ -34,7 +34,10 @@ MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习
|
||||

|
||||
因为现实世界中人类第一次遇到熊之前,我们根本不知道能不能跑得过熊,所以刚刚那个 10%、90% 的概率也就是虚构出来的概率。熊到底在什么时候会往什么方向去转变的话,我们经常是不知道的。我们是处在一个未知的环境里的,也就是这一系列的决策的 P 函数和 R 函数是未知的,这就是 model-based 跟 model-free 的一个最大的区别。强化学习就是可以用来解决用完全未知的和随机的环境。
|
||||
|
||||
强化学习要像人类一样去学习,人类学习的话就是一条路一条路地去尝试一下,先走一条路,看看结果到底是什么。多试几次,只要能活命的。我们可以慢慢地了解哪个状态会更好,我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,用 Q 函数来表示这个状态-动作值。
|
||||
强化学习要像人类一样去学习,人类学习的话就是一条路一条路地去尝试一下,先走一条路,看看结果到底是什么。多试几次,只要能活命的。我们可以慢慢地了解哪个状态会更好,
|
||||
|
||||
* 我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。
|
||||
* 然后用 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,用 Q 函数来表示这个状态-动作值。
|
||||
|
||||
## Q-table
|
||||
|
||||
@@ -85,9 +88,14 @@ $$
|
||||
这里的计算是我们选择了一条路,计算出这条路径上每一个状态动作的价值。我们可以看一下右下角这个图,如果说我走的不是红色的路,而是蓝色的路,那我算出来的 Q 值可能是这样。那我们就知道,当小乌龟在 -12 这个点的时候,往右边走是 -11,往上走是 -15,它自然就知道往右走的价值更大,小乌龟就会往右走。
|
||||
|
||||

|
||||
类似于上图,最后我们要求解的就是一张 Q 表格,它的行数是所有的状态数量,一般可以用坐标来表示表示格子的状态,也可以用 1、2、3、4、5、6、7 来表示不同的位置。Q 表格的列表示上下左右四个动作。最开始这张 Q 表格会全部初始化为零,然后 agent 会不断地去和环境交互得到不同的轨迹,当交互的次数足够多的时候,我们就可以估算出每一个状态下,每个行动的平均总收益去更新这个 Q 表格。怎么去更新 Q 表格就是接下来要引入的强化概念。
|
||||
类似于上图,最后我们要求解的就是一张 Q 表格,
|
||||
|
||||
`强化`就是我们可以用下一个状态的价值来更新当前状态的价值,其实就是强化学习里面有一个 bootstrap 的概念。在强化学习里面,你可以每走一步更新一下 Q 表格,然后用下一个状态的 Q 值来更新这个状态的 Q 值,这种单步更新的方法叫做`时序差分`。
|
||||
* 它的行数是所有的状态数量,一般可以用坐标来表示表示格子的状态,也可以用 1、2、3、4、5、6、7 来表示不同的位置。
|
||||
* Q 表格的列表示上下左右四个动作。
|
||||
|
||||
最开始这张 Q 表格会全部初始化为零,然后 agent 会不断地去和环境交互得到不同的轨迹,当交互的次数足够多的时候,我们就可以估算出每一个状态下,每个行动的平均总收益去更新这个 Q 表格。怎么去更新 Q 表格就是接下来要引入的强化概念。
|
||||
|
||||
**`强化`就是我们可以用下一个状态的价值来更新当前状态的价值,其实就是强化学习里面 bootstrapping 的概念。**在强化学习里面,你可以每走一步更新一下 Q 表格,然后用下一个状态的 Q 值来更新这个状态的 Q 值,这种单步更新的方法叫做`时序差分`。
|
||||
|
||||
## Temporal Difference
|
||||
|
||||
@@ -103,7 +111,7 @@ $$
|
||||
|
||||

|
||||
|
||||
为了让大家更加直观感受下一个状态影响上一个状态,我们再次推荐这个网站:[Temporal Difference Learning Gridworld Demo](https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html)。
|
||||
**为了让大家更加直观感受下一个状态影响上一个状态**,我们再次推荐这个网站:[Temporal Difference Learning Gridworld Demo](https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html)。
|
||||
|
||||

|
||||
|
||||
@@ -139,40 +147,79 @@ $Q(S_t,A_t)$ 就是要逼近这个目标值,我们用软更新的方式来逼
|
||||
|
||||
## Sarsa: On-policy TD Control
|
||||
|
||||
我们直接看这个框框里面的更新公式, 和之前的公式是一模一样的。$S'$ 就是 $S_{t+1}$ 。我们就是拿下一步的 Q 值来更新这一步的 Q 值,不断地强化每一个 Q。
|
||||

|
||||
|
||||
我们直接看这个框框里面的更新公式, 和之前的公式是一模一样的。$S'$ 就是 $S_{t+1}$ 。我们就是拿下一步的 Q 值 $Q(S',A')$ 来更新这一步的 Q 值 $Q(S,A)$,不断地强化每一个 Q。
|
||||
|
||||
## Q-learning: Off-policy TD Control
|
||||
|
||||

|
||||
|
||||
Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略。它直接拿下一步会执行的 action 来去优化 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,会尽可能的离悬崖远一点。这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。
|
||||
Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略,它直接拿下一步会执行的 action 来去优化 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,会尽可能的离悬崖远一点。这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。
|
||||
|
||||
而 off-policy 在学习的过程中,有两种不同的策略。第一个策略是我们希望学到一个最佳的目标策略,另外一个策略是探索环境的策略,它可以大胆地去探索到所有可能的轨迹,然后喂给这个目标策略去学习。而且喂给目标策略的数据中并不需要 $a_{t+1}$ ,而 Sarsa 是有 $a_{t+1}$ 的。比如目标策略优化的时候,Q-learning 才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。
|
||||
而 off-policy 在学习的过程中,有两种不同的策略:
|
||||
|
||||
* 探索环境的策略,我们叫做 `behavior policy(行为策略)`,它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验,然后把这些经验交给目标策略去学习。
|
||||
* `Target policy(目标策略)`就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,不需要去和环境交互。
|
||||
* 第一个策略是我们需要去学习的策略,即`target policy(目标策略)`,一般用 $\pi$ 来表示,Target policy 就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,不需要去和环境交互。
|
||||
* 另外一个策略是探索环境的策略,即`behavior policy(行为策略)`,一般用 $\mu$ 来表示。$\mu$ 可以大胆地去探索到所有可能的轨迹,采集轨迹,采集数据,然后把采集到的数据喂给 target policy 去学习。而且喂给目标策略的数据中并不需要 $A_{t+1}$ ,而 Sarsa 是要有 $A_{t+1}$ 的。Behavior policy 像是一个战士,可以在环境里面探索所有的动作、轨迹和经验,然后把这些经验交给目标策略去学习。比如目标策略优化的时候,Q-learning 才不管你下一步去往哪里探索,会不会掉进悬崖,我就只选我收益最大一个最优的策略。
|
||||
|
||||

|
||||
|
||||
再举个例子。比如环境是一个波涛汹涌的大海,但 learning policy 太胆小了,没法直接跟环境去学习,所以我们有了 exploratory policy,exploratory policy 是一个不畏风浪的海盗,他非常激进,可以在环境中探索。他有很多经验,可以把这些经验写成稿子,然后喂给这个 learning policy。Learning policy 可以通过这个稿子来进行学习。
|
||||
|
||||
在 off-policy learning 的过程中,我们这些轨迹都是 behavior policy 跟环境交互产生的,产生这些轨迹后,我们使用这些轨迹来更新 target policy $\pi$。
|
||||
|
||||
**off-learning policy 有很多好处:**
|
||||
|
||||
* 我们可以利用 exploratory policy 来学到一个最佳的策略,学习效率高;
|
||||
* 可以让我们学习其他 agent 的行为,模仿学习,学习人或者其他 agent 产生的轨迹;
|
||||
* 重用老的策略产生的轨迹。探索过程需要很多计算资源,这样的话,可以节省资源。
|
||||
|
||||

|
||||
|
||||
Q-learning 的算法有两种 policy:behavior policy 和 target policy。
|
||||
|
||||
Target policy $\pi$ 直接在 Q-table 上取 greedy,就取它下一步能得到的所有状态,如下式所示:
|
||||
$$
|
||||
\pi\left(S_{t+1}\right)=\underset{a^{\prime}}{\arg \max}~ Q\left(S_{t+1}, a^{\prime}\right)
|
||||
$$
|
||||
Behavior policy $\mu$ 可以是一个随机的 policy,但我们采取 $\varepsilon\text{-greedy}$,让 behavior policy 不至于是完全随机的,它是基于 Q-table 逐渐改进的。
|
||||
|
||||
> $\varepsilon\text{-greedy}$ 的意思是说,我们有 $1-\varepsilon$ 的概率会按照 Q-function 来决定 action,通常 $\varepsilon$ 就设一个很小的值, $1-\varepsilon$ 可能是 90%,也就是 90% 的概率会按照 Q-function 来决定 action,但是你有 10% 的机率是随机的。通常在实现上 $\varepsilon$ 会随着时间递减。在最开始的时候。因为还不知道那个 action 是比较好的,所以你会花比较大的力气在做 exploration。接下来随着 training 的次数越来越多。已经比较确定说哪一个 Q 是比较好的。你就会减少你的 exploration,你会把 $\varepsilon$ 的值变小,主要根据 Q-function 来决定你的 action,比较少做 random,这是 $\varepsilon\text{-greedy}$。
|
||||
|
||||
我们可以构造 Q-learning target,Q-learning 的 next action 都是通过 arg max 操作来选出来的,于是我们可以代入 arg max 操作,可以得到下式:
|
||||
$$
|
||||
\begin{aligned}
|
||||
R_{t+1}+\gamma Q\left(S_{t+1}, A^{\prime}\right) &=R_{t+1}+\gamma Q\left(S_{t+1},\arg \max ~Q\left(S_{t+1}, a^{\prime}\right)\right) \\
|
||||
&=R_{t+1}+\gamma \max _{a^{\prime}} Q\left(S_{t+1}, a^{\prime}\right)
|
||||
\end{aligned}
|
||||
$$
|
||||
接着我们可以把 Q-learning update 写成 incremental learning 的形式,TD target 就变成 max 的值,即
|
||||
$$
|
||||
Q\left(S_{t}, A_{t}\right) \leftarrow Q\left(S_{t}, A_{t}\right)+\alpha\left[R_{t+1}+\gamma \max _{a} Q\left(S_{t+1}, a\right)-Q\left(S_{t}, A_{t}\right)\right]
|
||||
$$
|
||||

|
||||
|
||||
**我们通过对比的方式来去理解 `Q-learning`。Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-policy 的时序差分学习方法。**
|
||||
**我们再通过对比的方式来进一步理解 `Q-learning`。Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-policy 的时序差分学习方法。**
|
||||
|
||||
* Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action。这个 action 有可能是 $\varepsilon$-greedy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实际执行的那个动作。
|
||||
|
||||
* 但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a)$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。Q-learning 默认的 next action 不是通过 behavior policy 来选取的,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入 A',即 $a_{t+1}$ 的值。
|
||||
* Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action。这个 action 有可能是 $\varepsilon$-greedy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作,但这是它实际执行的那个动作。
|
||||
* 但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a)$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。
|
||||
* Q-learning 默认的 next action 不是通过 behavior policy 来选取的,Q-learning 直接看 Q-table,取它的 max 的这个值,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入 A',即 $A_{t+1}$ 的值。
|
||||
|
||||
> 事实上,Q-learning 算法被提出的时间更早,Sarsa 算法是 Q-learning 算法的改进。
|
||||
|
||||
|
||||

|
||||
|
||||
Sarsa 和 Q-learning 的更新公式都是一样的,区别只在 target 计算的这一部分,
|
||||
**Sarsa 和 Q-learning 的更新公式都是一样的,区别只在 target 计算的这一部分,**
|
||||
|
||||
* Sarsa 是 $R_{t+1}+\gamma Q(S_{t+1}, A_{t+1})$ ;
|
||||
* Q-learning 是 $R_{t+1}+\gamma \underset{a}{\max} Q\left(S_{t+1}, a\right)$ 。
|
||||
|
||||
Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S_{t+1},A_{t+1})$ 去更新原本的 Q 值 $Q(S_t,A_t)$。 但是 Q-learning 并不需要知道我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。Q-learning 知道实际上 behavior policy 可能会有 10% 的概率去选择别的动作,但 Q-learning 并不担心受到探索的影响,它默认了就按照最优的策略来去优化目标策略,所以它可以更大胆地去寻找最优的路径,它会表现得比 Sarsa 大胆非常多。
|
||||
Sarsa 是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S_{t+1},A_{t+1})$ 去更新原本的 Q 值 $Q(S_t,A_t)$。
|
||||
|
||||
对 Q-learning 进行逐步地拆解的话,跟 Sarsa 唯一一点不一样就是并不需要提前知道 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-learning 在 learn 之前它也不需要去拿到 next action $A'$,它只需要前面四个 $ (S,A,R,S')$ 也就可以了,这一点就是跟 Sarsa 有一个很明显的区别。
|
||||
但是 Q-learning 并不需要知道我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。Q-learning 知道实际上 behavior policy 可能会有 10% 的概率去选择别的动作,但 Q-learning 并不担心受到探索的影响,它默认了就按照最优的策略来去优化目标策略,所以它可以更大胆地去寻找最优的路径,它会表现得比 Sarsa 大胆非常多。
|
||||
|
||||
对 Q-learning 进行逐步地拆解的话,跟 Sarsa 唯一一点不一样就是并不需要提前知道 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-learning 在 learn 之前它也不需要去拿到 next action $A'$,它只需要前面四个 $ (S,A,R,S')$ ,这跟 Sarsa 很不一样。
|
||||
|
||||
### Q-function Bellman Equation
|
||||
|
||||
@@ -212,8 +259,8 @@ $$
|
||||
|
||||
**总结一下 on-policy 和 off-policy 的区别。**
|
||||
|
||||
* Sarsa 是一个典型的 on-policy 策略,它只用一个 $\pi$ 。为了兼顾探索和利用,所以它训练的时候会显得有点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点,也还是在安全区域内,不至于跳进悬崖。
|
||||
* Q-learning 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆地用 behavior policy 去探索得到的经验轨迹来去优化目标策略,从而更有可能去探索到最优的策略。
|
||||
* Sarsa 是一个典型的 on-policy 策略,它只用了一个 policy $\pi$ 。如果 policy 采用 $\varepsilon$-greedy 算法的话,它需要兼顾探索,为了兼顾探索和利用,它训练的时候会显得有点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点,也还是在安全区域内。此外,因为采用的是 $\varepsilon$-greedy 算法,策略会不断改变($\varepsilon$ 会变小),所以策略不稳定。
|
||||
* Q-learning 是一个典型的 off-policy 的策略,它有两种策略:target policy 和 behavior policy。它分离了目标策略跟行为策略。Q-learning 就可以大胆地用 behavior policy 去探索得到的经验轨迹来去优化目标策略,从而更有可能去探索到最优的策略。Behavior policy 可以采用 $\varepsilon$-greedy 算法,但 target policy 采用的是 greedy 算法,直接根据 behavior policy 采集到的数据来采用最优策略,所以 Q-learning 不需要兼顾探索。
|
||||
* 比较 Q-learning 和 Sarsa 的更新公式可以发现,Sarsa 并没有选取最大值的 max 操作。
|
||||
* 因此,Q-learning 是一个非常激进的算法,希望每一步都获得最大的利益;
|
||||
* 而 Sarsa 则相对非常保守,会选择一条相对安全的迭代路线。
|
||||
@@ -227,9 +274,11 @@ $$
|
||||
* [Reinforcement Learning: An Introduction (second edition)](https://book.douban.com/subject/30323890/)
|
||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||
* [神经网络与深度学习](https://nndl.github.io/)
|
||||
* [Intro to Reinforcement Learning (强化学习纲要)](https://github.com/zhoubolei/introRL)
|
||||
* [机器学习](https://book.douban.com/subject/26708119//)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
docs/chapter3/img/Q-learning.png
Normal file
BIN
docs/chapter3/img/Q-learning.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 355 KiB |
BIN
docs/chapter3/img/off_policy_learning.png
Normal file
BIN
docs/chapter3/img/off_policy_learning.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 588 KiB |
@@ -300,7 +300,6 @@ REINFORCE 的伪代码主要看最后四行,先产生一个 episode 的数据
|
||||
|
||||
* [Intro to Reinforcement Learning (强化学习纲要)](https://github.com/zhoubolei/introRL)
|
||||
* [神经网络与深度学习](https://nndl.github.io/)
|
||||
|
||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||
|
||||
|
||||
|
||||
@@ -268,7 +268,7 @@ $$
|
||||
|
||||
## Exploration
|
||||
|
||||
第二个 tip 是`Exploration`。当我们使用 Q-function 的时候,policy 完全 depend on Q-function。给定某一个 state,你就穷举所有的 a, 看哪个 a 可以让 Q value 最大,它就是采取的action。那其实这个跟 policy gradient 不一样,在做 policy gradient 的时候,output 其实是 stochastic 的。我们 output 一个action 的distribution,根据这个action 的distribution 去做sample, 所以在policy gradient 里面,你每次采取的action 是不一样的,是有随机性的。那像这种 Q-function, 如果你采取的action 总是固定的,会有什么问题呢?你会遇到的问题就是这不是一个好的收集 data 的方式。因为假设我们今天真的要估某一个state,你可以采取 action $a_{1}$, $a_{2}$, $a_{3}$。你要估测在某一个state 采取某一个action 会得到的Q value,你一定要在那一个 state 采取过那一个action,才估得出它的value。如果你没有在那个state 采取过那个action,你其实估不出那个value 的。当然如果是用 deep 的network,就你的 Q-function 其实是一个 network,这种情形可能会没有那么严重。但是 in general 而言,假设 Q-function 是一个 table,没有看过的 state-action pair,它就是估不出值来。Network 也是会有一样的问题就是, 只是没有那么严重。所以今天假设你在某一个state,action $a_{1}$, $a_{2}$, $a_{3}$ 你都没有采取过,那你估出来的 $Q(s,a_{1})$, $Q(s,a_{2})$, $Q(s,a_{3})$ 的 value 可能都是一样的,就都是一个初始值,比如说 0,即
|
||||
**第二个 tip 是`Exploration`。**当我们使用 Q-function 的时候,policy 完全 depend on Q-function。给定某一个 state,你就穷举所有的 a, 看哪个 a 可以让 Q value 最大,它就是采取的 action。那其实这个跟 policy gradient 不一样,在做 policy gradient 的时候,output 其实是 stochastic 的。我们 output 一个 action 的 distribution,根据这个 action 的distribution 去做sample, 所以在 policy gradient 里面,你每次采取的 action 是不一样的,是有随机性的。那像这种 Q-function, 如果你采取的 action 总是固定的,会有什么问题呢?你会遇到的问题就是这不是一个好的收集 data 的方式。因为假设我们今天真的要估某一个 state,你可以采取 action $a_{1}$, $a_{2}$, $a_{3}$。你要估测在某一个state 采取某一个 action 会得到的 Q value,你一定要在那一个 state 采取过那一个 action,才估得出它的 value。如果你没有在那个 state 采取过那个action,你其实估不出那个 value 的。当然如果是用 deep 的network,就你的 Q-function 其实是一个 network,这种情形可能会没有那么严重。但是 in general 而言,假设 Q-function 是一个 table,没有看过的 state-action pair,它就是估不出值来。Network 也是会有一样的问题就是, 只是没有那么严重。所以今天假设你在某一个 state,action $a_{1}$, $a_{2}$, $a_{3}$ 你都没有采取过,那你估出来的 $Q(s,a_{1})$, $Q(s,a_{2})$, $Q(s,a_{3})$ 的 value 可能都是一样的,就都是一个初始值,比如说 0,即
|
||||
|
||||
$$
|
||||
\begin{array}{l}
|
||||
@@ -278,23 +278,25 @@ Q(s, a_3)=0
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
但是假设你在state s,你 sample 过某一个action $a_{2}$ ,它得到的值是 positive 的 reward。那 $Q(s, a_2)$ 就会比其他的action 都要好。在采取action 的时候, 就看说谁的Q value 最大就采取谁,所以之后你永远都只会 sample 到 $a_{2}$,其他的action 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
|
||||
但是假设你在 state s,你 sample 过某一个 action $a_{2}$ ,它得到的值是 positive 的 reward。那 $Q(s, a_2)$ 就会比其他的action 都要好。在采取 action 的时候, 就看说谁的 Q value 最大就采取谁,所以之后你永远都只会 sample 到 $a_{2}$,其他的 action 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
|
||||
|
||||
如果你没有好的 exploration 的话, 你在training 的时候就会遇到这种问题。举一个实际的例子, 假设你今天是用 DQN 来玩比如说`slither.io`。在玩`slither.io` 你会有一个蛇,然后它在环境里面就走来走去, 然后就吃到星星,它就加分。假设这个游戏一开始,它采取往上走,然后就吃到那个星星,它就得到分数,它就知道说往上走是positive。接下来它就再也不会采取往上走以外的action 了,所以接下来就会变成每次游戏一开始,它就往上冲,然后就死掉,再也做不了别的事。所以今天需要有exploration 的机制,需要让 machine 知道说,虽然根据之前sample 的结果,$a_2$ 好像是不错的,但你至少偶尔也试一下$a_{1}$ 跟$a_{3}$,搞不好他们更好也说不定。
|
||||
如果你没有好的 exploration 的话, 你在training 的时候就会遇到这种问题。举一个实际的例子, 假设你今天是用 DQN 来玩比如说`slither.io`。在玩`slither.io` 你会有一个蛇,然后它在环境里面就走来走去, 然后就吃到星星,它就加分。假设这个游戏一开始,它采取往上走,然后就吃到那个星星,它就得到分数,它就知道说往上走是 positive。接下来它就再也不会采取往上走以外的 action 了,所以接下来就会变成每次游戏一开始,它就往上冲,然后就死掉,再也做不了别的事。所以今天需要有 exploration 的机制,需要让 machine 知道说,虽然根据之前 sample 的结果,$a_2$ 好像是不错的,但你至少偶尔也试一下$a_{1}$ 跟 $a_{3}$,搞不好他们更好也说不定。
|
||||
|
||||
这个问题其实就是`探索-利用窘境(Exploration-Exploitation dilemma)`问题。
|
||||
|
||||
有两个方法解这个问题,一个是`Epsilon Greedy`。Epsilon Greedy 的意思是说,我们有$1-\varepsilon$ 的机率,通常$\varepsilon$ 就设一个很小的值, $1-\varepsilon$ 可能是90%,也就是90% 的机率,完全按照Q-function 来决定action。但是你有10% 的机率是随机的。通常在实现上 $\varepsilon$ 会随着时间递减。也就是在最开始的时候。因为还不知道那个action 是比较好的,所以你会花比较大的力气在做 exploration。接下来随着training 的次数越来越多。已经比较确定说哪一个Q 是比较好的。你就会减少你的exploration,你会把 $\varepsilon$ 的值变小,主要根据Q-function 来决定你的action,比较少做random,这是Epsilon Greedy。
|
||||
有两个方法解这个问题,一个是 `Epsilon Greedy`。Epsilon Greedy($\varepsilon\text{-greedy}$) 的意思是说,我们有 $1-\varepsilon$ 的概率会按照 Q-function 来决定 action,通常 $\varepsilon$ 就设一个很小的值, $1-\varepsilon$ 可能是 90%,也就是 90% 的概率会按照 Q-function 来决定 action,但是你有 10% 的机率是随机的。通常在实现上 $\varepsilon$ 会随着时间递减。在最开始的时候。因为还不知道那个 action 是比较好的,所以你会花比较大的力气在做 exploration。接下来随着 training 的次数越来越多。已经比较确定说哪一个 Q 是比较好的。你就会减少你的 exploration,你会把 $\varepsilon$ 的值变小,主要根据 Q-function 来决定你的 action,比较少做 random,这是 Epsilon Greedy。
|
||||
|
||||
还有一个方法叫做 `Boltzmann Exploration`,这个方法就比较像是 policy gradient。在 policy gradient 里面我们说network 的output 是一个 expected action space 上面的一个的 probability distribution。再根据 probability distribution 去做 sample。那其实你也可以根据 Q value 去定一个 probability distribution,假设某一个 action 的 Q value 越大,代表它越好,我们采取这个 action 的机率就越高。但是某一个 action 的 Q value 小,不代表我们不能try。所以我们有时候也要 try 那些 Q value 比较差的 action,怎么做呢?
|
||||
还有一个方法叫做 `Boltzmann Exploration`,这个方法就比较像是 policy gradient。在 policy gradient 里面我们说network 的output 是一个 expected action space 上面的一个的 probability distribution。再根据 probability distribution 去做 sample。那其实你也可以根据 Q value 去定一个 probability distribution,假设某一个 action 的 Q value 越大,代表它越好,我们采取这个 action 的机率就越高。但是某一个 action 的 Q value 小,不代表我们不能try。
|
||||
|
||||
因为 Q value 是有正有负的,所以可以它弄成一个概率,你先取 exponential,再做 normalize。然后把 $\exp(Q(s,a))$ 做 normalize 的这个概率当作是你在决定 action 的时候 sample 的概率。在实现上,Q 是一个 network,所以你有点难知道, 在一开始的时候 network 的 output 到底会长怎么样子。假设你一开始没有任何的 training data,你的参数是随机的,那给定某一个 state s,不同的 a output 的值,可能就是差不多的,所以一开始 $Q(s,a)$ 应该会倾向于是 uniform。也就是在一开始的时候,你这 个 probability distribution 算出来,它可能是比较 uniform 的。
|
||||
Q: 我们有时候也要 try 那些 Q value 比较差的 action,怎么做呢?
|
||||
|
||||
A: 因为 Q value 是有正有负的,所以可以它弄成一个概率,你先取 exponential,再做 normalize。然后把 $\exp(Q(s,a))$ 做 normalize 的这个概率当作是你在决定 action 的时候 sample 的概率。在实现上,Q 是一个 network,所以你有点难知道, 在一开始的时候 network 的 output 到底会长怎么样子。假设你一开始没有任何的 training data,你的参数是随机的,那给定某一个 state s,不同的 a output 的值,可能就是差不多的,所以一开始 $Q(s,a)$ 应该会倾向于是 uniform。也就是在一开始的时候,你这 个 probability distribution 算出来,它可能是比较 uniform 的。
|
||||
|
||||
## Experience Replay
|
||||
|
||||

|
||||
|
||||
第三个tip是 `Experience Replay(经验回放)`。 Experience Replay 会构建一个 `Replay Buffer`,Replay Buffer 又被称为 `Replay Memory`。Replay Buffer 是说现在会有某一个 policy $\pi$ 去跟环境做互动,然后它会去收集 data。我们会把所有的 data 放到一个buffer 里面,buffer 里面就存了很多data。比如说 buffer 是 5 万,这样它里面可以存 5 万笔资料,每一笔资料就是记得说,我们之前在某一个 state $s_t$,采取某一个action $a_t$,得到了 reward $r_t$。然后跳到 state $s_{t+1}$。那你用 $\pi$ 去跟环境互动很多次,把收集到的资料都放到这个 replay buffer 里面。
|
||||
**第三个 tip 是 `Experience Replay(经验回放)`。** Experience Replay 会构建一个 `Replay Buffer`,Replay Buffer 又被称为 `Replay Memory`。Replay Buffer 是说现在会有某一个 policy $\pi$ 去跟环境做互动,然后它会去收集 data。我们会把所有的 data 放到一个 buffer 里面,buffer 里面就存了很多 data。比如说 buffer 是 5 万,这样它里面可以存 5 万笔资料,每一笔资料就是记得说,我们之前在某一个 state $s_t$,采取某一个action $a_t$,得到了 reward $r_t$。然后跳到 state $s_{t+1}$。那你用 $\pi$ 去跟环境互动很多次,把收集到的资料都放到这个 replay buffer 里面。
|
||||
|
||||
这边要注意是 replay buffer 里面的 experience 可能是来自于不同的 policy,你每次拿 $\pi$ 去跟环境互动的时候,你可能只互动 10000 次,然后接下来你就更新你的 $\pi$ 了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的 policy。Buffer 只有在它装满的时候,才会把旧的资料丢掉。所以这个 buffer 里面它其实装了很多不同的 policy 的 experiences。
|
||||
|
||||
@@ -312,7 +314,7 @@ $$
|
||||
|
||||
Q:我们明明是要观察 $\pi$ 的 value,里面混杂了一些不是 $\pi$ 的 experience ,这有没有关系?
|
||||
|
||||
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的$\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去sample 一个trajectory,我们只sample 了一笔experience,所以跟是不是 off-policy 这件事是没有关系的。就算是off-policy,就算是这些 experience 不是来自于 $\pi$,我们其实还是可以拿这些 experience 来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 Experience Replay 在理论上也是没有问题的。
|
||||
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的 $\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去 sample 一个trajectory,我们只 sample 了一笔 experience,所以跟是不是 off-policy 这件事是没有关系的。就算是 off-policy,就算是这些 experience 不是来自于 $\pi$,我们其实还是可以拿这些 experience 来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 Experience Replay 在理论上也是没有问题的。
|
||||
|
||||
## DQN
|
||||
|
||||
|
||||
Reference in New Issue
Block a user