梯度下降
目标:解决多变量函数的最优化问题
例如神经网络中的损失函数(loss function):
C
(
w
,
b
)
=
1
2
n
∑
x
∥
y
(
x
)
−
a
∥
2
C(w,b)=\frac{1}{2n}\sum_{x}\|y(x)-a\|^2
C(w,b)=2n1x∑∥y(x)−a∥2
其中
w
w
w和
b
b
b为网络的参数,
x
x
x为训练样本,
n
n
n为训练样本的数目,
y
(
x
)
y(x)
y(x)为网络的期望输出,
a
a
a为网络的实际输出,
a
a
a是
x
,
w
,
b
x,w,b
x,w,b的函数。
为了让网络的输出尽可能接近期望输出,即求令损失函数最小化的网络参数
w
∗
w^*
w∗和
b
∗
b^*
b∗:
min
w
,
b
1
2
n
∑
x
∥
y
(
x
)
−
a
∥
2
\min \limits_{w,b} \frac{1}{2n}\sum_{x}\|y(x)-a\|^2
w,bmin2n1x∑∥y(x)−a∥2
我们可以采用梯度下降(gradient descent)求解该问题。
梯度下降法
1. 为什么用梯度下降法?
- 对于多变量问题,常用的微积分解法效果有限;
- 对于神经网络而言,常常包含大量的变量,采用微积分最小化的方法失效
2. 梯度下降法的灵感来源
我们假设
C
(
v
)
C(v)
C(v)是包含两个变量
v
1
,
v
2
v_1,v_2
v1,v2的函数,大概长这样
为了找到 C ( v ) C(v) C(v)的最小值,我们可以将 C ( v ) C(v) C(v)想象成一个山谷,假设某一个位置处有一个球沿着斜坡往下滚,则最后这个球一定会到达谷底。根据这一思想,我们可以随机选取一个起始点,然后模拟球往下滚的过程,最终找到 C ( v ) C(v) C(v)的最小值点(即谷底)。
为了实现这一过程,我们先假设沿
v
1
v_1
v1方向移动
Δ
v
1
\Delta{v_1}
Δv1,沿
v
2
v_2
v2方向移动
Δ
v
2
\Delta{v_2}
Δv2,我们可以计算出
C
(
v
)
C(v)
C(v)的变化:
Δ
C
≈
∂
C
∂
v
1
Δ
v
1
+
∂
C
∂
v
2
Δ
v
2
\Delta{C}\approx\frac{\partial C}{\partial v_1}\Delta{v_1}+\frac{\partial C}{\partial v_2}\Delta v_2
ΔC≈∂v1∂CΔv1+∂v2∂CΔv2
假设我们选择 Δ v 1 \Delta v_1 Δv1和 Δ v 2 \Delta v_2 Δv2使得 Δ C < 0 \Delta C<0 ΔC<0,重复这一过程,就能让球滚到谷底(求得 C C C的最小值点)。现在的重点是我们如何选择这样的 Δ v = ( ∂ C ∂ v 1 , ∂ C ∂ v 2 ) T \Delta v=(\frac{\partial C}{\partial v_1},\frac{\partial C}{\partial v_2})^T Δv=(∂v1∂C,∂v2∂C)T使得 Δ C < 0 \Delta C<0 ΔC<0呢?
3. 梯度下降原理
这里我们首先来改写一下
Δ
C
\Delta C
ΔC的公式。令
Δ
C
≈
∇
C
⋅
Δ
v
\Delta C\approx \nabla C \cdot \Delta v
ΔC≈∇C⋅Δv
其中 ∇ C ≡ ( ∂ C ∂ v 1 , ∂ C ∂ v 2 ) T \nabla C \equiv (\frac{\partial C}{\partial v_1},\frac{\partial C}{\partial v_2})^T ∇C≡(∂v1∂C,∂v2∂C)T。采用逐元素乘法(向量内积)。 ∇ C \nabla C ∇C 被称作 gradient vector,用于描述 C C C相对于 v v v的变化率。
为了选取合适的
Δ
v
\Delta v
Δv使得
Δ
C
<
0
\Delta C<0
ΔC<0,我们可以选取
Δ
v
=
−
η
∇
C
\Delta v=-\eta \nabla C
Δv=−η∇C
where
η
\eta
η is a small, positive parameter (known as the learning rate). 此时,
Δ
C
≈
−
η
∥
∇
C
∥
2
<
=
0
\Delta C \approx -\eta \| \nabla C \|^2<=0
ΔC≈−η∥∇C∥2<=0,这样每次改变
v
v
v,
C
C
C总是减小的。因此我们的学习规则为:
v
→
v
′
=
v
−
η
∇
C
v \rightarrow v^{'}=v-\eta \nabla C
v→v′=v−η∇C
Then we’ll use this update rule again, to make another move. If we keep doing this, over and over, we’ll keep decreasing C C C until - we hope - we reach a global minimum.
Summing up, the way the gradient descent algorithm works is to repeatedly compute the gradient Δ C \Delta C ΔC, and then to move in theopposite direction, “falling down” the slope of the valley.
关于learning rate η \eta η的选择:(1) η \eta η需要足够小; (2) η \eta η太小会导致学习速度慢。因此需要在两者之间寻找一个平衡。
使用梯度下降法训练神经网络
训练神经网络的目标是找到weights
w
k
w_k
wk 和biases
b
l
b_l
bl 使得损失函数
C
C
C的值最小化。我们可以得到梯度下降的更新规则:
w
k
→
w
k
′
=
w
k
−
η
∂
C
∂
w
k
w_k \rightarrow w_k^{'}=w_k- \eta \frac{\partial C}{\partial w_k}
wk→wk′=wk−η∂wk∂C
b l → b l ′ − η ∂ C ∂ b l b_l \rightarrow b_l^{'}- \eta \frac{\partial C}{\partial b_l} bl→bl′−η∂bl∂C
随机梯度下降法(stochastic gradient descent)
标准梯度下降法导致学习太慢的问题:损失函数
C
(
w
,
b
)
=
1
2
n
∑
x
∥
y
(
x
)
−
a
∥
2
C(w,b)=\frac{1}{2n}\sum_x\|y(x)-a\|^2
C(w,b)=2n1∑x∥y(x)−a∥2可以写作
C
=
1
n
∑
x
C
x
C=\frac{1}{n}\sum_xC_x
C=n1∑xCx,其中
C
x
≡
∥
y
(
x
)
−
a
∥
2
2
C_x \equiv \frac{\|y(x)-a\|^2}{2}
Cx≡2∥y(x)−a∥2。
计算梯度
∇
C
=
1
n
∑
x
∇
C
x
\nabla C=\frac{1}{n}\sum_x \nabla C_x
∇C=n1∑x∇Cx时,需要对每个样本都分别计算其梯度,由于训练数据集通常较大,计算会消耗大量的时间。
随机梯度下降可以用来加速学习: 其策略是,通过计算随机选取的一小部分训练样本的
∇
C
x
\nabla C_x
∇Cx,并计算其平均值来估算整体的梯度
∇
C
\nabla C
∇C。
首先随机选取
m
m
m个训练样本
X
1
,
X
2
,
.
.
.
,
X
m
X_1, X_2,...,X_m
X1,X2,...,Xm,视为一个 mini-batch。当
m
m
m足够大
m
≈
n
m\approx n
m≈n时,可以将部分样本梯度的平均值作为
∇
C
\nabla C
∇C的估计:
∇
C
≈
1
m
∑
j
m
∇
C
X
i
\nabla C \approx \frac{1}{m} \sum_j^m \nabla C_{X_i}
∇C≈m1j∑m∇CXi
因此,随机梯度下降的更新规则是:
w
k
→
w
k
′
=
w
k
−
η
m
∑
j
∂
C
X
j
∂
w
k
w_k \rightarrow w_k^{'}=w_k - \frac{\eta}{m}\sum_j \frac{\partial C_{X_j}}{\partial w_k}
wk→wk′=wk−mηj∑∂wk∂CXj
b l → b l ′ = b l − η m ∑ j ∂ C X j ∂ b l b_l \rightarrow b_l^{'} = b_l - \frac{\eta}{m} \sum_j \frac{\partial C_{X_j}}{\partial b_l} bl→bl′=bl−mηj∑∂bl∂CXj
具体执行过程是:先将数据集随机打乱然后均分成 k k k个mini-batch,对每个mini-batch依次采用上述更新规则,直至遍历完整个数据集(完成k个mini-batch的更新),称之为完成 an epoch of training。然后开始一个新的training epoch。
标准梯度下降与随机梯度下降的比较:
(1)标准梯度下降每次计算完整个数据集的梯度,才进行一次参数更新;随机梯度下降在一轮训练中(遍历完一次数据集)采用多次小批量更新策略,对每个mini-batch都进行一次参数更新。
(2)随机梯度下降的优点:加速学习(不需要等到计算完整个数据集的梯度才进行参数更新);计算梯度时加入了随机因素,有利于跳出局部极小(机器学习,周志华,P107)。
Tricks
为了让梯度下降法能够更快地收敛,常采用特征缩放(feature scaling)以及均值归一化(mean normalization)对数据进行预处理。
特征缩放的思路: 梯度下降算法中,在存在多个特征的情况下,如果能确保这些不同的特征都处于一个相近的范围,这样梯度下降法能更快地收敛。
均值归一化:
参考文献: