1 废话
·前一段一个很重要的面试挂了,难受了几天,又是谢师宴,还有昨天还打了一个晚上的电话,总之托了好几天。。。
prioritized replay 早就知道,也知道大概的意思,就是之前 loss 大的优先级设置大些,但是仔细看了论文,思想的确就是这样,但是实际的算法还是有很多细节要考虑的,下边就仔细说说。
注意:我把 transition 翻译成了“转换”,有时候也说成了“样本”。
2 Motivation
其实在我们日常的生活中就存在这样的现象,比如我们做错了一件事情,很难受,我们印象会特别深,甚至在脑海中重复很多次。其实这就是我们大脑在我们的 Experience Replay 把这些做错的事拿出来重新模拟训练。
还有一种情况,比如文中举了一个例子,在一个环境中,从起点需要走很多步才能到终点,只有从终点在走到起点才能获得一个正的 reward,而每一步都有一种走错地动作导致直接回到起点。这就造成了如果一共需要走n步,随机运动获得 reward 的概率是1/2^n,也就是平均执行 2^n 次动作才能获得 reward,那么我们把每次执行动作的转换(s, a, r, s')存在 replay 里,里面大量的都是没有 reward 的经验,直接均匀抽样几乎不可能抽到哪个能获得 reward 的转换。所以我们一定要增加那个有用的转换的优先级,保证一旦我们得到这个经验,我们就会多抽样几次,使得训练的时候把时间用在有用的转换上。
而且 Replay 越大,Prioritzed replay 越有用,因为均匀采样越难抽到有用的样本。
3 算法细节
主要讨论了如何计算优先级,实现的数据结构以及存在的问题和修正进行了说明。
3.1 用 TD-Error 计算优先级
这个其实是最容易想到的办法,就是我们每次从 replay 中抽到一批样本,我们计算 loss 其实就是用的 TD-error,把之前 loss 越大的样本优先级设置越高,然后选择优先级最高的一批数据,每次增加的新数据都先将优先级调至最高保证至少能抽到一次,在训练时再更新抽到的一批样本的 TD-error,论文中称这种方法为“greedy TD-error prioritization ”
实现的数据结构使用最大堆。
3.2 Stochastic prioritization
使用 TD-error 是存在一些问题的:
(1)replay 中的每个样本只有在被抽到后他的优先级才会被更新,那么有的样本可能刚开始 TD-error 很小,但是随着网络的训练,他的 TD-error 应该已经变得很大了,但是由于优先级低就一直没被抽到,也就一直没有更新,所以会错过很多有用的样本。
(2)比如在训练初期,我们的网络输出的值是错误的,其实 target 也是错误的,TD-error 带有很强的随机性,我们可能就会被某个 TD-error 很大的样本困住,其实他并没有多大用处,只是因为初期随机性比较大导致了他的 TD-error 比较大。换句话说收到异常值的影响比较大。
(3)使得抽到的样本可能会频繁是那几个最大的,导致网络过拟合。
所以我们应该增加一些随机性,使得剩余优先级不是特别大的样本也有可能被抽到,而且不要受异常值影响过于严重。因此应该定义一种概率,根据这种概率在 Replay 中抽取样本,文中给出的抽到第 i 个样本的概率为:
然后计算 p(i) 提出了两种方法:
(1) Proportional prioritization
直接定义 p(i) = TD-error + 一个很小的正值,保证分母不为零。
(2) Rank-based prioritization
根据 TD-error 对 Replay 中的样本进行排名,然后 p(i) 就等于第 i 个样本排名的倒数。
具体实现的数据结构我就不细说了,直接贴图:
3.3 有偏估计的改善
使用随机的更新(训练)来估计 value 的期望需要这些更新的分布和期望的分布相一致。而 Prioritized relay 改变了分布,所以带来的偏置,尤其在训练的最后阶段,估计的偏置影响是比较严重的因此需要减小偏置,很直观的办法就是除以抽到的概率,定义一个乘在 loss 前,来根据抽到的概率改变 loss 的缩放程度。
当为1时完全消除偏置,越小则优先级大的样本对训练的影响越大。在实现时从一个较小值逐渐增大至1。
将 Prioritized replay 用在 Double DQN 中的算法如下所示:
4 实验
还没看完,回头再加上。