太长不看划重点,由我个人理解,人工「神经网络」在信息处理上的特点可以归纳为以下三类:
为了充分了解这三个特点,我们需要从人工神经网络是什么开始讲起
人工神经网络(英语:Artificial Neural Network,ANN),简称神经网络(Neural Network,NN),在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。
神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统,通俗的讲就是具备学习功能。
现代神经网络是一种非线性统计性数据建模工具,神经网络通常是通过一个基于数学统计学类型的学习方法(Learning Method)得以优化,所以也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,我们通过数学统计学的应用可以来做人工感知方面的决定问题(也就是说通过统计学的方法,人工神经网络能够类似人一样具有简单的决定能力和简单的判断能力),这种方法比起正式的逻辑学推理演算更具有优势[1]。
和其他机器学习方法一样,神经网络已经被用于解决各种各样的问题,例如机器视觉和语音识别。这些问题都是很难被传统基于规则的编程所解决的。
那么,人工神经网络是怎么模仿生物神经网络的呢?让我们先展开说说
神经系统Nervous system中的细胞叫做神经元Neuron,人脑中有大概一千亿个神经元。树突Dendrite和轴突Synapse。而神经元之间通过电化学过程进行交流
生物神经网络中,每个神经元与其他神经元相连,当它兴♂奋时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阈值,那么它就会激活,即兴♂奋起来并向其他神经元发送化学物质。
深度学习借鉴了这样的结构,每一个神经元(定义中的适应性简单单元)接受输入 x ,通过带权重 w 的连接进行传递,将加权总输入信号与神经元的阈值θ进行比较,最后通过激活函数处理确定是否激活,并将激活后的计算结果 y 输出,而我们所说的训练,所训练的就是这里面的权重 w。
而将这些神经元一层一层地相互连接,我们就得到了一个复杂的多层神经网络~
如下图所示,每一层的每一个神经元都与上一层的每一个神经元相连,所以这也叫全连接神经网络。
而下图的连接都是用箭头表示的,这说明信息(数据)的流动方向是由“输入→输出”,一路向前不回头,因此这种神经网络也成为“前馈”神经网络。
把上述的三段话合在一起,我们就得到了最原始的神经网络模型——“多层/全连接/前馈/神经网络”
是不是觉得看着头昏脑胀,看了这么半天还没有涉及到我说的那三个特性?那不如让我们找一个实际的例子说明一下!
卷积神经网络为代表的深度学习理论在舆论界走向高潮的事件是16年左右Alpha Go先后击败人类顶尖棋手李世石和柯洁[2]。
但在此之前,深度学习理论在学术界获得重视的出发点则是2012年名为AlexNet[3]的卷积神经网络模型力压群雄,获得了图像识别比赛ImageNet的冠军。而随后的所有图像识别比赛中,几乎所有的图像识别类比赛中,名列前茅的参赛队伍都使用了基于卷积神经网络的架构,而在2015年,ResNet[4]的图像识别能力首次超过人类。
(基础好的同学可以参考我的这个回答,了解ResNet的原理)
图像识别其实是个对我们来说很简单的任务:给AI看一张图片,AI告诉你图里的“是什么东西”。
但直到12年之前,这却就是一直难倒一票科学家的问题。因为最早我们解决问题的方法是基于“统计+规则”的方法。如下图所示(密恐警告……)。
过去,程序员通过人为编程告诉程序,狗的脸是一个“白色或者黄色的圆,上面有固定分布的三个黑色小球”这一规则。结果,来自现实数据的毒打教会了程序员,很多曲奇其实也长这样,这种基于简单“统计+规则”的方法行不通。
你可能觉得“再加几条规则就好了?”但实际上,为了实现人想要的效果,需要统计的规则会变得无穷多,甚至我们自己都不知道需要统计哪些规则。你难道以为搞定了曲奇,戚风蛋糕就不会冲过来暴打程序员了吗?
类似问题充斥于计算机视觉,自然语言处理等很多领域。直到有一天,AI程序员的大救星,也就是本文的主角“神经网络”诞生了。它是一种方便的工具,可以对大数据进行自我学习,并找出那些连人类都说不清为什么的规则,且它们就是有用,比如当初暴打人类围棋的“点三三”起手。
而且,图像识别任务是人脸识别/目标检测之类更高级任务的基础。只有教会AI每种东西长什么样,它才能对其做出特定的反应。不知道什么是人脸,美颜相机就没脸可以美,地铁站那些方便的人脸识别功能就更无从谈起了。
实际上,几乎所有计算机视觉任务用到的神经网络模型,都是在图像识别的基础上增补额外的东西。因此,至少在计算机视觉(与图像有关的人工智能)领域,图像识别是重中之重的基础。
让我们继续以图像识别任务为例,在PART1中,我们讲到神经网络接到的输入是一组数字 X,那数字和图片又有说明关系呢?
实际上,在信息处理中,所有不同的信息最终都要被用各种方法转化为数字信号(比如音频信号的模数转换),而图片信息则是各个像素点上,各个颜色的亮度值。现在,我们把 X 看成输入的猫,继续回顾之前说过的内容:
接受输入x ,通过带权重w 的连接进行传递,将加权总输入信号与神经元的阈值θ进行比较,最后通过激活函数处理确定是否激活,并将激活后的计算结果 y输出,而我们所说的训练,所训练的就是这里面的权重w。
而我们的目的,就是想寻找一个奇妙的函数 ,它的输入是一张照片的像素值,然后输出则是这张图片是不是猫(或者说是是猫的概率,这个值越大则说明它越有可能是只猫)
实际上,在实际处理中,输入x 和 权重w 加权求和可以通过一个输入向量 x 与权重矩阵 w 的矩阵乘法[5]描述。让我们先忽略阈值,那么单层神经网络的输出就是:
接下来,我们思考一下为什么要引入非线性?或者说我们为什么要和某个阈值进行比较呢?
当然,最简单的原因就是我们的生物神经元也有兴♂奋和抑制两种状态,所以人工的也可以通过让中间结果 和阈值 比较的方式模拟这两种状态。
但是,从数学上讲,我们也可以很简单想到这个问题。
之前我们考虑的都是只有一层神经网络的情况,现在假设我们有两层神经网络,这两层的权重分别是 ,输入先经 再经过 ,那么这个过程可以写作
这个时候,尴尬的情况就来了,我们知道线性代数中矩阵乘法是满足结合律[6]的,所以上述式子等价于
也就是说,如果我们令 ,那么没有非线性的两层神经网络将会退化为一个一层的神经网络。而且这个结论可以推广到任意层,不管有多少层神经网络,只要没有非线性都会退化为一个很小的一维神经网络。而这种非线性,我们由叫它“激活函数”。
为了让多层神经网络有意义,我们需要对每一层输出的中间结果带入一个非线性的激活函数进行处理。最常用的激活函数就是线性整流单元(Rectified Linear Unit)——Relu!
实际上,Relu做的事情就是将输出结果 与一个等于0的阈值相比,若大于0则输出,小于0则输出0!
有了非线性函数的加持,我们就可以用很多层很复杂的神经网络逼近任意的连续函数!这就是传说中鼎鼎大名的——“万能逼近定理(Universal Approximation Theorem)”[7]
从数学上讲,任何神经网络体系结构都旨在寻找可以将属性(x)映射到输出(y)的任何数学函数y = f(x)。此功能(即映射)的准确性取决于数据集的分布和所用网络的体系结构而有所不同。函数f(x)可以任意复杂。万能逼近定理逼近定理告诉我们,神经网络具有某种通用性,即无论f(x)是什么,都有一个网络可以近似地逼近结果并完成工作!该结果适用于任意数量的输入和输出。
总而言之,在非线性的加持下,我们可以设计出任意复杂的神经网络。而由万能逼近定理,只要我们能计算足够复杂的神经网络,那么我们总可以使用神经网络解决某个十分抽象的数学问题(比如输入图片的像素,得到其内容分类的概率)
这就是第一个特性,非线性:省心的“万能函数逼近器”
虽然神经网络可以设计的十分复杂,但是拆开来看,就单纯只是“加权求和+比较阈值”而已。
那么,这些简单的模块组合在一起,究竟能学习到什么东西呢?
让我们把一个用来识别猫、狗和曲奇等物品的神经网络拆开来看看吧!
所谓拆开来看看,就是找到一个用于图片分类的卷积神经网络,把他们每一层的权重 拿出来,然后画在电脑上(就像我们把照片通过数字保存在电脑显示一样)。
这时卷积神经网络的第一层权重[8](第一层有好多组,这些组是什么则是神经网络的第三个特性)
我们看到了很多小方格,每个小方格就是一组权重,我们会发现特别有趣的一点,那就是即使没有人告诉神经网络,神经网络自己就学习出了很多很多有规则的权重!
比如上面的几个,我们看到了很多不同角度的纹理,这其实这些神经元可以让神经网络对图片中的边、角度和纹理高度敏感!
而下面则是一些色块,这说明这些神经元负责感知图片中的颜色变化和分布!
也就是说,神经网络通过大数据,自己就学会了观察图片中的线条、纹理和颜色,并且学会了各个神经元之间各司其职。
但这有什么用呢?
要知道,这些简单的纹理、边、颜色检测器是十分简单的,简单到我们用几行代码就可以完成同样的效果。也就是说,单个神经元的作用其实十分简单粗暴……
强大在于,这个神经网络有很多层,每一层都是获取上一层的输出作为输入。那么,你可以这么理解,就是神经网络在对信息一步一步的进行自发的组合。本来是几条边,组合在一起就可以形成某种形状,再加上颜色就会变成某个特定的色块,而色块和形状组合又会变成更加具体的图像,这么逐步组合,逐步处理,最终神经网络将会理解极度复杂的信息
复杂到即使是专家,也很难自己写出尽善尽美的规则一步步组合这些信息,而神经网络却可以做到。
在高层神经元权重中,我们其实已经很难看出什么信息了,因为我们自己都搞不懂神经网络在做什么样的组合。但是我们可以去看各个高层神经元会对啥玩意更敏感。以上图[9]为例,每一行都是一个特定的神经元,我们会发现他们各自都对一些事物很敏感,比如人脸,黑白、棕白相间的东西(狗和铁板),红红的一坨(不管是花花还是意大利面)……
总结一下,这就是第二个特性了:单个神经元简单粗暴,组合起来能理解的信息却极度复杂
之前介绍的神经网络是多层全连接前馈网络,但我们举的例子是卷积神经网络。
卷积神经网络[10](Convolutional Neural Networks,CNNs,不是Fake News)是一种对图片信息特攻的神经网络。其相比传统的全连接网络最大的区别就在于卷积。
卷积和信号与系统的卷积有点不太一样,不过意思差不多,就是通过一个更小的神经元:卷积核(filter),滑过输入的每一个位置,每次只处理输入(图片)中的一小部分信息。
这么做的好处在于可以是用更少的参数量,因为图片都是很大的(长1080宽720的RGB图像就有 个数!),传统的全连接神经网络需要把输入的每个数连到一个神经元上,需要的计算量很大,大到没人会考虑拿神经网络搞图片。
而卷积神经网络的好处不只在于参数量少,想象一下,同一个物体有不同的角度,不同的光照,也可能在一张图中不同的位置。但他们同样都是一部分线条和颜色的组合,这样,我们其实更关心的是有没有这些线条、颜色和形状,而不是他们在哪。这就是图片的平移、旋转不变性。
所以,我们可以每次只关注图片的一小部分,寻找那些基本元素再进行一步步的组合!这样就可以最大化地针对图片本身的特性(如平移旋转不变性)设计独特的神经网络求解问题。
更进一步的,针对各种问题,我们都可以针对问题中数据的特性来设计特有的神经网络。
比如,为了处理文字和声音这样的序列,我们设计了循环神经网络[11],为了让神经网络能够自己创造出全新的信息,我们设计了生成对抗网络[12],等等等等……
之所以能设计出这么多变体,也是因为神经网络的基本元素——神经元的原理极其简单,而且他们的组合十分容易,但是组合之后的效果却惊人的好。
因此,它就像一块块乐高积木,我们得以用他们拼凑出各种神秘的东西!
在未来,我们会碰到越来越多的问题,并通过分析设计出各种各样的神经网络解决他们,这就是神经网络的第三个特性:极强的拓展性和潜力
作为一个研究深度学习和计算机视觉的直博生,我还在在人工神经网络这个汪洋大海中探索,每每看到一个新的方法,我都会感慨:这真的是个十分有意思的方向!
我希望我能早一点为这个领域添砖加瓦(指发一些不错的paper,设计出好用的算法和模型)。在这个慢慢求索路上,我会把自己的心得体会记录在我的专栏《薰风的计算机科学家之路》中,欢迎关注~
与君共勉!