梯度下降或者牛顿法本质都是通过迭代的方式逼近最值,而迭代的目标则是找出下一个逼近最值的位置,梯度下降法是根据一阶梯度来确定下一个位置,而牛顿法则是根据二阶梯度来确定下一个位置。
泰勒展开式就是使用多项式函数在 x 0 x_0 x0处逼近函数 f ( x ) f(x) f(x),即在 x 0 x_0 x0处 f ( x ) f(x) f(x)等于泰勒展开式。虽然是废话,但是一定要好好思考,这个才是核心
1. 梯度下降法为什么可以求极值
a. 梯度的定义
我们通常称在函数
f
(
x
)
f(x)
f(x)某个点上
x
0
x_0
x0的变化率为导数,通常可以求出这个点的切线,一般叫斜率,即
f
′
(
x
0
)
=
l
i
m
Δ
y
Δ
x
=
l
i
m
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
Δ
x
f'(x_0)=lim \frac{\Delta y}{\Delta x}=lim\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}
f′(x0)=limΔxΔy=limΔxf(x0+Δx)−f(x0)
对于多元函数,则是称之为方向导数,想象一下二维函数
z
=
f
(
x
,
y
)
z=f(x,y)
z=f(x,y),这是一个曲面,在某个点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)可以求一个切面,每个方向都可以求一个斜率,假如求方向夹角为
α
\alpha
α的变化率
l
i
m
f
(
x
0
+
t
c
o
s
α
,
y
0
+
t
s
i
n
α
)
−
f
(
x
0
,
y
0
)
t
=
f
x
(
x
0
,
y
0
)
c
o
s
α
+
f
y
(
x
0
,
y
0
)
s
i
n
α
\begin{aligned} lim\frac{f(x_0+tcos\alpha,y_0+tsin\alpha)-f(x_0,y_0)}{t}&=f_x(x_0,y_0)cos\alpha+f_y(x_0,y_0)sin\alpha \end{aligned}
limtf(x0+tcosα,y0+tsinα)−f(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)sinα
令
g
=
[
f
x
(
x
0
,
y
0
)
,
f
y
(
x
0
,
y
0
)
]
\pmb{g}=[f_x(x_0,y_0),f_y(x_0,y_0)]
g=[fx(x0,y0),fy(x0,y0)],
e
=
[
c
o
s
α
,
s
i
n
α
]
\pmb{e}=[cos\alpha,sin\alpha]
e=[cosα,sinα]
那么有
f
x
(
x
0
,
y
0
)
c
o
s
α
+
f
y
(
x
0
,
y
0
)
s
i
n
α
=
g
∗
e
=
∣
g
∣
∣
e
∣
c
o
s
θ
=
∣
g
∣
c
o
s
θ
f_x(x_0,y_0)cos\alpha+f_y(x_0,y_0)sin\alpha=\pmb{g}*\pmb{e}\\=|\pmb{g}||\pmb{e}|cos\theta=|\pmb{g}|cos\theta
fx(x0,y0)cosα+fy(x0,y0)sinα=g∗e=∣g∣∣e∣cosθ=∣g∣cosθ
其中,
θ
\theta
θ为
g
\pmb{g}
g 和
e
\pmb{e}
e 的夹角,
α
\alpha
α是我们求某个斜率的方向。那么我们该如何确定
α
\alpha
α使得变化率最大呢?
当
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)确定的时候,
g
\pmb{g}
g也就确定了,所以
- 当 θ = 0 \theta=0 θ=0时, e \pmb{e} e和 g \pmb{g} g的方向相同,此时变化率最大,且为正
- 当 θ = π \theta=\pi θ=π时, e \pmb{e} e和 g \pmb{g} g的方向相反,此时变化率最大,且为负
通过
g
\pmb{g}
g就可以确定
α
\alpha
α了,这两个是等价的。实际使用中,我们称
g
\pmb{g}
g为梯度。
现在应该就明白为什么说梯度是函数某个点变化最大最快的方向了吧。
b. 泰勒展开式
然后看一阶泰勒展开式
f
(
x
0
+
Δ
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
Δ
x
f(x_0+\Delta x)=f(x_0)+f'(x_0) \Delta x
f(x0+Δx)=f(x0)+f′(x0)Δx
为了求极小值,我们希望找到的下一个
x
′
=
x
0
+
Δ
x
x'=x_0+\Delta x
x′=x0+Δx可以使
f
(
x
)
f(x)
f(x)变小,因此希望有
f
(
x
0
+
Δ
x
)
=
f
(
x
′
)
<
=
f
(
x
0
)
f(x_0+\Delta x)=f(x')<=f(x_0)
f(x0+Δx)=f(x′)<=f(x0)
将一阶泰勒展开式带入
f
′
(
x
0
)
Δ
x
=
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
<
=
0
f'(x_0) \Delta x=f(x_0+\Delta x)-f(x_0) <= 0
f′(x0)Δx=f(x0+Δx)−f(x0)<=0
所以只有当 f ′ ( x ) f'(x) f′(x)和 Δ x \Delta x Δx的符号相反,才能保证有 f ′ ( x 0 ) Δ x < 0 f'(x_0) \Delta x <0 f′(x0)Δx<0,做一个简单的变换 Δ x = − λ f ′ ( x 0 ) \Delta x=-\lambda f'(x_0) Δx=−λf′(x0),这个变换保证了符号相反,并且要求 λ > 0 \lambda>0 λ>0, λ \lambda λ是实时变化的,无法确定,但是在使用中,我们通常会给一个很小的值,就是梯度下降法中的步长。
2. 牛顿法为什么比梯度下降法更快
a. 牛顿法的定义
一阶牛顿法主要是求0值,二阶牛顿法是求极值,所以一般在机器学习中说的牛顿法主要是指二阶的。我们使用二阶泰勒展开式
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
1
2
f
′
′
(
x
0
)
(
x
−
x
0
)
2
f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{1}{2}f''(x_0)(x-x_0)^2
f(x)=f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2
根据极值的定义
f
′
(
x
)
=
0
f'(x)=0
f′(x)=0,我们对x进行求导
0
=
f
′
(
x
)
=
f
′
(
x
0
)
+
f
′
′
(
x
0
)
(
x
−
x
0
)
0=f'(x)=f'(x_0)+f''(x_0)(x-x_0)
0=f′(x)=f′(x0)+f′′(x0)(x−x0)
可以得到牛顿法的更新公式
x
=
x
0
−
f
′
(
x
0
)
f
′
′
(
x
0
)
x=x_0-\frac{f'(x_0)}{f''(x_0)}
x=x0−f′′(x0)f′(x0)
多维度的情况就不做推导了,需要查一下资料。
b. 为什么牛顿法更快
从下面两个图可以看到,梯度下降法使用的一阶泰勒展开式,可以认为是在
x
0
x_0
x0处使用线性函数在拟合。按照斜率方向更新x。而牛顿法呢?使用的是二阶泰勒展开式,相当于是使用一个二阶函数在
x
0
x_0
x0处进行函数拟合。求梯度时,直接找到了更优的点。
举个极端的例子。如果我们的函数就是二阶的,如果使用梯度下降法,依然需要一步一步逼近,但是当我们使用牛顿法的时候,相当于直接求出了这个函数的极值点,一次更新就可以了。