【数学基础】梯度下降法
先一步一步来:
(一)全局最小值与局部最优值
对于很多非线性的优化问题,会存在许许多多的若干局部最小值。
局部最小值的定义是:
假设
x
∗
x^\ast
x∗是一个局部最小值
存在一个
δ
>
0
\delta>0
δ>0 对于所有满足
∥
x
−
x
∗
∥
<
δ
\parallel x-x^\ast\parallel<\delta\;
∥x−x∗∥<δ 的
x
x
x都有
f
(
x
∗
)
⩽
f
(
x
)
f(x^\ast)\leqslant f(x)
f(x∗)⩽f(x) , 也就是说在x这点的邻域内所有点的函数值都是大于x这一点的函数值的。
对于所有的
x
∈
D
x\in\mathcal D
x∈D 如果
f
(
x
∗
)
⩽
f
(
x
)
f(x^\ast)\leqslant f(x)
f(x∗)⩽f(x) 成立的话,则
x
∗
x^\ast
x∗是一个全局最小值。
求局部最小解一般来说是容易的,但是很难保证能求出来的局部最小解是全局最小解,对于线性规划或者凸优化问题来说,局部最小解就是全局最小解。
要判定一个点
x
∗
x^\ast
x∗是不是一个局部最小值,通过比较它的领域内有没有更小的函数是不现实的。如果函数
f
(
x
)
f(x)
f(x)是二次连续可微的,我们可以求出其在点
x
∗
x^\ast
x∗处的梯度
∇
f
(
x
∗
)
\nabla f(x\ast)
∇f(x∗) 和 Hessian矩阵来判断。
局部最小解的一阶必要条件:若
x
∗
x^\ast
x∗ 为局部最小解并且函数在
x
∗
x^\ast
x∗的领域内一阶可微,则
∇
f
(
x
∗
)
=
0
\nabla f(x\ast)=0
∇f(x∗)=0
局部最小解的二阶必要条件:若 x ∗ x^\ast x∗ 为局部最小解并且函数在 x ∗ x^\ast x∗的领域内二阶可微,则 ∇ f ( x ∗ ) = 0 , ∇ 2 f ( x ∗ ) \nabla f(x\ast)=0,\ \ \ \ \nabla^2f(x\ast) ∇f(x∗)=0, ∇2f(x∗)为半正定矩阵
证明的话,就用一阶、二阶泰勒展开式近似处理一下即可得证。
(二)梯度下降法
梯度下降法(Gradient Descent Method)简称GD,通常是用来求解无约束优化的最小值问题的。
对于函数
f
(
x
)
f(x)
f(x)如果在
x
t
x_t
xt点是连续可微的,那么它下降的最快的方向就是它的梯度方向的反方向。(说白了就是切线方向,向着递减的那个方向)
由泰勒一阶展开公式:
f
(
x
t
+
1
)
=
f
(
x
t
+
△
x
)
≈
f
(
x
t
)
+
△
x
T
∇
f
(
x
t
)
f(x_{t+1})=f(x_t+\triangle x)\approx f(x_t)+\triangle x^T\nabla f(x_t)
f(xt+1)=f(xt+△x)≈f(xt)+△xT∇f(xt)
为了实现下降,那么要让
f
(
x
t
+
1
)
<
f
(
x
t
)
f(x_{t+1})<f(x_t)
f(xt+1)<f(xt) 才行。
那如果这个条件成立了,那么
△
x
T
∇
f
(
x
t
)
<
0
\triangle x^T\nabla f(x_t)<0
△xT∇f(xt)<0
现在可以让
△
x
=
−
α
∇
f
(
x
t
)
\triangle x=-\alpha\nabla f(x_t)
△x=−α∇f(xt),当
α
>
0
\alpha>0
α>0且足够小的时候,
f
(
x
t
+
1
)
<
f
(
x
t
)
f(x_{t+1})<f(x_t)
f(xt+1)<f(xt) 成立。
按照这个方法,我们从
x
0
x_0
x0作为初始值开始通过迭代公式:
x
t
+
1
=
x
t
−
α
∇
f
(
x
t
)
x_{t+1}=x_t-\alpha\nabla f(x_t)
xt+1=xt−α∇f(xt)
可得到:
f
(
x
0
)
≥
f
(
x
1
)
≥
f
(
x
2
)
≥
.
.
.
≥
f
(
x
∧
)
f(x_0)\geq f(x_1)\geq f(x_2)\geq...\geq f(\;\overset\wedge x\;)
f(x0)≥f(x1)≥f(x2)≥...≥f(x∧)
如果顺利的话,会收敛,
x
∧
\overset\wedge x\;
x∧处就是局部最小值。
α
\alpha
α乘为步长,也叫做学习率,太大会导致函数发散无法收敛,太小会导致收敛过慢。
总结:梯度下降法是一个一阶收敛算法,当接近局部最优值时梯度变小,收敛速度变慢,以S型的方式下降。如果目标是二阶连续可微的,可以采用牛顿法,拟牛顿法来解决。但是牛顿法(NT)是二阶收敛算法,收敛速度更快,但是每次迭代都需要计算Hessian矩阵,复杂度特别大。所以当数据量在10^5以内可以用牛顿法,太大了的话,就还是老老实实用GD或者SGD吧。
如果遇到了要求解极值点是最大的情况,有两个办法解决,第一是转换成求解极小值问题,或者使用梯度上升法,在迭代中正向叠加梯度和步场的乘积。