![深度学习之模型设计:核心算法与案例实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/822/33114822/b_33114822.jpg)
1.3 神经网络基础
深度学习经过了半个多世纪的软硬件的发展,整个过程可分为3个阶段,下面将详细介绍深度学习发展过程中诞生的重要技术——神经网络。
1.3.1 生物神经元与人工神经网络
人工神经网络(Artificial Neural Network)简称神经网络(Neural Network,NN),是人类模拟生物神经网络的结构和功能提出的数学模型,广泛应用于计算机视觉等领域。
虽然人工神经网络的设计在很多地方并不遵循生物神经元的原理,但它确实是受生物神经网络的启发产生的,其中最重要的概念就是神经元。
神经元又称神经细胞,是生物神经网络的基本组成。其外观和大小在神经系统中差异很大,但都具有相同的结构体,即胞体、树突和轴突。胞体又名核周体,由内质网、微管、游离核糖体、神经丝和核组成。轴突和树突是神经元的突起,在神经元间传递电信号。神经元的功能是接收信号并对其做出反应,传导兴奋,处理并存储信息,以及发生细胞之间的联结等,有了这些功能,动物才能迅速对环境的变化做出整合性的反应。
神经元之间相互连接,当某一神经元处于“兴奋”状态时,其相连神经元的电位将发生改变,若该神经元电位改变量超过了一定的数值(也称阈值),则其被激活,处于“兴奋状态”,并向下一级连接的神经元继续传递电位改变信息。信息从一个神经元以电传导的方式跨过细胞之间的联结(突触),传给另一个神经元,最终使肌肉收缩或腺体分泌。
神经元可以处理信息,也可以以某种目前还未知的方式存储信息。突触的连接可使数目众多的神经元组成比其他系统复杂得多的神经系统。从神经元的结构特性和生物功能可以得出结论:神经元是一个多输入单输出的信息处理单元,并且其对信息的处理是非线性的。
基于上述背景,1943年,McCulloch和Pitts提出了MP模型,这是一种基于阈值逻辑算法创造的神经网络计算模型,由固定的结构和权重组成。
在MP模型中,首先某个神经元接受其余多个神经元传递的信号,多个输入与对应连接权重相乘后输入该神经元进行求和,再与该神经元预设的阈值进行比较,最后通过激活函数产生神经元输出。每个神经元均为多输入单输出的信息处理单元,具有空间整合特性和阈值特性。
MP模型把神经元抽象为一个简单的数学模型,模拟了生物神经元的激活方式,成功证明了神经元能够执行逻辑功能,由此开创了人工神经网络研究的时代。从此神经网络的研究演变出两种不同的思路:一种是继续生物学原理方面的探究,着重关注大脑中信息传递与处理的生物学过程;另一种是逐渐趋于计算机学科,开始研究人工神经网络的应用。
1.3.2 感知机是神经网络吗
感知机(Perceptron)是Frank Rosenblatt在1957年提出的概念,其结构与MP模型类似,一般被视为最简单的人工神经网络,也被作为二元线性分类器广泛使用。
在通常情况下,感知机是指单层的人工神经网络,以区别于多层感知机(Multilayer Perceptron)。尽管感知机结构简单,但其能够学习并解决较复杂问题。其结构如图1.15所示。
假设有一个n维输入的单层感知机,x1~xn为n维输入向量的各个分量,w1~wn为各个输入分量连接到感知机的权量(或称权值),θ为阈值,f为激活函数(又称激励函数或传递函数),y为标量输出。理想的激活函数f(·)通常为阶跃函数或Sigmoid函数。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_32_1.jpg?sign=1738997174-rVcPz8SZK8s1PN7UbcZrF6wFazFsbcvC-0-cfd051dc2f5c4967e9d41ea2387ef371)
图1.15 感知机结构
感知机的输出是输入向量X与权重向量W求内积后经激活函数f所得到的标量。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_32_2.jpg?sign=1738997174-wmEMnxrnIZlH0EDiSaZjioZbATVjT6iS-0-b255dec55bab5d223163a17ea221baed)
权重向量W的初始值一般是随机设置的,往往达不到较好的拟合结果。那如何更改权重数值使标量输出y逼近实际值呢?这时需要简单了解感知机的学习过程。
首先按照式(1.1)得到输出值,然后将实际输出值和理论输出值做差,由此来调整每个输出端的权值。学习规则是用来计算新的权重向量W及新的偏差B的算法。
下面举一个实际的例子来说明。
中国常用的长度单位为厘米(cm),美国常用的长度单位为英寸(in),两者之间有一个固定的转化公式。现在假设我们并不知道该公式,在单层感知机(目前考虑为单输入)的输入端输入以英寸为单位的数值,希望输出端输出相应的以厘米为单位的数值。
首先我们先设定输入值为10英寸,并随机设定隐藏神经元的数值,假设w为1。此时单层感知机的输出为
10×1=10(厘米)
但我们知道正确的输出应该为25.4厘米,这时可以计算输出值与真实值之间的差:
误差值=真实值-输出值
=25.4-10
=15.4
下一步用这个误差值对权重w进行调整。
如将w由1调整至2,可以得到新的结果:10×2=20(厘米)。这个结果明显优于上一个,误差值为5.4。
再次重复上述过程,将w调整至3,结果为:10×3=30(厘米),明显超过了真实值,误差为-4.6,与当w=2时符号相反。
如果误差达到可以接受的范围,就可以停止训练;如果不能接受,可以继续在[2,3]微调w。
在上述例子中,感知机接收一个输入,并做出对应的预测,称为预测器。
下面给出一个单层感知机应用于分类问题的Python应用实例。
1.输入数据集与其对应标签
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_32_3.jpg?sign=1738997174-g5cSlpG1k3eZHMIo0gJkexJ4DCTJRLo7-0-8397898eb17387af3f399566aecd6882)
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_33_1.jpg?sign=1738997174-8qYo0ruafyYL7v6LpddffAVc7anyG1Y7-0-e62dc5cf58226c4d1775ff6813284532)
外界输入是4个值,后两个值确定平面上的某个点的位置,前两个值相当于偏置值,与阈值的意义相同,Y存储每组值对应的正负标签,这里输入了5组数值。现在需要做的是找到一条直线,将正负值区域分开。
2.权重的初始化
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_33_2.jpg?sign=1738997174-gsXHw0afET2IFgF1ar7un7TvOkZe5wel-0-060518ed2e12c88dcc6960a3a4fd51e1)
随机生成范围为(-1,1)的权重,权重的个数与输入向量维度相同。
3.更新权重函数
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_33_3.jpg?sign=1738997174-nvLAc6C9ULhZZzVAQ2kpOaC5GFsjfkHm-0-d45969493f65cd8275a555f4bb3f8f47)
若随机生成的权重W不能合理区分正负值区域,就要根据当前输出标签和原有标签差值的大小进行权重调整,将二者的差乘以输入X,再与学习率lr相乘得到权重改变值,然后与原有权重相加后得到新权重。
完整的代码如下。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_33_4.jpg?sign=1738997174-rz8RwFH6RNhWDqtwjM4K87yqtZF8XqtU-0-67c6e75a037ae59d2e379e5721ae7ee9)
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_34_1.jpg?sign=1738997174-6YwKuM4du8c89a8Bqb77GURoFuHZ1Dlu-0-2055766d660bdff7936986c49940b243)
感知机分类结果示意如图1.16所示。
单层感知机类似一个逻辑回归模型,可以做线性分类任务,其结构简单,权重更新计算快速,能够实现逻辑计算中的NOT、OR、AND等简单计算。
1969年,美国数学家及人工智能先驱Minsky在其著作中证明了感知机本质上是一种线性模型,只能处理线性分类问题,连最简单的XOR(异或)问题都无法正确解决。这等于直接宣判了感知机的死刑,神经网络的研究也陷入了近20年的停滞。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_35_1.jpg?sign=1738997174-v0K9LxN1Fxd3zKVsMw5TQONbgoQkYZYd-0-2361e836112392906f27cc728d052a87)
图1.16 感知机分类结果示意
1.3.3 BP算法
多层感知机(Multi-Layer Perceptron,MLP)是由单层感知机推广而来的,其最主要的特点是有多个神经元层。一般将MLP的第一层称为输入层,中间层称为隐藏层,最后一层称为输出层。MLP并没有规定隐藏层的数量,因此可以根据实际处理需求选择合适的隐藏层的数量。另外,MLP对于隐藏层和输出层中每层神经元的个数也没有限制。
图1.17和图1.18所示分别为单隐藏层前馈网络和多隐藏层前馈网络。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_35_2.jpg?sign=1738997174-EdIr4CoBY5laf1hZrv99IBJ3sdWb63fL-0-4995f416d5d2f569564b4885437a4515)
图1.17 单隐藏层前馈网络
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_35_3.jpg?sign=1738997174-6SzMl6V4IOgQio2rYzasLRMKEDsGo7Y3-0-dffe586d21fad2f903b3b687ec43de32)
图1.18 多隐藏层前馈网络
多层感知机的关键问题在于训练其中各层间的连接权值,其训练方法大致可以分为两类:一类是将其他连接权值固定,只训练某两层间的连接权值,研究者已从数学上证明了这种方法对所有非线性可分的样本集都是收敛的;另一类是大家所熟知的BP神经网络,其通常使用Sigmoid和Tanh等连续函数模拟神经元对激励的响应,使用反向传播BP算法对神经网络的连接权值进行训练。
下面将推导BP算法公式,以便让大家对BP算法有一个直观的理解。
令表示第l-1层的第i个神经元到第l层的第j个神经元的连接权值,
表示第l层第j个神经元的输入,
表示第l层第j个神经元的输出,
表示第l层第j个神经元的偏置,C表示代价函数(Cost Function),相关变量计算如下。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_1.jpg?sign=1738997174-ZXsJJAxLd3JeZT1v9HysIr9COLmYrAmD-0-26c7f7be1554b5d1fbec4281f9a95f4a)
其中,f(·)表示激活函数,如Sigmoid函数。
训练多层网络的目的是使代价函数C最小化。对于一个单独的训练样本X,其标签为Y,定义其代价函数为
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_2.jpg?sign=1738997174-udV0St7hS6WRgLa8jKDvNdqNuulgyvkx-0-3bed8b3d55ddaefa34f2de87364e4c03)
可以看出,这个函数依赖实际的目标值Y。yL表示预测结果,它是权值和偏置的函数,通过不断地修改权值和偏置值可改变神经网络的预测结果。
那么如何更新权值和偏置值呢?
首先定义误差δ,令表示第l层第j个神经元上的误差,可定义为
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_4.jpg?sign=1738997174-GqIFL5aslKrTnkqX5J2XrBmHAXpepQPY-0-914fe037cdb377f847b64dd8a136d950)
结合式(1.2)和式(1.3),由链式法则可得输出层的误差为
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_5.jpg?sign=1738997174-MRAlxoNaIMYvNBPZk3eq1czVLSgU1VR2-0-9ca5144b196b4d04c329a64d7ba0e8ba)
因为当前层神经元的输入是上一层神经元输出的线性组合,由链式法则可知,通过下层神经元的误差来表示当前层的误差:
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_6.jpg?sign=1738997174-HHNEns6pLSFIQiXKgIXB7az463ZLlXJD-0-1dc4b1320e17eb52038b6c52634b6a47)
因为是
的函数,继续推导可以得到
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_9.jpg?sign=1738997174-0CoWRlWjeZwvvvLjobQEHmd9cXpSS8Hn-0-993ab4e1a48dbf3597e71d1fa1310c22)
对求偏导,可得
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_11.jpg?sign=1738997174-V3jhHWJ6Ixt9OgUhoRNKTDwLuOWwJ804-0-0a84eb3ac80be2626b61b92634f0ea36)
故有
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_12.jpg?sign=1738997174-2B21x9ubFZMX3ttWgDJ1L2J6OTrDP9oE-0-40c8600a4ff0480d49a686f8ed0195ac)
这就是反向传播过程,即第l层神经元j的误差值,等于第l+1层所有与神经元j相连的神经元的误差值的权重之和乘以该神经元j的激活函数的梯度。
可以通过以下公式更新权值:
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_36_13.jpg?sign=1738997174-SaomBlgaYcgF4IUB0bPGb2luROS61hIE-0-dda3e8600e71da8423b9ab5e3d31f3af)
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_37_1.jpg?sign=1738997174-gZoK6NuvUW2yh4CkN3i70bHPGhYlaEZx-0-6f92994ca55a5a5d980424cc185ccf2c)
由梯度下降法可得更新规则:
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_37_2.jpg?sign=1738997174-1req81rD7YIYPOYF2pHGuTeylEaN1NcV-0-76988c7f3cd0388a96c736aa19f57d60)
由此可以看出,反向传播过程就是更新神经元的误差值,然后再根据所求出的误差值更新权值和偏置值的过程。
下面给出基于BP算法的多层感知机解决异或问题的Python实例。本例中对神经元添加了非线性输入,使等效的输入维度变大,划分对象不再是线性的。
具体代码如下。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_37_3.jpg?sign=1738997174-CuZ3BdfHs2iPkMfClxp1b8SatLkRteog-0-4ab8b0f2fc60692670e9afb5f4c50ac7)
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_38_1.jpg?sign=1738997174-Umt6qKF1OPVSz9W5ambU8caXFe722TQA-0-b7767f667dd38771afed7b649b3e3fbc)
最后多层感知机解决异或问题结果示意如图1.19所示。
![](https://epubservercos.yuewen.com/60C819/17725770607802806/epubprivate/OEBPS/Images/39030_38_2.jpg?sign=1738997174-Nei67H4DMAzDu7Gnm4DifEHmf6lnkSDb-0-dee2e19bb977524ef53da731a2052f42)
图1.19 多层感知机解决异或问题结果示意
虽然BP算法应用广泛,但它仍然属于传统的机器学习算法,需要我们对图像进行手工特征提取以作为输入,这限制了模型的学习能力。
经过近10年的迭代后,1997年,LSTM模型被发明,并且在序列建模上取得了重大突破;LeNet网络系列的最终版LeNet5卷积神经网络在1998年被提出,并且在银行手写数字识别任务中取得了很好的成绩。随着大数据时代的到来,以及GPU等硬件计算能力的飞速发展,深度学习悄然孕育。