为什么我们使用基于一阶偏微分的SGD优化算法,而不使用包含二阶偏微分的牛顿法?
牛顿法是基于二阶泰勒级数展开来近似目标函数的优化方法。
目标函数J(θ)在θ0处的二阶展开为
J(θ)≈J(θ0)+(θ−θ0)T∇θJ(θ0)+21(θ−θ0)TH(θ−θ0)
上式令∇θJ(θ)=0,可以解得θ∗=θ0−H−1∇θJ(θ0)
对于二次函数(或在局部是二次的函数),Hessian矩阵H正定,那么H−1可计算,牛顿法会使参数直接跳到极小值点。
对于非二次的函数,只要Hessian矩阵在当前保持正定,牛顿法依然适用,可以迭代地更新下去。
相比起一阶方法,牛顿法能够充分利用二阶微分的信息,减少迭代的次数,缩短训练时间。但它有以下缺陷:
- 牛顿法需要计算矩阵的逆。一个k×k的矩阵的求逆运算的复杂度是O(k3),这将大大增加计算的负担。
- 牛顿法在局部二次曲面上会直接求得极小值点,而极小值点的梯度为零。这就使得模型陷入了局部最优,无法通过梯度更新逃离局部最优解。
- 牛顿法只适用于Hessian矩阵正定的情况。在高维空间中,这一点不一定成立。例如,在鞍点附近,Hessian矩阵同时具有正负特征值。牛顿法将会得到错误的方向。
- 最严重的问题是,牛顿法会被吸引到鞍点。但高维参数空间中,鞍点比局部极值普遍。梯度下降法会沿着梯度的反方向前进,如果梯度反方向没有鞍点,那么它不会主动去找鞍点。所以梯度下降能够逃离鞍点,但牛顿法不能。牛顿法旨在寻找梯度为零的点,它会主动找到鞍点,并锁死在那里(因为鞍点的梯度为零)。