# 学习一个“深度学习”算法（1）

![](https://piccdn3.umiwi.com/img/201901/27/201901271855260364203999.jpg)

春节快到了，在这个辞旧迎新的日子里，适合学习一些比较新、比较猛的知识。我们来学习一个基于“深度学习”的图形识别算法。

我们的学习目标是一个叫做“卷积网络”的东西，这是一个风头正劲的算法。不要被技术名词吓到！我们去年讲《人工不智能》这本书的时候详细讲解过一个判断泰坦尼克号幸存者的机器学习算法，这一次更高级，但是这次不编程。我们是个思想性的专栏，就好像前面讲相对论那样，我们关注的是它的思想，不是细节问题。如果你能欣赏广义相对论，那么你没有理由不能欣赏“深度学习”。


为啥要了解深度学习呢？首先这个东西现在太热门了，图形识别、语音识别、汽车导航全都能用上，非常值钱。但更重要的是，我认为这个算法包含精妙的思想，能够代表这个时代的精神。这个思想并不难，但是一旦领会了，你就能窥探一点脑神经科学和现代工程学。

我将重点使用两份参考资料。一个是 Ars technica 网站上个月刚刚出来的一篇文章，叫做《计算机图形识别能力如何好到令人震惊》[1]，作者是蒂莫西·李（Timothy Lee）。 一个是一本新书，叫《深度学习：智能时代的核心驱动力量》[2]，作者是特伦斯·谢诺夫斯基（Terrence J. Sejnowski），英文版是2018年10月出来的，现在中信出版社刚刚出了中文版。

不知道你注意到没有，你的手机相册，现在知道你每一张照片里都有什么东西。不管你用的是 iPhone 还是安卓，打开相册，它有一个搜索功能，你输入“beach”，它能列举所有包含海滩的照片；输入“car”，它能列举画面中有汽车的照片，而且它还能识别照片中的每一个人。

![](https://piccdn3.umiwi.com/img/201901/27/201901271938442468983637.png)

每拍摄一张照片，手机都自动识别其中的典型物体。这是一个细思极恐的技术。怎么才能教会计算机识别物体呢？

## 1.没有规则的学习

就在不到十年之前，人们还总爱用模式识别作为人脑比计算机厉害的例子。我记得人们爱说的一个典故就是人很容易就能从一张照片里找到一只猫，可是Google动用了无比强大的计算力量、花了很多年研究都做不到这一点。

但现在可不是这样了。从2012年开始，“深度学习”让计算机识别图形的能力突然变得无比强大，目前已经超过了人类。

咱们先想想人是怎么识别猫的。观察一下下面这张图，看看你是怎么判断这张照片里有没有猫的呢？

![](https://piccdn3.umiwi.com/img/201901/27/201901271924553266332181.jpg)

你可能会说，这很简单，所有人都知道猫长什么样——好，那请问猫长什么样？你也许可以用科学语言描写“三角形”是什么样的——这是一种图形，它有三条直线的边，有三个顶点。可是你能用比较科学的语言描写猫吗？它有耳朵、有尾巴，但这么形容远远不够，最起码你得能把猫和狗区分开来才行。

或者咱们再想一个问题。我再给你看一个人脸的图片，你怎么判断 ta 是男还是女呢？

![[图片来自 design.tutsplus.com]](https://piccdn3.umiwi.com/img/201901/27/201901271925184909785587.png)

你可能会说女性长得更秀气一些——那什么叫“秀气”？是说眉毛比较细吗？是轮廓比较小吗？

你体会一下，这是一个非常奇怪的感觉。你明明知道猫长什么样，你明明一眼就能区分男性和女性，可是你说不清你是怎么看出来的。

古老的计算机图形识别方法，就是非得说清楚一些明确的识别规则，让计算机根据规则判断，结果发现非常不可行。

根本原因就是连人自己都说不清。我们专栏讲过一个真事儿，一个法官说，什么叫色情作品？我没办法给你一个明文规定——但如果我看见了，我就能识别出来。

所以人脑并不是通过什么规则做的判断。那到底是怎么判断的呢？

## 2.神经网络

神经网络计算并不是一个很新的东西，好几十年前就已经出来了，但是一开始并不被看好。

《深度学习》这本书的作者谢诺夫斯基，上世纪80年代就在研究神经网络计算，那时候他是一个少数派。

1989年，谢诺夫斯基到麻省理工学院计算机实验室访问。气氛不算融洽，那里的人都质疑他的方法。午餐之前，谢诺夫斯基有五分钟的时间，给所有人介绍一下他讲座的主题。谢诺夫斯基临场发挥，以食物上的一只苍蝇为题，说了几句话。

谢诺夫斯基说，你看这只苍蝇的大脑只有10万个神经元，能耗那么低，但是它能看、能飞、能寻找食物，还能繁殖。MIT有台价值一亿美元的超级计算机，消耗极大的能量，有庞大的体积，可是它的功能为什么还不如一只苍蝇？

在场的教授都未能回答好这个问题，倒是一个研究生给出了正确答案。他说这是因为苍蝇的大脑是高度专业化的，进化使得苍蝇的大脑只具备这些特定的功能，而我们的计算机是通用的，你可以对它进行各种编程，它理论上可以干任何事情。

这个关键在于，大脑的识别能力，不是靠临时弄一些规则临时编程。大脑的每一个功能都是专门的神经网络长出来的，那计算机能不能效法大脑呢？

谢诺夫斯基说，大脑已经给计算机科学家提供了四个暗示。

**第一个暗示：大脑是一个强大的模式识别器。人脑非常善于在一个混乱的场景之中识别出你想要的那个东西。比如你能从满大街的人中，一眼就认出你熟悉的人。**

**第二个暗示：大脑的识别功能可以通过训练提高。**

**第三个暗示：大脑不管是练习还是使用识别能力，都不是按照各种逻辑和规则进行的。我们识别一个人脸，并不是跟一些抽象的规则进行比对。我们不是通过测量这个人两眼之间的距离来识别这个人。我们一眼看过去，就知道他是谁了。**

**第四个暗示：大脑是由神经元组成的。我们大脑里有数百亿个神经元，大脑计算不是基于明确规则的计算，而是基于神经元的计算。**

这就是神经网络计算要做的事情。

## 3.什么是“深度学习”

我们接着看图，下面这张图代表一个最简单的计算机神经网络。 

![[图片来自 hackernoon.com]](https://piccdn3.umiwi.com/img/201901/27/201901271926162668541491.png)

它从左到右分为三层。

第一层代表输入的数据，第二和第三层的每一个圆点代表一个神经元。

第二层叫“隐藏层”。

第三层是“输出层”。

数据输入进来，经过隐藏层各个神经元的一番处理，再把信号传递给输出层，输出层神经元再处理一番，最后作出判断。 

从下面这张图，你可以看到它的运行过程。

![[图片来自 Analytics India Magazine ]](https://piccdn3.umiwi.com/img/201901/27/201901271926461714449604.gif)

那什么叫“深度学习”呢？最简单的理解，就是中间有不止一层隐藏层神经元的神经网络计算。“深度”的字面意思就是层次比较“深”。 

接着看下面这张图，你可以看到，左边是简单神经网络，右边是深度学习神经网络。

![[图片来自 Towards Data Science 网站]](https://piccdn3.umiwi.com/img/201901/27/201901271927111789459709.png)

整个结构就是这么简单。我们专栏讲《柏拉图和技术呆子》那本书的时候专门说过“分层”这个思想，分层可以让我们用简单的东西解决复杂的问题。计算机最底层的单元是晶体管，而神经网络最底层的单元就是神经元。

神经元是什么东西呢？我们看一个最简单的例子。

你看，下面这张图表现了一个根据交通信号灯判断要不要前进的神经元。它由三部分组成：输入、内部参数和输出。 

![](https://piccdn3.umiwi.com/img/201901/27/201901271929304965541435.png)

这个神经元的输入就是红灯、黄灯和绿灯这三个灯哪个亮了。我们用1表示亮，0表示不亮，那么按照顺序，“1，0，0” 这一组输入数字，就代表红灯亮，黄灯和绿灯不亮。

神经元的内部参数包括“权重（weight）”，它对每个输入值都给一个权重，比如图中给红灯的权重是 -1，黄灯的权重是 0，给绿灯的权重是 1。另外，它还有一个参数叫“偏移（bias）”，图中偏移值是 -0.5。

神经元做的计算，就是把输入的三个数字分别乘以各自的权重，相加，然后再加上偏移值。比如现在是红灯，那么输入的三个数值就是1、0、0，权重是 -1、0、1，所以计算结果就是：

1×(-1) + 0×0 + 0×1 - 0.5 = -1.5。

输出是做判断，判断标准是如果计算结果大于 0 就输出“前进”命令，小于 0 就输出“停止”命令。现在计算结果小于0，所以神经元就输出“停止”。

这就是神经元的基本原理。真实应用中的神经元会在计算过程中加入非线性函数的处理，并且确保输出值都在 0 和 1 之间，但那些都是技术细节，我们这里不必在意。

本质上，神经元做的事情就是按照自己的权重参数把输入值相加，再加入偏移值，形成一个输出值。如果输出值大于某个阈值，我们就说这个神经元被“激发”了。当然，人脑的神经元不一定是这么工作的，但是这个模型在计算中很好用。

神经元的内部参数，包括权重和偏移值，都是可调的。用数据训练神经网络的过程，就是调整更新各个神经元的内部参数的过程。神经网络的结构在训练中不变，是其中神经元的参数决定了神经网络的功能。

接下来我们要用一个实战例子说明神经网络是怎样进行图形识别的。我们要用一个简单的神经网络识别手写的阿拉伯数字！咱们下一讲再说。

![](https://piccdn3.umiwi.com/img/201901/27/201901271900354894544819.jpg)

