第一部分 神经网络基础及MATLAB
绪论
“智能”无疑是当前的流行词之一,相关的新闻报道和各种消息中经常会出现,而且很多产品也被冠以“智能”。然而对于如何定义智能及实现智能,大家却不是很关心。好像只要能给生活带来一些便捷的产品就可以将其称为智能产品,例如智能手机、智能家居等。事实上,对于智能的定义是在不断变化的,从心理学上定义的智能到机器智能、人工智能都有不同的表述。而机器智能多指具有一定的类似人的推理能力的机器或装置。这些智能的机器或装置的确给我们的生活带来了不少便利,使得很多人对其青睐有加,想方设法使它更加“聪明”地为我们服务,这就涉及智能的实现问题。
智能如何实现?人们会很自然地联想到自身,智能的实现可以借鉴人的智能的实现,首先应该有一个“大脑”用来思考,还应该接受一定的教育和训练才能“智能”地生活和“智能”地工作。这实际上就说明了智能的实现应该有两方面的支撑:一是“大脑”——计算机硬件,二是“思维”——软件和算法。计算机硬件的发展依赖于制造业和材料科学的发展,当然也得有古老和传统的采矿业的支撑;而智能的实现更主要的是软件和算法。这正如人的智能:光有一个机灵的大脑是不行的,还要经过系统的学习和训练才能成为一个有思想、会思考的人!中国古典读物中也有“玉不琢,不成器;人不学,不知义”的说法。一个人机灵的大脑可能来自遗传,相应地,一个智能机器的硬件会依赖于材料科学等方面的保障。要使机器具有“智能”,则更应该强调其软件和算法的效率和优势。因此,从智能的实现上来说,也强调高效的算法。
如何实现高效的智能算法呢?在20世纪中叶,很多富有远见的学者就开始了探讨。在1956年夏天,美国学者赫伯特·亚历山大·西蒙(Herbert Alexander Simon,1916—2001)、约翰·麦卡锡(John McCarthy,1927—2011)、马尔文·李·明斯基(Marvin Lee Minsky,1927—2016)、纽厄尔(Allen Newell,1927—1992)等聚集在达特茅斯一起讨论关于信息处理的学术问题,在这次会议(达特茅斯会议)上首次提出了“人工智能”这一术语,一般认为这就是人工智能的起源。
在此后将近10年的时间,也就是到20世纪60年代中叶,关于智能研究的主题是系统的执行能力,研究内容为对数据的优化处理,即智能系统在接收到相应的数据后进行自寻优的过程。需要设计在现在看来较为简单的算法使系统能够自动进行优化处理,例如某些棋局对弈程序。随着技术问题的不断出现,也在不断提出新的处理要求,各种智能算法层出不穷。在智能算法领域始终存在两种方向(发展为两大学派):一是以传统统计学为基础,并在此基础上不断改进和发展的统计学习理论和支持向量机方法;二是仿生智能,这是受到了生物智能或神经科学的启发而发展出的一系列智能方法,例如遗传算法、神经网络等。
传统统计学对于智能算法方面的基础贡献主要来源于传统统计学中的多元统计分析。多元统计分析是对标量数据统计的扩展。多元统计分析方法建立在严密的数学推理基础上,对于数据样本的分析给出了详尽的分析过程和不容辩驳的结果。很多基于统计学方法的智能算法都能在多元统计分析的范畴进行溯源,例如线性分类、聚类和主成分分析等。在某种程度上,可以说多元统计分析是智能算法的源流。当然,多元统计分析方法也存在一些问题,首先,多元统计分析方法始终还是一种静态分析方法,对于动态系统的数据建模,多元统计分析方法是无能为力的;其次,由于关注数学分析的严谨,多元统计分析方法的计算量比较大。但不论怎样,经过多年的不断发展,统计学习理论学派在基于贝叶斯理论的基础上形成了统计学习的方法,因此也被称为“贝叶斯派”。这个学派的主要代表人物是弗拉基米尔·瓦普尼克(Vladimir N. Vapnik)和阿列克谢·切沃宁基斯(Alexey Chervonenkis)。
仿生智能作为智能算法的一个重要分支,与统计学相比,可能在理解上更为容易,同时在普及程度上也似乎比统计学更广一些。在仿生智能中又有很多分支,例如生物遗传算法、粒子群算法等。但其中最有代表性的莫过于神经网络算法了。神经网络算法正如其名,最初是受到了神经元对于外部刺激-响应模式的启发,然后利用简单的电路实现的,后来随着硬件水平的不断提高,神经网络算法的复杂程度和精细程度也在不断提高,在很多传统技术难以解决的领域大显身手,受到了广泛的赞誉。首先,经典神经网络算法是依赖于数据的,对于外部输入的大量数据,经过一定的处理可以很好地建立起输入和输出之间的关系。这种关系一般是非线性的(如果是线性关系,则不必费这么大的周折)。因此,神经网络对于非线性映射关系的建立有着不可撼动的地位。其次,神经网络是依赖于结构的,网络结构的调整和改变往往会带来不同的运算效果。因此,神经网络的发展也促进了其他相关学科的发展。最后,神经网络的学习模式与人类的学习模式存在一定的相似性,神经网络学习模式的产生和发展在很大程度上是受到了人类的学习模式的影响,因此神经网络的学习模式与人类的学习模式可以相互借鉴,促进人工智能的不断发展。
鉴于神经网络自身的特点,这种具有特色的仿生智能算法也受到了一些质疑,例如神经网络并不能解释非线性映射的机理,只是“照猫画虎”地“模仿”;神经网络依赖于数据,其泛化程度不尽如人意;神经网络的学习模式过于单一等。对于这些质疑,神经网络计算学派在不断推广其实际应用的同时也在不断反思和改进。经过多年的改进后,一种新型的神经网络终于面世——这就是基于深度学习的神经网络。在这种神经网络中,将统计学和其他较为严谨的数学理论引入,在一定程度上规避了传统神经网络的缺点,从而在很大程度上提升了传统神经网络的性能。AlphaGo与李世石的围棋之战就是一个很好的例证。目前,各种基于深度学习的神经网络如雨后春笋般相继推出,例如卷积神经网络、生成对抗网络等。这似乎预示着在将来一段时间内以神经网络为基本架构,同时兼顾统计学派学习方法的智能学习模式可能要占据人工智能领域的制高点。
再好的理论也得有实践的平台,各种神经网络算法的实现也不例外。在硬件平台方面,现在已经有很多性能良好的GPU和CPU供神经网络算法运行,而且,在AlphaGo与李世石围棋大战两个月后,谷歌公司的硬件工程师公布的张量处理单元(Tensor Processing Unit,TPU)已经应用于深度学习神经网络。有的技术人员甚至声称“TPU的处理速度比当前GPU和CPU的速度快15~30倍”。这些处理单元主要应用于很多专用和特殊的场合,而对于神经网络的初学者来说最为重要的是了解算法的结构,体验算法的效率。基于这种考虑,如果不进行超大规模的神经网络计算,则一般性能较好的PC就足以支撑算法的运行。有了硬件支撑,接下来就要考虑算法和软件了。目前能够在PC上运行神经网络算法的软件有很多种,这些软件各具特色,从不同的侧面反映着神经网络算法的特点。传统而经典的C、C++语言主要侧重于基础和底层的开发;Java语言由于其半编译性的特点具有较高的可移植性,但在运行速度上有一些问题;在当前智能算法、神经网络的开发领域很多人推崇Python语言,但Python语言对于线程的处理又似乎不尽如人意……可以看出,对于软件和计算机语言的选择,更多的是见仁见智、难分伯仲。对于想了解和体验神经网络算法优势的人来讲,笔者推荐使用MATLAB软件。
单纯从计算机语言的角度讲,MATLAB不像是一种计算机语言。虽然它也有一些语法规则,但与正统的计算机语言相比,似乎显得简陋了一些。然而自从诞生以来,MATLAB在科学分析和计算领域就一直占据很重要的位置。MATLAB是Matrix和Laboratory两个词的组合,意为矩阵实验室。MATLAB最初推出的版本就以简洁和类似手工计算的方式解决了矩阵计算的问题。当时被称为“演算纸式”计算机语言。紧接着,MATLAB提供控制工程领域仿真分析软件包。在其后几十年,MATLAB不断发展,陆续将各学科和技术领域的分析计算软件包囊括在内,形成了涵盖控制、电气、电子、通信、虚拟现实甚至航空航天等诸多领域的庞大软件。此外,MATLAB还体现了体系开放的特点,对于C、Python等语言可以相互交融,进行混合编程。从某种程度上说,MATLAB软件是广大科技人员不可或缺的理论分析和仿真运算工具。
MATLAB既提供了较为规范和完备的传统神经网络工具箱,也为新型的深度学习神经网络留下了扩展空间。在学习神经网络基础理论的同时,如果能够利用MATLAB对所学的理论进行验证则会达到事半功倍的效果。如果在此基础上激发创新的灵感,开发出更加有效和实用的神经网络,那更完美。