问题描述
对于无约束凸函数求最值问题:
m
i
n
i
m
i
z
e
f
(
x
)
minimize \quad f(x)
minimizef(x)
f
(
x
)
f(x)
f(x)为二次可微凸函数。我们假设该问题存在唯一最优解
x
∗
x^*
x∗,既然
f
(
x
)
f(x)
f(x)二次可微,则满足以下充要条件:
f
′
(
x
∗
)
=
0
f'(x^*)=0
f′(x∗)=0
有时候,上式可以直接通过解析解求得最优解。但更多时候,无法求得解析解,如最小二乘的解析解里需要求逆,该逆不一定可以求出。此时,必须采用迭代算法,即计算一系列点 x 0 , x 1 , x 2 , . . . . x n x_{0},x_{1},x_{2},....x_{n} x0,x1,x2,....xn的函数值 f ( x n ) f(x_n) f(xn),来查找最接近 x ∗ x^* x∗的点,当 f ( x n ) − f ( x ∗ ) < ϵ f(x_{n})-f(x^*)<\epsilon f(xn)−f(x∗)<ϵ时,算法终止, ϵ \epsilon ϵ为容许误差值,此时 x n x_{n} xn为近似最优解 x ∗ x^* x∗.
问题是:
如何获得这些近似点序列呢?前提是越往后的点,越接近最优值,即满足(假设是求最小值问题,最大值类似):
f
(
x
n
+
1
)
<
f
(
x
n
)
f(x_{n+1}) < f(x_{n})
f(xn+1)<f(xn)
梯度下降法和牛顿法就是用来解决该问题。
泰勒公式
泰勒(Taylor)中值定理1:
如果函数
f
(
x
)
f(x)
f(x)在
x
0
x_0
x0处具有
n
n
n阶导数,那么存在
x
0
x_0
x0的一个邻域,对于该邻域内的任一
x
x
x,有:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
1
!
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
+
.
.
.
+
f
n
(
x
0
)
n
!
(
x
−
x
0
)
n
+
o
(
(
x
−
x
0
)
n
)
f(x)=f(x_0) + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 +...+ \frac{f^n(x_0)}{n!}(x-x_0)^n + o((x-x_0)^n)
f(x)=f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+...+n!fn(x0)(x−x0)n+o((x−x0)n)
其中:
R
n
(
x
)
=
o
(
(
x
−
x
0
)
n
)
R_n(x)=o((x-x_0)^n)
Rn(x)=o((x−x0)n)
如何理解?
泰勒公式用于在给定了
f
(
x
)
f(x)
f(x),和一个初始点
x
0
x_0
x0,自然,
f
f
f对
x
0
x_0
x0的
n
n
n阶导数可直接求出。此时,可间接求得
x
0
x_0
x0附近的点
x
x
x的函数值,求解方法为用一个多项式函数(等号右侧的函数),去近似这个复杂的目标函数(等号左侧的函数),即多项式的值即为
f
(
x
)
f(x)
f(x)的值。
梯度下降法
回到我们问题的目标:
计算一系列点
x
0
,
x
1
,
x
2
,
.
.
.
.
x
n
x_{0},x_{1},x_{2},....x_{n}
x0,x1,x2,....xn的函数值
f
(
x
n
)
f(x_n)
f(xn),来查找最接近
x
∗
x^*
x∗的点,当
f
(
x
n
)
−
f
(
x
∗
)
<
ϵ
f(x_{n})-f(x^*)<\epsilon
f(xn)−f(x∗)<ϵ时,算法终止,这些点必须满足:
f
(
x
n
+
1
)
<
f
(
x
n
)
f(x_{n+1}) < f(x_{n})
f(xn+1)<f(xn)
假设:
- x 0 x_{0} x0为第一个点,即初始点,由于 f f f形式为已知,所以 f ( x 0 ) f(x_0) f(x0)可求得,自然, f f f对 x 0 x_0 x0的 n n n阶导数可直接求出。
- x x x为下一个满足条件 f ( x n + 1 ) < f ( x n ) f(x_{n+1}) < f(x_{n}) f(xn+1)<f(xn)的点
正向推导
根据泰勒公式,取前两项,可得:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x)=f(x_0) + f'(x_0)(x-x_0)
f(x)=f(x0)+f′(x0)(x−x0)
为了
x
x
x满足条件
f
(
x
n
+
1
)
<
f
(
x
n
)
f(x_{n+1}) < f(x_{n})
f(xn+1)<f(xn)即
f
(
x
)
<
f
(
x
0
)
f(x) < f(x_{0})
f(x)<f(x0),可得
f
′
(
x
0
)
(
x
−
x
0
)
<
0
f'(x_0)(x-x_0) <0
f′(x0)(x−x0)<0
为了满足该条件,我们构造一个
x
x
x,很明显当:
(
x
−
x
0
)
=
−
α
f
′
(
x
0
)
,
α
>
0
(x-x_0)= -\alpha f'(x_0),\quad \alpha>0
(x−x0)=−αf′(x0),α>0
时,
f
(
x
)
=
f
(
x
0
)
+
(
−
α
f
′
(
x
0
)
2
)
f(x)=f(x_0) + (-\alpha f'(x_0)^2)
f(x)=f(x0)+(−αf′(x0)2)
使得:
f
(
x
)
<
f
(
x
0
)
f(x) < f(x_{0})
f(x)<f(x0)
这时满足条件的
x
x
x为:
x
=
x
0
−
α
f
′
(
x
0
)
x= x_0-\alpha f'(x_0)
x=x0−αf′(x0)
写成迭代形式:
x
n
+
1
=
x
n
−
α
f
′
(
x
n
)
x_{n+1}= x_n-\alpha f'(x_n)
xn+1=xn−αf′(xn)
这就是 x n x_n xn的迭代公式,其中 α \alpha α为学习率,也叫步长或比例因子, f ′ ( x 0 ) f'(x_0) f′(x0)为搜索方向,也叫步径。这里搜索方向即为目标函数的一阶导数方向,所以该迭代求解方法也叫梯度下降法。
以上步骤是在一元函数上证明了梯度下降的有效性。容易推广到多元函数。
反向证明
假设:
- 当前点为 x 0 x_0 x0
- 下一个迭代点为 x 1 = x 0 + Δ x x_1=x_0+\Delta x x1=x0+Δx
- f f f在 x 0 x_0 x0处的导数值 f ′ ( x 0 ) = a f'(x_0)=a f′(x0)=a
- Δ x \Delta x Δx取 f ′ ( x 0 ) f'(x_0) f′(x0)的反方向,即 Δ x = − α a \Delta x= - \alpha a Δx=−αa
- α ≥ 0 \alpha \geq 0 α≥0,为学习率
根据导数的定义:
f
(
x
0
)
=
lim
Δ
x
→
+
∞
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
Δ
x
=
a
f(x_0) = {\lim_{\Delta x\to +\infty}} \frac{f(x_0+\Delta x) - f(x_0)}{\Delta x} =a
f(x0)=Δx→+∞limΔxf(x0+Δx)−f(x0)=a
Δ
x
\Delta x
Δx很小,但不会为零,所以将其乘到右边可得:
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
=
−
α
a
2
f(x_0+\Delta x) - f(x_0) =-\alpha a^2
f(x0+Δx)−f(x0)=−αa2
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
=
−
α
a
2
≤
0
f(x_0+\Delta x) - f(x_0) =-\alpha a^2 \leq 0
f(x0+Δx)−f(x0)=−αa2≤0
f
(
x
0
+
Δ
x
)
≤
f
(
x
0
)
f(x_0+\Delta x) \leq f(x_0)
f(x0+Δx)≤f(x0)
即:
f
(
x
1
)
≤
f
(
x
0
)
f(x_1) \leq f(x_0)
f(x1)≤f(x0)
即下一个迭代点更趋近最小值。
牛顿法
正向推导
根据泰勒公式,这次我们取前三项,可得:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
1
!
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
(
1
)
f(x)=f(x_0) + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 \quad (1)
f(x)=f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2(1)
因为我们假设
x
x
x是比上一个迭代值
x
0
x_0
x0更接近最小值,不妨假设
x
x
x就是最小值,此时,
f
′
(
x
)
=
0
f'(x)=0
f′(x)=0
即
f
(
x
0
)
+
f
′
(
x
0
)
1
!
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
f(x_0) + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2
f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2对
x
x
x求导为0,即:
f
′
(
x
0
)
x
+
f
′
′
(
x
0
)
2
!
2
x
(
x
−
x
0
)
=
0
f'(x_0)x + \frac{f''(x_0)}{2!}2x(x-x_0) = 0
f′(x0)x+2!f′′(x0)2x(x−x0)=0
可得:
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)
写成迭代公式形式:
x
n
+
1
=
x
n
−
α
f
′
(
x
n
)
f
′
′
(
x
n
)
,
α
>
0
x_{n+1}=x_n - \alpha \frac{f'(x_n)}{f''(x_n)},\quad \alpha>0
xn+1=xn−αf′′(xn)f′(xn),α>0
对比可发现,牛顿法修正了梯度下降的方向。
反向推导
还可以将结果
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)
反代入(1)式:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
1
!
(
−
f
′
(
x
0
)
f
′
′
(
x
0
)
)
+
f
′
′
(
x
0
)
2
!
(
−
f
′
(
x
0
)
f
′
′
(
x
0
)
)
2
f(x)=f(x_0) + \frac{f'(x_0)}{1!}(- \frac{f'(x_0)}{f''(x_0)}) + \frac{f''(x_0)}{2!}(- \frac{f'(x_0)}{f''(x_0)})^2 \quad
f(x)=f(x0)+1!f′(x0)(−f′′(x0)f′(x0))+2!f′′(x0)(−f′′(x0)f′(x0))2
f
(
x
)
=
f
(
x
0
)
−
1
2
f
′
(
x
0
)
2
f
′
′
(
x
0
)
f(x)=f(x_0) - \frac{1}{2} \frac{f'(x_0)^2}{f''(x_0)} \quad
f(x)=f(x0)−21f′′(x0)f′(x0)2
f
(
x
)
−
f
(
x
0
)
=
−
1
2
f
′
(
x
0
)
2
f
′
′
(
x
0
)
f(x)-f(x_0)= - \frac{1}{2} \frac{f'(x_0)^2}{f''(x_0)} \quad
f(x)−f(x0)=−21f′′(x0)f′(x0)2
因为
f
f
f为凸函数,所以二阶导数:
f
′
′
(
x
0
)
≥
0
f''(x_0)\geq0
f′′(x0)≥0
所以:
f
(
x
)
−
f
(
x
0
)
=
−
1
2
f
′
(
x
0
)
2
f
′
′
(
x
0
)
≤
0
f(x)-f(x_0)= - \frac{1}{2} \frac{f'(x_0)^2}{f''(x_0)} \leq0
f(x)−f(x0)=−21f′′(x0)f′(x0)2≤0
f
(
x
)
−
f
(
x
0
)
≤
0
f(x)-f(x_0)\leq0
f(x)−f(x0)≤0
上面的数学推导是用的一元函数,对于多元函数,这个分母存相当于要计算Hessian矩阵的逆矩阵,这是非常困难且耗费时间的。因此,很多牛顿算法的变形出现了,这类变形统称拟牛顿算法。BFGS是用迭代法去近似计算海森矩阵。而BFGS需要额外储存近似的那个海森矩阵,所以有了改进版L-BFGS。
参考:https://blog.csdn.net/qq_28739605/article/details/80862810