总结了李飞飞教授的讲义,稍微结合自己的一些经验(也就是厚着脸皮说一下结合了自己的经验了,其实自己的那些经验,都在教授的讲义中了。。。。)。
数据预处理:零均值(zero-centered),将数据的均值变成零。所有数据整体减去本身的均值就行了。
归一化(normalize),把数据各个向量的方差改成1. (1,2两点,在BN层中其实也是这样的思想了)
去相关性(decorrelate),将数据各个分量设置为互相独立的。协方差矩阵是对角阵。
白化(whiten),协方差矩阵是单位阵,零均值,方差为1.
这些操作在神经网络中比较常见。有些层的设计也是基于上面的一些思想来的。
少量数据的验证:
先使用少量数据,确保网络能够在这些很少的数据集上完全拟合。如果是自己写的代码,可以验证有没有错误,结构设计有没有缺陷。
学习率:
这个调整起来相当看经验。。。。。下面总结的几点也不是绝对的。如果loss 没有下降:学习率可能过低或者过高。过低是因为每次更新的太小了,总在很小的地方波动,网络基本无法训练。过高是因为在某个最低点附近震动,无法进入那个最低点。(此处非常感谢 @赵英俊 指出问题!)。
如果loss 爆炸了:学习率过高
如果loss出现了NaN:一个可能是学习率过高,另外可能是自己写的哪里有bug。(有时候有一些奇怪的情况,非常偶尔出现NaN,就是查不出哪里错了,而且不能复现NaN,后面的实验都是正常的。这个问题我也不清楚,难道是GPU过热了23333。。。)(NaN的情况有@ValK的分析&#x