前言
今天在调试强化学习代码时,之前在gym-CartPole环境下运行良好的代码,在MountainCar环境下怎么也学不好,其实仔细观察loss函数,会发现一个规律性存在的问题:每个几代,就会有一个特别大的loss值出现。这一问题刚开始时我没有引起重视,后来仔细思考这极有可能是导致算法错误学习的关键原因——一些过大的误差覆盖了整个学习过程
方法
这个时候,我想到了鲁棒核函数的掩盖作用,这里我们使用了一个更为简单粗暴的方法,那就是凡是loss超过某个阈值,这一样本就不参与下降过程了(因为我是单样本下降,所以实现起来是很方便的,如果是批量下降,则要从pytorch着手实现了)
对比
我们做一个很简单的对比实验,看一看如上所述的掩盖后,究竟有无改善
做掩盖处理(阈值=100)的网络在4000代学习后,学到的play模式如GIF所示:
未做掩盖处理的网络在4000代学习后,学到的play模式如GIF所示:
很神奇,掩盖的部分使得小车忘记了前行
,未掩盖的时候前行
的力量
又覆盖
了后退
的学习,也就是说,我们的掩盖过了头,下面放宽掩盖力度(阈值=250),再来一次实验
实验进行到4000代的时候,不是特别明显的改善,不过确实让小车突破了“左右”的限制,我又让算法跑到了10000代,结果如下:
是不是特别顺畅了,为了保证严谨性,我将重新对掩盖和不掩盖的情形进行10000次迭代,记录结果如下
首先是不掩盖情形下进行的10000次迭代,其结果如下所示:
好家伙,越学越回去了,再看看完全掩盖(阈值=100)的情形下,10000代后会怎样
有左右之分,但是幅度还太小,接近我们阈值为250时迭代4000代时候的效果
以上实验表明,鲁棒核函数在MountainCar中有很好的效应,目前来说阈值为250是比较合适的值