0%

梯度下降

什么是梯度

梯度本质上来说就是一个向量,这个向量的各个分量是多元函数在某点的各个一阶偏导数。既然是一个向量,那么就可以表示方向。进而由方向导数的定义可以知道,沿梯度方向,函数值增大的速度就越快,相反沿梯度的反方向,函数值减小的速度就越大

为什么要使用梯度下降法

对于一些优化问题时,我们一般需要求解问题的局部最优解,而表现在函数上,局部最优解就是函数的极值点。根据费马定理,如果一个函数一阶可偏导,那么极值点处的一阶偏导数都为0。而一般绝大多数的函数都是一阶可偏导的。

但是直接求出函数的偏导数,然后令偏导数等于0求解方程的这种方法一般很难求出方程的解。所以只有通过数值计算的方法来求解近似解。

梯度下降法的一般形式

首先确定一个初始点$W0$,然后使用迭代公式: $w{n+1}^i = wn^i - \alpha f’{w^i}(W_n)$,$w^i$表示点$W$的第$i$个分量,$\alpha$为学习率,一般为一个接近0的常数,例如0.001。

迭代,直到达到一定的迭代步数或者是目标函数的变化或参数的变化小于某一阈值时停止迭代。

实现细节问题

初始值的设定

一般的,对于不带约束条件的优化问题,可以将初始值设置为0,或者设置为随机数。初始值的设定对算法的收敛很重要,不同的初始值最后可能收敛到不同的极值点。

学习率的设定

一般可以令学习率为一个很小的正数例如0.001,并且在接下来的迭代过程中不再改变学习率。或者可以在迭代的过程中动态的调整学习率的值,例如前10000步迭代时学习率为0.001,然后10000步学习率减半。如果梯地下降算法运行异常的话,可能也是学习率设置得不太合理。

特征缩放

有时候,一个特征的可能取值范围可能很大,这对于梯度下降法来说就可能需要很多次迭代才能最后收敛。所以为了减少迭代次数,可以使用特征缩放的方法。

例如有特征$x_1$,其取值范围为$(0, 2000)$,特征$x_2$,其取值$(0, 100)$,那么就可以对这两个特征进行缩放为$\frac{x_1}{2000}$和$\frac{x_2}{100}$。

一般的,特征缩放后的读取范围一般为$[-1,1]$之间。为此,可以使用均值归一化方法,如果一个特征$x$的均值为$\mu$,其取值区间长度为$n$,则归一化方法缩放方式为$\frac{x-\mu}{n}$。

判断梯度下降法是否收敛

一种方法是设置收敛阈值,即当目标函数的变化值小于某个阈值时表明梯度下降收敛。

令一种方法是画出目标函数值随着迭代步数变化的图形,例如每迭代100次就画出当时的目标函数的函数值。最后根据图像来判断是否收敛。

第一种方法有可能不好设置阈值,两种方法可以配合着使用。

梯度下降法的问题

在大多数非凸优化问题中,极值点不一定就是局部最优解的点,而且,即使某个极值点是局部最优解的点但是局部最优解不一定就是全局最优解。

随机梯度下降

对于某些机器学习问题,我们的目标函数是关于样本的损失函数,例如对于线性规划问题,假设训练集中有N个样本,并且N很大,在进行训练时我们使用均方误差来作为损失函数。即$L(W) = \frac{1}{N} \sum_{k=1}^{N} (Y-WX)^2$,$Y,X$都是N维向量,$W$是我们的自变量。则一次迭代下来,要计算全部样本的话计算量就太大了。

作为改进,可以在一次迭代时,随机选择部分样本来进行近似损失函数,即$L(W) = \frac{1}{M} \sum_{k=1}^{M} (Y-WX)^2, M \ll N$。这就是随机梯度下降法。已经证明,随机梯度下降法产生的梯度的期望值等于全部样本最为产生的梯度。