在几年之,深层神经网络在机器学习领域是一潭死水。但随后,克里泽夫斯基和他在多伦多大学的同事们提交了一份备受瞩目的图像识别竞赛的参赛作品,该竞赛比以往任何一项都要精确得多。几乎一夜之间,深层神经网络成为图像识别的主要技术。其他使用该技术的研究人员很快证明了图像识别精度的进一步飞跃。在这篇文章中,我们将深入探讨深度学习。我将解释什么是神经网络,它们是如何被训练的,以及为什么它们需要如此多的计算能力。然后我将解释为什么一种特殊类型的神经网络——深度卷积网络——非常擅长理解图像。别担心,会有很多照片的。一个简单的单神经元的例子,短语“神经网络”可能仍然感觉有点模糊,所以让我们从一个简单的例子开始。假设你想要一个神经网络来决定一辆车是否应该基于红灯的绿灯、黄灯和红灯行驶。神经网络可以用一个神经元完成这项任务。神经元接受每个输入(1表示打开,0表示关闭),将其乘以相关的权重,并将所有权重值相加。然后,神经元添加偏差,从而确定神经元“激活”的阈值。在这种情况下,如果输出是正的,我们认为神经元已经被“激活”了——否则我们就不会被激活。这个神经元等价于不等式“绿-红- 0.5 > 0”。如果结果是真的,也就是说绿灯亮,红灯关,那么车应该开走。
在真实的神经网络中,人工神经元又多走了一步。将加权输入相加并加入偏差后,神经元再应用非线性激活函数。一个流行的选择是sigmoid函数,它是一个s形函数,总是产生0到1之间的值。激活函数的使用不会改变我们简单红绿灯模型的结果(除了我们需要使用0.5而不是0的阈值),但是激活函数的非线性对于神经网络建模更复杂的函数是必不可少的。没有激活函数,每一个神经网络,不管多么复杂,都可以简化成它的输入的线性组合。线性函数不能模拟复杂的现实现象。非线性激活函数使神经网络能够逼近任何数学函数。一个网络,当然,有很多方法可以近似函数。神经网络的特别之处在于,我们知道如何用一点微积分、一堆数据和大量的计算能力来“训练”它们。而不是一个人类程序员直接设计神经网络对于一个特定的任务,我们可以构建软件,开始于一个相当通用的神经网络,看着一堆标签的例子,然后修改神经网络,使其产生正确的标签为尽可能多的标签的例子。希望得到的网络能够一般化,为以前不在其训练集中的事例生成正确的标签。实现这一点的过程早在AlexNet之前就开始了。1986年,三位研究人员发表了一篇关于反向传播的里程碑式论文。反向传播是一种帮助训练复杂神经网络在数学上变得容易操作的技术。
为了直观地了解反向传播是如何工作的,让我们来看看Michael Nielsen在他优秀的在线深度学习课本中描述的一个简单的神经网络。这个网络的目标是采取28×28像素图像代表一个手写的数字和正确确定数字是0,1,2,等等。每个图像有28个×28 = 784输入值,0和1之间的每一个实数表示像素有多光明或黑暗。尼尔森构建了这样一个神经网络:在这幅图中,在中间和右边的每一个圆都是一个神经元,就像我们在上一节看到的那样。每个神经元取其输入的加权平均值,加上一个偏差值,然后应用一个激活函数。注意左边的圆圈不是神经元——这些圆圈代表网络的输入值。虽然图像只显示了8个输入圆,但实际上有784个输入——每个像素对应一个输入图像。每个10神经元右边应该“点亮”不同的数字:顶部神经元输入图像时要火是一个手写的0(而不是其他),第二个应该火当网络看到手写1(而不是其他),等等。每个神经元从它前面一层的每个神经元接收输入。所以中间这15个神经元每一个都有784个输入值。这15个神经元中的每一个都有一个权重参数,对应于它的784个输入。这意味着这一层只有15×784 = 11760重量参数。同样,输出层包含10个神经元,每一个都需要一个输入从每个中间神经元的15层,添加另一个15×10 = 150重量参数。除此之外,这个网络还有25个偏差变量——每个偏差变量对应25个神经元。
神经网络的训练,训练的目标是优化这11935个参数,以最大限度地提高正确输出神经元(只有输出神经元)在显示手写数字图像时亮起来的机会。我们可以使用一个著名的数据集称为MNIST提供60000标记28×28像素图片:Nielsen展示了如何使用74行常规Python代码来训练这个网络——不需要特殊的机器学习库。训练从为11935个权重和偏差参数中的每一个选择随机值开始。然后,软件通过示例图像,为每一个图像完成两个步骤:前馈步骤计算网络的输出值,给定输入图像和网络的当前参数。反向传播步骤计算结果与正确的输出值偏离多少,然后修改网络参数,以略微改进其在特定输入图像上的性能。
留言与评论(共有 0 条评论) |