赞
踩
我们常说的 深度学习 ,其实就是指 神经网络 ,尤其是 大规模的神经网络。
那么神经网络究竟是什么?
本质上,神经网络属于一种强大有效的 机器学习模型,同样是 数据驱动,从数据中学习。
最初神经网络算法的诞生是出于 对生物神经系统建模 的目的,但随后与其分道扬镳,成为一个 独立的工程问题,并在机器学习领域取得了很好的效果。
我们可以参考生物神经系统去初步理解认识神经网络,但要清楚两者本质上是不同的东西,更多的应该 从工程算法模型的角度去理解神经网络的一些具体做法。
我们先从神经网络的基本构成单元——神经元的结构讲起。
大脑的基本计算单位是 神经元(neuron)。人类的神经系统中大约有860亿个神经元,它们被大约1014-15个突触(synapses)连接起来。
每个神经元都 从它的树突获得输入信号,然后 沿着它唯一的轴突(axon)产生输出信号。轴突在末端会逐渐分枝,通过突触和其他神经元的树突相连。
左边为一个生物学的神经元,右边为一个常用的数学模型
具体地,在 神经元的计算模型 中,
需要注意的是,这个对于生物神经元的建模是非常粗糙(过度简化)的,实际中的神经元种类更多,属性和计算更加复杂。
激活函数是神经网络中一个至关重要的部分。
需要注意的是,激活函数必须是非线性的,这是为了 向神经网络中引入非线性,提高神经网络计算的复杂度。
【一般激活函数都有 激活 和 非激活 两种状态,个人理解激活函数的非线性就体现于此】
如果你 只使用线性函数(或者叫做恒等激励函数),那么不管网络有多少层,进行了多少次运算,到最后从输入到输出也 只是进行了线性运算的组合,相当于单个线性层而已。举个简单的例子,
下面列举了 常见的 几种激活函数。
对应导数
d d z g ( z ) = ( − 1 ) ⋅ 1 ( 1 + e − z ) 2 ⋅ e − z ⋅ ( − 1 ) = 1 1 + e − z ⋅ ( 1 − 1 1 + e − z ) = g ( z ) ( 1 − g ( z ) ) \frac {d}{dz}g(z)=(-1)·\frac {1}{(1+e^{-z})^2}·e^{-z}·(-1)=\frac {1}{1+e^{-z}}·(1-\frac {1}{1+e^{-z}})=g(z)(1-g(z)) dzdg(z)=(−1)⋅(1+e−z)21⋅e−z⋅(−1)=1+e−z1⋅(1−1+e−z1)=g(z)(1−g(z))
sigmoid函数接受输入值并将其 “压缩” 到0到1范围内,当输入特别小时输出为0,特别大时输出为1。
在过去,sigmoid函数非常常用,这是因为它 能够很好地表示出神经元的激活特性:从完全不激活(0)到完全饱和(saturated)激活(1)。
然而现在sigmoid函数 逐渐被人们抛弃了,因为它有 两个关键缺点:
对应导数
d d z g ( z ) = 1 − ( t a n h ( x ) ) 2 \frac {d}{dz}g(z)=1-(tanh(x))^2 dzdg(z)=1−(tanh(x))2
具体求导可以参考 这篇文章
tanh函数 将输入值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。可以说,tanh函数在所有场合都优于sigmoid函数。
有一个例外,在二分类的问题中,对于输出层,因为
y
y
y 的值是0或1,所以想让
y
^
\hat y
y^ 的数值介于0和1之间,而不是在-1和+1之间。所以我们对隐藏层使用tanh激活函数,输出层使用sigmoid函数。
【输出层的特殊性,输出层更注重输出的范围】
近些年ReLU变得非常流行。
即当输入小于0时,输出为0,当输入大于0时,输出等于输入。
对应导数
通常在
z
=
0
z=0
z=0 的时候给定其导数1或者0,当然
z
=
0
z=0
z=0 的情况很少
ReLU 的优缺点如下:
优点:
缺点:
Leaky ReLU 是为解决 “死亡ReLU” 问题的一种尝试。ReLU 中当 x < 0 x<0 x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如 0.01。
对应导数
通常在
z
=
0
z=0
z=0 的时候给定其导数1或者0.01;当然
z
=
0
z=0
z=0 的情况很少
Leaky ReLU 的效果通常比 Relu 要好(YOLO网络就是 用的 Leaky ReLU 作为激活函数)。
新提出的激活函数还有PReLU、Maxout等等,大家可以自行去了解。
撇开输出层要根据具体任务的输出要求选择激活函数外【比如二分类问题,输出为0、1,输出层选择sigmoid函数】,其它的所有单元都选择Relu函数。这是很多常用的默认选择。
如果在隐藏层上不确定使用哪个激活函数,那么通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu的一个优点是:当是负值的时候,导数等于0。
(为什么这是优点?)
将多个神经元进行连接(将一些神经元的输出作为另一些神经元的输入),便构成了神经网络。
在网络中是不允许循环的,因为这样会导致前向传播的无限循环(RNN?)。
通常,在神经网络模型中,神经元是 按层组织的(分层的),而不是像生物神经元一样聚合成大小不一的团状。
对于普通神经网络,最基本的层类型是 全连接层(fully-connected layer)。全连接层中,层间的神经元完全成对连接,层内的神经元之间没有连接。
下图展示了两个全连接神经网络的例子:
一个完整神经网络的网络层可以分为三个部分:
神经网络层数的规定 从左到右,从0开始标号,即输入层为第0层。当我们说神经网络层数的时候,输入层不算在内,即等于 隐层(hidden layer)数量+ 1个输出层。因此,单层神经网络就是指没有隐层的,从输入直接映射到输出。因此,有的研究者会说逻辑回归或者SVM是单层神经网络的一个特例。
神经网络在实践中非常好用,是因为它们表达出的函数不仅平滑,而且对于数据的统计特性有很好的拟合。同时,网络通过最优化算法(例如梯度下降)能比较容易地学习到这个函数。
神经网络本质上是由一系列函数组成的函数族 f , f ( x ) = y ^ f,f(x)=\hat y f,f(x)=y^,网络的权重就是每个函数的参数。
问:那么这种函数族的表达能力如何?存在不能被神经网络表达的函数吗?
万能近似定理(universal approximation theorrm)
万能近似定理(universal approximation theorem)表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种 ‘‘挤压’’ 性质的激活函数(例如logistic sigmoid 函数)的隐藏层,那么只要给予网络足够数量的隐藏单元,就可以以任意的精度近似任何连续函数。
(那如果不是连续函数,而是更加复杂的函数呢?)
问:既然一个隐层就能近似任何函数,那为什么还要构建更多层来将网络做得更深?
答案是,虽然一个2层网络在数学理论上能完美地近似所有连续函数,但在实际操作中效果相对较差,很难拟合。
能够表示,不代表能够学得,主要有两个原因:
现实中我们一般会构造多个隐层来更容易的拟合函数。但是大多数情况下,继续加深(做到4,5,6层)很难再提高性能。
不过,针对图像处理的卷积神经网络,情况却不同。在卷积神经网络中,对于一个良好的识别系统来说,深度是一个极端重要的因素,比如数十(以10为量级)个可学习的层。对于该现象的一种解释观点是:因为图像拥有层次化结构(比如脸是由眼睛等组成,眼睛又是由边缘组成),所以多层处理对于这种数据就有直观意义。
一个神经网络的尺寸由以下几个方面确定:网络的层数,神经元的个数,参数的个数。
拿上面图示的两个网络举例:
在面对一个具体问题的时候,该确定网络结构呢?到底是不用隐层呢?还是一个隐层?两个隐层或更多?每个层的尺寸该多大?
网络层数越多,每个层的尺寸越大,神经网络的容量也就越大,表达的函数空间也就越大(可以表达更复杂的函数)。然而这既是优势也是不足,优势是 可以处理更复杂的数据,不足是 可能造成对训练数据的过拟合。
过拟合(Overfitting) 指网络对 数据中的噪声 有很强的拟合能力,而没有重视 数据间(假设)的潜在基本关系。
(这个噪声,我个人理解,是数据个体的特异性,亦或者是数据采集时引入了一定的误差)
举个例子,如果有一个在二维平面上的二分类问题,我们可以训练3个不同的神经网络,每个网络都只有一个隐层,但是每层的神经元数目不同。
下图展示了各网络的结果。数据是用不同颜色的圆点表示他们的不同类别,决策边界是由训练过的神经网络做出的。
可以看到,有20个神经元隐层的网络 拟合了所有的训练数据,但是其 代价是把决策边界变成了许多不相连的红绿区域。而有3个神经元的模型的表达能力只能用比较宽泛的方式去分类数据。它将数据看做是两个大块,并把个别在绿色区域内的红色点看做噪声。在实际中,这样可以在测试数据中获得更好的 泛化(generalization)能力。
【泛化性:即在没有看过的样本上的表现。也就是我们训练模型所追求的终极目标,毕竟我们需要的不是一个只能在训练集上获得高准确率的模型】
那这是否意味着实际应用中,小一点的网络反而更好(从控制过拟合,提高泛化性的角度看的话)?
基于上面的讨论,看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2正则化,dropout和输入噪音等),在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多。
不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练:虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,但是这些最小值一般都很差,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。因为神经网络是非凸的,就很难从数学上研究这些特性。即便如此,还是有一些文章尝试对这些目标函数进行理解,例如The Loss Surfaces of Multilayer Networks这篇论文。在实际中,你将发现如果训练的是一个小网络,那么最终的损失值将展现出多变性:某些情况下运气好会收敛到一个好的地方,某些情况下就收敛到一个不好的极值。从另一方面来说,如果你训练一个大的网络,你将发现许多不同的解决方法,但是最终损失值的差异将会小很多。这就是说,所有的解决办法都差不多,而且对于随机初始化参数好坏的依赖也会小很多。
总而言之,不应该因为害怕出现过拟合而使用小网络。相反,应该尽可能使用大网络,然后使用技巧来控制过拟合。
斯坦福 CS231n
吴恩达 deplearning.ai lesson1-week3
神经网络(Neural Networks)基础系列笔记
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。