完整代码链接
写了个Q学习小车上山 感觉不行。把Q表画出来 找找原因。
... # q learning update # 其中q是q表 o是离散化的观察 400-900个值 a是三个动作 r是奖励 d是done # 1-d的意思是 如果done了 就不用后来的q表更新上一步q值 q[o][a] q[o][a] alpha*(r (1-d)*gamma*max(q[o1])-q[o][a]) # 可视化q表的代码 def plot_q(self): q np.array(self.q);s self.steps fig,(a1,a2,a3) plt.subplots(1,3,figsize (15,5)) c1 a1.pcolormesh(q[:,0].reshape(s,s));fig.colorbar(c1,ax a1) c2 a2.pcolormesh(q[:,1].reshape(s,s));fig.colorbar(c2,ax a2) c3 a3.pcolormesh(q[:,2].reshape(s,s));fig.colorbar(c3,ax a3) plt.show()
如果gamma TD折扣 衰减为95% 一开始q表用上述代码打出来是这样的
而gamma为1 不衰减 的时候 q表是这样 注意右侧色标尺度是从0到负50 比上面大了很多
后期经验表明 gamma 1时可以产生部分解。记得解决这个问题是连续100次的平均值在-110左右 这里100次的滑动平均到了-140左右
而gamma 0.95时是这样的
可以说是一蹶不振。究其原因 还是梯度消失。先看gamma为95%的时候 训练晚期的q表
再看gamma 1的时候晚期q表
后者明显有一种从中心朝外螺旋的感觉 很符合小车来回驾驶 积累动量的过程
而且 gamma 1的q表右侧色标比gamma 0.95的色标范围宽了5倍多。
也就是说 gamma 0.95的时候 训练两万次 基本上没能推出梯度来。
小车上山这个任务的难点在于 奖励只有一步 而且达成奖励的道路是比较曲折的。这时候梯度消失就非常可怕了。这已经是为什么gamma 0.95的时候训练无效。
顺带说一句 将成功前一步的q强行设置成0也可以解决mountaincar问题。 代码中的fix_done
gamma设置为1也让人想起残差层中 上层和经过残差层的权重占比必须是1:1。
TODO
1、on-policy 即变成SARSA。也是助力推进梯度的。
2、另外一种方式是资格迹 eligibility trace 也就是SARSA-lambda。
砖瓦编码太复杂了 而且对于DRL没啥用 就没搞。
3、用OOP的那些东西改下接口 使DRL的模块很容易插进来 像stable-baselines那种吧 。



