局部最小值和鞍点
如何区分局部最小点和鞍点
一般区分鞍点和局部最优的方法是使用神经网络 loss surface 的 Hessian 矩阵,通过计算 Hessian 矩阵的特征值,进行判断:
当 Hessian 矩阵的特征值有正有负的时候,神经网络的一阶导数为 0 的点是鞍点;当 Hessian 矩阵的特征值是非负的时候,神经网络的一阶导数为 0 的点是局部极小值点;当 Hessian 矩阵最小特征值小于零,则为严格鞍点(包含了局部最大)
另外一种判断是否是鞍点的方法:若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点。
最优点和鞍点的区别在于其在各个维度是否都是最低点。
只要某个一阶导数为0的点在某个维度上是最高点而不是最低点,那它就是鞍点。而区分最高点和最低点当然就是用二阶导数,斜率从负变正的过程当然就是“下凸”,即斜率的导数大于0,即二阶导数大于0。反之则为“上凹”,二阶导数小于0。
如何避免陷入局部最小值或者鞍点
实际上,我们并不需要害怕陷入局部最小值,原因有这几个:
第一个,很直观的解释来自于上面特征值的分布信息:当loss很小的时候,我们才会遇到局部最小值问题,也就是说这时候的loss已经足够小,我们对这时候的loss已经足够满意了,不太需要花更大力气去找全局最优值。
第二个,在一定假设条件下,很多研究表明深度学习中局部最小值很接近于全局最小值。
而对于鞍点,逃离鞍点的做法有这几种:
1、利用严格鞍点负特征值对应的方向,采用矩阵向量乘积的形式找到下降方向;
2、利用扰动梯度方法逃离鞍点,在梯度的模小于某个数的时候,在梯度上加个动量。
学习率计划器常用技巧
1、提高初始学习率。因为学习率一般会随着训练批次的增加而降低,所以不妨让学习率从一个较高的水平开始下降。较大的学习率可以使模型在初始训练时权重有更大的变化,有助于后续低学习率调优时收敛至更优的权重范围。
2、使用大的动量系数。使用大的动量系数可以保证在你的学习率衰减得比较小时,优化算法还可以使模型权重在正确的方向上以较快的速度收敛。
3、尝试不同的学习率计划器。因为现在还没有理论明确地指出什么情况下应该使用什么样的学习率规划器,所以你需要尝试各种不同的配置来寻找最适合你当前问题的计划器配置。你可以按照指数规律划分学习率规划器的参数,也可以根据模型在训练集/测试集上响应的结果自适应地调整学习率规划器参数。
批次标准化 (Batch Normalization)
对于每一层网络的输出,对其做一个归一化,使其服从标准的正态分布,这样后一层网络的输入也是一个标准的正态分布,所以能够比较好的进行训练,加快收敛速度。
这个时候会出现一个问题,就是测试的时候该使用批标准化吗?
答案是肯定的,因为训练的时候使用了,而测试的时候不使用肯定会导致结果出现偏差,但是测试的时候如果只有一个数据集,那么均值不就是这个值,方差为 0 吗?这显然是随机的,所以测试的时候不能用测试的数据集去算均值和方差,而是用训练的时候算出的移动平均均值和方差去代替
引用
链接: Datawhale-李宏毅深度学习
链接: 机器学习基础
链接: 学习率调度器
链接: 批次标准化