在求解机器学习模型参数时,即对问题进行优化时,梯度下降是最最常用的方法之一,下面对梯度下降做一个总结。
一、梯度
在微积分中,对多元函数的变量求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度,比如函数 f(x,y),分别对 x, y 求偏导,得: ∂ f ∂ y , ∂ f ∂ x \frac{{\partial f}}{{\partial y}},\frac{{\partial f}}{{\partial x}} ∂y∂f,∂x∂f,那么这个梯度组成的向量有什么用呢?从几何意义上讲,就是函数变化增长最快的方向,或者说沿着梯度向量的方向,函数会更快找到最大值,反过来,沿着梯度相反的方向,梯度减少最快,函数会更快找到最小值。
二、梯度下降与梯度上升
在机器学习算法求解时,在最小化损目标函数时,可以通过梯度下降一步步迭代求解,得到最小化的损失函数和模型参数值;反过来,如果需要求解目标函数的最大值,,就需要使用梯度上升来迭代。
梯度下降和梯度上升可以互相转化,比如我们想求目标函数 f ( θ ) f(\theta ) f(θ) 的最大值,此时需要使用梯度上升;但如果我们要求解的问题转化成求解 − f ( θ ) -f(\theta ) −f(θ)的最小值,此时对 − f ( θ ) -f(\theta ) −f(θ) 需要使用梯度下降。
三、梯度下降法
假设 f ( x ) f(x ) f(x) 是 R n {R^n} Rn 上具有一阶连续偏导数的函数,要求解的无约束最优化问题是:
min x ∈ R n f ( x ) \mathop {\min }\limits_{x \in {R^n}} {\rm{ }}f(x) x∈Rnminf(x)
梯度下降是一种迭代算法,选取适当的初值 x ( 0 ) {x^{(0)}} x(0),不断迭代,更新 x 的值,对 目标函数最小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新 x 的值,从而达到减少函数值的目的。
由于 f ( x ) f(x ) f(x) 具有一阶连续偏导数,若第 k 次迭代值为 x ( k ) {x^{(k)}} x(k),则可将 f ( x ) f(x) f(x) 在 x ( k ) {x^{(k)}} x(k)附近进行一阶泰勒展开:
f ( x ) = f ( x ( k ) ) + g k T ( x − x ( k ) ) f(x) = f({x^{(k)}}) + g_k^T(x - {x^{(k)}}) f(x)=f(x(k))+gkT(x−x(k))
其中 g k T = g ( x ( k ) ) = ∇ f ( x ( k ) ) g_k^T = g({x^{(k)}}) = \nabla f({x^{(k)}}) gkT=g(x(k))=∇f(x(k)) 为 f ( x ) f(x) f(x) 在 x ( k ) {x^{(k)}} x(k) 的梯度。
第 k+1 次迭代值 x ( k + 1 ) {x^{(k+1)}} x(k+1):
x ( k + 1 ) : = x ( k ) + λ ( − ∇ f ( x ( k ) ) ) {x^{(k + 1)}} := {x^{(k)}} + \lambda ( - \nabla f({x^{(k)}})) x(k+1):=x(k)+λ(−∇f(x(k)))
其中 λ \lambda λ 是迭代步长,如图所示:
梯度下降算法描述如下:
输入:目标函数
f
(
x
)
f(x)
f(x) ,梯度函数
g
(
x
)
=
∇
f
(
x
)
g(x) = \nabla f(x)
g(x)=∇f(x),计算精度
ε
\varepsilon
ε;
输出:
f
(
x
)
f(x)
f(x) 的极小值点
x
∗
{x^*}
x∗;
(1)取初始值
x
(
0
)
∈
R
n
{x^{(0)}} \in {R^n}
x(0)∈Rn,k = 0;
(2)计算
f
(
x
(
k
)
)
f({x^{(k)}})
f(x(k));
(3)计算梯度
g
k
=
g
(
x
(
k
)
)
{g_k} = g({x^{(k)}})
gk=g(x(k)),当
∣
∣
g
k
∣
∣
<
ε
||{g_k}|| < \varepsilon
∣∣gk∣∣<ε 时,停止迭代,此时
x
∗
=
x
(
k
)
{x^*} = {x^{(k)}}
x∗=x(k) ;
(4)否则,令
x
(
k
+
1
)
:
=
x
(
k
)
+
λ
(
−
∇
f
(
x
(
k
)
)
)
{x^{(k + 1)}} := {x^{(k)}} + \lambda ( - \nabla f({x^{(k)}}))
x(k+1):=x(k)+λ(−∇f(x(k))),计算
f
(
x
(
k
+
1
)
)
f({x^{(k + 1)}})
f(x(k+1)),当
∣
∣
f
(
x
(
k
+
1
)
)
−
f
(
x
(
k
)
)
∣
∣
<
ε
||f({x^{(k + 1)}}) - f({x^{(k)}})|| < \varepsilon
∣∣f(x(k+1))−f(x(k))∣∣<ε 或
∣
∣
x
(
k
+
1
)
−
x
(
k
)
∣
∣
<
ε
||{x^{(k + 1)}} - {x^{(k)}}|| < \varepsilon
∣∣x(k+1)−x(k)∣∣<ε 时,停止迭代,此时
x
∗
=
x
(
k
+
1
)
{x^*} = {x^{(k+1)}}
x∗=x(k+1) ;
(5)否则,令 k = k + 1,转到(3);
需要注意的是,如果目标函数是凸函数,梯度下降可以得到全局最优解,否则,梯度下降算法不一定能够得到全局最优解。
四、梯度下降法的参数
(1)步长
λ
\lambda
λ :步长决定了梯度下降中每一步沿着负梯度方向前进的长度;
(2)计算精度
ε
\varepsilon
ε
五、梯度下降算法调优
(1)步长:步长太大,导致迭代过快,可能造成振荡,错过最优解;步长太小,算法收敛过慢;
(2)初始化:由于梯度下降存在局部最优解的情况,建议多次初始化,选择使得目标函数最小的初值;
(3)归一化:由于样本不同特征的取值范围不同,可能导致梯度下降时等高线为椭圆,下降速度太慢,为了减少特征取值对梯度下降的影响,对特征进行归一化:
x : = x − x ‾ s t d ( x ) x: = \frac{{x - \overline x }}{{std(x)}} x:=std(x)x−x
其中 std(x) 是特征 x 的标准差,对特征进行缩放后,消除特征值大小对梯度下降算法的影响。