最优化算法
之前学习的时候关于最优化算法没有一个系统性的认识,对于梯度下降法与牛顿法的区别和关联认识不清晰,这次进行一个系统性的总结。
梯度下降法
定义
梯度下降算法是求解无约束最优化问题的迭代算法。
算法的前提条件是,损失函数
f
(
x
)
f(x)
f(x)是具有一阶连续偏导数的函数。
梯度下降算法具体过程是:
- 选定初始值 x 0 x_0 x0
- 不断沿着负梯度方向迭代更新x , x k + 1 = x k + λ k p k x^{k+1} = x^k + \lambda_k p_k xk+1=xk+λkpk,这里 p k = − f k ′ p_k = -f'_k pk=−fk′是负梯度方向, λ k \lambda_k λk是步长(>0),根据搜索确定 arg min λ f ′ ( x k + λ p k ) \argmin_{\lambda} f'(x^k+\lambda p_k) λargminf′(xk+λpk),这里步长不是一个固定值。
- 直到梯度模长 ∣ ∣ p k ∣ ∣ ||p_k|| ∣∣pk∣∣小于定值,结束迭代
这里的关键是为什么这个更新公式是有效的呢?
感性理解
根据导数定义
f
′
(
x
)
=
f
(
x
+
ϵ
)
−
f
(
x
)
ϵ
,
ϵ
→
0
f'(x) = \frac{f(x+\epsilon) - f(x)}{\epsilon}, \epsilon \to 0
f′(x)=ϵf(x+ϵ)−f(x),ϵ→0
可以推断:
f
(
x
−
ϵ
f
′
(
x
)
)
<
f
(
x
)
,
ϵ
→
0
f(x-\epsilon f'(x)) < f(x), \epsilon \to 0
f(x−ϵf′(x))<f(x),ϵ→0
基于泰勒展开的有效性证明
我们首先证明,
x
k
+
1
=
x
k
−
λ
k
f
k
x^{k+1} = x^k - \lambda_k f_k
xk+1=xk−λkfk可以让
f
k
+
1
<
f
k
f^{k+1} < f^k
fk+1<fk
根据泰勒一阶展开公式可知:
f
(
x
)
=
f
(
x
k
)
+
∇
f
k
(
x
−
x
k
)
f(x) = f(x^k) + \nabla f_k(x-x^k)
f(x)=f(xk)+∇fk(x−xk),当然,这里要求
x
−
x
k
→
0
x-x^k \to 0
x−xk→0
根据上述待证明的更新公式,设
x
k
+
1
−
x
k
=
−
λ
k
∇
f
k
x^{k+1} - x^k =- \lambda_k \nabla f_k
xk+1−xk=−λk∇fk,待入泰勒公式可以得到:
f
(
x
)
=
f
(
x
k
)
−
λ
k
∇
2
f
k
f(x) = f(x^k) - \lambda_k \nabla^2 f_k
f(x)=f(xk)−λk∇2fk
这里已经直到
λ
k
>
0
\lambda_k>0
λk>0,当梯度不等于0时,必然有
f
(
x
)
=
f
(
x
k
−
λ
k
f
k
)
<
f
(
x
k
)
f(x) = f(x^k - \lambda_k f_k) < f(x^k)
f(x)=f(xk−λkfk)<f(xk)
负梯度为什么是最快的方向
前面已经证明了更新公式是有效的,那么如何证明负梯度方向是损失函数下降最快的方向呢?
概念:
梯度向量:针对多维输入的函数,包含所有偏导数的向量,即
∇
x
f
(
x
)
\nabla_x f(x)
∇xf(x)
方向导数:针对某方向
u
u
u,函数
f
f
f在
u
u
u方向上的斜率,也就是函数
f
(
x
+
a
u
)
f(x+au)
f(x+au)关于
a
a
a的导数。
当
a
→
0
a \to 0
a→0时,
∂
f
(
x
+
a
u
)
∂
a
=
u
T
∇
x
f
(
x
)
\frac{\partial f(x+au)}{\partial a} = u^T\nabla_x f(x)
∂a∂f(x+au)=uT∇xf(x)
为了让
f
f
f最小化,需要找到梯度下降最快的方向导数,即
u
∗
=
arg min
u
u
T
∇
x
f
(
x
)
u^*=\argmin_u u^T\nabla_x f(x)
u∗=uargminuT∇xf(x)
当然这里要注意,因为是使
f
f
f最小,所以这个导数是负的
min
u
u
T
∇
x
f
(
x
)
⟺
min
u
∣
∣
u
∣
∣
2
∣
∣
∇
x
f
(
x
)
∣
∣
2
c
o
s
θ
⟺
min
c
o
s
θ
\min_u u^T \nabla_x f(x) \iff \min_u ||u||_2||\nabla_x f(x)||_2 cos\theta \iff \min cos\theta
uminuT∇xf(x)⟺umin∣∣u∣∣2∣∣∇xf(x)∣∣2cosθ⟺mincosθ
所以当方向导数
u
u
u与梯度方向
∇
f
\nabla f
∇f取反向,则下降速度最大,因此梯度下降也成为最速下降法。
当目标函数是凸函数时候,梯度下降法是全局解。
拓展:随机梯度下降
在损失函数计算中,我们采用所有样本点的损失函数平均作为总体的损失函数。
f
(
x
)
=
1
n
∑
i
f
i
(
x
)
f(x) = \frac{1}{n}\sum_if_i(x)
f(x)=n1∑ifi(x)
这里计算量巨大,每一步迭代都需要计算
O
(
n
)
O(n)
O(n),这种方法叫批量梯度下降
还有两种改进方法,一种叫随机梯度下降(SGD),即
n
=
1
n=1
n=1
另一种叫随机批量梯度下降(SBGD),即
n
=
m
n=m
n=m
此前写过一个关于随机梯度下降算法介绍
牛顿法
定义公式
牛顿法是求解无约束最优化问题的迭代算法。
相对于梯度下降,牛顿法是基于二阶泰勒展开在某点
x
0
x_0
x0附近来优化
f
(
x
)
f(x)
f(x)
f
(
x
)
=
f
(
x
k
)
+
g
k
T
(
x
−
x
k
)
+
1
2
(
x
−
x
k
)
T
H
(
x
k
)
(
x
−
x
k
)
f(x) = f(x_k)+g_k^T(x-x_k) + \frac{1}{2}(x-x_k)^TH(x_k)(x-x_k)
f(x)=f(xk)+gkT(x−xk)+21(x−xk)TH(xk)(x−xk)
牛顿法的必要条件是梯度
f
′
(
x
)
=
0
f'(x)=0
f′(x)=0,当海赛矩阵是正定时,此点x是极小值点。
当
ϵ
→
0
\epsilon \to 0
ϵ→0,设
∇
f
(
x
k
+
1
)
=
0
\nabla f(x_{k+1}) = 0
∇f(xk+1)=0
∇
f
(
x
k
+
1
)
=
0
=
g
k
+
1
2
H
(
x
k
)
(
x
k
+
1
−
x
k
)
\nabla f(x_{k+1}) = 0 = g_k + \frac{1}{2}H(x_k)(x_{k+1}-x_k)
∇f(xk+1)=0=gk+21H(xk)(xk+1−xk)
x
k
+
1
=
x
k
−
1
2
g
k
H
k
−
1
x_{k+1} = x_k - \frac{1}{2}g_kH_k^{-1}
xk+1=xk−21gkHk−1
二阶导数衡量曲率
二阶导数表示只基于梯度信息的梯度下降的幅度。如果没有曲率,那么函数就是一条直线(梯度不变化)
设点
x
0
x_0
x0附近的泰勒展开
f
(
x
)
=
f
(
x
0
)
+
(
x
−
x
0
)
T
g
+
1
2
(
x
−
x
0
)
T
H
(
x
−
x
0
)
f(x) = f(x_0) + (x-x_0)^Tg + \frac{1}{2}(x-x_0)^TH(x-x_0)
f(x)=f(x0)+(x−x0)Tg+21(x−x0)TH(x−x0)
设
x
=
x
0
−
ϵ
g
x = x_0 - \epsilon g
x=x0−ϵg
得到
f
(
x
0
−
ϵ
g
)
=
f
(
x
0
)
−
ϵ
g
T
g
+
1
2
ϵ
2
g
T
H
g
f(x_0-\epsilon g)=f(x_0) - \epsilon g^Tg + \frac{1}{2}\epsilon^2g^THg
f(x0−ϵg)=f(x0)−ϵgTg+21ϵ2gTHg
这三项分别是函数原始值,梯度导致的预期改善,曲率导致的矫正。当H非正定,则
ϵ
\epsilon
ϵ越大,f下降越多。正曲率表示梯度将越来越平坦,负曲率表示梯度将越来越陡峭,所以这里正曲率有修正作用。
在正定情况下,可以得到最大的下降步长
E
(
ϵ
)
=
f
(
x
0
−
ϵ
g
)
−
f
(
x
0
)
+
ϵ
g
T
g
−
1
2
ϵ
2
g
T
H
g
E(\epsilon) = f(x_0-\epsilon g) - f(x_0) + \epsilon g^Tg - \frac{1}{2}\epsilon^2g^THg
E(ϵ)=f(x0−ϵg)−f(x0)+ϵgTg−21ϵ2gTHg
∂
E
∂
ϵ
=
ϵ
∗
=
g
T
g
g
T
H
g
\frac{\partial E}{\partial \epsilon} = \epsilon^* = \frac{g^Tg}{gTHg}
∂ϵ∂E=ϵ∗=gTHggTg
在这种情况下,因为[1,1]曲率最大,所以修正后步长变小,而[1,-1]曲率小,步长变大,可以解决上述问题。
牛顿法在正定二次函数时可以直接跳到函数最小点,而如果时近似正定二次,会迭代更新到最小点。但是如果不是,在鞍点情况下效果比梯度下降要差。
所以牛顿法只适用于最小点附近的情况。
问题
非凸函数(海赛矩阵非正定)
牛顿法只适用于海赛矩阵是正定的情况(此时为凸函数)。
这里的正定即
X
M
X
>
=
0
XMX >= 0
XMX>=0,直官理解就是矩阵根据某向量变化后和向量本身夹角小于90度。参见直观理解正定和凸函数
当目标函数是非凸的,出现鞍点,牛顿法是无效的
可以利用将海赛矩阵正则化处理,即海赛矩阵对角线增加常数
x
k
+
1
=
x
k
−
1
2
g
k
(
H
k
+
α
I
)
−
1
x_{k+1} = x_k - \frac{1}{2}g_k(H_k + \alpha \bold{I})^{-1}
xk+1=xk−21gk(Hk+αI)−1
当曲率变大,
α
\alpha
α需要更大,以至于步长变小,收敛变慢
计算负担
牛顿法需要在每次迭代中考虑海赛矩阵,计算量非常大( O ( n 3 ) O(n^3) O(n3)),占据内存也非常大。
拟牛顿法
条件
解决办法是拟牛顿法,考虑一个矩阵
G
k
G_k
Gk来代替
H
k
−
1
H_k^{-1}
Hk−1
如何替代?
条件有两个:1.
G
k
G_k
Gk是正定的,2.满足牛顿法的迭代公式
牛顿法的迭代公式是
x
k
+
1
=
x
k
−
H
k
−
1
g
k
x_{k+1} = x_k -H_k^{-1}g_k
xk+1=xk−Hk−1gk
这里考虑极值情况,
g
k
+
1
=
0
g_{k+1}=0
gk+1=0
所以,
g
k
+
1
−
g
k
=
H
k
(
x
k
+
1
−
x
k
)
g_{k+1}-g_k = H_k(x_{k+1}-x_k)
gk+1−gk=Hk(xk+1−xk)
设
δ
k
=
x
k
+
1
−
x
k
,
y
k
=
g
k
+
1
−
g
k
\delta_k = x_{k+1} - x_k,y_k = g_{k+1}-g_k
δk=xk+1−xk,yk=gk+1−gk
得到牛顿法迭代公式条件:
y
k
=
H
k
δ
k
y_k = H_k \delta_k
yk=Hkδk
拟牛顿法找一个满足条件的正定矩阵来拟合海赛矩阵或者海赛逆矩阵,每次都利用迭代公式 G k + 1 = G k + Δ G G_{k+1} = G_{k} + \Delta G Gk+1=Gk+ΔG更新矩阵,而不是重新计算。
DFP
利用
G
k
G_k
Gk拟合海赛逆矩阵,将迭代公式设为
G
k
+
1
=
G
k
+
P
k
+
Q
k
G_{k+1} = G_k+P_k+Q_k
Gk+1=Gk+Pk+Qk
所以需要让
P
k
y
k
=
δ
k
,
Q
k
y
k
=
−
G
k
y
k
P_ky_k=\delta_k,Q_ky_k=-G_ky_k
Pkyk=δk,Qkyk=−Gkyk,好让G满足牛顿公式条件
可以找到可用的形式:
P
k
=
δ
k
δ
k
T
δ
k
T
y
k
P_k = \frac{\delta_k \delta_k^T}{\delta_k^T y_k}
Pk=δkTykδkδkT
Q
k
=
−
G
k
y
k
y
k
T
G
k
y
k
T
G
k
y
k
Q_k = -\frac{G_ky_ky_k^TG_k}{y_k^TG_ky_k}
Qk=−ykTGkykGkykykTGk
BFGS
利用
B
k
B_k
Bk拟合海赛矩阵,将迭代公式设为
B
k
+
1
=
B
k
+
P
k
+
Q
k
B_{k+1} = B_k+P_k+Q_k
Bk+1=Bk+Pk+Qk
所以需要让
P
k
δ
k
=
y
k
,
Q
k
δ
k
=
−
B
k
δ
k
P_k\delta_k=y_k,Q_k\delta_k=-B_k\delta_k
Pkδk=yk,Qkδk=−Bkδk,好让G满足牛顿公式条件
可以找到可用的形式:
P
k
=
y
k
y
k
T
y
k
T
δ
k
P_k = \frac{y_k y_k^T}{y_k^T \delta_k}
Pk=ykTδkykykT
Q
k
=
−
G
k
δ
k
δ
k
T
G
k
δ
k
T
G
k
δ
k
Q_k = -\frac{G_k\delta_k\delta_k^TG_k}{\delta_k^TG_k\delta_k}
Qk=−δkTGkδkGkδkδkTGk
共轭梯度
比较与定义
梯度下降采用一阶导数,而牛顿法采用二阶导数,相比梯度下降,牛顿法的收敛速度更快,但是在计算存储上存在问题,同时需要海赛矩阵正定的条件,后者明显约束更多。