🍅 写在前面
👨🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。
🔎个人主页:主页链接(欢迎各位大佬光临指导)
⭐️近期专栏:机器学习与深度学习
LeetCode算法实例
张量分解
凸优化系列知识,详见下方链接:
凸优化学习(1)——什么是凸优化、凸集、凸函数
凸优化学习(2)——梯度类方法求解(gradient descent)
本系列文章主要参考:卡耐基梅隆 凸优化系列课程
目录
- 综述
- gradient descent
- backtracking line search
- exact line search
- subgradient descent
- 次梯度
- proximal gradient descent
综述
1、梯度类方法是无约束方法中最常用的方法之一, 其依据是梯度的负方向就是函数值下降最快的方向。但是,常用的梯度下降(gradient descent)方法中,必须要求目标函数连续且可导,对于连续不可导的问题,梯度下降方法无能为力。
2、这里还将介绍另外两种针对目标函数连续不可导可用的优化方法,分别是subgradient descent 和 proximal gradient descent
gradient descent
一般梯度下降的基本迭代公式为:
x
k
=
x
k
−
1
−
t
k
∇
f
(
x
(
k
−
1
)
)
{x^k} = {x^{k - 1}} - {t_k}\nabla f({x^{(k - 1)}})
xk=xk−1−tk∇f(x(k−1))
式子中的k表示的是第k次迭代,
t
k
{t_k}
tk表示的是学习率(步长),
∇
f
(
x
)
\nabla f({x})
∇f(x)表示的是点在x处的梯度。
这里针对学习率是否改变以及如何改变又有不同的方法。最简单的当然是固定学习率为一个恒定值,但是学习率如果过大或者过小,可能会导致结果难以收敛或者收敛速度很慢。因此,产生了可变学习率的方法。可变学习率的思想是:每次迭代中根据一定规则更新现有的学习率。下面介绍两种可变学习率的方法。
backtracking line search
backtracking line search 方法需要先固定两个参数 α β \alpha \beta αβ,并要求 0 < α < 1 / 2 0<\alpha<1/2 0<α<1/2, 0 < β < 1 0<\beta<1 0<β<1。每次迭代时,计算下列式子判断是否需要更新学习率:
f
(
x
−
t
∇
f
(
x
)
)
>
f
(
x
)
−
α
t
∥
∇
f
(
x
)
∥
2
2
f(x - t\nabla f(x)) > f(x) - \alpha t{\left\| {\nabla f(x)} \right\|_2}^2
f(x−t∇f(x))>f(x)−αt∥∇f(x)∥22
如果式子成立,则改变学习率为
t
=
β
t
t = \beta t
t=βt。这种方法的思想是当步长过大的时候 (即跨过了最优点),减小步长,否则保持步长不变
exact line search
exact line search方法则是先计算出梯度 ∇ f ( x ( k − 1 ) ) \nabla f({x^{(k - 1)}}) ∇f(x(k−1)),然后带入下列函数中,此时函数中只有 t k {t_k} tk学习率未知,因此有对 t k {t_k} tk求导并另导数等于零,求得的 t k {t_k} tk则为当前的最优学习率,因为这个学习率能够令当前迭代下降的距离最大。该方法也被称为最速梯度下降法。
f ( x ( k − 1 ) − t k ∇ f ( x ( k − 1 ) ) ) f({x^{(k - 1)}} - {t_k}\nabla f({x^{(k - 1)}})) f(x(k−1)−tk∇f(x(k−1)))
subgradient descent
subgradient descent用于解决某些函数存在连续不可导,梯度不存在的问题。
次梯度
一个凸函数f在x的次梯度g定义为:
f
(
y
)
≥
f
(
x
)
+
g
T
(
y
−
x
)
f(y) \ge f(x) + {g^T}(y - x)
f(y)≥f(x)+gT(y−x)
次梯度的一些特性:
1、总是存在于定义域dom(f)的内部;
2、如果f在x上是完全可微的,那么其存在唯一的次梯度
g
=
∇
f
(
x
)
g = ∇ f ( x )
g=∇f(x);
3、该次梯度的定义也可以推广到非凸函数中,但非凸函数的次梯度g gg可能不存在。
举例:
f
(
x
)
=
∣
x
∣
f(x) = \left| x \right|
f(x)=∣x∣,在x=0处不可导,图像如下。
其次梯度为:
proximal gradient descent
proximal 通过对原问题的拆分并利用 proximal mapping,能够解决 subgradient descent 无法解决的问题。一般来说,该方法将目标函数转化为一下形式:
f
(
x
)
=
g
(
x
)
+
h
(
x
)
f(x) = g(x) + h(x)
f(x)=g(x)+h(x)
其中,g(x)是凸且可微的,h(x)是凸函数。则proximal gradient descent方法的迭代过程如下:
x
(
k
)
=
x
(
k
−
1
)
−
t
k
G
t
k
(
x
(
k
−
1
)
)
G
t
(
x
)
=
x
−
p
r
o
x
t
h
(
x
−
t
∇
g
(
x
)
)
t
p
r
o
x
t
h
(
x
)
{x^{(k)}} = {x^{(k - 1)}} - {t_k}{G_{tk}}({x^{(k - 1)}}){G_t}(x) = \frac{{x - pro{x_{th}}(x - t\nabla g(x))}}{t}pro{x_{th}}(x)
x(k)=x(k−1)−tkGtk(x(k−1))Gt(x)=tx−proxth(x−t∇g(x))proxth(x)
其中:
p
r
o
x
t
h
(
x
)
=
arg
min
z
∈
R
n
1
2
t
∥
x
−
z
∥
2
2
+
h
(
z
)
pro{x_{th}}(x) = \arg {\min _{z \in {R^n}}}\frac{1}{{2t}}{\left\| {x - z} \right\|_2}^2 + h(z)
proxth(x)=argz∈Rnmin2t1∥x−z∥22+h(z)
以上是本节梯度方法求解凸优化问题,下一节总结对偶方法解决梯度问题。