人工智能程序员面试笔试宝典
上QQ阅读APP看书,第一时间看更新

4.1 深度学习基础知识

4.1.1 神经网络发展历程

首先以计算机视觉为例谈谈深度学习最早期的发展。自从图灵提出了“机器智能”,达特茅斯会议提出“人工智能”学科后,研究人员就开始活跃起来。正所谓有人的地方就有江湖,人工智能的研究派系主要分为两大阵营。

第一大阵营,被称为符号派,他们用统计逻辑和符号系统来研究人工智能,采用自顶向下的研究思路,也就是要先看懂人工智能是什么,再去一步一步实现它。符号派用人工智能技术来证明公式,发明专家系统,代表人物有纽厄尔(Newell)、西蒙(Simon)等。

第二大阵营是统计派,现在的深度学习就属于这一派,这一派研究问题的方法就是仿造大脑,采用自底向上的思路。通过一个一个简单逻辑的搭建,搭建成一个足够复杂的系统后,系统就自然会有智能了。代表人物为新时代的深度学习三大巨头Yoshua Bengio、Hinton和LeCun。

应该说,符号派的研究方法最早也更加直观,典型的例子是专家系统,它的缺陷也非常明显,必须先对所研究的问题有完整的理解,然后再通过知识编码,这对于达到一定复杂程度的问题来说根本不可能实现,不是所有知识都能一下子说出来原因的。就好比在图像中识别一只猫,到底怎样的一幅图片才是猫的图像,传统的图像描述算子就很难完全定义并保证覆盖到各类场景。

统计派的思路就更加务实,摆事实讲道理,通过统计学习的方法来归纳出知识,不再完全由人工干预,和大数据的特性是天然契合的,这也是成功的必然性。

有学者一生站队在一派,也有的摇摆过,比如马文·明斯基,就从最开始的统计派在第二次AI浪潮中转变成为了符号派,并成为摆脱第二次低谷的重要推手。

统计派采用了模仿大脑的方式,人类花了亿万年的时间来进化,那生物的大脑究竟是如何处理视觉信息呢?

生物学家的研究表明大脑的基本感知单元就是神经元,一个神经元所影响的刺激区域就叫作神经元的感受野,即receptive field,不同神经元感受野的大小和性质都不同。感受野的研究来自于美国神经科学家哈特兰(Keffer Hartline)和匈牙利裔美国神经科学家库夫勒(Stephen W. Kuffler),1953年他们发现猫视网膜神经节细胞的感受野具有同心圆结构。第一种感受野由作用强的中心兴奋区域和作用较弱但面积更大的周边抑制区域构成了一个同心圆结构,称为On型感受野。第二类感受野是由中心抑制和周边兴奋的同心圆构成,称为Off型感受野。当刺激On型感受野中心时,细胞就兴奋,如第一列第一排的图。刺激周边时,细胞就被抑制,如第一列第二排的图,Off型图则反之。不过尽管明白了感受野,视觉感知的机制仍然没有被得到更深刻的理解,直到视觉功能柱的发现。

加拿大神经生理学家David Hunter Hubel和瑞典神经科学家Torsten Nils Wiesel在20世纪50年代和60年代开始研究视觉机制,他们将图像投射到屏幕上,将测量神经元活动的电线插入猫的大脑,通过固定猫的头部来控制视网膜上的成像,测试生物细胞对线条、直角、边缘线等图形的反应。研究显示有些细胞对某些处在一个角度上的线条、垂直线条、直角或者明显的边缘线,都有特别的反应,这就是绝大多数视皮层细胞都具有的强烈的方位选择性。不仅如此,要引起这个细胞反应,直线的朝向还只能落在一个很小的角度范围里,也就是该细胞的感受野内。这样以上两个研究就统一起来了。

从1960年到1980年,两人合作了20年,细致科学地研究了人眼视觉的机制,因此他们被认为是现代视觉科学之父,并于1981年一起获得了诺贝尔生理学与医学奖。

这一项研究,直接催生了David Marr的视觉分层理论,也催生了计算机视觉学科,更是卷积神经网络的发源。

4.1.2 常见的深度学习框架都有哪些,它们都有什么特点

目前最常见的深度学习框架有TensorFlow、Caffe、Keras、PyTorch、MXNet等,本文中的代码均基于PyTorch实现,它们的对比如表4-1所示。

表4-1 常见深度学习框架对比表

4.1.3 什么是人工神经网络

人工神经网络指由大量的神经元互相连接而形成的复杂网络结构。以人的视觉系统为例,人的视觉系统的信息处理是分级的,高层的特征是低层特征的组合,从低层到高层的特征表示越来越抽象,越来越能表现语义或者意图。人工神经网络提出最初的目的是为了模拟生物神经网络传递和处理信息的功能。它按照一定规则将许多神经元连接在一起,并行地处理外界输入的信息。人工神经网络的每一层都有若干神经元并用可变权重的有向弧连接,具体训练过程是通过多次迭代对已知信息的反复学习并调整改变神经元连接权重。人工神经网络主要分为前向神经网络与反馈神经网络。前向神经网络包括单层感知器、自适应线性网络和BP神经网络等,典型的反馈神经网络有Hopfield网络等。

4.1.4 万能近似定理是什么

万能近似定理(Universal approximation theorem)是神经网络理论非常核心的定理,该定理是指如果前馈神经网络具有至少一个非线性输出层,那么只要有足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的函数,换句话说就是只含有一层隐藏层的有限神经元网络可以逼近在实数集上紧子空间的连续函数。

4.1.5 激活函数有什么作用,常见的激活函数都有哪些

激活函数的目的主要是为了在神经网络中加入非线性因素,这样就加强了网络的表示能力,获得更强大的学习和拟合能力。神经网络解决问题的能力与网络所采用的激励函数关系很大,常见的激活函数在PyTorch中都可以直接利用函数调用,例如ReLU函数中可以直接调用torch.nn.ReLU来实现。

(1)0-1激活函数

0-1激活函数将任意的输入转化成0或1的输出:

(2)sigmoid函数

sigmod函数的输出是在(0,1)开区间内,从神经科学的角度理解来看,中间斜率较大部分即为神经元的敏感区,两边斜率较平缓的地方即为抑制区。

(3)tanh函数

tanh是双曲正切函数,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的。tanh有个良好的求导性质:

但是sigmoid和tanh都有个问题就是容易导致梯度消失的现象发生,这是由于两者的导函数在x很大或很小的时候,都容易趋近于0,从而导致梯度消失的现象发生。

(4)ReLU函数

f(x)=max(0,x)

ReLU函数相比于sigmod函数和tanh函数有两个优点:一方面在输入为正数的时候,不存在梯度饱和问题,另一方面计算速度要快很多,这是由于ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。

不过ReLU函数也有缺点,当输入是负数时,ReLU是完全不被激活的,会丢失一部分信息。这就意味着反向传播过程中,输入负数则梯度就会为0,不利于信息的学习。

这里可能会有一个问题,为什么ReLU函数在0点处不是可导的也可以用于梯度学习?这是由于实际情况中在0点通常会返回左导数或右导数的其中一个,从而避免了这个问题。

(5)ELU函数

ELU函数是针对ReLU函数的一个改进型,即使输入为负数也是有输出的,不过还是有梯度饱和指数运算的问题。

4.1.6 什么是MP模型与感知机

神经元之间相互连接,当某一神经元处于“兴奋”状态时,其相连神经元的电位将发生改变,若神经元电位改变量超过了一定的数值(也称为阈值),则被激活处于“兴奋状态”,向下一级连接的神经元继续传递电位改变信息。信息从一个神经元以电传导的方式跨过细胞之间的联结(即突触),传给另一个神经元,最终使肌肉收缩或腺体分泌。

神经元通过突触的连接使数目众多的神经元组成比其他系统复杂得多的神经系统。从神经元的结构特性和生物功能可以得出结论:神经元是一个多输入单输出的信息处理单元,并且对信息的处理是非线性的。

在这个基础上,就有科学家产生了模拟神经网络的想法。1943年McCulloch和Pitts提出了MP模型,这是一种基于阈值逻辑的算法创造的神经网络计算模型,由固定的结构和权重组成。

在MP模型中,某个神经元接受来自其余多个神经元的传递信号,多个输入与对应连接权重相乘后输入该神经元进行求和,再与神经元预设的阈值进行比较,最后通过激活函数产生神经元输出。每一个神经元均为多输入单输出的信息处理单元,具有空间整合特性和阈值特性。

其实MP模型就已经是感知器的原型了,只是没有真正在计算机上实现而已。感知机(Perceptron)是Frank Rosenblatt在1957年提出的概念,其结构与MP模型类似,一般被视为最简单的人工神经网络,也作为二元线性分类器被广泛使用。通常情况下指单层的人工神经网络,以区别于多层感知机(Multilayer Perceptron)。尽管感知机结构简单,但能够学习并解决较复杂问题,结构如图4-1所示。

图4-1 感知机结构

假设有一个n维输入的单层感知机,x1xnn维输入向量的各个分量,w1wn为各个输入分量连接到感知机的权量(或称权值),θ为阈值,f为激活函数(又称为激励函数或传递函数),y为标量输出。理想的激活函数f(·)通常为阶跃函数或者sigmoid函数。感知机的输出是输入向量X与权重向量W求得内积后,经激活函数f所得到的标量:

单层感知器类似一个逻辑回归模型,可以做线性分类任务,但是不能做更复杂的任务。第二次AI浪潮中马文·明斯基在其著作中证明了感知器本质上是一种线性模型,只能处理线性分类问题,就连最简单的XOR(异或)问题都无法正确解决。作为人工智能领域的开创者之一,这一声明也直接或间接促使神经网络的研究陷入了近20年的停滞。

不过就算在低谷期,1974年哈佛大学的Paul Werbos仍然证明增加一个网络层,利用反向传播算法可以解决XOR问题。到了后来Rummelhart、McClelland以及Hinton在1986年正式在多层感知器(MLP)中使用BP算法,采用Sigmoid进行非线性映射,有效解决了非线性分类和学习的问题。

多层感知机(Multi-Layer Perceptron)是由单层感知机推广而来,最主要的特点是有多个神经元层。一般将MLP的第一层称为输入层,中间的层为隐藏层,最后一层为输出层。MLP并没有规定隐藏层的数量,因此可以根据实际处理需求选择合适的隐藏层层数,且对于隐藏层和输出层中每层神经元的个数也没有限制。

多层感知机的关键问题在于如何训练其中各层间的连接权值,方法有一些不过大家最熟知的就是反向传播BP算法。

4.1.7 什么是BP神经网络和反向传播算法

BP神经网络是人工神经网络中最常见的算法之一,它的核心就是反向传播算法。主要算法过程是通过对连接权值的不断调整,使输出结果逐步逼近期望值,其过程包括信号的正向传播过程和误差的反向传播过程。BP神经网络算法的主要优点是将输入和输出数据之间的关系转化为非线性问题并且泛化能力很强。主要不足是收敛速度慢,容易陷入局部极小点,隐含层神经元数不好直接确定。BP神经网络的原理为:BP神经网络各层神经元之间互相连接。BP神经网络从外界接到输入向量后,经由隐藏层的非线性变换,最终产生一个输出。在训练过程中,主要采用的反向传播的方式,即在训练时的正向传播,通过模型的输出和真实值之间的误差建立误差函数,然后从输出端反向沿着损失函数的梯度下降方向,并通过求偏导的方式调整权重参数、偏置量等,使得经过训练的模型的输出和期望值相比达到最优。

总之,后向传播是在求解损失函数对参数求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。需要注意的是要对参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这种情况被称为对称失效。

下面通过公式来展示一下信号正向传播和反向传播的过程。

1.信号正向传播

最简单的BP神经网络模型分为三层:输入层、隐含层和输出层,通过这三层,任何输入输出复杂的非线性关系均可以实现函数映射。BP神经网络预测模型将影响因素经量化后,作为输入数据的一部分,输入到神经网络输入层,再经过神经网络隐含层、输出层作用,便可以产生一组与输入数据相对应的输出值。

设输入层为xr=(x1,x2,…,xr)T,隐含层内包括n个神经结点,激活函数为f1,输出层结点数为m,激活函数为f2。输出向量为ym=(y1,y2,…,yr)T,实际输出值为Y,目标值是T

隐含层第i个神经元输出为:

输出层第k个结点输出为:

定义误差函数:

2.误差反向传播

通过输出值与期望值的对比、反校,便可以确定输出的误差范围,从而将误差进一步反向传播到BP神经络的隐含层,BP神经网络进行下一步的学习,直到输出误差满足要求。如需进行预测工作,只需要应用已经训练好的BP神经网络,将待预测时段的各影响因素输入神经网络,便可以得到相应预测结果。由此可见,BP神经网络具备一定的推理联想能力,对于在训练过程中未出现的情形,BP网络同样可以进行预测。

记学习率为η,输出层权值的变化:

输出层阀值的变化:

隐含层权值的变化,对从第j个输入到第i个输出的权值变化:

隐含层阀值的变化:

经过上述的过程,调整后的参数会使得模型输出量和期望值之间的差距减少,然后计算迭代计算直至收敛。

图4-2展示了一个简单的两个神经元的反向传播算法。

图4-2 两个神经元的传播过程图

如图4-2所示,输出为y,设损失函数为E

y=h2wh1+h2wh2=h1(x1w11+x2w12)+h2(x1w21+x2w22)

假如某一时刻值如下:

那么计算EWh1的误差传播值为:

下次更新Wh1参数的时候就可以采用:

η是学习率,一层一层推导下去即可。反向传播算法让多层感知器,或者说传统的全连接神经网络有了训练的手段,引发了神经网络的第二次热潮,虽然为期不长,毕竟当时计算力和数据都很有限,但是全连接神经网络总算是正式起来了。

下面展示如何利用PyTorch搭建最简单的人工神经网络:

4.1.8 BP网络模型的缺陷

虽然BP神经网络在处理许多种大规模的非线性数据表现良好,但还是存在一些不足,主要体现在以下方面。

1)梯度消失问题。由于BP神经网络一般会设置较多层数,而在反向传播算法中,每一层残差都需要向前一层累积,当层数较多时,很有可能到了某一层会出现梯度消失的现象,会导致这一层之前的层无法更新参数。

2)合适超参数的选择只有依靠经验值或者不断调试。尚无数学理论严格证明某些超参数一定会表现得更好,更多时候,超参数的选择是随着问题的改变而变化的,目前为止,虽然一些文献中会给出一些参数选择,但是不一定适合于所有情况,最好的超参数仍然要不停地尝试对比才能获得,但神经网络的训练通常比较耗时间。

3)局部最小值问题。BP神经网络的训练非常依赖超参数的初始选择,如果超参数的初始选择不合适,很可能会导致该模型在训练时陷入局部最小值而非全局最小值。

4)没有时间序列的概念。BP神经网络并没有设置记忆单元,也没有表示方向和时间的传递方式。由于股价数据是个典型的时间序列数据,因此理论上BP神经网络并不适用。

4.1.9 传统神经网络的训练方法为什么不能用在深度神经网络

BP算法作为传统训练多层网络的典型算法,网络稍微一加深,训练方法就会很不理想,主要问题有梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;容易收敛到局部最小值。深度结构非凸目标代价函数中普遍存在的局部最小会导致利用BP神经网络训练非常困难。