第1章 使用神经网络识别手写数字
我们可以写一些识别形状的规则来进行手写数字的识别,例如数字“9”上半部分有一个圆圈,下半部分右下方则是一条竖线。但是,当这些规则越写越多的时候,就会很快陷入各种异常和特殊情形的困境中。
神经网络则是以另一种方式看待这个问题。其思想是使用样本来自动进行学习,然后推断出识别手写数字的规则。然后通过增加训练样本的数量,网络可以学到更多关于手写数字的知识,这样就能够提升自身的准确性。
感知器
第一层感知器通过权衡输入依据做出非常简单的决定。第二层感知器的每一个都在权衡第一层的决策结果并做出决定,所以,第二层中的感知器可以比第一层的做出更加复杂和抽象的决策。第三层的感知器甚至能够进行更加复杂的决策。以这种方式,一个多层的感知器网络可以从事复杂巧妙的决策。
S型神经元
感知器网络中,单个感知器上一个权重或偏置的微小改动有时候会引起那个感知器的输出完全翻转,或引起其余网络的行为以极其复杂的方式完全改变。所以,在感知器网络中,通过逐步修改权重和偏置来让网络接近期望变得困难。
S型神经元和感知器类似,但是权重和偏置的微小改动只引起输出的微小变化。
这是因为
σ
的平滑意味着权重和偏置的微小变化,会对神经元产生一个微小的输出变化。
S型神经元与感知器不同的地方还在于,S型神经元不仅输出0或1,而且可以输出0和1之间的任何实数。
使用梯度下降算法学习
定义代价函数:
我们想要的是找到C的全局最小值。
一种解决办法是使用微积分来解析最小值。如果变量过多(最大的网络有依赖数亿权重和偏置的代价函数),计算量将会非常非常大。所以用微积分来计算最小值已经不可行了。
另一种解决的办法就是梯度下降法。
梯度方向就是下降的最快的方向。
学习率太小,下降的非常缓慢;
学习率太大,有可能越过极小值,在附近徘徊。
梯度下降法可以视为一种在代价函数在下降最快的方向上做微小变化的方法。
随机梯度下降算法能够加速学习。通过随机地选取并训练输入的小批量数据来工作。
当我们用完了所有的训练输入,称为完成了一个训练迭代期。
注意:当我们不能提前知道训练数据数量的情况下,我们通过舍弃梯度下降前面的 1n 或者随机梯度下降前面的 1m 。实际上等价于改变了学习速率的大小。
梯度下降的一个极端的版本是把小批量数据的大小设为1。这个学习的过程被称为在线学习。
实现我们的网络来分类数字
超参数:训练的迭代器数量,小批量数据大小和学习速率。
验证集可以用来设置超参数。
使用更多的隐藏神经元帮助我们得到更好的结果。
通常,调试一个神经网络是具有挑战性的。
复杂的算法
≤
简单的学习算法
+
<script type="math/tex" id="MathJax-Element-8">+</script>好的训练数据
迈向深度学习
神经网络中的权重和偏置是被自动发现的。这意味着我们不能立即解释网络是怎么做的,做了什么。
手工设计网络中的权重和偏置无疑是不切实际的。取而代之的是,我们希望使用学习算法来让网络能够自动从训练数据中学习权重和偏差,这样形成一个概念的层次结构。
事实证明,多个隐藏层的网络比单个隐藏层的网络表现的更加出色。原因是深度网络能够构建起一个复杂的概念层次结构。