fix ch7 typos
This commit is contained in:
@@ -4,29 +4,43 @@
|
||||
|
||||
接下来要讲的是训练 Q-learning 的一些 tips。第一个 tip 是做 `Double DQN`。为什么要有 Double DQN 呢?因为在实现上,你会发现 Q 值往往是被高估的。上图来自于 Double DQN 的原始 paper,它想要显示的结果就是 Q 值往往是被高估的。
|
||||
|
||||
这边有 4 个不同的小游戏,横轴是训练的时间,红色锯齿状一直在变的线就是 Q-function 对不同的状态估计出来的平均 Q 值,有很多不同的状态,每个状态你都 sample 一下,然后算它们的 Q 值,把它们平均起来。红色这一条线,它在训练的过程中会改变,但它是不断上升的,为什么它不断上升,因为 Q-function 是取决于你的策略的。学习的过程中你的策略越来越强,所以你得到 Q 值会越来越大。在同一个状态, 你得到 reward 的期望会越来越大,所以一般而言,这个值都是上升的,但这是 Q-network 估测出来的值。
|
||||
这边有 4 个不同的小游戏,横轴是训练的时间,红色锯齿状一直在变的线就是 Q-function 对不同的状态估计出来的平均 Q 值,有很多不同的状态,每个状态你都 sample 一下,然后算它们的 Q 值,把它们平均起来。
|
||||
|
||||
接下来你真地去算它,怎么真地去算?你有策略,然后真的去玩那个游戏。就玩很多次,玩个一百万次。然后就去真地估说,在某一个状态, 你会得到的 Q 值到底有多少。你会得到说在某一个状态,采取某一个动作。你接下来会得到累积奖励(accumulated reward)是多少。你会发现估测出来的值是远比实际的值大。在每一个游戏都是这样,都大很多。所以今天要提出 Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。我们先看它的结果,蓝色的锯齿状的线是 Double DQN 的 Q-network 所估测出来的 Q 值,蓝色的无锯齿状的线是真正的 Q 值,你会发现它们是比较接近的。 用网络估测出来的就不用管它,比较没有参考价值。用 Double DQN 得出来真正的累积奖励,在这 3 种情况下都是比原来的 DQN 高的,代表 Double DQN 学习出来的那个策略比较强。所以它实际上得到的 reward 是比较大的。虽然一般的 DQN 的 Q-network 高估了自己会得到的 reward,但实际上它得到的 reward 是比较低的。
|
||||
这条红色锯齿状的线在训练的过程中会改变,但它是不断上升的。因为 Q-function 是取决于你的策略的。学习的过程中你的策略越来越强,你得到的 Q 值会越来越大。在同一个状态, 你得到 reward 的期望会越来越大,所以一般而言,这个值都是上升的,但这是 Q-network 估测出来的值。
|
||||
|
||||
接下来你真地去算它,怎么真地去算?你有策略,然后真的去玩那个游戏,就玩很多次,玩个一百万次。然后就去真地算说,在某一个状态, 你会得到的 Q 值到底有多少。你会得到在某一个状态采取某一个动作。你接下来会得到累积奖励(accumulated reward)是多少。你会发现估测出来的值远比实际的值大,在每一个游戏都是这样,都大很多。所以今天要提出 Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。
|
||||
|
||||
我们先看它的结果,蓝色的锯齿状的线是 Double DQN 的 Q-network 所估测出来的 Q 值,蓝色的无锯齿状的线是真正的 Q 值,你会发现它们是比较接近的。 用网络估测出来的就不用管它,比较没有参考价值。用 Double DQN 得出来真正的累积奖励,在这 3 种情况下都是比原来的 DQN 高的,代表 Double DQN 学习出来的那个策略比较强。所以它实际上得到的 reward 是比较大的。虽然一般的 DQN 的 Q-network 高估了自己会得到的 reward,但实际上它得到的 reward 是比较低的。
|
||||
|
||||

|
||||
|
||||
Q: 为什么 Q 值总是被高估了呢?
|
||||
|
||||
A: 因为实际上在做的时候,是要让左边这个式子跟右边这个目标越接近越好。那你会发现说,目标的值很容易一不小心就被设得太高。因为在算这个目标的时候,我们实际上在做的事情是,看哪一个 a 可以得到最大的 Q 值,就把它加上去,就变成我们的目标。所以假设有某一个动作得到的值是被高估的。
|
||||
A:因为实际上在做的时候,是要让左边这个式子跟右边这个目标越接近越好。你会发现目标的值很容易一不小心就被设得太高。因为在算这个目标的时候,我们实际上在做的事情是,看哪一个 a 可以得到最大的 Q 值,就把它加上去,就变成我们的目标。所以假设有某一个动作得到的值是被高估的。
|
||||
|
||||
举例来说, 现在有 4 个动作,本来其实它们得到的值都是差不多的,它们得到的 reward 都是差不多的。但是在估计的时候,那毕竟是个网络。所以估计的时候是有误差的。所以假设今天是第一个动作被高估了,假设绿色的东西代表是被高估的量,它被高估了,那这个目标就会选这个动作。然后就会选这个高估的 Q 值来加上 $r_t$,来当作你的目标。如果第 4 个动作被高估了,那就会选第 4 个动作来加上 $r_t$ 来当作你的目标值。所以你总是会选那个 Q 值被高估的,你总是会选那个 reward 被高估的动作当作这个 max 的结果去加上 $r_t$ 当作你的目标,所以你的目标总是太大。
|
||||
举例来说, 现在有 4 个动作,本来它们得到的值都是差不多的,它们得到的 reward 都是差不多的。但是在估计的时候,网络是有误差的。
|
||||
|
||||
* 假设是第一个动作被高估了,假设绿色的东西代表是被高估的量,它被高估了,那这个目标就会选这个动作,然后就会选这个高估的 Q 值来加上 $r_t$,来当作你的目标。
|
||||
* 如果第四个动作被高估了,那就会选第四个动作来加上 $r_t$ 来当作你的目标值。所以你总是会选那个 Q 值被高估的,你总是会选那个 reward 被高估的动作当作这个 max 的结果去加上 $r_t$ 当作你的目标,所以你的目标总是太大。
|
||||
|
||||

|
||||
Q: 怎么解决目标值总是太大的问题呢?
|
||||
|
||||
A: 在 Double DQN 里面,选动作的 Q-function 跟算值的 Q-function,不是同一个。在原来的 DQN 里面,你穷举所有的 a,把每一个 a 都带进去, 看哪一个 a 可以给你的 Q 值最高,那你就把那个 Q 值加上 $r_t$。但是在 Double DQN 里面,你有两个 Q-network,第一个 Q-network,决定哪一个动作的 Q 值最大。你用第一个 Q-network 去带入所有的 a,去看看哪一个 Q 值最大。你决定你的动作以后,你的 Q 值是用 $Q'$ 算出来的,假设我们有两个 Q-function,
|
||||
A: 在 Double DQN 里面,选动作的 Q-function 跟算值的 Q-function 不是同一个。在原来的 DQN 里面,你穷举所有的 a,把每一个 a 都带进去, 看哪一个 a 可以给你的 Q 值最高,那你就把那个 Q 值加上 $r_t$。但是在 Double DQN 里面,你有两个 Q-network:
|
||||
|
||||
* 假设第一个 Q-function 高估了它现在选出来的动作 a,那没关系,只要第二个 Q-function $Q'$ 没有高估这个动作 a 的值,那你算出来的就还是正常的值。
|
||||
* 假设反过来是 $Q'$ 高估了某一个动作的值,那也没差, 因为反正只要前面这个 Q 不要选那个动作出来就没事了,这个就是 Double DQN 神奇的地方。
|
||||
* 第一个 Q-network Q 决定哪一个动作的 Q 值最大(你把所有的 a 带入 Q 中,看看哪一个 Q 值最大)。
|
||||
* 你决定你的动作以后,你的 Q 值是用 $Q'$ 算出来的。
|
||||
|
||||
假设我们有两个 Q-function,
|
||||
|
||||
* 假设第一个 Q-function 高估了它现在选出来的动作 a,只要第二个 Q-function $Q'$ 没有高估这个动作 a 的值,那你算出来的就还是正常的值。
|
||||
* 假设 $Q'$ 高估了某一个动作的值,那也没差,因为只要前面这个 Q 不要选那个动作出来就没事了,这个就是 Double DQN 神奇的地方。
|
||||
|
||||
Q: 哪来 Q 跟 $Q'$ 呢?哪来两个网络呢?
|
||||
|
||||
A: 在实现上,你有两个 Q-network, 一个是目标的 Q-network,一个是真正你会更新的 Q-network。所以在 Double DQN 里面,你的实现方法会是拿你会更新参数的那个 Q-network 去选动作,然后你拿目标网络,那个固定住不动的网络去算 值。而 Double DQN 相较于原来的 DQN 的更改是最少的,它几乎没有增加任何的运算量,连新的网络都不用,因为你原来就有两个网络了。你唯一要做的事情只有,本来你在找最大的 a 的时候,你在决定这个 a 要放哪一个的时候,你是用 $Q'$ 来算,你是用目标网络来算,现在改成用另外一个会更新的 Q-network 来算。
|
||||
A: 在实现上,你有两个 Q-network:目标的 Q-network 和你会更新的 Q-network。所以在 Double DQN 里面,你会拿你会更新参数的那个 Q-network 去选动作,然后你拿目标网络(固定住不动的网络)去算值。
|
||||
|
||||
Double DQN 相较于原来的 DQN 的更改是最少的,它几乎没有增加任何的运算量,连新的网络都不用,因为原来就有两个网络了。你唯一要做的事情只有,本来你在找 Q 值最大的 a 的时候,你是用 $Q'$ 来算,你是用目标网络来算,现在改成用另外一个会更新的 Q-network 来算。
|
||||
|
||||
假如你今天只选一个 tip 的话,正常人都是实现 Double DQN,因为很容易实现。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user