这篇文章来写一下梯度下降算法和拟牛顿算法
先来看一下上篇文章中的一些东西
Lagrange对偶函数的鞍点解释
(1)为表述方便,假设没有等式约束,只考虑不等式约束,结论可方便的扩展到等式约束
(2)假设
x
0
x_0
x0不可行,即存在某些i,使得
f
i
(
x
)
>
0
f_i(x)>0
fi(x)>0,则选择
λ
i
→
∞
\lambda_i\to∞
λi→∞,对于其他乘子,
λ
j
=
0
,
j
≠
i
\lambda_j=0,j≠i
λj=0,j=i
(3)假设
x
0
x_0
x0可行,则有
f
i
(
x
)
≤
0
,
(
i
=
1
,
2
,
.
.
.
,
m
)
f_i(x)≤0,(i=1,2,...,m)
fi(x)≤0,(i=1,2,...,m),选择:
λ
i
=
0
,
1
,
2
,
.
.
.
,
m
\lambda_i=0,1,2,...,m
λi=0,1,2,...,m
有:
鞍点:最优点
原问题是:
i
n
f
x
f
0
(
x
)
\qquad \underset{x}{inf}f_0(x)
xinff0(x)
从而,原问题的本质为:
i
n
f
x
s
u
p
λ
≥
0
L
(
x
,
λ
)
\underset{x}{inf} \underset {\lambda≥0}{sup} L(x,\lambda)
xinfλ≥0supL(x,λ)
而对偶问题,是求对偶函数的最大值,即:
s
u
p
λ
≥
0
i
n
f
x
L
(
x
,
λ
)
\underset {\lambda≥0}{sup} \underset{x}{inf} L(x,\lambda)
λ≥0supxinfL(x,λ)
而:
s
u
p
λ
≥
0
i
n
f
x
L
(
x
,
λ
)
≤
i
n
f
x
s
u
p
λ
≥
0
L
(
x
,
λ
)
\underset {\lambda≥0}{sup} \underset{x}{inf} L(x,\lambda)≤\underset{x}{inf} \underset {\lambda≥0}{sup} L(x,\lambda)
λ≥0supxinfL(x,λ)≤xinfλ≥0supL(x,λ)
即,先求极小值再求极大值的情况肯定不如先求极大值再求极小值
这个结论我们后面还会用到的
预备题目
已知二次函数的一个点函数值和导数值,以及另外一个点的函数值,如何确定该函数的的解析式?
(1)即:二次函数
f
(
x
)
f(x)
f(x),已知
f
(
a
)
,
f
′
(
a
)
,
f
(
b
)
,
求
f
(
x
)
f(a),f^{'}(a),f(b),求f(x)
f(a),f′(a),f(b),求f(x)
(2)特殊的,若a=0,题目变成:
对于二次函数
f
(
x
)
,
已
知
f
(
0
)
,
f
′
(
0
)
,
f
(
a
)
,
求
f
(
x
)
f(x),已知f(0),f^{'}(0),f(a),求f(x)
f(x),已知f(0),f′(0),f(a),求f(x)
从线性回归谈起
y
=
a
x
+
b
=
a
x
1
+
b
x
0
,
其
中
,
x
0
=
1
y=ax+b=ax_1+bx_0,其中,x_0=1
y=ax+b=ax1+bx0,其中,x0=1
多个变量的情形
考虑两个变量:
θ
\theta
θ的解析式的求解过程
(1)将M个N维样本组成矩阵X:
a.其中,X的每一行对应一个样本,共M个样本
b.X的每一列对应样本的一个维度,共N维:其实还有额外的一维常数项,全为1
(2)一个比较“符合常理”的误差函数为:
(3)已经论证:最小二乘建立的目标函数,是在高斯噪声的假设下,利用极大似然估计的方法建立的。
梯度下降法
(1)初始化
θ
\theta
θ(随机初始化)
(2)迭代,新的
θ
\theta
θ能够使得
J
(
θ
)
J(\theta)
J(θ)更小
(3)如果
J
(
θ
)
J(\theta)
J(θ)能够继续减少,返回(2)
α称为学习率/步长
梯度方向
思考:(1)学习率α如何确定
a.使用固定学习率还是变化学习率
b.学习率设置多大比较好?
(2)下降方向
a.处理梯度方向,其他方向是否可以?
b.可行方向和梯度方向有何关系?
实验:固定学习率的梯度下降
y
=
x
2
y=x^2
y=x2,初值取x=1.5,学习率使用0.01
从上图可以看出,效果还是非常不错的,经过200次迭代,x=0.0258543,经过1000次迭代,
x
=
2.52445
∗
1
0
−
9
x=2.52445*10^{-9}
x=2.52445∗10−9
实验2:
y
=
x
4
y=x^4
y=x4,初值取x=1.5,学习率使用0.01
效果还是比较欠缺的,经过200次迭代,x=0.24436;经过1000次迭代,x=0.111275,并且迭代后期下降速率变得很慢
优化学习率
(1)分析“学习率α”在
f
(
x
)
f(x)
f(x)中的意义
(2)调整学习率:
a.在斜率(方向导数)大的地方,使用小学习率
b.在斜率(方向导数)小的地方,使用大学习率
梯度下降的运行过程分析
(1)
x
k
=
a
x_k=a
xk=a,沿着负梯度方向,移动到
x
k
+
1
=
b
x_{k+1}=b
xk+1=b,有:
(2)从
x
0
x_0
x0为出发点,每次沿着当前函数梯度反方向移动移动距离
α
k
α_k
αk,得到序列:
x
0
,
x
1
,
x
2
,
.
.
.
,
x
n
x_0,x_1,x_2,...,x_n
x0,x1,x2,...,xn
(3)对应的各点函数值序列之间的关系为:
f
(
x
0
)
≥
f
(
x
1
)
≥
f
(
x
2
)
≥
.
.
.
≥
f
(
x
n
)
f(x_0)≥f(x_1)≥f(x_2)≥...≥f(x_n)
f(x0)≥f(x1)≥f(x2)≥...≥f(xn)
(4)当n达到一定值时,函数
f
(
x
)
f(x)
f(x)收敛到局部最小值
视角转换
(1)记当前点为
x
k
x_k
xk,当前搜索方向为
d
k
d_k
dk(如,负梯度方向),因为学习率α是待考察的对象,因此,将下列函数
f
(
x
k
+
α
d
k
)
f(x_k+αd_k)
f(xk+αdk)看做关于α的函数
h
(
α
)
h(α)
h(α)
h
(
α
)
=
f
(
x
k
+
α
d
k
)
,
α
>
0
h(α)=f(x_k+αd_k),α>0
h(α)=f(xk+αdk),α>0
(2)当α=0时,
h
(
0
)
=
f
(
x
k
)
h(0)=f(x_k)
h(0)=f(xk)
(3)导数:
学习率α的计算标准
(1)因为梯度下降是寻找
f
(
x
)
f(x)
f(x)的最小值,那么,在
x
k
x_k
xk和
d
k
d_k
dk给定的前提下,即寻找函数
f
(
x
k
+
α
d
k
)
f(x_k+αd_k)
f(xk+αdk)的最小值,即:
进一步,如果h(α)可导,局部最小值处的α满足:
学习率函数导数的分析
(1)将α=0代入:
(2)下降方向
d
k
d_k
dk可以选负梯度方向
或者选择与负梯度方向夹角小于90°的某方向
(3)从而:
h
′
(
0
)
<
0
h^{'}(0)<0
h′(0)<0
(4)如果能够找到足够大的α,使得
h
′
(
a
^
)
>
0
h^{'}(\hat{a})>0
h′(a^)>0
(5)则必存在某α,使得
h
′
(
a
∗
)
=
0
h^{'}(a^*)=0
h′(a∗)=0
(6)
a
∗
a^*
a∗即为要寻找的学习率
线性搜索(Line Search)
最简单的处理方式
(1)二分线性搜索(Bisection Line Search)
(2)不断将区间
[
a
1
,
a
2
]
[a_1,a_2]
[a1,a2]分成两半,选择端点异号的一侧,直到区间足够小或者找到当前最优学习率
回溯线性搜索(Backing Line Search)
基于Armijo准则计算搜索方向上的最大步长,其基本思想是沿着搜索方向移动一个较大的步长估计值,然后以迭代形式不断缩减步长,直到该步长使得函数值
f
(
x
k
+
α
d
k
)
f(x_k+αd_k)
f(xk+αdk)相对于当前函数值
f
(
x
k
)
f(x_k)
f(xk)的减小程度大于预设的期望值(即满足Armijo准则)为止。
回溯与二分线性搜索的异同
(1)二分线性搜索的目标是求得满足
h
′
(
α
)
≈
0
h^{'}(α)≈0
h′(α)≈0的最优步长近似值,而回溯线性搜索放松了对步长的约束,只要步长能使函数值有足够大的变化即可
(2)二分线性搜索可以减少下降次数,但在计算最优步长上花费了不少代价;回溯线性搜索找到一个差不多的步长即可
回溯线性搜索的思考:插值法
(1)采样多项式插值法(Interpolation)拟合简单函数,然后根据该简单函数估计函数的极值点,这样选择合适步长的概率会高很多
(2)现在拥有的数据为:
x
k
x_k
xk处的函数值
f
(
x
k
)
f(x_k)
f(xk)及其导数
f
′
(
x
k
)
f^{'}(x_k)
f′(xk),再加上第一次尝试的步长
α
0
α_0
α0,如果
α
0
α_0
α0满足条件,显然算法退出;若
α
0
α_0
α0不满足条件,则根据上述信息可以构造一个二次近似函数:
二次插值法求极值
显然,导数为0的最优值为:
若
a
1
a_1
a1满足Armijo准则,则输出该学习率;否则,继续迭代
实验:二次插值线性搜索寻找学习率
y
=
x
4
y=x^4
y=x4,初值取x=1.5,二次插值线性搜索方法
分析:效果还不错,经过12次迭代,x=0.0000282229
经过100次迭代,
x
=
3.61217
∗
1
0
−
7
x=3.61217*10^{-7}
x=3.61217∗10−7
总结与思考
(1)通过使用线性搜索的方式,能够比较好的解决学习率问题
(2)一般的说,回溯线性搜索和二次差值线性搜索能够基本满足实践中的需要
搜索方向
(1)若搜索方向不是严格梯度方向, 是否可以?
思考:因为函数二阶导数反映了函数的凹凸性;二阶导越大,一阶导的变化越大。在搜索中,可否用二阶导做些“修正”?如:二者相除?
附:平方根算法
在任意点
x
0
x_0
x0处Taylor展开
令
f
(
x
)
=
x
2
−
a
,
即
f
(
x
)
=
0
f(x)=x^2-a,即f(x)=0
f(x)=x2−a,即f(x)=0
实验:搜索方向的探索
y
=
x
4
y=x^4
y=x4,初值取x=1.5,搜索方向为负梯度除以二阶导
效果出奇的好!经过12次迭代,x=0.00770735
经过100次迭代,
x
=
3.68948
∗
1
0
−
18
x=3.68948*10^{-18}
x=3.68948∗10−18
试比较二次插值线性搜索时:经过12次迭代,x=0.0000282229
经过100次迭代,
x
=
3.61217
∗
1
0
−
7
x=3.61217*10^{-7}
x=3.61217∗10−7
虽然经过12次迭代的值还是有些欠缺,但是100次迭代后效果已经非常好了
分析上述结果的原因
若
f
(
x
)
f(x)
f(x)二阶导连续,将
f
(
x
)
f(x)
f(x)在
x
k
x_k
xk处Taylor展开:
这就是牛顿迭代法
该方法可以直接推广到多维,用方向导数代替一阶导,用Hessian矩阵代替二阶导
牛顿法的特点
(1)经典牛顿法虽然具有二次收敛性,但是要求初始点需要尽量靠近极小点,否则有可能不收敛
(2)计算过程中需要计算目标函数的二阶偏导数,难度较大
(3)目标函数的Hessian矩阵无法保持正定,会导致算法产生的方向不能保证是f在
x
k
x_k
xk处的下降方向, 从而令牛顿法失效
(4)如果Hessian矩阵奇异,牛顿方向可能根本是不存在的
拟牛顿的思路
(1)求Hessian矩阵的逆影响算法效率,同时,搜索方向只要和负梯度的夹角小于90°即可,因此,可以用近似矩阵代替Hessian矩阵,只要满足该矩阵正定,容易求逆,或者可以通过若干步递推公式计算得到
a.BFGS/LBFGS
拟牛顿里面最著名的要属BFGS了
BFGS
矩阵迭代公式:
初值选单位阵
B
0
=
I
B_0=I
B0=I
记:
C
k
≈
H
k
−
1
C_k≈H_k^{-1}
Ck≈Hk−1
有:
ok,暂且到这里,虽然很乱也很难,但是认真看看还是可以学会哒