深度学习经验总结

在keras上的实验,SGD,也叫随机梯度下降法,按我个人的理解,在keras上的实现过程是这样的,先把训练数据打乱(可选,也就是fit里面的shuffle属性)然后根据batch_size设置的值把训练数据拆分成几个等份,每份有batch_size个大小,用这些训练数据进行训练网络。

其实keras里的sgd是可以实现mini_batch的。当batch_size取1的时候,也就是说每次训练只选一个进行训练,然后把所有训练数据都遍历一遍后就完成了一个epoch.

而当batch_size设置为训练集的大小时,实现的就是batch梯度下降,也就是全量梯度下降。而当batch_size设置成中间只时就相当于mini_batch梯度下降 。

在我自己的实验中发现,当使用全量梯度下降时,损失曲线下降较平滑,但是收敛速度比较慢

而当使用mini_batch梯度下降是,损失曲线会有震荡下降的趋势,这在一方面可以跳过局部最小值,另一方面也造成了正确率会剧烈震荡。当batch_size的值设置的越小,可能震荡越剧烈。而且,batch_ssize设置越大(越接近训练数据总量)训练速度也越快。

另外,有一种自适应梯度下降法,叫adam,可以使收敛速度加快,效果较好,是目前用的比较多的一种梯度下降法。

另外,可以将学习率设置成随着训练的进行慢慢减小,这样也能 使最终结果收敛到一个较好的值。根据我的经验,比如迭代10000次,在100次里面验证集损失值没有下降,就将学习率减半,而在1000次里面学习率没有下降就提前停止训练。

你可能感兴趣的:(深度学习经验总结)