简单记录下困扰了我半个多月的问题:在跑 Librec 的 SBPR 算法代码的时候,发现 Loss 一直随着迭代次数在逐渐增加,这不是不正常吗???
一、我的疑问
最早的时候,只是拿 Librec 去跑一个数据集的实验结果,但是一不下心瞄了一眼输出的迭代结果,竟然发现 loss 一直在逐渐增大,跑了其他几个方法,都没有发现这样的情况,按理来说,越训练 loss 应该越小才对,所以到底哪里有问题???
说明:
- 上图的 loss 是每一次迭代的 loss 总值
- delta_loss 是上一次迭代的 loss 值 - 本次迭代 loss 值
二、我的尝试解决办法
然后我开始尝试不断的解决问题,劝说自己:
- 首先排查是不是不小心把对方的代码改了,这里没有。
- 然后想想是不是迭代次数不够,慢慢的后面会逐渐收敛,所以把迭代次数设置的超级大,但 loss 还是一直在持续上升,并且不是上升一点点的那种。
- 查询很多资料后,发现 loss 上升绝对是不正常的,所以我开始看原论文,发现原论文是用梯度上升求最大值,看了眼公式,既然是求最大值,那 loss 上升应该是对的,我这样想。
我以为这是我的最终答案,遂不管它。但是过了几天想想还是不对劲,loss 代表的是误差,误差一直在增大,怎么样都说不过去啊,只有 loss 缓慢更新才代表收敛啊,这样才叫训练好了啊,然后我就开始查梯度上升的资料,发现这方面的资料很少。咨询同门师弟也说,loss 一直上升是不正常的!!!
- 后来查到如果 loss 上升的话,可以调整下学习率,每次迭代的时候都相应的更新学习率,loss 就会收敛。而在 librec 中确实有一个 bolddriver 的设置问题,设置为 true 的话,可以控制每次迭代的时候相应的更新学习率的大小,比如 loss 在增加,学习率在下一轮变小,loss 在减小,学习率在下一轮变大。这样设置后, 虽然前面的迭代次数 loss 都在上升,但是后面逐渐收敛。
我以为上面就是我的最终答案,只要改一个默认的参数设置 bolddriver就可以解决 。遂又开始不管它。(但SBPR的梯度上升的疑问一直留在我的