2.2 基于梯度的二阶优化
梯度下降算法在梯度为零(▽L=0)的点停止迭代,并将此点作为最优参数。在参数空间中,梯度为零的点并不全是局部最小值,还可能是一个鞍点,见定义2.2。如果算法停留在鞍点,那么就意味着优化算法失败,我们可以进行多次初始化参数来避免这一点。
定义2.2(鞍点) 一阶导数为零,但是在该点邻域上的二阶导数正负号相反,比如y=x3在(0,0)上的表现,一阶导数为零,但是左右邻域的二阶导数符号相反,表明这并不是一个极值点,而是一个鞍点。
高维参数空间的鞍点可以通过海森矩阵来判断,见定义2.3。如果损失函数在参数空间上的某一点上的海森矩阵是正定的,那么该点就是极小值点,如果是负定的,那么该点就是极大值点,矩阵的正定性,见《统计学习必学的十个问题》中的第6章核方法中的定理6.1。
定义2.3(海森矩阵(Hessian)) 实值函数S对于多变量的所有二阶偏导组成的矩阵,将多变量记为(x1,x2,…,xn),矩阵的每一个元素为:
海森矩阵由于是厄米矩阵,可以被对角化,它的特征值和特征向量可以分别定义为:
如果特征向量被正交归一化,那么特征向量d就是基,那么特征值就是该方向上的二阶导数,两边同时乘以特征向量的转置,就可以得到:
对于鞍点,某个特征向量所对应的特征值就是负的,就意味着是这个方向上的极大值点,而另一特征向量所对应的特征值就是正的,意味着同时也是另一方向上的极小值点。如图2.3,点X在AB方向是极小值,CD方向是极大值。
图2.3 二维参数空间的鞍点示意
其余方向的二阶导数就可以通过特征向量来计算,因为特征向量可以构成一组基(完备正交),所有向量都可以用这组基进行线性表示,可以理解为原始坐标轴旋转,与特征向量的方向对齐。任意方向f可以被表示为:
f=a1d1+a2d2+…anλn
所以,任意方向的二阶导数都可以得到:
fTHf=a1d1+a2d2+…anλn
海森矩阵除了用来判断极值和鞍点以外,它还包含了损失函数的曲率信息,因为海森矩阵的对角线就是参数的二阶导数,一个函数的导数衡量的是函数的变化率,二阶导数表示就是一阶导数的变化率。我们可以用它来获得梯度的变化信息,以衡量一阶优化算法的表现。
具体衡量方法就是泰勒展开,我们在《统计学习必学的十个问题》的第8章中,曾经使用泰勒公式的二阶展开来讨论GBDT的优化问题,得到了关于学习器的一个多项式。那么在讨论一般的优化算法中,我们也可以做类似的操作,来更深刻的洞察优化算法。
在一个典型的凸损失函数中,随着优化的进行,梯度会变得越来越小,在固定好小的学习率前提下,优化会越来越慢,可以将损失函数在参数θ0附近做泰勒展开:
假设我们执行了一次梯度下降,从θ0到θ那么就有关系:
将梯度▽θL(X,θ0,y)表示为g,将其代入泰勒展开式,可以得到:
如果我们将后面两项写作一项,用来表示损失函数需要减小的项:
如果需要减小的项大于零,那么损失函数总会减小,比如海森矩阵的特征值均为负,其实对应着极大值点,那么无论学习率多小,损失函数总会下降很大。但是,如果海森矩阵特征值均为正,而且非常大,就意味着极小值附近的曲率非常大,固定学习率的情况下,执行梯度下降反而可能会导致损失的上升。
如果我们希望损失函数能下降最多,其实就是希望需要减小的项越大越好,在海森矩阵特征值为正的情况下,在我们将ε看作自变量,令其一阶导数为零,就得到了:
gTg-tgTH(L)g=0
也就是:
上式表示着我们在执行梯度下降的每一次迭代,理论上的最佳学习率。
我们完全可以不采取梯度下降的办法来优化参数,式(2.6)给出了损失函数的二阶展开,但仍然是一个关于参数的函数,我们直接对上式求一阶导数,并令其为零,就可以直接得到最佳参数:
上式就是著名的牛顿法(Newton method)的更新公式。牛顿法已经默认使用了一阶导数为零的信息,理想情况下,它只需要从初始参数点迭代一次就可以找到极小值点。同时,它利用了海森矩阵的曲率信息,一般而言也要比梯度更快。