在 Why Deep Structure 一文中我已经说明了 Deep Structure 的表示能力很强,以及相比 Shallow Structure 的优势所在。但“能力越大责任越大”,拟合能力越强的模型往往越难找到最优解。
本文根据李宏毅老师的讲义整理了关于 Deep Learning 中的 Optimization 部分的一个特殊情形,即梯度为 0 的情形。
首先,我们知道,若损失函数为凸函数,则使用梯度下降法找到的局部最优解即为全局最优解,但深度学习难就难在其损失函数通常不是凸函数,如图所示:
图中通过一个很简单的例子说明了为什么 DL 的 Loss Function 通常非凸。假如我们当前找到了一组权重使得 Loss Function 达到局部最小值,那么我们通过交换神经元的位置而不改变权重,显然得到的还是局部最小值,而这两者的权重向量是不同的,由其中一个向量变化到另一个向量的过程中 Loss Function 必然会有一个上升过程(因为当前处于局部最小),因此局部的函数图像如右下角的图形所示,是一个非凸函数。
非凸函数的麻烦在于,当我们利用梯度下降法找到局部最小值时,我们不知道和全局最小值相差多少,也无法保证能够得到全局最小值。
但近期的研究中人们猜测,虽然 DL 的损失函数局部最小值很多,但都相差不大,也就是说,当陷入局部最小的时候,我们就得到了一个不错的解。
所以接下来的问题就是,利用梯度下降法能够得到局部最优解吗?
如上图所示,当我们陷入梯度为 0 (或梯度数值非常小)的点时,有可能是局部最小值,有可能是局部最大值,也有可能是鞍点。
当然,利用梯度下降法最终停在局部最大值的可能性几乎为 0,除非你的初始位置就在局部最大值点,使得参数无法更新。
当梯度下降法运行停止的时候,我们要如何判断所在点是以上哪一种情形呢?
其实思路和高中时期求二阶导没有本质区别。首先将 Loss Function 在当前的临界点 进行 Taylor expansion,由于当前导数 ,因此函数值在 附近的变化情形由二阶项决定。
这里就自然引出了 Hessian Matrix 的定义。
由图中的形式我们知道,若 是正定矩阵(即对任意,都有),则 在点 附近的所有 的取值都大于在 的取值(因为二次项恒正),所以 是 local minimum。
同理,若 是负定矩阵,则 在点 附近的所有 的取值都小于在 的取值(因为二次项恒负),所以 是 local maximum。
若有时, 有时,则 是一个鞍点。
需要注意的是,如果 是半正定或半负定的,即对任意,都有 或 ,则无法确定 是哪一种情形,因此当 的时候,决定 附近点的取值的就变成三次项了。
最后,需要说明的是,梯度下降法有时候会卡住,也就是说 Loss Function 的值不再呈下降趋势,而是在某个值附近振荡,这时候我们往往认为是接近临界点导致的,而事实并不一定如此。
如图所示,当梯度下降法导致的 Loss Function 变化平缓的时候,其实它的梯度值仍然可能很大。
此外,在实践中人们发现,DL 的训练过程中 Loss Function 的变化趋势更像下面的形式。
也就是说,我们一直在不断跳入鞍点(下降)然后逃离(上升),而不是一路下降停在一个局部最优点。