Michael Nielsen 著Neural Networks and Deep Learning关于第一章使用神经网络识别手写数字的74行Python代码之“梯度下降算法”
作者编著的“识别手写数字”的神经网络是基于MNIST数据集进行的,而这些数据集的图片都是
28
∗
28
28*28
28∗28大小的灰度图像,所以我们会把每一个训练输入记为
x
x
x,并记作一个
28
∗
28
=
784
28*28=784
28∗28=784维的向量输入给网络,而每个向量中的数值代表图像中每个像数的灰度值。同时我们使用
y
=
y
(
x
)
y=y(x)
y=y(x)表示对应的期望输出,其中
y
y
y是一个10维向量。
例如:输入一个
x
x
x为784维向量,其对应数字为6的图像,那么
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
前面已经讲过感知器,S型神经元,知道了什么是权重和偏置,我们现在需要找到一个算法可以找到详细相应的权重以及偏置,使得网络的输出
y
(
x
)
y(x)
y(x)能够拟合所有的训练输入
x
x
x,为了量化我们如何实现这个目标,有了代价函数的定义:
C
(
w
,
b
)
≡
1
2
n
∑
x
∣
∣
y
(
x
)
−
a
∣
∣
2
C(w,b) \equiv \cfrac{1}{2n}\sum_{x}||y(x)-a||^2
C(w,b)≡2n1∑x∣∣y(x)−a∣∣2
公式说明:
n
n
n是训练输入数据的个数 ,
a
a
a是表示当输入为
x
x
x时输出的向量,求和则是在总的训练输入
x
x
x上进行的。这里可以看出
C
(
w
,
b
)
C(w,b)
C(w,b)是非负数,同时我们得要明确一下我们的目的 : 找到一个学习算法,它能找到适当的
w
,
b
w,b
w,b使得代价函数
C
(
w
,
b
)
≈
0
C(w,b) \approx0
C(w,b)≈0。所以这里我们采用称为梯度下降的算法来达到这个目的。
C
C
C可以是任意的多元实值函数,我们现在想象
C
C
C是一个只有两个变量
v
1
和
v
2
v_1和v_2
v1和v2的函数,如图,我们现在需要找到全局最小值,我们同时想象一下有一个小球从山谷的斜坡滚落下来,常识告诉我们这个球会滚到谷底,我们可以利用这个算法来找到函数的最小值。那如何精确描述这个问题呢?
比如当我们在
v
1
和
v
2
v_1和v_2
v1和v2方向分别将球体移动一个很小很小的量,即
∆
v
1
和
∆
v
2
∆v_1和∆v_2
∆v1和∆v2,球体将会发生什么情况。利用微积分的知识我们可以得到
C
C
C将会有如下的变化:
∆
C
≈
∂
C
∂
v
1
∆
v
1
+
∂
C
∂
v
2
∆
v
2
∆C \approx \cfrac{∂C}{∂v_1}∆v_1+ \cfrac{∂C}{∂v_2}∆v_2
∆C≈∂v1∂C∆v1+∂v2∂C∆v2(7)
我们需要寻找一种选择
∆
v
1
和
∆
v
2
∆v_1和∆v_2
∆v1和∆v2的方法使得
∆
C
∆C
∆C为负——球体滚落。为了弄明白如何选择,我们记
v
=
v
1
,
v
2
v=v_1,v_2
v=v1,v2,定义
∆
v
∆v
∆v为
v
v
v变化的向量,即
∆
v
=
(
∆
v
1
,
∆
v
2
)
T
∆v=(∆v_1,∆v_2)^T
∆v=(∆v1,∆v2)T。另外,
C
C
C的梯度为其偏导数的向量,我们使用
∇
C
\nabla C
∇C来表示,
即
∇
C
=
(
∂
C
∂
v
1
,
∂
C
∂
v
1
)
T
\nabla C=( \cfrac{∂C}{∂v_1}, \cfrac{∂C}{∂v_1})^T
∇C=(∂v1∂C,∂v1∂C)T(8)
结合公式(7)和公式(8)于是就有了:
∆
C
≈
∇
C
⋅
∆
v
∆C \approx \nabla C\cdot∆v
∆C≈∇C⋅∆v
现在可以看到
∇
C
\nabla C
∇C使得
v
v
v的变化与
C
C
C的变化关联起来
这里问:什么是梯度?暂搁置一旁
那么如何选取
∆
v
∆v
∆v才能让
∆
C
∆C
∆C变为负数?于是有了右边的假设:
∆
v
=
−
η
∇
C
∆v=-\eta\nabla C
∆v=−η∇C
因为这样子假设的话
∆
C
≈
−
η
∇
C
⋅
∇
C
=
−
η
∣
∣
∇
C
∣
∣
2
∆C \approx -\eta\nabla C\cdot \nabla C=-\eta||\nabla C||^2
∆C≈−η∇C⋅∇C=−η∣∣∇C∣∣2,显然
∣
∣
∇
C
∣
∣
2
>
=
0
||\nabla C||^2>=0
∣∣∇C∣∣2>=0,同时
∆
C
<
=
0
∆C<=0
∆C<=0。如果按照这样的假设去改变
v
v
v,那么
C
C
C会一直减少。而
v
→
v
′
=
v
−
η
∇
C
v→v^{'} =v-\eta\nabla C
v→v′=v−η∇C,然后用它再次更新规则来计算下一次移动,从而持续减少
C
C
C。
整个梯度下降算法就是重复计算梯度
∇
C
\nabla C
∇C,让后沿着相反的方向移动——沿着山谷“滚落”;梯度下降法可以视为一种使得
C
C
C下降最快的方向上做微小变化的方法。
这一章并没有讨论如何计算代价函数的梯度,该书第二章将会讲到反向传播,会解释如何计算这些梯度的快速算法。