我们经常会用到梯度下降,那为什么是梯度呢?为什么不是硬度?长度?零度?百度?
优化问题分成无约束优化和有约束优化,有约束优化最终都要调整成无约束优化问题,所以我们直接看无约束优化问题,它的标准形式如下:
min
x
f
(
x
)
\min_{x}f(x)
xminf(x)
严格的数学定义里要求
f
(
x
)
f(x)
f(x)是一个平滑函数,一般来说
x
x
x是向量,比如机器学习里面动不动就是几百维的,我们的目标是找到一个
x
x
x使得
f
(
x
)
f(x)
f(x)最小,小学二年级在学习完微积分后我们知道最小值肯定出现在
f
(
x
)
f(x)
f(x)一阶导数等于0的时候,可以使一阶导数等于0的
x
x
x叫驻点,那你可能就要问了,既然可以得到解析解(analytical solution/closed solution),为什么还要用梯度下降求呢?原因大概如此:如果
f
(
x
)
f(x)
f(x)极其复杂的话,计算它的一阶导数非常困难,其次还得让计算机求解
f
′
(
x
)
=
0
f'(x)=0
f′(x)=0,为了求解一个问题,引入另一个复杂问题~这不是解决问题的思路~所以才会出现优化算法。
求解优化问题肯定脱离不了大概也许是计算机世界最伟大的思想——迭代,给定一个初始的 x x x,叫它 x 0 x_0 x0, 通过某种策略,得到一个新的 x x x,叫它 x 1 x_1 x1,要求 f ( x 1 ) < f ( x 0 ) f(x_1) < f(x_0) f(x1)<f(x0),再找一个新的 x x x,叫 x 2 x_2 x2,同样要求 f ( x 2 ) < f ( x 1 ) f(x_2) < f(x_1) f(x2)<f(x1),一只更新 x x x,一直得到更小的 f ( x ) f(x) f(x),直到您满意为止,如何从 x 0 x_0 x0到 x 1 x_1 x1直到 x n x_n xn就是各种优化算法干的活,大概有两种思路,一种叫线性搜索(Linear Search),另一种叫信任域(Trust Range),Trust Range我没仔细看过,不瞎指挥~梯度下降属于线性搜索。
既然要求 f ( x k + 1 ) < f ( x k ) f(x_{k+1})<f(x_k) f(xk+1)<f(xk),下次迭代的函数值要小于这次的函数值,只要每次迭代都能保证这样,函数值就会一直变小,美好的愿景~~如何得到 x k + 1 x_{k+1} xk+1 呢?这里需要引荐一个人,Taylor
当然不是霉霉,而是下面这位:
以这位泰勒命名的定理,泰勒定理,还记得么?
定理:
设
n
n
n 是一个正整数。如果定义在一个包含
a
a
a的区间上的函数
f
f
f在
a
a
a点处
n
+
1
n+1
n+1次可导,那么对于这个区间上的任意
x
x
x,都有:
f
(
x
)
=
f
(
a
)
+
f
′
(
a
)
1
!
(
x
−
a
)
+
f
(
2
)
(
a
)
2
!
(
x
−
a
)
2
+
⋅
⋅
⋅
+
f
(
n
)
(
a
)
n
!
(
x
−
a
)
n
+
o
[
(
x
−
a
)
n
]
f(x) = f(a) + \frac{{f}'(a)}{1!}(x-a)+ \frac{f^{(2)}(a)}{2!}(x-a)^{2} + \cdot \cdot \cdot + \frac{f^{(n)}(a)}{n!}(x-a)^{n} + o[(x - a)^{n}]
f(x)=f(a)+1!f′(a)(x−a)+2!f(2)(a)(x−a)2+⋅⋅⋅+n!f(n)(a)(x−a)n+o[(x−a)n]
其中的多项式称为函数在
a
a
a处的泰勒展开式,剩余的
R
n
(
x
)
R_n(x)
Rn(x)是泰勒公式的余项,是
(
x
−
a
)
n
(x-a)^n
(x−a)n的高阶无穷小。
上面定理来自维基百科泰勒公式,如果看着很伤,没关系,这不重要,放在我们的情况下可以这样解释,新引入一个
Δ
x
=
x
k
+
1
−
x
k
\Delta x=x_{k+1}-x_{k}
Δx=xk+1−xk,如果这个
Δ
x
\Delta x
Δx足够小的话,
f
(
x
k
+
Δ
x
)
f(x_{k} + \Delta x)
f(xk+Δx)近似等于
f
(
x
k
)
+
∇
f
(
x
k
)
⋅
Δ
x
f(x_k) + \nabla f(x_k) \cdot \Delta x
f(xk)+∇f(xk)⋅Δx,这里为啥把一阶导数换成梯度符号
∇
\nabla
∇,因为帅,当然计算二阶导数会更准确,但是也更复杂了后面咱再聊,我们现在就使用一阶导数近似:
f
(
x
k
+
1
)
=
f
(
x
k
+
Δ
x
)
≈
f
(
x
k
)
+
∇
f
(
x
k
)
⋅
Δ
x
f(x_{k+1}) = f(x_k + \Delta x) \approx f(x_k)+\nabla f(x_k) \cdot \Delta x
f(xk+1)=f(xk+Δx)≈f(xk)+∇f(xk)⋅Δx
x
x
x是向量所以
Δ
x
\Delta x
Δx也是向量,是向量就有两部分长度和方向,我们让
Δ
x
=
α
p
k
\Delta x = \alpha p_k
Δx=αpk
α
\alpha
α是大于0的非常小的常数,叫它步长吧,
p
k
p_k
pk是单位向量,新一轮的函数值可以写成:
f
(
x
k
)
+
α
p
k
T
∇
f
(
x
k
)
f(x_k) + \alpha p_{k}^{T}\nabla f(x_k)
f(xk)+αpkT∇f(xk)
既然要求它小于
f
(
x
k
)
f(x_k)
f(xk) ,所以
α
p
k
T
∇
f
(
x
k
)
\alpha p_{k}^{T}\nabla f(x_k)
αpkT∇f(xk)小于0,既然是让
f
(
x
k
)
+
α
p
k
T
∇
f
(
x
k
)
<
f
(
x
k
)
f(x_k) + \alpha p_{k}^{T}\nabla f(x_k) < f(x_k)
f(xk)+αpkT∇f(xk)<f(xk),反正是走一步,那就尽量让这一步的函数值小一点,索性就让这一次迭代的函数值最小得了,当然是在
α
\alpha
α这个常数一定的情况~~~所以新一轮迭代的要求可以写成:
min
f
(
x
k
)
+
α
p
k
T
∇
f
(
x
k
)
\min f(x_k) + \alpha p_{k}^{T}\nabla f(x_k)
minf(xk)+αpkT∇f(xk)
因为每次迭代
x
x
x都发生了变化,所以每次都可以计算上面这个最小化问题,大概跟下山一样(NG的视频这样形容),每次下降到一个位置,就需要重新选择一个方向继续下降。其中
f
(
x
k
)
f(x_k)
f(xk) 是上一轮的函数值,已知,
α
\alpha
α大于0的很小的常数,事先给定的,已知,与下面的最小化是等价的:
min
p
k
T
∇
f
(
x
k
)
\min p_{k}^{T}\nabla f(x_k)
minpkT∇f(xk)
啰嗦一句,最小化
p
k
T
∇
f
(
x
k
)
p_{k}^{T}\nabla f(x_k)
pkT∇f(xk)就是最小化
f
(
x
k
)
+
α
p
k
T
∇
f
(
x
k
)
f(x_k) + \alpha p_{k}^{T}\nabla f(x_k)
f(xk)+αpkT∇f(xk),也就是最小化
f
(
x
k
+
Δ
x
)
f(x_k + \Delta x)
f(xk+Δx),也就是最小化
f
(
x
k
+
1
)
f(x_{k+1})
f(xk+1),意思就是,下一步在步长
α
\alpha
α固定的情况下尽可能的让
f
(
x
k
+
1
)
f(x_{k+1})
f(xk+1)小,每一次迭代都尽可能的小,直到到达某个
x
x
x稳定下来~其实这个思路非常贪婪,很可能会掉入局部最小值无法自拔,当然也有解决思路,有机会聊~
min
p
k
T
∇
f
(
x
k
)
\min p_{k}^{T}\nabla f(x_k)
minpkT∇f(xk)怎么解?两个向量做乘法,假如两个向量的夹角
θ
\theta
θ,看下图:
根据向量乘法的定义
p
k
T
∇
f
(
x
k
)
=
∥
p
k
∥
∥
∇
f
(
x
k
)
∥
cos
θ
p_k^T\nabla f(x_k)=\left \| p_k \right \|\left \| \nabla f(x_k) \right \| \cos \theta
pkT∇f(xk)=∥pk∥∥∇f(xk)∥cosθ,其中
∥
p
k
∥
∥
∇
f
(
x
k
)
∥
\left \| p_k \right \|\left \| \nabla f(x_k) \right \|
∥pk∥∥∇f(xk)∥是大于0的,
cos
θ
\cos \theta
cosθ最小等于-1,于是
p
k
T
∇
f
(
x
k
)
p_k^T\nabla f(x_k)
pkT∇f(xk)最小等于
−
∥
p
k
∥
∥
∇
f
(
x
k
)
∥
-\left \| p_k \right \|\left \| \nabla f(x_k) \right \|
−∥pk∥∥∇f(xk)∥,此时
θ
=
18
0
∘
\theta = 180^{\circ}
θ=180∘,像这样:
p
k
p_k
pk和
∇
f
(
x
k
)
\nabla f(x_k)
∇f(xk)的方向是相反的,向量表示就是
p
k
=
−
∇
f
(
x
k
)
p_k=-\nabla f(x_k)
pk=−∇f(xk),有没有一种似曾相识的感觉,没错,梯度下降的公式终于出现了,新一轮可以使
f
(
x
k
+
1
)
f(x_{k+1})
f(xk+1)尽可能小移动方向是负梯度方向~梯度下降~
如果每次我们都选择负梯度方向更新x,在保证
f
(
x
k
+
Δ
x
)
<
f
(
x
k
)
f(x_k + \Delta x) < f(x_k)
f(xk+Δx)<f(xk)的同时,还能保证
f
(
x
k
+
Δ
x
)
f(x_k + \Delta x)
f(xk+Δx)一直是最小的,每次迭代都会更新
x
x
x,所以下次又可以计算
min
f
(
x
k
+
Δ
x
)
\min f(x_k + \Delta x)
minf(xk+Δx) ,这样一直迭代下去,总是会找到一个
x
x
x使得
f
(
x
)
f(x)
f(x)最小~当然可能是局部最小。
PS:
既然保证每次迭代
f
(
x
k
+
1
)
<
f
(
x
k
)
f(x_{k+1}) < f(x_k)
f(xk+1)<f(xk),也就是
p
k
T
∇
f
(
x
k
)
p_{k}^{T}\nabla f(x_k)
pkT∇f(xk) 小于0就可以,所以
p
k
p_k
pk不一定非要选择负梯度方向,只要
α
\alpha
α足够小,
p
k
p_k
pk选择下图左边蓝色区域的任意方向,都以保证新一轮的
f
(
x
k
+
1
)
小
于
f
(
x
k
)
f(x_{k+1})小于f(x_k)
f(xk+1)小于f(xk)。
参考文献:
- Jorge NocedalStephen J. Wright, Numerical Optimization