深度学习优化算法之梯度下降(泰勒展开式推导)
深度学习优化算法之梯度下降(泰勒展开式推导)
在深度学习中,为了得到一个好的模型,通常需要预先定义一个损失函数(优化的目标函数),然后使用合适的优化算法去试图得到一个最小值。优化的目标是为了降低训练误差,对于深度学习的模型来说,是为了降低泛化误差,因为单纯的降低训练误差,有可能会造成过拟合。在尽可能降低损失函数的值的过程中,会遇到两个问题:局部最小值和鞍点。
泰勒展开式与梯度下降
为了简化问题,我们一般将目标函数在某点邻域展开成泰勒多项式来逼近原函数。一阶泰勒展开式就是拉格朗日中值定理,公式如下:
$$f(x) = f(a) + df(a) \cdot (x - a)$$
通过推导,我们可以得出梯度下降的原理。其中,一阶泰勒展开式起到了桥梁作用,将导数与函数联系起来。
局部最小值
求解过程分为解析解和数值解。解析解就是数学公式直接推导求得,然而我们知道目标函数一般都比较复杂,所以基本上都是使用数值解。目标函数一般会有若干局部最小值,在这个附近的梯度接近或为0,那么最终迭代求得的值,很大程度上不是全局最小化,而是局部最小化。
例如,函数 $f(x) = x \cos(\pi x)$ 的走势图如下:
图中可以看到这个函数存在局部最小值和全局最小值,一般情况得到的结果都是局部最小值。
鞍点
除了局部最小值之外,另一种情况是在鞍点附近,也会使得梯度接近或为0。例如,函数 $f(x) = x^3$ 的走势情况如下:
再看一个三维图形函数 $f(x, y) = x^2 - y^2$:
从图中的鞍点位置(红色标注点)可以看出,目标函数在x轴方向上是局部最小值,但是在y轴方向上是局部最大值。
海森矩阵
海森矩阵是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。假设函数输入是k维向量,输出是标量,那么黑塞矩阵(Hessian matrix)有k个特征值,该函数在梯度为0的位置上可能是局部最小值、局部最大值或者鞍点三种情况:
- 当函数的黑塞矩阵在梯度为0的位置上的特征值全为正时,该函数得到局部最小值
- 当函数的黑塞矩阵在梯度为0的位置上的特征值全为负时,该函数得到局部最大值
- 当函数的黑塞矩阵在梯度为0的位置上的特征值有正有负时,该函数得到鞍点
对于一个大的高斯随机矩阵来说,正负概率各占一半,那从图中可以得出,1和2的情况的概率就是0.5的k次方,k一般很大,所以概率是很小的,也就是说目标函数更容易得到的是鞍点而不是局部最优值。
虽然找到目标函数的全局最优解很难,但并非必要,下面的优化算法在实际问题中都能训练出十分有效的深度学习模型。
一维梯度下降
对于梯度大家应该很熟悉了,一维就是导数,二维就是偏导数的集合,我们通过代码可视化梯度下降,看下具体是如何工作的。函数 $f(x) = x^2$ 我们知道其最小值是0,观察它的迭代:
其中eta学习率是超参数,设定过小、合适、过大,分别看下什么效果:
我们发现学习率过小,x更新缓慢,需要更多迭代才可以,过大就导致 $|ηf'(x)|$ 过大,一阶泰勒展开式就不再成立,也就不能保证迭代x会降低f(x)的值了。
多维梯度下降
我们可以通过一维梯度推广到多维梯度,设目标函数的输入是一个d维向量,那么有关x的梯度就是一个有d个偏导数组成的向量,现在对函数进行可视化观察梯度下降情况:
想了解更多关于梯度的伙伴们可以点击:
- Python随机梯度下降法(一)
- Python随机梯度下降法(二)
- Python随机梯度下降法(三)
- Python随机梯度下降法(四)【完结篇】