ANN原来如此简单
人工神经网络目前仍然是一个火热的话题,许多人都对它充满了兴趣。然而,对于想了解ANN具体是怎么回事的同学来说,往往缺乏一个足够简单可视化的方法去了解神经网络的内部构造。网络上的各种文章除了数学公式以外,剩下的多是利用Tensorflow等现成的python库实现的样例,虽然实现起来简单,但是底层函数全部封装起来,十分难以理解。因此,神经网络往往在大家的心目中呈现出高深莫测的样子。然而,这篇文章的写作目的就是为了把神经网络拉下神坛,让任何对Excel有最基本了解的人也能在自己的电脑上搭建出一个能准确识别手写数字(准确率达到95%以上)的神经网络出来,同时还能对神经网络的运行底层算法有一个非常直观的了解。对于仅仅是感兴趣的初学者来说,能够非常直观地看到神经元长什么样子,能够非常清晰地看到网络的前馈计算和反向传播的参数传递过程,对于希望了解神经忘咯具体算法的研究者或爱好者来说,能够直观地了解各种不同的算法参数的区别,从而对神经网络各个超参数(hyper parameter)的选择和调整产生更深刻的理解。
本文在写作时考虑到需要照顾各个不同层次的读者,因此会力求从浅到深,按照下面的结构来编排,同时每一个章节又相对独立,如果对某些部分已经熟悉的读者,大可跳过一部分,直接阅读感兴趣的章节即可
- 第一节,神经网络的历史
– 神经网络和人工智能
– 人工神经网络是一个很老的概念
– 神经元和神经系统 - 第二节,开始了解人工神经网络
– 感知器模型和多层感知器模型
– 神经网络的前馈计算和反馈
– 神经网络的有监督学习算法 - 第三节,Excel中实现MNIST手写数字识别
– MNIST数据集
– 神经元基本计算的实现
– 损失函数及反向传播算法的实现
– 用简单的宏实现随机梯度下降训练
– 训练成果的 - 第四节,神经网络的优化:实现CNN卷积网络
– 卷积网络的结构
– Excel中逐步实现卷积池化和全联接计算
– 随机梯度下降算法及训练成果 - 第五节,更多的内容
– 使用VBA实现的ANN Excel工具箱
– 使用tensorflow实现ANN
第一节,神经网络的历史
神经网络和人工智能
自从人类第一次发明机器开始,就一直梦想着创造一种可以自己思考、甚至拥有自主意识的机器,拥有与人类的大脑一样能力。我们把这样拥有智能的机器叫做人工智能或机器智能。
其实很多人有误解,认为所谓人工智能就是在机器或电脑中模拟出人类的智能,但是看看那些闻名遐迩的“人工智能程序”,比如和卡斯帕罗夫下棋的电脑“深蓝”,还有名声赫赫打遍天下无敌手的阿尔法狗,还有特斯拉的自动驾驶程序,我们虽然会认为这些电脑程序能够出色地完成一些前所未见的任务,但恐怕没有人会认为他们拥有了人类的智能吧。可以这么说,尽管现在很多的“人工智能”项目如火如荼,但没有任何一个计算机程序宣称自己模拟出了人类的智能?
那么我们说的人工智能是什么呢?计算机行业定义人工智能的研究对象是一种“智能设备”:“能够对外界环境进行感知并且做出反应,并借此提升其解决问题或达到特定目标的能力的设备1”。然而,人工智能的定义随着时代的变迁,也在不断地变化。因为随着技术的发展,很多原来难以企及的任务,现在可以轻松地用计算机完成了,而一旦一个任务被完成,它就会被大家从“人工智能”的定义中去掉,转而去攻克下一个课题。比如,文字识别或手写识别曾被认为是一个典型的人工智能任务,但现在已经是一项成熟的技术,不再是人工智能的课题。所以,有人说,现在计算机还做不到的事情,就是人工智能(“AI is what ever hasn’t been done yet”)2。
人工智能作为计算机科学的一个分支,从上世纪五六十年代开始被卡内基梅隆大学CMU和麻省理工MIT的一群创意超群的学者在达特茅斯3提出以来,发展出了各种不同的研究方法、工具,并形成不同的研究流派,其中有的在早期红极一时但后来又迅速没落,有的早起并不被人看好,但随着计算机性能的提高而被人重新发现从而复兴。
那次著名的达特茅斯研讨会的参与者们现在被认为是AI的开山鼻祖4
在早期,人们研究人工智能的方法大致上沿着一种形式化(Symbolic)智能的路线在前进,通过程序来描述解决问题的实际逻辑,比如在80年代非常成功的“专家系统”就是典型的一种。在专家系统的数据库中,知识被以一种明确的格式存储在计算机中,通常像这样“如果一个健康的成年人突然发烧,那么他很可能得了感冒”。这样的知识集合起来,形成了具有“专家智能”的系统。后来,数据和统计学方法也被大量用于人工智能,解决问题的方法变成通过大量历史数据的统计结果来判断当下,就比如说:“通过对过去X个与现在这个病人有相似的体温、年龄及症状的病人的分析,有Y%的病人被确诊为感冒”5。除了上述两种比较容易理解的方法以外,人们还会使用被称为“人工神经网络”的工具来实现人工智能,它模拟人脑中神经元的工作方式,通过对神经元连接强度的不断微调,最终实现对外界的感知、对模式的识别、或者对输出的预测。
人工神经网络的缘起
与许多人心目中的印象不同,人工神经网络并不是一个最近才被发明出来的概念。其实,神经网络的概念早在1943~1954年就开始形成了6。要知道,世界上第一台电子计算机ENIAC可是在1946年才在宾夕法尼亚大学被制造出来的。这个比电子计算机还要老的数学模型,在如今强大的计算能力和海量数据的加持下,已经成为了最强大的工具。
说到神经网络的最初开创性工作,必须要提到下面这两个人:
McCulloch是一个心理学家,和他的数学家朋友Pitts在1943年共同提出了一个被称为McCulloch Pitts感知器的神经元数学模型。最初建立这个模型的目的是为了通过模拟人脑的功能,人脑太过于复杂,需要从最基本的组成结构开始搭建,而最基本的结构就是神经元。就像利用门电路作为砖块搭建电子计算机一样,人们也期望可以用人工神经元搭建起一个人工的大脑。不过,关于人工大脑的建立,人们一直有着疑虑,通过模拟真实的神经元,真的可以创造出人工大脑么?要知道,人类的航空工业并不是模拟鸟类的飞行原理而建立的,今天我们研究神经元,真的能够创造出人工大脑来么?这个问题现在还没有答案。但人工神经元现在正在创造出的奇迹,已经足以让人为之兴奋不已了。
神经元和神经系统
首先让我们看看神经元:
我们的大脑是由超过100亿个神经细胞组成的,每一个神经细胞是我们的神经系统乃至大脑最基本的功能部分,因此我们也叫它神经元。在显微镜下,神经元长得像上图中的样子。每一个神经元的表面都有很多的突起,通常每个神经元有一条长长的突起,同时还有许多条较短的突起。较长的那个叫轴突,较短的被称作树突。每个神经元的轴突都会与另一个神经元的树突联接起来,在连接的部位,通过一系列的电化学反应,一个神经元可以将它产生的微弱电信号传递给下一个神经元,当成千上万的神经元通过轴突和树突相互连结成复杂的网络,无数的电信号在这样的网络中如同骤风暴雨般传递时,意识便产生了:
我们仍然不太清楚大脑整体是如何工作的,但是对于单个神经元,我们却有了不少的了解。单个的神经元有这样一些特性:
单向连接:我们现在知道,神经元的信号传递是有方向的,神经电信号在通过轴突、树突进行传递时,只能通过轴突传递到树突,而无法将信号通过树突反向传递给轴突。因此神经元就拥有了独特的输入、输出的结构:从树突接受信号输入,而从轴突产生信号输出传递给下一个神经元
兴奋/抑制特性:大多数的神经元细胞在接收到输入信号后,会将输入信号转化为特定振幅的电压脉冲编码。由于每个神经元的树突连接强度不同,神经元从树突的每个节点接受到的树突电位是不同的,众多接收到的树突电位会在神经元内部的整合区进行总和,总和电位如果大于神经元的阈值时,会导致神经元兴奋并将电信号传递到下一个神经元,否则会发生“抑制”作用,不会传递任何信号出去7
可塑性:一个神经元的兴奋与抑制的阈值并不是一成不变的,随着神经元受到不同电信号的刺激,一个神经元的兴奋阈值和树突连接强度都会产生不断的变化以适应新的刺激。体现在宏观的层面上,其实这就是神经元的学习功能
神经元的上述特性都在McCullen和Pitts建立的MP感知器数学模型中一一得到了体现,将许多个这样的感知器连接起来,便具备了最基本的逻辑判断功能。我们将在下一节中了解感知器和人工神经网络
- Definition of AI as the study of intelligent agents:
Poole, Mackworth & Goebel 1998, p. 1, which provides the version that is used in this article. Note that they use the term “computational intelligence” as a synonym for artificial intelligence. ↩ - Hofstadter (1980, p. 601) ↩
- Hegemony of the Dartmouth conference attendees:
Russell & Norvig 2003, p. 17, who write “for the next 20 years the field would be dominated by these people and their students.”
McCorduck 2004, pp. 129–130 ↩ - 图片来自网络文章:以科学的方式赤裸裸地剖析人工智能 | 混沌初开,洪小文 ↩
- wikipedia: artificial intelligence 词条,Basics ↩
- Simon Haykin: Neural Networks and Learning Machines 神经网络和机器学习 ↩
- wikipedia: Neuron词条的解释:All-or-none principle ↩