Chapter 1. 使用神经网络识别手写数字

1.1 感知器

  • 背景

20世纪五、六十年代Frank Rosenblatt发明,受Warren McCulloch和Walter Pitts工作的影响。

  • 工作原理

感知机简单结构

一个感知机接收多个二进制作为输入,然后产生一个二进制输出。各个输入加上权重来表示其对于输出的重要性,最终输出在[0,1]之间产生,有分配权重后的总和 j w j x j \sum_jw_jx_j 和阈值的大小来决定。阈值和权重都是实数,都是神经元的参数,公式表示如下:

o u t p u t = { 0 , j w j x j t h r e s h o l d 1 , j w j x j > t h r e s h o l d output = \begin{cases}0, \sum_jw_jx_j \leq threshold \\ 1, \sum_jw_jx_j > threshold \end{cases}

为简化其数学描述,对上式进行改写,因而加入偏置,改写后的规则为下式,其中 w x w和x 分别对应权重和输入向量。其中,偏置是一种让感知器更容易输入1而引入的一个参数,是为了进一步引导公式中的符号问题:

o u t p u t = { 0 , w x + b 0 1 , w x + b > 0 output =\begin{cases}0, w \cdot x+b \leq0\\1, w \cdot x + b > 0\end{cases}

感知器网络

上图所列网络中,除开Input和Output外,主要分为三列。第一列称为第一层感知器,主要是通过权衡输入做出决策;第二层感知器则主要对第一层中做出的决策进行进一步的权衡,做出比第一层中更为复杂抽象的决策;第三层功能同第二层,对第二层的结果进行分析,从而做出决策。就这样,层层递进,下一层对上一层的结果做出权衡,直到做出最终决策输出。

  • 总结

虽然感知器运算具有通用性,但是看上去也只不过是一种新的与非门。不过实际上我们可以设计学习算法,从而实现自动对人工神经元的权重和偏置进行调整。这种调整可以对外部刺激进行响应,而不需要我们的直接干预。学习算法使我们能够一种从根本上不同于传统逻辑门的方式使用人工神经元。

1.2 S型神经元

  • 背景

为解决感知器网络中进行学习算法设计时反复改动权重和偏置可能引起后续整个感知器的输出完全反转的问题,于是引入S型神经元。

  • 定义

同感知器类似,但是它对学习算法中的权重和偏置的发生的细微改动,只会引起最终输出的微小变化。

  • 工作原理

同感知器,也有多个输入,且每个输入都有自己的权重,但只有一个总的偏置,其输入可以是0~1之间的任意值,最后的输出也不再局限于[0,1],而是 σ ( w x + b ) \sigma(w\cdot x+b) 。其中 σ \sigma 被称为S型函数,有时候也叫逻辑函数,而这种新的神经元类型被称为逻辑神经元。定义 z w x + b z\equiv w \cdot x+b ,定义如下:

σ ( z ) 1 1 + e z \sigma(z) \equiv \frac{1}{1+e^{-z}}

即对于一个具有输入 x 1 , x 2 , . . . x_1,x_2,... ,权重 $w_1,w_2,… $ ,和偏置b的S型神经元的输出是:

1 1 + e x p ( j w j x j b ) \frac{1}{1+exp(-\sum_jw_jx_j-b)}
利用 σ \sigma 函数,可以得到一个平滑的感知器, σ \sigma 函数的平滑特性便是其中的关键因素。 σ \sigma 越平滑,说明权重和偏置的细微变化,即 w j \bigtriangleup w_j b \bigtriangleup b ,然后从神经元网络中产生一个微小的输出变化 o u t p u t \bigtriangleup output .

Δ o u t p u t j o u t p u t w j Δ w j + o u t p u t b Δ \Delta output \approx \sum_j \frac {\partial output}{\partial w_j} \Delta w_j + \frac {\partial output}{\partial b} \Delta

其中,求和是在所有权重上进行的, o u t p u t / w j \partial output/\partial w_j 和表示 o u t p u t output 分别对于 w j w_j b b 的偏导数。其中 Δ o u t p u t \Delta output 是反映权重和偏置变化(即 Δ w j \Delta w_j Δ b \Delta b )的线性函数,这一线性函数是得选择权重和偏置的微小变化来达到输出的微小变化变容易。

  • 感知器和S型神经元的异同

感知器的输出仅限于[0,1],而S型神经元可以输出0~1之间的任意实数。而且由于历史原因,S型神经元虽然不是由感知器构成,但是仍然被称为多层感知器或MLP。

1.3 神经网络的架构

  • 相关术语

简单神经网络架构

上述网络中,最左边的称为输入层,其中的神经元叫做输入神经元。而最右边的,即输出层包含输出神经元。中间层既非输入也非输出,则被称为隐藏层。

  • 前馈神经网络

以上一层的输出作为下一层的输入,网络中是不存在回路的,信息总是向前传播,而不会出现反向回馈。

  • 递归神经网络

在网络模型中,反馈环路是可行的。其设计思想是因为存在在休眠前保持一段时间激活状态的神经元,这种激活状态会对其他神经元形成刺激,使其随后被激活并同样保持一段有限的时间。这样就会导致更多神经元被激活,我们就能得到一个级联的神经元激活系统。因为一个神经元的输出只会在一段时间后而不是立马影响其输入,在模型回路中不会引起问题。其影响力较前馈神经网络小,一部分原因是因为递归网络中的学习算法不够强大。但只从原理上讲,它比前馈神经网络更加接近于实际人脑工作。

1.4 一个简单的分类手写数字的网络

  • 数字分割问题解决办法
    • 尝试不同的分割方式,用数字分类器对每个切分片段打分。但是如果数字分类器在一或多个片段中出现问题,那么这种方式就会得到较低的分数。方法思想是,若分类器有问题,则极有可能是由于图像分割出错而导致,其变化形式能较好解决分割问题。
    • 使用一个三层神经网络识别单个数字:

识别单个数字的三层神经网络

上述网络第一层即输入层包含给输入像素值进行编码的神经元;第二层即隐藏层,用于设置n个不同神经元对输入进行处理;第三层即输出层包含10个神经元代表0~9这10个数字,当其中任一个神经元被激活时,则代表识别出对应输入的数字。

1.5 使用梯度下降算法进行学习

  • 数据集
    • 训练数据集:60000幅,28*28的灰度图像;
    • 测试数据集:10000幅;
  • 算法
    • 代价函数

C ( w , b ) 1 2 n x y ( x ) a 2 C(w,b)\equiv\frac{1}{2n}\sum_x||y(x)-a||^2

其中 w w 表示所有网络中的权重的集合, b b 是所有偏置, n n 代表训练输入数据的个数, a a 代表当输入为 x x 时输出的向量,求和则是在总的训练输入 x x 上进行。其中,输出 a a 取决于 x , w b x,w和b v ||v|| 表示向量$v 的模。 C又称为二次代价函数,有时也被称为均方误差或MSE,其结果都是非负的,且 0 \approx 0 。我们训练神经网络的目的是找到能够最小化二次代价(损失/目标)函数 C ( w , b ) C(w,b) 的权重和偏置。

对于上图,当我们想要找到$C 的全局最小值时,假设在 v_1,v_2 方向分别将球体移动一个很小的量,即 \Delta v_1,\Delta v_2 ,此时 \Delta C \approx \frac {\partial C}{\partial v_1}\Delta v_1 + \frac {\partial C}{\partial v_2}\Delta v_2 。用 \triangledown C 表示梯度向量,即 \triangledown C = (\frac{\partial C}{\partial v_1},\frac{\partial C}{\partial v_2})^T , ,于是 \Delta C \approx \triangledown C \cdot \Delta v 。这一式子解释了 \triangledown C 为何被称为梯度向量 ,它将 v$的变化关联为C的变化,正如用梯度表示。选取:

Δ v = η C \Delta v = - \eta \triangledown C

其中 η \eta 是很小的正数(叫做学习速率),则 Δ C η C C = η C 2 \Delta C \approx -\eta \triangledown C \cdot \triangledown C = - \eta ||\triangledown C||^2 。若我们按照上述规则去改变 v v ,则 C C 将一直减小,不会增加。

  • 总结

梯度下降示意图

梯度下降算法的实质就是不断计算梯度 C \triangledown C ,然后沿着相反方向移动,朝着山谷“降落”,如上图所示。为了使梯度下降能够正确运行,需要选取足够小的学习速率 $ \eta ,否则最终将导致 \Delta C > 0 。但 \eta 使 也不能太小,否则这将使 \Delta v 变化极小,梯度下降算法运行速率将非常缓慢。而且实际上, \eta 是不断变化的,以确保 \Delta C \approx \triangledown C \cdot \Delta v$的近似度。

  • 随机梯度下降

思想是通过随机选取销量训练输入样本来计算 C x \triangledown C_x ,进而估算梯度 C \triangledown C 。通过计算少量样本的平均值从而快速得到一个对于实际梯度 C \triangledown C 的很好的估算,有助于加速梯度下降,进而加速学习过程。更为准确的说,算法通过随机选取小量的m个训练输入来工作,将其标记为 X 1 , X 2 , . . . , X m X_1,X_2,...,X_m ,并将它们称作一个小批量数据(mini-batch)。

假设样本数量 m m 足够大,我们期望 C X j \triangledown C_{X_j} 的均值大致等于整个 C x \triangledown C_x 的均值,即

j = 1 m C X j m x C x n = C \frac{\sum ^m_{j=1} \triangledown C_{X_j}}{m} \approx \frac{\sum_x \triangledown C_x}{n} = \triangledown C

对左右两边进行交换,则得到下列式子,说明我们可以仅用火计算随机选取的小批量数据的梯度来估算整体的梯度:

C 1 m j = 1 m C X j \triangledown C \approx \frac{1}{m} \sum ^m_{j=1} \triangledown C_{X_j}

随机梯度下降通过随机选取并训练输入的小批量数据,然后再挑选另一随机选定的小批量数据去训练,知道用完所有训练样本,此时则成为完成了一个训练迭代期(epoch)

1.6 使用网络来对数字进行分类

  • 数据集
    • 50000个训练集;
    • 10000个验证集,对于解决如何去设置某些神经网络中的超参数很有用;
    • 10000个测试集;
  • 代码

[代码及数据](https://github.com/mnielsen/neural-networks-and-deep-learning)

当创建一个仅有输入层(784个神经网络)和输出层(10个神经网络)的网络,而没有隐藏层时:

net = network.Network([784, 0, 10])
net.SGD(training_data, 30, 10, 3, test_data = test_data) # epochs:30、mini-batch:10、学习率:3

最终结果如下图:

无隐藏层时结果

发布了104 篇原创文章 · 获赞 69 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/github_39655029/article/details/99435209
今日推荐