目錄
Introduction
使用神经网络识别手写数字
感知机
sigmoid神经元
神经网络的结构
用简单的网络结构解决手写数字识别
通过梯度下降法学习参数
实现我们的神经网络来分类数字
迈向深度学习
反向传播算法是如何工作的
热身:一个基于矩阵的快速计算神经网络输出的方法
关于损失函数的两个假设
Hadamard积,s⨀t
反向传播背后的四个基本等式
四个基本方程的证明(自选)
反向传播算法
反向传播算法代码
为什么说反向传播算法很高效
反向传播:整体描述
改进神经网络的学习方法
交叉熵代价函数
用交叉熵解决手写数字识别问题
交叉熵的意义是什么?它又是怎么来的?
Softmax
过拟合和正则化
正则化
为什么正则化能够降低过拟合
c3s6
神经网络能够计算任意函数的视觉证明
为什么深度神经网络的训练是困难的
1.1
1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.3
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7
1.3.8
1.3.9
1.4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.5.1
1.4.5.2
1.4.6
1.5
1.6
1
深度学习
1.7
2
Introduction
「 Neural Networks and Deep Learning 」
中文翻译(进行中)
说明
本项目是Neural Networks and Deep Learning的中文翻译
后面的翻译都发表在了微信公众号 HIT_SCIR ,请关注搜索,已连载完毕
Lisence
This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported
License.
3
使用神经网络识别手写数字
使用神经网络识别手写数字
人类的视觉系统是世上的一个奇迹。考虑以下这串手写的数字:
大部分人都能轻易地识别出图上的数字是504192。这个看似简单的过程的背后,实际上很复
杂。在我们大脑的每个脑半球中,有一个叫做初级视皮层(primary visual cortex)的部分,
也被称作V1。它拥有1亿4千万个神经元,包含了上百亿的神经元连接。然而,人类的视觉系
统不仅仅依赖于V1,还依赖于整套视皮层——V2、V3、V4和V5的协同工作,来实现复杂的
图像处理任务。我们的大脑就像一台超级计算机,经过了上亿年的进化,才得以能够出色地
理解视觉的世界。识别手写数字不是一个简单的任务,但是,人类极其擅长理解眼睛所看到
的东西,并且几乎所有这些工作都是在无意识的情况下完成的,所以我们通常不会意识到我
们的视觉系统解决了的任务有多么困难。
当你企图实现一个用来识别类似上图数字的计算机程序时,你就会逐渐意识到视觉模式识别
的难度。一个本来对于人类看似很简单的事情,突然就变得极其困难。「数字9的上部有一个
圆圈,右下部有一笔竖线」这种人类识别形状的直觉,在算法上却很难表示。当你试图定义
明确的识别规则时,你会很快地被一大堆特例所困扰。这似乎毫无解决的希望。
神经网络(Neural Networks)使用一种不同的思路解决这个问题。它的思想是利用大量的手
写数字,亦被称为训练样例,
从这些训练样例学习并建立一个系统。换一种说法,神经网络使用这些样例,从中能够自动
地学习到识别手写数字的规则。而且,随着训练样例的增加,神经网络可以从中学习到更多
信息,从而提高它的准确度。所以,尽管我上面只给出了100个训练数字,也许我们可以使用
上千、上万、上亿的训练样例来构建一个更好的手写识别器。
4
使用神经网络识别手写数字
在本章中,我们会实现一个神经网络的计算机程序,来学习并识别手写数字。虽然这个程序
仅仅只有74行,并且没有使用任何特别的神经网络库,但是它可以在没有任何人工干预的情
况下,达到超过百分之96的手写数字识别准确率。在之后的章节中,我们会进一步改善我们
的方法,使之达到超过百分之99的准确率。实际上,目前最好的商用神经网络已经足够好到
能被银行用来处理支票,以及被邮局用来识别地址。
我们会专注于手写数字的识别这个问题,因为它基本上是学习神经网络最好的示范问题,之
所以这么说是因为它戳中了几个痛点:它具有挑战性,识别手写数字不是一个简单的工程;
同时它的难度也不是特别大,并不需要极其复杂的方法,或者大量的计算资源。而且它是实
现更高级技术的基础,例如深度学习(deep learning)。所以,手写数字识别问题会贯穿本
书。在本书的后部分,我们会讨论如何将这些想法应用到计算视觉的其它问题上,甚至语音
处理、自然语言处理以及其它领域。
当然,本章的主旨如果只是实现一个程序来识别手写数字,那么本章的内容就会少很多!实
际上,在这个过程中,我们会产生许多关于神经网络的关键思想,包括两种重要的人工神经
元(感知机和sigmoid神经元),以及神经网络的标准学习算法,称为随机梯度下降
(stochastic gradient descent)。在本书中,我关注于解释为什么问题能够被这样解决,以
及为你建立关于神经网络的直觉。尽管相比于仅仅展示基础理论过程,这需要更长的篇幅来
讨论,但是这对于你的深入理解是很有价值的。从中的收获,就是在章节的最后,我们就能
够理解深度学习是什么,以及为什么它能够起作用。
5
感知机
感知机
什么是神经网络?在回答这个问题之前,我会先解释一种叫做感知机(perceptron)的人工神
经元。感知机由科学家Frank Rosenblatt发明于1950至1960年代,他受到了来自Warren
McCulloch 和Walter Pitts的更早工作的启发。现如今,我们通常使用其它种类的人工神经元
模型——在这本书里,以及在许多关于神经网络的最新工作里,主要使用的是一种叫做
sigmoid神经元(sigmoid neuron)的神经元模型。我们会在稍后学习sigmoid神经元。为了理
解sigmoid神经元,我们首先需要花一点时间来理解感知机,这是非常有价值的。
那么,感知机是怎么工作的呢?感知机的输入是几个二进制,
的二进制:
,输出是一位单独
本例中的感知机有三个输入,
Rosenblatt提出了一种计算输出的简单的规则。他引入了权重(weight),
。通常,它可以有更多或者更少的输入。
,等
实数来表示各个输入对于输出的重要程度。神经元的输出是0还是1,由加权和
是否
小于或者大于某一个阈值(threshold value)。和权重一样,阈值也是一个实数,同时它是神
经元的一个参数。使用更严密的代数形式来表示:
这就是感知机的工作方式!
这是一个基础的数学模型。你可以这样理解感知机,它是一个通过给evidence赋予不同权重
从而作出决策的机器。让我们来举一个例子,或许这不是一个真实的例子,但是它很容易理
解,稍后我们会举一个更实际的例子。假设周末就要到了,你听说你所在的城市将会举办一
个奶酪节。你非常喜欢奶酪,你正在犹豫是否要去参加这个节日。你可能需要权衡以下几个
因素来作出决定:
1. 天气好不好?
2. 你的男朋友或者女朋友会陪你去吗?
3. 坐公共交通方便去吗?(假设你自己没有车)
6
感知机
我们可以使用
和 这几个二进制变量来表示这三个因素。比如,如果天气很好,那么
我们令
,否则如果天气不好,那么
。同样地,如果你的男朋友或者女朋友也
想去,那么
,否则
。代表公共交通的 也用类似的方法来表示。
假设你真的超级喜欢奶酪,即便是你的男朋友或者女朋友的对此没兴趣并且交通也不方便的
情况下,你也依然很想去。不过,你非常在意天气情况,如果天气不好的话你就不会去参加
了。你可以用感知机来为这样的决策建立模型。一种方式是,你可以为天气赋予权重
,为另外两个条件赋予权重
。相对来说值比较大的 表明了天气情况对
你的决策影响更大,胜过了你的男朋友或者女朋友是否会陪你去,以及交通的便捷程度。最
和
后,假设你选择 作为感知机的阈值。这样,这个感知机就构建起了一个决策模型,只要天气
好就输出 ,只要天气不好就输出 。你的男朋友或者女朋友是否会去,以及公共交通是否方
便,都不会影响输出的结果。
通过调整权重和阈值的大小,我们可以得到不同的决策模型。例如,假设我们选择的阈值为
。那么此时,如果要让感知机做出你应该去参加这个节日的决策,就需要满足天气很好或者
交通方便的同时你的男朋友或者女朋友也会陪你去。也就是说,这个决策模型与之前不同
了。阈值的降低意味着你参加这个节日的意愿越强。
显然,感知机不能完全建模人类的决策系统!不过,这个例子阐明的是感知机如何赋予不同
evidence权重来达到做出决策的目的。一个由感知机构成的复杂网络能够做出更加精细的决
策,这貌似看上去是说得通的:
在这个网络中,第一列感知机——通常称为第一层感知机——通过赋予输入的evidence权
重,做出三个非常简单的决策。第二层感知机呢?每一个第二层感知机通过赋予权重给来自
第一层感知机的决策结果,来做出决策。通过这种方式,第二层感知机可以比第一层感知机
做出更加复杂以及更高层次抽象的决策。第三层感知机能够做出更加复杂的决策。通过这种
方式,一个多层网络感知机可以做出更加精细的决策。
顺便提一句,当我之前定义感知机的时候,我说到感知机只有一个输出。在上面这个网络
中,感知机似乎看上去有多个输出。实际上,它们仍然只有一个输出。多个输出箭头仅仅是
用来方便表示它的输出被用作其它几个感知机的输入。如果画成一个输出分裂出几个箭头就
太难看了。
7
感知机
让我们来简化一下对感知机的描述。
的条件太笨重了,我们可以通
过使用两个新记法来简化它。第一是使用点乘来代替
。我们有
,其中 和 都是向量,它们的元素分别代表了权重和输入。第二是将阈
值移到不等号的另一侧,并使用偏移(bias)来代替阈值threshold,
是,感知机规则可以被重写为:
。于
你可以将偏移(bias)理解为感知机为了得到输出为1的容易度的度量。如果从生物的角度来
理解,偏移是使神经元被激活的容易度的度量。如果一个感知机的偏移非常大,那么这个感
知机的输出很容易为1,相反如果偏移非常小,那么输出1就很困难。显然,引入偏移的概念
仅仅是一个很小的改动,稍后我们会对这个公式进行进一步的简化。在本书的剩余部分,我
们将不再使用阈值,而是使用偏移(bias)。
我之前将感知机描述为通过权衡evidence做出决策的一种方法。感知机的另一种用途是计算
初等逻辑函数,例如 AND 、 OR 和 NAND 。例如,假如一个感知机有两个输入,每一个权重都
是 ,偏移为 ,如图:
那么,对于输入 ,输出为 ,因为
的结果是正的。这里
我用 符号显式写出了运算过程。类似地,对于输入 和 ,输出都是 。但是对于输入
,输出为 ,因为
实现了 NAND 门!
的结果是负的。从而,这个感知机就
这个 NAND 的例子表明了我们可以使用感知机来计算初等逻辑函数。实际上,我们可以使用感
知机网络计算任何逻辑函数,因为 NAND 门在计算上是通用的,这意味着我们可以使
用 NAND 门构建任意逻辑运算。例如,我们可以使用 NAND 门构造一个求和两个比特 和
的电路。这需要计算
,以及进位
:
8