暂时只更新到牛顿法
参考文章
- 深度学习(花书)
- 梯度下降法、牛顿法和拟牛顿法 - Eureka的文章 - 知乎
- 梯度下降法与牛顿法比较 - 王多鱼的文章 - 知乎
- 【最优化】无约束优化方法-牛顿法 - 忆臻的文章 - 知乎
- 泰勒公式-百度百科
二阶梯度方法使用二阶导数改进了优化,最广泛使用的时牛顿法
牛顿法
思想
用目标函数的二阶泰勒展开近似该目标函数,通过求解这个二次函数的极小值来求解凸优化的搜索方向
牛顿法的主要应用在两个方面:1.求方程的根;2. 最优化
预备知识
一元泰勒展开式
此次使用一元泰勒展开式进行讨论
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 ! f ′ ′ ( x 0 ) + ⋯ + 1 n ! f ( n ) ( x 0 ) ( x − x 0 ) n f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0)+\frac{1}{2!}f^{\prime \prime}(x_0)+\cdots+\frac{1}{n!}f^{(n)}(x_0)(x-x_0)^n f(x)=f(x0)+f′(x0)(x−x0)+2!1f′′(x0)+⋯+n!1f(n)(x0)(x−x0)n
海森矩阵(Hessian)
Hessian矩阵定义的二次范数
H(x^{(k)}) =
实际应用
1. 求解方程根
并不是所有的方程都有求根公式或者求根公式很复杂,导致求解困难。
利用牛顿法,可以迭代求解
过程
利用泰勒展开式在
x
0
x_0
x0处展开,展开到一阶,即
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0)
f(x)=f(x0)+f′(x0)(x−x0)
求解方程
f
(
x
)
=
0
f(x) = 0
f(x)=0
这就等价于
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
=
0
f(x_0)+f^{\prime}(x_0)(x-x_0) = 0
f(x0)+f′(x0)(x−x0)=0
解得
x
1
=
x
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x_1 = x = x_0 - \frac{f(x_0)}{f^{\prime}(x_0)}
x1=x=x0−f′(x0)f(x0)
注意,这里我们是使用泰勒一阶展开式来近似, f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0) f(x)=f(x0)+f′(x0)(x−x0)是近似表达,不完全相等。这里求得的 x 1 x_1 x1,并不能使 f ( x ) = 0 f(x)=0 f(x)=0,即 f ( x 1 ) ≠ 0 f(x_1) \not = 0 f(x1)=0,只能说 f ( x 1 ) f(x_1) f(x1)比 f ( x 0 ) f(x_0) f(x0)更接近于等于 0 0 0
于是得到迭代过程
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_n - \frac{f(x_n)}{f^{\prime}(x_n)}
xn+1=xn−f′(xn)f(xn)
通过不停迭代,此公式会在
f
(
x
∗
)
=
0
,
f(x^*) = 0,
f(x∗)=0,计算过程如下
2. 最优化
假设无约束最优化问题
m i n x ∈ R n f ( x ) min_{x \in R^{n} }f(x) minx∈Rnf(x)
x ∗ x^* x∗为目标函数的极小点。
设
f
(
x
)
f(x)
f(x)具有二阶连续导数,若第
k
k
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
)
)
+
1
2
(
x
−
x
(
k
)
)
T
⋅
H
⋅
(
x
−
x
(
k
)
)
f(x) = f(x^{(k)})+g^{T}_k(x-x^{(k)})+\frac{1}{2}(x-x^{(k)})^T\cdot H \cdot (x-x^{(k)})
f(x)=f(x(k))+gkT(x−x(k))+21(x−x(k))T⋅H⋅(x−x(k))
g
k
=
g
(
x
(
k
)
)
=
∇
f
(
x
(
k
)
)
g_k = g(x^{(k)}) = \nabla f(x^{(k)})
gk=g(x(k))=∇f(x(k)),表示
f
(
x
)
f(x)
f(x)在点
x
(
k
)
x^{(k)}
x(k)的梯度向量
H
(
x
(
k
)
)
H(x^{(k)})
H(x(k)) 是
f
(
x
)
f(x)
f(x) 的海瑟矩阵(
H
e
s
s
i
a
n
Hessian
Hessian矩阵)在点
x
(
k
)
x^{(k)}
x(k)处的值
H
(
x
)
=
[
∂
2
f
∂
x
i
∂
x
j
]
H(x) = \big[ \frac{\partial^2f}{\partial{x_i}\partial{x_j}} \big]
H(x)=[∂xi∂xj∂2f]
函数
f
(
x
)
f(x)
f(x)有极值的必要条件是在极值点处一阶导数为
0
0
0,即梯度向量为
0
0
0。
特别的当
H
(
x
(
k
)
)
H(x^{(k)})
H(x(k)) 是正定矩阵时,函数
f
(
x
)
f(x)
f(x)的极值为极小值。
为了得到一阶导数
f
′
(
x
)
=
0
f^{\prime}(x)=0
f′(x)=0的点,我们使用上节中的求解方程根的方法。
根据二阶泰勒展开,对
∇
f
(
x
)
\nabla f(x)
∇f(x)在
x
(
k
)
x^{(k)}
x(k)进行展开得
∇
f
(
x
)
=
g
k
+
H
k
⋅
(
x
−
x
(
k
)
)
\nabla f(x) = g_k + H_k \cdot (x-x^{(k)})
∇f(x)=gk+Hk⋅(x−x(k))
其中
H
k
=
H
(
x
(
k
)
)
,
H_k = H(x^{(k)}),
Hk=H(x(k)),则
g
k
+
H
k
⋅
(
x
(
k
+
1
)
−
x
(
k
)
)
=
0
g_k + H_k \cdot (x^{(k+1)} - x^{(k)}) = 0
gk+Hk⋅(x(k+1)−x(k))=0
x
(
k
+
1
)
=
x
(
k
)
−
H
k
−
1
g
k
x^{(k+1)} = x^{(k)} - H_k^{-1} g_k
x(k+1)=x(k)−Hk−1gk
我们令
H
k
p
k
=
−
g
k
H_k p_k = -g_k
Hkpk=−gk
则得到迭代公式
x
(
k
+
1
)
=
x
(
k
)
−
p
k
x^{(k+1)} = x^{(k)} - p_k
x(k+1)=x(k)−pk
最终可在 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0收敛
算法
目标为 J ( Θ ) = 1 m ∑ i = 1 m L ( f ( x i ; θ ) , y ( i ) ) J(\Theta) = \frac{1}{m}\sum_{i=1}^{m}L(f(x^{i};\theta),y^{(i)}) J(Θ)=m1∑i=1mL(f(xi;θ),y(i))牛顿法
R
e
q
u
i
r
e
Require
Require:初始参数
θ
0
\theta_0
θ0
R
e
q
u
i
r
e
Require
Require: 包含
m
m
m个样本的训练集
~~~~
w
h
i
l
e
while
while 没有达到停止准则
~~
d
o
do
do
~~~~
计算梯度:
g
←
1
m
∇
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g \leftarrow \frac{1}{m}\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)})
g←m1∇θ∑iL(f(x(i);θ),y(i))
~~~~
计算
H
e
s
s
i
a
n
Hessian
Hessian矩阵:
H
←
1
m
∇
θ
2
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
H \leftarrow \frac{1}{m}\nabla_{\theta}^2\sum_iL(f(x^{(i)};\theta),y^{(i)})
H←m1∇θ2∑iL(f(x(i);θ),y(i))
~~~~
计算
H
e
s
s
i
a
n
Hessian
Hessian逆:
H
−
1
H^{-1}
H−1
~~~~
计算更新:
Δ
θ
=
−
H
−
1
g
\Delta\theta = -H^{-1}g
Δθ=−H−1g
~~~~
应用更新:
θ
=
θ
+
Δ
θ
\theta = \theta + \Delta\theta
θ=θ+Δθ
e n d w h i l e end ~~ while end while
计算海森矩阵的逆
拟牛顿法
思想
计算海森矩阵的逆 H − 1 H^{-1} H−1是比较复杂的,这一计算比较复杂,这一计算比较复杂,考虑用一个 n n n阶矩阵 G k = G ( x ( k ) ) G_k= G(x^{(k)}) Gk=G(x(k))来近似代替 H k − 1 = H − 1 ( x ( k ) ) H_k^{-1} = H^{-1}(x^{(k)}) Hk−1=H−1(x(k))。这就是拟牛顿法的基本想法。
注意
- 牛顿法只适用于Hessian矩阵正定的情况
- 在深度学习中,目标函数的表面通常非凸(有很多特征),如鞍点。因此使用牛顿法是有问题的,
- 如果Hessian矩阵的特征值并不都是正的,例如,靠近鞍点处,牛顿法实际上会导致更新错误的方向移动
- 这种情况可通过正则化Hessian矩阵来避免
牛顿法 VS 梯度下降
- 梯度下降法和牛顿法相比,两者都是迭代求解,
- 梯度下降法是梯度求解
- 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))
- 牛顿法是用二阶的海森矩阵的逆矩阵求解
- x ( k + 1 ) = x ( k ) − λ ( H ( k ) ) − 1 ∇ f ( x ( k ) ) x^{(k+1)} = x^{(k)} - \lambda (H^{(k)})^{-1} \nabla f(x^{(k)}) x(k+1)=x(k)−λ(H(k))−1∇f(x(k))
- 相对而言,使用牛顿法收敛更快(迭代更少次数)。但是每次迭代的时间比梯度下降法长。
红色曲线是牛顿法迭代求解,绿色曲线是利用梯度下降法
为什么牛顿法下降更快
找到了各种不同的解释,我将都列出来
通俗来说梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
更多的可见:最优化问题中,牛顿法为什么比梯度下降法求解需要的迭代次数更少?
根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
共轭梯度
共轭梯度是一种通过迭代下降的共轭方向(conjugate directions)以有效避免Hessian矩阵求逆计算的方法。
这种方法的灵感来自于对最速下降方法弱点的仔细研究
DFP(Davidon-Fletcher-Powell)算法(DFP algorithm)
BFGS
Broyden-Fletcher-Goldfard-Shanno(BFRS)算法具有牛顿法的一些优点,但没有牛顿法的计算负担。