从感知机到深度学习(初稿)
神经网络的提出
机器学习需要解决的2大问题:回归问题 分类问题
回归问题:通过训练集学习函数y=g(x,w)中系数w,并使用y=g(x,w)来推断任一输入x所对应的输出值,输出值连续。
分类问题:通过训练集学习函数y=g(x,w)中系数w,并使用y=g(x,w)来推断任一输入x所对应的输出值,输出值离散。(对于二分类问题,一般为0或1)
不管回归或者分类,问题的核心在于寻找函数y=g(x,w)。
对于函数y=g(x,w),传统机器学习方法提出了不少描述。如线性回归,它认为自变量与因变量之间存在线性关系,也就是g(x,w)为x的多项式;SVM,y=g(x,w)是最大分类面函数。
而神经网络的提出,也是基于此。学者希望通过这样一种网络,能够实现复杂函数的描述。(后面,有学者证明,如果神经网络够深,够复杂,它可以模拟任何复杂函数)
感知机(perceptron)
最开始,神经网络很简单,它只有2层,输入层、输出层。并且各层之间通过权值线性连接,神经元也没有我们后面提到的激活函数。
【插图:NN线性】
但由于只是通过权值线性连接,虽然增加了隐藏层,但是最后输出层的结果与输入层之间满足的函数线性关系。它对于g(x,w)的描述,和多项式相差无几,可想而知它的效果并不好。
之后在20世纪50-60年代,有学者提出在神经元中加入激活函数(activation function),使得神经元的输入和输出呈非线性关系。从而使得整个网络具有非线性表达能力,实现复杂网络的描述。
一开始,提出的激活函数为阶跃函数(step function)
【插图2:NN感知机】
这也是我们开头标题中提到的感知机。不过由于这时候的感知机,仍然只有一层隐藏层,虽然比起之前,对于函数的描述能力变强,但仍然有限。比如,它不能解决逻辑问题中的简单的“异或”问题。
多层感知机
为了让神经网络解决诸如“异或”等问题,学者开始了新一轮的思考。有人提出是否可以通过添加多个隐藏层来实现,结果证明是可行的。下图是采用多个隐藏层实现“异或”问题。
【插图3:MLP感知机】
虽然说,多层神经网络在理论上可以解决很多问题。但是在实际应用中,还是碰到了难题。那就是权值更新问题。从第一节知道,我们是通过训练集来学习权值,进而构造函数y=g(x,w)。在训练学习过程中,我们一般采用“梯度下降”的方式,迭代求解权值,使得模型最优。然而,由于在神经元中采用阶跃函数,其梯度为0,我们只能求解最后一层权值(隐藏层-输出层)的梯度,其他层权值梯度无法获取。这样,我们在使用多层神经网络的时候,不得不事先固定其他层网络参数,只更新最后一层。但这样,神经网络的表达能力,就受到事先固定权值精度的影响。
科学家解决问题的能力,永远是不可估量的。学者开始寻找一种能够替代阶跃函数的可导函数,它在具有可导性质的同时,还需要具备非线性的特性。他们发现有一个函数具备这样的特性。
【插图4:sigmoid函数】
从图上,我们可以看到,它不仅具有非线性,而且可导。它的导数为
【插图5:sigmoid多层神经网络】
因为神经元上的激活函数可导,我们可以推导出各层网络之间权值的导数(梯度),从而可以实现各层网络权值的更新(具体权值更新算法: BP算法)。神经网络的描述性能大大提升。这种多层神经网络,我们把它成为多层感知机(Multiple Layer Perceptrons, MLP)。之前,只有一层隐藏层的神经网络,我们称之为单层感知机或感知机(Single Layer Perceptron, SLP / Perceptron)。
多层感知机遇到的问题
随着研究的加深,以及对网络描述能力提出更高的要求时,新的问题又浮出水面。
学者发现,随着神经网络层数的加深,网络权值的迭代出现新的问题。权值衰减问题,也就是网络在进行后向传播时,权值不断变小,使得最前端的网络层权值趋于0且不再更新的现象。
例:网络权值存在这样的关系:
不妨令
可知
当m-p较大时,第p层权值更新趋于0,僵死。
从上面示例中,我们也可以看到权值更新僵死问题,主要是激活函数引起的。那么是否有新的、更好的激活函数可以替代sigmoid函数呢?由仿生学作为指导,学者提出Relu函数,作为sigmoid函数的替代。
【插图6:Relu函数】
另外相比于sigmoid,Relu除了能够防止权值僵死问题,学者还发现它的其他特性:
(1)梯度为0或1,减少了网络后向传播的计算量;
(2)当输入<=0时,权值梯度为0,神经元被“杀死”,增加了网络稀疏性;(从仿生学的角度来看,稀疏且深的网络,更易描述复杂的模型)
(3)当输入<=0时,输出全为0。函数为强烈非线性;结合输入>0的线性输出部分,Relu的非线性表达能力,比sigmoid函数更强(sigmoid中间近80%部分约为线性,其余部分又存在梯度饱和现象,权值更新缓慢)。进一步说明了Relu与sigmoid相比,能够描述更为复杂的模型。
深度神经网络介绍
在神经网络的发展中,限制网络加深的因素,主要有2个:(1)网络权值更新问题,(2)训练数据集大小以及计算机计算能力的限制。
在上一小节中我们提到Relu激活函数能够解决网络权值衰减问题;而随着计算机计算能力的提升,以及一些大型训练数据集的制备。以上2个问题得以解决。深度学习开始迎来快速发展。
从2006年大牛Hinton的实验室利用5层卷积神经网络高精度实现ImageNet数据集1000类目标分类,到2012年,Rbg基于上述神经网络提出Region CNN将目标检测精度推至另一高度,再到最近的pvanet综合使用之前的各种网络训练技巧,快速高精度地实现目标检测。神经网络的层数在不断加深,网络表达能力也不断跨出新高度。
在介绍各种网络优化策略之前,首先让我们对深度神经网络(DNN)再做一次划分。深度神经网络根据其网络传递方式主要分为两类:FNN(Feedforward Neural Network,前传神经网络)和RNN(Recurrent Neural Network,递归神经网络)。
FNN:也就是传统的神经网络,网络从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的;
RNN:与FNN不同,RNN网络在隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,这样网络对前面的信息会进行记忆并应用于当前输出的计算中。
【插图7:FNN】
【插图8:RNN】
一般来说,FNN常用于静态数据处理,而RNN则用于序列数据处理,如视频,语音等。当然,有人认为静态数据有时在空间结构上呈现出一种序列特性,所以也会有RNN用于静态数据处理的例子。
这里,我们主要以FNN处理静态数据为主,对深度神经网络做介绍;由于目前本人对RNN研究不深,这里我们只会捎带介绍一些RNN的基础知识。
在深度神经网络的不断发展中,FNN前传神经网络出现了一个重要的研究分支:CNN(Convolution Neural Network,卷积神经网络),这也是目前我研究的重点。
CNN的发展
CNN的发展,与尝试将神经网络用于图像处理是分不开的。(卷积神网络的基础介绍)
由于图像中的最小单元为像素,通常一幅图像的像素个数为100k级(例如,540*360=194400)。如果我们按照传统的神经网络方式,将像素作为输入向量元素,那么输入层有100k个元素,假设我们第一个隐藏层同样有100k神经元,若采用全连接的方式,则第一次网络权值个数为100k*100k=10^10,可想而知构建一个神经网络,所需求解的权值个数巨大,导致网络极易过拟合。所以各层之间采用全连接的方式,对于图像而言是不可行的。
学者基于动物对世界的视觉认识,提出了“感受野”的概念。他们认为动物对于世界的认识是从局部到全局,从一个个局部中抽象出特征,最终组合成一个整体,形成对世界的认识。一个个小的局部,就是一个个认识世界的感受野。在1998年,学者Lecun正式提出CNN概念,通过对每一个小的感受野进行卷积操作,实现从局部到整体的抽象;并通过共享权值的方式,减少网络权值个数,避免网络过拟合。并且他通过CNN实现了对手写字符的高精度分类(Lenet5)。
以下是Lent5网络示意图:
【插图9:Lenet5】
之后,CNN在图像处理领域开始高速发展。2006年,Hinton团队提出Alexnet夺得ImageNet比赛冠军;2012年,Rbg提出RCNN系列(RCNN/Fast-RCNN/Faster-RCNN),夺得Voc目标检测冠军;之后基于Faster-RCNN,新的目标检测算法相继被提出,如Yolo,SSD,pavanet等,使得目标检测的精度和速度都得到极大的提升。
关于CNN的具体介绍之后会给出相应博客链接。
RNN简介
LSTM(Long short term memory,长短期记忆)
Relu等网络优化策略使得深度神经网络成为可能
在神经网络发展过程中,一系列网络优化策略的提出,对于网络层数的加深以及网络表达能力的提升,起到不可磨灭的影响,如之前提到的激活函数Relu的提出,使得网络权值衰减问题得到缓和。
当然,在神经网络的整个发展历程中,还有诸多的网络优化策略。这一节,我们主要对一些优化策略做一些简要介绍。(优化策略具体理论分析,现在功力不够,无法写出)
(1)Relu(Rectified Linear Units)
前面也提到,Relu是为了解决权值衰减问题而提出的。
(i)由于其相对于sigmoid函数,具有单侧抑制的强非线性的特点,网络具有稀疏性,使得它能表达的模型更为复杂;
(ii)它Relu的梯度只有0或1,后向传播时,权值梯度不会随着网络层数的加深,而呈指数级递减;且由于梯度是定值,在后向传播时,计算量相应减少。
关于Relu的详细介绍
(2)CRelu(Concatenation Relu)
该优化策略的提出,主要是基于学者们对于网络数值的观察。长时间的观察,学者们发现网络的开始几层卷积层输出正负个数大致相同,且数值也相差不大。所以学者们开始验证在卷积层是否只输出之前一半的通道数,然后通过取反操作得到另一半符号相反的通道,再将二者结合起来,进行Relu运算。实验结果证明这样做并不会明显降低深度神经网络的精度,而且由于只需要计算一般的通道数,在速度上相比之前提高了一倍。
当然,为了避免原始通道与取反后的通道在数值上的相同,在进行Relu运算之前,会对各通道数值进行微平移和缩放操作(scale/shift,这里我们可认为是对数值的微调即可)。CRelu的示意图如下所示。
(3)Batch Normalization
(4)Inception
(5)Residual
(6)Dropout