训练中的基础技巧(数据处理,验证集设置,参数处理)
首先,对于数据
我们需要统一其量纲。通用的做法是数据标准化。
就是让一个样本内的均值为0,不同样本类内方差尽量一致
然后就是为标签做one-hot encoding
对于权重
1.随机初始化
2.均值为0,且尽量不同意义的权重间尽量有一致的方差
这是因为初始化对最后的结果实际上很重要,如果我们有机器学习基础,我们就知道。而对于神经网络这样一个较复杂的模型,我们并不知道初始化在哪里比较合适,我们想尽量避免初始化对模型产生较大影响,就采用随机初始化的方法较为合适。
而均值为0的道理,还记得我们之前解析神经网络中的激励函数嘛,如果采用sigmoid这样的函数,均值偏大或者偏小都会导致更新较慢。
1.梯度方向往往受到解平面某点附近的变化趋势影响,不见得会向着目标局部极小值收敛。所以在我们训练过程中会出现错误率是螺旋式下降的。那么对于这个问题,我们可以这样子解决。让
新的梯度方向=0.9×前一个梯度方向+0.1新的梯度方向
得到新的梯度方向。当然这个参数是可以变的
可以看到,虽然大的学习速率比小的更快收敛,但是大的也更加快地到达了‘平原区域’
这是因为学习速率高很可能进不去小的‘坑’,而小坑下面连接的可能是更低的谷底
所以小的学习速率总是可以在最终收敛结果上比大的要好。但是如果一直采用小学习速率,在一开始的下降过程又太慢了。这时候我们想要学习率在step增加时逐渐减小。
我以上说的这两点被总结起来叫做AdaGD,自适应梯度下降。tf中为我们提供的就是它,所以我们不需要关心学习速率和梯度方向的问题。当然,如果到很熟练需要定制的最优化方法时,可以去改动。但目前还用不到。
对于训练集、验证集、测试集
我这里的观点是,在参加竞赛之类的不需要我们自己设置测试集,而发paper时需要设置小部分测试集。
我以上说的这两点被总结起来叫做AdaGD,自适应梯度下降。tf中为我们提供的就是它,所以我们不需要关心学习速率和梯度方向的问题。当然,如果到很熟练需要定制的最优化方法时,可以去改动。但目前还用不到。
对于训练集、验证集、测试集
我这里的观点是,在参加竞赛之类的不需要我们自己设置测试集,而发paper时需要设置小部分测试集。