1.5 使用梯度下降算法进行学习
- MNIST数据 (
28
×
28
28 \times 28
28×28 大小的灰度图像)
- 6000 幅用于训练数据的图像
- 1000 幅用于测试数据的图像
我们将使用的训练数据集是MNIST数据集,其包含有数以万计的连带着正确分类器的手写数字的扫描图像。用符号 x x x 来表示一个训练输入。为了方便,把每个训练输入 x x x 看作一个 28 × 28 = 784 28 \times 28 = 784 28×28=784 维的向量。每个向量中的项目代表图像中单个像素的灰度值。我们用 y = y ( x ) y= y(x) y=y(x) 表示对应的期望输出,这里 y y y 是一个 10 10 10 维的向量。例如,如果有一个特定的画成 6 6 6 的训练图像, x x x,那么 y ( x ) = ( 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 ) T y(x) = (0, 0, 0, 0, 0, 0, 1, 0, 0, 0)^T y(x)=(0,0,0,0,0,0,1,0,0,0)T 则是网络的期望输出。
————————————代价函数介绍————————————
代价函数
我们希望有一个算法,能让我们找到权重和偏置,以至于网络的输出
y
(
x
)
y(x)
y(x) 能够拟合所有的训练输入
x
x
x。为了量化我们如何实现这个目标,我们定义一个代价函数(或称损失函数/目标函数):
C
(
w
,
b
)
≡
1
2
n
∑
x
∥
y
(
x
)
−
a
∥
2
C(w,b) \equiv \frac{1}{2n} \sum_x \| y(x) - a\|^2
C(w,b)≡2n1x∑∥y(x)−a∥2
这里
w
w
w 表示所有的网络中权重的集合,
b
b
b 是所有的偏置,
n
n
n 是训练输入数据的个数,
a
a
a 是表示当输入为
x
x
x 时输出的向量,求和则是在总的训练输入
x
x
x 上进行的。当然,输出
a
a
a 取决于
x
x
x,
w
w
w 和
b
b
b。符号
∥
v
∥
\|v\|
∥v∥ 是指向量
v
v
v 的模。我们把
C
C
C 称为二次代价函数,有时也被称为均方误差或者MSE。
观察二次代价函数的形式我们可以看到:
- C ( w , b ) C(w,b) C(w,b) 是非负的,因为求和公式中的每一项都是非负的
- 代价函数 C ( w , b ) C(w,b) C(w,b) 的值相当小,即 C ( w , b ) ≈ 0 C(w,b) \approx 0 C(w,b)≈0
精确地说,是当对于所有的训练输入 x x x, y ( x ) y(x) y(x) 接近于输出 a a a 时。因此如果我们的学习算法能找到合适的权重和偏置,使得 C ( w , b ) ≈ 0 C(w,b) \approx 0 C(w,b)≈0,它就能很好地工作。因此我们的训练算法的目的,是最小化权重和偏置的代价函数 C ( w , b ) C(w,b) C(w,b)。换句话说,我们想要找到一系列能让代价尽可能小的权重和偏置。我们将采用称为梯度下降的算法来达到这个目的。
为什么要介绍二次代价呢?这么做是因为在神经网络中,被正确分类的图像数量所关于权重和偏置的函数并不是一个平滑的函数。大多数情况下,对权重和偏置做出的微小变动完全不会影响被正确分类的图像的数量。这会导致我们很难去解决如何改变权重和偏置来取得改进的性能。用一个类似二次代价的平滑代价函数则能更好地去解决如何用微小的改变来取得更好的效果的问题
————————————梯度下降算法介绍————————————
梯度下降算法
假设我们要最小化
C
(
v
)
C(v)
C(v)。它可以是任意的多元实值函数,
v
=
v
1
,
v
2
,
…
v = v_1, v_2, \ldots
v=v1,v2,…。注意我们用
v
v
v 代替了
w
w
w 和
b
b
b 以强调它可能是任意的函数,想象
C
C
C 是一个只有两个变量
v
1
v1
v1 和
v
2
v2
v2 的函数。一种解决这个问题的方式是用微积分来解析最小值,但是最大的神经网络有依赖数亿权重和偏置的代价函数,极其复杂。如下图所示,当我们在
v
1
v1
v1 和
v
2
v2
v2 方向分别将球体移动一个很小的量,即
Δ
v
1
\Delta v1
Δv1 和
Δ
v
2
\Delta v2
Δv2 时,球体将会发生什么情况。微积分告诉我们
C
C
C 将会有如下变化:
Δ
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
\Delta C
ΔC 为负;即,我们选择它们是为了让球体滚落。为了弄明白如何选择,需要定义
Δ
v
\Delta v
Δv 为
v
v
v 变化的向量,
Δ
v
≡
(
Δ
v
1
,
Δ
v
2
)
T
\Delta v \equiv (\Delta v_1, \Delta v_2)^T
Δv≡(Δv1,Δv2)T,
T
T
T 是转置符号。我们也定义
C
C
C 的梯度为偏导数的向量,
(
∂
C
∂
v
1
,
∂
C
∂
v
2
)
T
\left(\frac{\partial C}{\partial v_1}, \frac{\partial C}{\partial v_2}\right)^T
(∂v1∂C,∂v2∂C)T。我们用
∇
C
\nabla C
∇C 来表示梯度向量,即:
∇
C
≡
(
∂
C
∂
v
1
,
∂
C
∂
v
2
)
T
\nabla C \equiv \left( \frac{\partial C}{\partial v_1}, \frac{\partial C}{\partial v_2} \right)^T
∇C≡(∂v1∂C,∂v2∂C)T
有了这些定义,
Δ
C
\Delta C
ΔC 的表达式可以被重写为:
Δ
C
≈
∇
C
⋅
Δ
v
\Delta C \approx \nabla C \cdot \Delta v
ΔC≈∇C⋅Δv 。
∇
C
\nabla C
∇C 把
v
v
v 的变化关联为
C
C
C 的变化,这个方程让我们看到了如何选取
Δ
v
\Delta v
Δv 才能让
Δ
C
\Delta C
ΔC 为负数。假设我们选取:$ \Delta v = -\eta \nabla C$,这里的
η
\eta
η 是个很小的正数(称为学习速率)。可以得到:
Δ
C
≈
−
η
∇
C
⋅
∇
C
=
−
η
∥
∇
C
∥
2
\Delta C \approx -\eta \nabla C \cdot \nabla C = -\eta \|\nabla C\|^2
ΔC≈−η∇C⋅∇C=−η∥∇C∥2。由于
∥
∇
C
∥
2
≥
0
\| \nabla C \|^2 \geq 0
∥∇C∥2≥0,这保证了
Δ
C
≤
0
\Delta C \leq 0
ΔC≤0,因此
C
C
C 会一直减小,不会增加。如果我们反复持续更新规则计算下一次的移动,我们将持续减少
C
C
C 直到获得一个全局的最小值。
总结来说,梯度下降算法的工作方式是重复计算梯度 ∇ C \nabla C ∇C,然后沿着相反的方向移动, η \eta η 是一个足够小的正数。
人们已经研究出很多梯度下降的变化形式,但是有一个主要的缺点:它最终必需去计算 C C C 的二阶偏导,这代价可是非常大的。但是在本书中我们将主要使用梯度下降算法使用神经网络学习。
————————————回到数字分类问题————————————
我们的目标是利用梯度下降算法去寻找能使代价函数取得最小值得权重和偏置,用这些分量来写梯度下降的更新规则,我们得到:
KaTeX parse error: Expected 'EOF', got '&' at position 22: …rightarrow w_k'&̲= w_k-\eta \fra…
通过重复应用这一更新规则我们就能“让球体滚下山”,并且有望能找到代价函数的最小值。换句话说,这是一个能让神经网络学习的规则。注意代价函数有这样的形式
C
=
1
n
∑
x
C
x
C = \frac{1}{n} \sum_x C_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
\nabla C
∇C,我们需要为每个训练输入
x
x
x 单独地计算梯度值
∇
C
x
\nabla C_x
∇Cx,然后求平均值,
∇
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。通过计算少量样本的平均值我们可以快速得到一个对于实际梯度 ∇ C \nabla C ∇C 的很好的估算,这有助于加速梯度下降,进而加速学习过程。随机梯度下降通过随机选取小量的 m m m 个训练输入来工作。我们将这些随机的训练输入标记为 X 1 , X 2 , … , X m X_1, X_2, \ldots, X_m X1,X2,…,Xm,并把它们称为一个mini-batch。假设样本数量 m m m 足够大,我们期望 ∇ C X j \nabla C_{X_j} ∇CXj 的平均值大致相等于整个 ∇ C x \nabla C_x ∇Cx的平均值,即: ∑ j = 1 m ∇ C X j m ≈ ∑ x ∇ C x n = ∇ C \frac{\sum_{j=1}^m \nabla C_{X_{j}}}{m} \approx \frac{\sum_x \nabla C_x}{n} = \nabla C m∑j=1m∇CXj≈n∑x∇Cx=∇C,则 ∇ C ≈ 1 m ∑ j = 1 m ∇ C X j \nabla C \approx \frac{1}{m} \sum_{j=1}^m \nabla C_{X_{j}} ∇C≈m1∑j=1m∇CXj,证实了我们可以通过仅仅计算随机选取的小批量数据的梯度来估算整体的梯度。
我们挑选随机指定的小批量数据去训练,然后再挑选另一个,直到我们用完了所有的训练输入,这被称为完成了一个训练迭代期(epoch),然后我们就会开始一个新的训练迭代期。