目录标题
一.前置知识
在求解机器学习算法的模型参数时,梯度下降法(Gradient Descent)是最常用的方法之一,另一种最常用的是最小二乘法。学习梯度下降法之前,需要了解导数、偏导数、方向导数和梯度的概念。
1.导数
上图为导数的概念示意图,导数的定义如下:
f
′
(
x
0
)
=
lim
Δ
x
−
>
0
△
y
△
x
=
l
i
m
Δ
x
−
>
0
f
(
x
0
+
△
x
)
−
f
(
x
0
)
△
x
f'(x_0)=\lim_{\Delta x->0} \frac{△y}{△x}=lim_{\Delta x->0}\frac{f(x_0+△x)-f(x_0)}{△x}
f′(x0)=Δx−>0lim△x△y=limΔx−>0△xf(x0+△x)−f(x0)
符号 | 含义 |
---|---|
f ′ ( x 0 ) f'(x_0) f′(x0) | 函数 f f f 在 x 0 x_0 x0 处的导数 |
Δ x \Delta x Δx | x x x 的变化量 |
Δ y = f ( x 0 + Δ x ) − f ( x 0 ) \Delta y=f(x_0+\Delta x)-f(x_0) Δy=f(x0+Δx)−f(x0) | 函数的增量 |
l i m ‾ Δ x → 0 \varliminf_{\Delta x\to0} limΔx→0 | Δ x \Delta x Δx 趋近于0 |
d x dx dx | x x x 的变化量 Δ x \Delta x Δx 趋近于0 |
d y dy dy | f ′ ( x 0 ) d x f'(x_0)dx f′(x0)dx |
f ′ ( x 0 ) f'(x_0) f′(x0) 反应的是函数 y = f ( x ) y=f(x) y=f(x)在 x x x 轴上某一点处沿 x x x 轴正方向的变化率/变化趋势。如果 f ′ ( x ) > 0 f'(x)>0 f′(x)>0 ,说明函数的值沿着 x x x 轴正方向趋于增加,反之则趋于减少。
2.偏导数
偏导数的定义如下:
∂
f
(
x
0
,
x
1
,
.
.
.
x
n
)
∂
x
i
=
lim
Δ
x
−
>
0
△
y
△
x
=
lim
Δ
x
−
>
0
f
(
x
0
,
.
.
.
x
i
+
Δ
x
,
.
.
.
x
n
)
−
f
(
x
0
,
.
.
.
x
i
,
.
.
.
x
n
)
△
x
\frac{\partial f(x_0,x_1,...x_n)}{\partial x_i}=\lim_{\Delta x->0} \frac{△y}{△x}=\lim_{\Delta x->0} \frac{f(x_0,...x_i+\Delta x,...x_n)-f(x_0,...x_i,...x_n)}{△x}
∂xi∂f(x0,x1,...xn)=Δx−>0lim△x△y=Δx−>0lim△xf(x0,...xi+Δx,...xn)−f(x0,...xi,...xn)
可以看到,导数与偏导的本质一样,也是函数在某一点沿坐标轴正方向的变化率。不过它们的区别在于:
-
导数指的是在一元函数中,函数 y = f ( x ) y=f(x) y=f(x) 在某一点沿 x x x 轴正方向的变化率;
-
偏导数指的是在多元函数中,函数 y = f ( x 0 , x 1 , . . . , x n ) y=f(x_0,x_1,...,x_n) y=f(x0,x1,...,xn) 在某一点沿某一坐标轴 ( x 0 , x 1 , . . . x n ) (x_0,x_1,...x_n) (x0,x1,...xn) 正方向的变化率。
3.方向导数
方向导数定义如下:
∂
f
(
x
0
,
x
1
,
.
.
.
x
n
)
∂
l
=
lim
Δ
ρ
−
>
0
△
y
△
x
=
lim
Δ
ρ
−
>
0
f
(
x
0
+
Δ
x
,
.
.
.
x
i
+
Δ
x
,
.
.
.
x
n
+
Δ
x
)
−
f
(
x
0
,
.
.
.
x
i
,
.
.
.
x
n
)
ρ
\frac{\partial f(x_0,x_1,...x_n)}{\partial l}=\lim_{\Delta\rho ->0} \frac{△y}{△x}=\lim_{\Delta\rho ->0} \frac{f(x_0+\Delta x,...x_i+\Delta x,...x_n+\Delta x)-f(x_0,...x_i,...x_n)}{\rho}
∂l∂f(x0,x1,...xn)=Δρ−>0lim△x△y=Δρ−>0limρf(x0+Δx,...xi+Δx,...xn+Δx)−f(x0,...xi,...xn)
其中:
ρ
=
(
Δ
x
0
)
2
+
.
.
.
+
(
Δ
x
i
)
2
+
.
.
.
+
(
Δ
x
n
)
2
,
l
\rho=\sqrt{(\Delta x_0)^2+...+(\Delta x_i)^2+...+(\Delta x_n)^2},l
ρ=(Δx0)2+...+(Δxi)2+...+(Δxn)2,l 表示某个方向。
我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),也要知道函数在任意方向的变化率,前面的导数和偏导数都是沿坐标轴正方向讨论函数的变化率,而此处的方向导数就是函数在其他特定方向上的变化率。
4.代价函数
代价函数也称为损失函数,英文名为 l o s s f u n c t i o n loss function lossfunction 或 c o s t f u b c t i o n costfubction costfubction ,不过它们有个细微的差别,损失函数是定义在单个样本上的,算的是一个样本的误差,而代价函数计算的是整个训练集上所有样本误差的平均值。不过,实际中并不太会细致区分。
代价函数的可以理解为一个人为定义的函数,我们用过训练代价函数来求得深度学习机器学习算法函数的参数最优解,代价函数的值越小,说明模型的预测值越接近真实的标签值,而算法的效果效果越好(当然也并不是绝对的,大部分算法适用于这一规则,小部分并不是这样,比如生成对抗网络,损失值的大小有时候和模型好坏基本没有相关关系)。最为常见的代价函数就是均方差代价函数(Mean-Square Error,MSE),也称为二次代价函数。
均方差代价函数公式:
E
=
1
2
M
(
T
−
Y
)
2
=
1
2
M
∑
i
=
1
M
(
t
i
−
y
i
)
2
E=\frac{1}{2M}(T-Y)^2=\frac{1}{2M}\sum_{i=1}^{M}(t_i-y_i)^2
E=2M1(T−Y)2=2M1i=1∑M(ti−yi)2
其中
T
T
T 表示真实标签,
Y
Y
Y 表示算法的输出,
i
i
i 表示样本的序号,
M
M
M 表示样本数量,
2
M
2M
2M 中的没有特殊意义,只是为了求导时计算方便约掉2次方的2。
二.梯度下降法
1.梯度
(1).定义
在微积分里面,对一个多元函数的参数求偏导数,并把求得的各个参数的偏导数以向量的形式写出来,就是所谓的梯度。比如函数
f
(
x
,
y
)
f(x,y)
f(x,y) ,分别对
x
,
y
x,y
x,y 求偏导数,求得的梯度向量就是 (∂f/∂ x)^T,简称
g
r
a
d
f
(
x
,
y
)
gradf(x,y)
gradf(x,y) 或者
▽
f
(
x
,
y
)
\triangledown f(x,y)
▽f(x,y) 。扩展到多元函数,则梯度的定义如下:
g
r
a
d
f
(
x
0
,
x
1
,
.
.
.
x
n
)
=
(
∂
f
∂
x
0
,
.
.
.
,
∂
f
∂
x
i
,
.
.
.
,
∂
f
∂
x
n
)
gradf(x_0,x_1,...x_n) = (\frac {\partial f}{\partial x_0},...,\frac {\partial f}{\partial x_i},...,\frac {\partial f}{\partial x_n})
gradf(x0,x1,...xn)=(∂x0∂f,...,∂xi∂f,...,∂xn∂f)
(2).性质
- 梯度是一个向量,有大小有方向;
- 梯度的方向就是最大方向导数的方向;
- 梯度的值是最大方向导数的值。
- 梯度的模是该点上方向导数的最大值,梯度的模等于:
∣ g r a d f ( x 0 , x 1 , . . . x n ) ∣ = ( ∂ f ∂ x 0 ) 2 + . . . + ( ∂ f ∂ x i ) 2 + . . . + ( ∂ f ∂ x n ) 2 |gradf(x_0,x_1,...x_n)|=\sqrt{{(\frac{\partial f}{\partial x_0})^2}+...+{(\frac{\partial f}{\partial x_i})^2}+...+{(\frac{\partial f}{\partial x_n})^2}} ∣gradf(x0,x1,...xn)∣=(∂x0∂f)2+...+(∂xi∂f)2+...+(∂xn∂f)2
(3).意义
对于 y = f ( x 0 , x 1 , . . . , x n ) y=f(x_0,x_1,...,x_n) y=f(x0,x1,...,xn) 上的某一点来说存在很多个方向导数,从几何上来讲,沿着梯度向量方向就是函数增长最快的方向,更容易找到函数的最大值,反之,沿着梯度向量相反的方向,更容易找到函数的最小值。
2.梯度下降法定义
既然在空间某一点处,函数沿梯度方向具有最大的变化率,那么在最小化损失函数的时候,我们就可以沿着负梯度方向去减小代价函数的值,称其为梯度下降法,通过一步步的迭代求解,得到最终的模型参数值。迭代过程可描述如下(
η
\eta
η 表示学习率。):
模型的参数一般用
w
w
w 或
θ
\theta
θ 表示,所以梯度下降法的优化公式可表示如下(此处用
w
w
w 表示):
w
=
w
−
η
∂
f
∂
w
w=w-\eta\frac{\partial f}{\partial w}
w=w−η∂w∂f
3.梯度下降法举例解释
(1).梯度下降法二维例子
假定代价函数只有一个参数 w w w ,参数 w w w 与代价函数 l o s s loss loss 的关系如下:
假设 w w w 的初始值是-5,我们需要使用梯度下降法来不断优化 w w w 的取值,使 l o s s loss loss 不断减少,首先应该计算 w = − 5 w=-5 w=−5 时的梯度,结果如下:
当 w = − 5 w=-5 w=−5 时, w w w 所处的位置的梯度是一个负数,梯度下降法在优化代价函数时,是沿着负梯度的方向去减小代价函数的值, w w w 在更新时会减去梯度,减去负数相当于加一个整数,所以 w w w 的值此时会变大。根据梯度下降法的优化公式 w = w − η ∂ f ∂ w w=w-\eta\frac{\partial f}{\partial w} w=w−η∂w∂f , η \eta η 一般是0到1之间的正数,所以 w w w 变大的程度和 η \eta η 有关。
假设 w w w 变大移动到了 w = 4 w=4 w=4 的位置,此时需要再次计算 w = 4 w=4 w=4 的梯度,结果如下图所示:
当 w = 4 w=4 w=4 时, w w w 所处的位置的梯度是一个正数,梯度下降法在优化代价函数时,是沿着负梯度的方向去减小代价函数的值, w w w 在更新时会减去梯度,减去正数时 w w w 的值会变小。根据梯度下降法的优化公式 w = w − η ∂ f ∂ w w=w-\eta\frac{\partial f}{\partial w} w=w−η∂w∂f, η \eta η 一般是0到1之间的正数,所以 w w w 变大的程度和 η \eta η 有关。假设经过若干次计算后, w w w 的值最终位于曲线最底部,那么此时 w w w 取得最优解,算法结束。
总结:不管 w w w 初始值是多少,当 w w w 向着负梯度方向移动时,其实是向着 l o s s loss loss 最小的地方移动,就类似于山谷有一个小球,小球最终是朝着谷底的方向运行,而每一次移动的步伐大小和学习率 η \eta η 有很大关系,学习率太大不行,太小也不行。
(2).梯度下降法三维例子
假定代价函数有两个参数 w 1 , w 2 w_1,w_2 w1,w2 ,参数 w 1 , w 2 w_1,w_2 w1,w2 与代价函数 l o s s loss loss 的关系如下:
在图中随机选取两个 w 1 w1 w1 和 w 2 w2 w2 的初始值 p 1 p1 p1 和 p 2 p2 p2,然后从 p 1 , p 2 p1,p2 p1,p2 这两个初始位置,开始使用梯度下降法优化网络参数,得到的结果如下图所示:
算法网络参数优化的过程,就是 w 1 , w 2 w_1,w_2 w1,w2 两个小球从初始点开始,每次移动一步,就是在向谷底移动,在向 l o s s loss loss 最小的地方移动。其中 p 1 p1 p1 最后移动到了全局最小值的位置,而 p 2 p2 p2 走到了局部极小值的位置,说明不同的参数初始值模型训练后的结果会有所不同,这是梯度下降法存在的一个缺点,一个模型多训练几次,取最好结果即可。
4.梯度下降法算法描述
(1).代数方法描述
-
确定优化模型的假设函数及损失函数
假设函数为:
f w ( x 0 , x 1 , . . . , x n ) = ∑ i = 0 n w i x i = w 0 x 0 + w 2 x 1 + . . . + w n x n f_w(x_0,x_1,...,x_n)=\sum_{i=0}^{n}w_ix_i=w_0x_0+w_2x_1+...+w_nx_n fw(x0,x1,...,xn)=i=0∑nwixi=w0x0+w2x1+...+wnxn 其中 w i , x i ( i = 0 , 1 , 2 , . . . , n ) w_i,x_i(i=0,1,2,...,n) wi,xi(i=0,1,2,...,n) 分别为模型参数、每个样本的特征值。
损失函数为MSE: J ( w 0 , w 1 , . . . , w n ) = 1 2 m ∑ j = 0 m ( f w ( x 0 j , x 1 j , . . . , x n j ) − y j ) 2 J(w_0,w_1,...,w_n)=\frac{1}{2m}\sum_{j=0}^{m}(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)^2 J(w0,w1,...,wn)=2m1j=0∑m(fw(x0j,x1j,...,xnj)−yj)2 其中 m , j m,j m,j 分别为样本的数量、当前样本序号。 -
参数初始化
符号 值 w i w_i wi 初始化为0或者随机初始化 η \eta η 0到1的小数,根据经验而定 l l l 终止距离 -
迭代计算(4小步)
-
计算当前位置损失函数的梯度,对于 w i w_i wi,其梯度表示为
∂ J ( w 0 , w 1 , . . . , w n ) ∂ w i = 1 m ∑ j = 0 m ( f w ( x 0 j , x 1 j , . . . , x n j ) − y j ) x i j \frac{\partial J(w_0,w_1,...,w_n)}{\partial w_i}=\frac{1}{m}\sum_{j=0}^{m}(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)x_i^j ∂wi∂J(w0,w1,...,wn)=m1j=0∑m(fw(x0j,x1j,...,xnj)−yj)xij -
计算当前位置下降的距离
φ i = η ∂ J ( w 0 , w 1 , . . . , w n ) ∂ w i \varphi_i=\eta\frac{\partial J(w_0,w_1,...,w_n)}{\partial w_i} φi=η∂wi∂J(w0,w1,...,wn) -
判断是否终止
判断所有的 φ \varphi φ 是否都小于终止距离 l l l ,如果是则算法终止,否则进行下一小步。 -
更新 w i w_i wi,并返回第1小步计算下个位置的数据
w i = w i − η ∂ J ( w 0 , w 1 , . . . , w n ) ∂ w i w i = w i − η 1 m ∑ j = 0 m ( f w ( x 0 j , x 1 j , . . . , x n j ) − y j ) x i j w_i=w_i-\eta\frac{\partial J(w_0,w_1,...,w_n)}{\partial w_i}\\ w_i=w_i-\eta\frac{1}{m}\sum_{j=0}^{m}(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)x_i^j\\ wi=wi−η∂wi∂J(w0,w1,...,wn)wi=wi−ηm1j=0∑m(fw(x0j,x1j,...,xnj)−yj)xij
-
(2).矩阵方法描述
-
确定优化模型的假设函数及损失函数
假设函数为:
f w ( X ) = X W f_w(X)=XW fw(X)=XW X X X 为mx(n+1)的向量, W W W 为 (n+1)x1 的向量。
损失函数为MSE: J ( W ) = 1 2 ( X W − Y ) T ( X W − Y ) J(W)=\frac{1}{2}(XW-Y)^T(XW-Y) J(W)=21(XW−Y)T(XW−Y) 其中 Y Y Y 为mx1的样本输出向量 -
参数初始化
符号 值 w i w_i wi 初始化为0或者随机初始化 η \eta η 0到1的小数,根据经验而定 l l l 终止距离 -
迭代计算(4小步)
-
计算当前位置损失函数的梯度,对于 w i w_i wi,其梯度表示为
∂ J ( W ) ∂ w \frac{\partial J(W)}{\partial w} ∂w∂J(W) -
计算当前位置下降的距离
η ∂ J ( W ) ∂ w \eta\frac{\partial J(W)}{\partial w} η∂w∂J(W) -
判断是否终止
判断 W W W 向量中的每个值是否都小于终止距离 l l l ,如果是则算法终止,否则进行下一小步。
-
更新 w i w_i wi,并返回第1小步计算下个位置的数据
W = W − η ∂ J ( W ) ∂ w W=W-\eta\frac{\partial J(W)}{\partial w} W=W−η∂w∂J(W)
-
三.梯度下降法常用算法
梯度下降法有三种常见的变形,BGD,SGD,MBGD,通常把梯度下降法称为随机梯度下降法SGD,但是通常用的是MBGD。
定义 | 优点 | 缺点 | |
---|---|---|---|
BGD(批量梯度下降) | 每次迭代需要计算所有样本上损失函数的梯度,再求和 | 全局最优化 | 计算量大,迭代速度慢 |
SGD(随机梯度下降) | 每次迭代只计算一个样本损失函数的梯度,并更新参数 | 训练速度快 | 准确率小,存在噪音,非全局最优化 |
MBGD(小批量梯度下降) | 每次迭代时,随机选取一小部分样本来计算梯度并更新参数 | 效率高 | 准确率不如BGD,非全局最优解 |
1.批量梯度下降法BGD
批量梯度下降法(Batch Gradient Desent),是梯度下降法最常用的形式,具体做法是在更新参数时使用所有的样本来进行更新,二.4 中讲解的就是这种算法。
w
i
=
w
i
−
η
1
m
∑
j
=
0
m
(
f
w
(
x
0
j
,
x
1
j
,
.
.
.
,
x
n
j
)
−
y
j
)
x
i
j
w_i=w_i-\eta\frac{1}{m}\sum_{j=0}^{m}(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)x_i^j
wi=wi−ηm1j=0∑m(fw(x0j,x1j,...,xnj)−yj)xij
假设初始有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据,得到的虽然是一个最优解,但每迭代一步都需要用到所有数据,如果数据量很大,这种方法的速度会很慢。
2.随机梯度下降法SGD
随机梯度下降法(Stochastic Gradient Descent),原理和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本来求梯度。对应的更新公式是:
w
i
=
w
i
−
η
(
f
w
(
x
0
j
,
x
1
j
,
.
.
.
,
x
n
j
)
−
y
j
)
x
i
j
w_i=w_i-\eta(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)x_i^j
wi=wi−η(fw(x0j,x1j,...,xnj)−yj)xij 随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
3.小批量梯度下降法MBGD
小批量梯度下降法(Mini-batch Gradient Descent),兼顾了准确度和训练速度,它是批量梯度下降法和随机梯度下降法的中和,在所有的m个样本中采用x个样本来迭代,1<x<m。
w
i
=
w
i
−
η
∑
j
=
t
t
+
x
−
1
(
f
w
(
x
0
j
,
x
1
j
,
.
.
.
,
x
n
j
)
−
y
j
)
x
i
j
w_i=w_i-\eta\sum_{j=t}^{t+x-1}(f_w(x_0^j,x_1^j,...,x_n^j)-y_j)x_i^j
wi=wi−ηj=t∑t+x−1(fw(x0j,x1j,...,xnj)−yj)xij
四.梯度下降法的优化方法
通常的梯度下降法存在下降速度慢,迭代时间长等缺点,而且很有可能会停留在一个局部最优点处,针对这些缺点,人们对其进行了相应的优化。
1.Momentum(动量算法,对梯度进行修正)
动量梯度下降(Gradient Descent with Momentum)计算梯度的指数加权平均数,即更新参数的时候在一定程度上保留之前更新的方向,可以在一定程度上增加稳定性。
W W W 的更新如下: η \eta η为学习率, γ \gamma γ为动量指数,通常设置为0.9
V t = γ V t + η Δ w f ( W t ) V_t=\gamma V_{t} + \eta\Delta_wf(W_{t}) Vt=γVt+ηΔwf(Wt)
W t = W t − V t W_t=W_{t}-V_t Wt=Wt−Vt
2.AdaGrad(对学习率η进行修正)
在上述方法中,学习率在每个迭代周期内都是相同的。AdaGrad算法能够在训练中自动调整学习率。参数出现的次数越多,更新越小。缺点就是迭代次数越多,学习率会越低,最终趋向于0。
在首次迭代时,AdaGrad将 s 0 s_0 s0中的每个元素初始化为0, ϵ \epsilon ϵ作用是为了避免分母为0,一般取1e-07。
s t = s t + ( Δ w f ( W t ) ) 2 s_t=s_{t}+(\Delta_wf(W_{t}))^2 st=st+(Δwf(Wt))2
然后调整学习率计算权值
W t = W t − η s t + ϵ ∗ Δ w f ( W t ) W_t=W_{t}-\frac{\eta}{\sqrt{s_{t}+\epsilon}}*\Delta_wf(W_{t}) Wt=Wt−st+ϵη∗Δwf(Wt)
3.RMSprop(对学习率η进行修正)
AdaGrad 算法在迭代后期由于学习率分母过大,导致学习率整体过小,较难找到最优解。RMSprop 算法做出了改进,AdaGrad 会累加之前所有的梯度平方,而 RMSprop 是将这些梯度按元素平方做指数加权移动平均。
s t = γ s t + ( 1 − γ ) ( Δ w f ( W t ) ) 2 s_t=\gamma s_{t}+(1-\gamma)(\Delta_wf(W_{t}))^2 st=γst+(1−γ)(Δwf(Wt))2
W t = W t − η s t + ϵ ∗ Δ w f ( W t ) W_t=W_{t}-\frac{\eta}{\sqrt{s_{t}+\epsilon}}*\Delta_wf(W_{t}) Wt=Wt−st+ϵη∗Δwf(Wt)
4.Adam(对梯度和学习率都要修正)
Adam(Adaptive Moment Estimation)自适应估计将 Momentum 和 RMSprop 结合。Adam 在 RMSprop 的基础上对小批量随机梯度也做了指数加权移动平均。
m
t
=
β
1
m
t
+
(
1
−
β
1
)
Δ
w
f
(
W
t
)
m_t=\beta_1 m_{t}+(1-\beta_1)\Delta_wf(W_{t})
mt=β1mt+(1−β1)Δwf(Wt)
v t = β 2 v t + ( 1 − β 2 ) ( Δ w f ( W t ) ) 2 v_t=\beta_2 v_{t}+(1-\beta_2)(\Delta_wf(W_{t}))^2 vt=β2vt+(1−β2)(Δwf(Wt))2
m ‾ t = m t 1 − β 1 t \overline{m}_t=\frac{m_t}{1-\beta_1 ^t} mt=1−β1tmt
v ‾ t = v t 1 − β 2 t \overline{v}_t=\frac{v_t}{1-\beta_2 ^t} vt=1−β2tvt
W t = W t − η v ‾ t + ϵ m ‾ t W_t=W_{t}-\frac{\eta}{\sqrt{\overline v_{t}}+\epsilon}\overline m_t Wt=Wt−vt+ϵηmt