神经网络基础介绍(一)

来源:互联网 发布:网络硬盘录像机 交换机 编辑:程序博客网 时间:2024/06/05 02:22

http://cs231n.github.io/neural-networks-1/
https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/

对于刚学习神经模型的人来说,诸多生疏的名词带给初学者很多困扰,并且容易忘记和混淆,通过查找相关资料与整理,本文简要介绍神经网络和卷积神经网络所涉及到的知识,希望能对初学者有所启发,文中可能也有自己理解的误区,希望大家批评指正,共同进步。

  1. 生物学的启发
    神经网络最开始是受生物神经系统的启发,为了模拟生物神经系统而出现的。大脑最基本的计算单元是神经元,人类的神经系统中大概有86亿的神经元,它们之间通过10^14-10^15的突触相连接。每个神经元从它的树突(dendrites)接受输入信号,沿着唯一的轴突(axon)产生输出信号,而轴突通过分支(branches of axon),通过突触(synapses)连接到其他神经元的树突,神经元之间就这通过这样的连接,进行传递。如下图。
    单一神经元结构图
  2. 数学模型
    为了模拟这种神经系统,人们就构建了相应的数学模型,如下图,单一的神经元数学模型。
    数学模型
    其中x_0,x_1,x_2,为其他神经元沿着轴突通过突触、树突传送到此神经元的输入信号,该神经元细胞,通过与对应的w_n参数(该参数表示该输入对该神经元影响的大小)相乘、求和等,得到最终的输出。其中f为激活函数(activation funtion),b表示偏置项(bias)。
  3. 激活函数(activation funtion)
    输入的信号,在神经元体内相加,当超过某一阈值时,神经元就会起火(fire),并沿着轴突产生一个尖峰(spike),在数学模型中,我们不考虑尖峰产生的精确时间的影响,只考虑神经元起火的频率所带来的影响,为了模拟起火频率,设计出激活函数来表示沿着轴突传递尖峰的频率。常见的激活函数有以下几种。
    Sigmoid:sigmoid函数是非线性的,其数学公式为σ(x)=1/(1+ex),其图像如下图。该函数将
    Sigmoid
    实数值映射到0到1的范围内,越小的数越趋近于0,越大的数越趋近于1。Sigmoid函数是原来使用最多的激活函数,由于其能够很好的解释神经元的起火频率,0表示没起火,1表示全饱和(fully-saturated),也就是最大的起火频率。如今,Sigmoid函数已经过时了,人们也很少会使用它,因为它有两个严重的缺陷:
    (1)容易饱和和杀死梯度。该激活函数在0或者1的状态下会饱和,梯度在这些地方接近于0。那么在反向传播过程中,由于梯度太小,导致神经元相应的权重参数几乎无法更新,并且也会影响后续参数的更新。由于函数在饱和状态下,会产生杀死梯度的现象,那么我们在初始化网络参数时,就应该更加注意来防止饱和现象的发生。例如,当初始化参数太大,大多数的神经元将会饱和,网络就很难学习。
    (2)Sigmoid函数的输出并不是以0对称的。由于Sigmoid的函数输出范围是0-1,并不是以0为中心对称的,那么在梯度反向传播的过程中,要么是全正,要么全负(根据表达式f=wTx+b来决定),这样就会带来参数更新过程中不理想的锯齿形变化。当然这点的严重程度比上一点要低很多。
    Tanh:Tanh是一种非线性函数,其函数图像如下图。
    tanh
    从图中可以看到,tanh将实数压缩到-1到1的范围内,和sigmoid函数一样,它仍然存在饱和与梯度消失的现象,但是比sigmoid函数好的地方,tanh函数的取值是以0为中心对成的,因此在实验中,tanh函数的效果往往要比sigmoid函数好。需要注意的是tanh函数其实就是sigmoid函数的缩放版本(tanh(x)=2σ(2x)−1)。
    ReLU(Rectified Linear Unit):ReLU是这几年使用最多的激活函数,它的计算公式是f(x)=max(0,x),其函数图像如下图。
    这里写图片描述
    使用ReLU激活函数的好处是:
    (1)2012年,Krizhevsky等人发现,相比于tanh和sigmoid函数,ReLU函数具有非常快的收敛速度,如下图。
    这里写图片描述
    如此快的收敛速度,被认为是由于它的线性和非饱和的形式。
    (2)相对于tanh和sigmoid函数的昂贵的计算代价,ReLU函数简单的将其转化为0完成计算。
    ReLU函数也有缺点,在训练过程中,ReLU神经元可能会停止更新。例如,当一个大的梯度传到一个ReLU神经元,权重参数的更新时,使得该神经元永远不会再次激活,那么网络中的该节点将永远保持0的状态。因此,在实验设置中,要设置一个合适的学习率,如果学习率太高,将会导致超过40%的神经元不工作。
    Leaky ReLU:Leaky ReLU函数是为了解决ReLU函数的不工作问题。Leaky ReLU使用f(x)=1(x<0)(αx)+1(x>=0)(x)来计算,当x<0时,使用很小的常量α,来使其不等于0。很多人证明了该函数的有效性,但是结果并不是一致的。x<0的区域的斜率也可以当作每个神经元的参数,比如Kaiming He等人提出的PReLU神经元,但是对于不同的任务,其表现也没那么有效。
    Maxout:该函数由Goodfellow等人提出,该函数泛化了ReLU和leaky ReLU,Maxout的计算公式为max(wT1x+b1,wT2x+b2),可以看出,当w_1,b_1=0时,Maxout函数就变成了ReLU函数,因此Maxout具有ReLU函数的优势,但是由于其增加了一倍的参数,增加了计算的复杂性。
    通过介绍几种常见的激活函数,那么在使用中应该使用什么激活函数呢?当使用ReLU是要注意学习率的设置,或者尝试使用Leaky ReLu或者Maxout函数,但是不需要使用sigmoid和tanh函数了,因为它们的性能比ReLU/Maxout会差。
  4. 偏置项(bias)
    很多人可能不太理解偏置项的作用,事实上,偏置项可以调整激活函数,使得激活函数左右移动,如下图。
    这里写图片描述
    这里写图片描述
    如果还不能很好的理解,可以对比中学学到的y=kx+b,偏置项的作用就类似于b的作用。
  5. 神经网络的组织
    神经网络是神经元逐层组织以非循环的方式连接的图,也就是说,一些神经元的输出也可以变成另外神经元的输入,神经网络中是不允许环的出现。在通常的神经网络中,层与层之间的连接是以全连接(Fully-connected)的方式进行连接,相邻层之间的神经元都互相连接,相同层内的神经元之间不连接。如下图。
    neural_net
    通常我们所说的N层神经网络并不包含输入层,如上图即两层的神经网络。因此,对于一层的神经网络,是不包含隐藏层的,你也许会听到人们称之为LR或者SVM,确实它们就是特殊形式的单层神经网络。你也许会听到人们把这些网络成为ANN(Artificial Neural Networks)或者MLP(Multi-Layer Perceptrons),有些人不喜欢把神经网络比作人脑,更愿意成神经网络的神经元为单元(units)。
    输出层与神经网络中的其它层不同,它并不包含激活函数,因为输出层通常用来表示类别的得分。一个网络的规模通常可以用网络中参数的数量、神经元的数量来衡量,如上图神经网络,总共包含 4 + 2 = 6个神经元, [3 x 4] + [4 x 2] = 20个权重, 4 + 2 = 6个偏置项,一共26个可以学习的参数。
    神经网络通过前向传播完成计算,通过构造损失函数(loss function)衡量真实值与预测值之间的差别,使用反向传播算法,更新网络中的参数。
  6. 神经网络表示的能力
    到此,我们心中肯定会有疑问,我们为什么要使用神经网络或者神经网络的表达能力有多强呢?已经被证明,至少包含一个隐藏层的神经网络就可以近似任意的连续函数,可以参考文章Approximation by Superpositions of Sigmoidal Function。
    接着就会有疑问,如果一个隐藏层就可以近似任意的函数,那为什么神经网络需要更多的层,并往更深的层次发展?答案就是,虽然两层的神经网络就可以当做通用的近似器,但是从数学的角度上来看,如此简单的结构,在实践中是很弱甚至是无用的。并且通过长期实践发现,越深层的神经网络所具有的表达效果更好,特别对于卷积神经网络(CNN,Convolutional Neural Network)。
    那么随着网络规模的不断扩大,网络中的参数也就急剧增加,那么就会需要大量的数据来调整参数,当数据不多时,为了能使网络不仅对训练的数据更好的预测,也要对未知的数据具有良好的预测(通常把这种能力成为泛化能力(generalization ability)),就需要防止过拟合(over-fitting)现象的发生,过拟合就是对训练数据有很好的预测,而对未知数据的预测很差,如正则化(Regularzation),归一化(Normalization)。防止过拟合有很多方法,在以后再给大家做更详细的介绍。
  7. 卷积神经网络(CNN)
    CNN的主要目的是对输入图像应用卷积操作提取抽取相应的特征。假设输入图像如下图:
    image
    另外一个 3 x 3的矩阵如下图:
    fliter
    那么5 x 5输入图像与3 x 3矩阵的卷积过程,就可以看成如下过程:
    卷积
    在CNN模型中,我们把3×3的矩阵成为滤波器(filter)或者核(kernel)或者特征检测器(feature detector),所得到的结果称为卷积特征(Convolved feature)或者激活图(Activation Map)或者特征图(Feature Map)。
    可能有些人觉得CNN和神经网络有很大区别,其实不是的,它们只是名称不同,其实是一回事,滤波器中的元素就是上述神经元输入的权重参数,卷积计算结果就是对应神经元的输出,不同的是这个过程中,每个神经元不是全连接输入,而是只连接部分的输入,并且每个神经元的权重都一样,以这样的方式可以极大的减少网络参数。
    通道(Channel)是另外CNN中的术语,从标准数码相机中拍摄的图像有3个通道-红,绿,蓝,上述的卷积过程只是发生在单通道的图像上,那么对于3通道的输入图像,卷积的过程如下图:
    多通道卷积
    其中有几点需要注意的,卷积核包含两种w0w1,每个卷积核包含3个(与输入图像的通道对应)的2维滤波器,并且2维滤波器之间的元素组成是不同的,并且卷积结果是3个2维滤波器分别对三个通道输入图像卷积结果相加。由于使用了2个卷积核,那么最终得到2种特征图,如果两种特征图作为下一层网络的输入,就相当于输入图像变为2通道,那么下一层的卷积层只需要2个2维滤波器即可。
  8. CNN的发展
    CNN模型最早于1990年由Yann LeCun提出,被称为LeNet5。1990年-2012年,CNN处于孵化阶段,随着数据量的增多,硬件计算能力的增加,CNN变得越来越多人研究。2012年,Alex Krizhevsky提出AlexNet,它比LeNet具有更深的层次,并且在ImageNet比赛中,取得了突破性的成果,至此引领学术界开始进入深度学习的浪潮。Terryum总结了深度学习领域非常重要并且具有研究价值的文章,对于想深入了解CNN或者深度学习的同学可以作很好的参考。
0 0