1 简介
在线性分类一节中,在给出图像的状况下,是使用$s=W x$来计算不一样视觉类别的评分,其中$W$是一个矩阵,$x$是一个输入列向量,它包含了图像的所有像素数据。python
在使用数据库CIFAR-10的案例中,$x$是一个$[3072 \times 1]$的列向量,$W$是一个$[10 \times 3072]$的矩阵,因此输出的评分是一个包含10个分类评分的向量。算法
神经网络算法则不一样,它的计算公式是$s=W_{2} \max \left(0, W_{1} x\right)$。数据库
其中$W_{1}$的含义是这样的:举个例子来讲,它能够是一个[100x3072]的矩阵,其做用是将图像转化为一个100维的过渡向量。数组
函数$\max (0,-)$是非线性的,它会做用到每一个元素。这个非线性函数有多种选择。网络
矩阵$W_{2}$的尺寸是[10x100],所以将获得10个数字,这10个数字能够解释为是分类的评分。函数
注意非线性函数在计算上是相当重要的,若是略去这一步,那么两个矩阵将会合二为一,对于分类的评分计算将从新变成关于输入的线性函数。学习
参数$W_{1}, W_{2}$将经过随机梯度降低来学习到,他们的梯度在反向传播过程当中,经过链式法则来求导计算得出。spa
一个三层的神经网络能够类比地看作$s=W_{3} \max \left(0, W_{2} \max \left(0, W_{1} x\right)\right)$。code
2 单个神经元建模
神经网络算法领域最初是被对生物神经系统建模这一目标启发。下面图表的左边展现了一个生物学的神经元,右边展现了一个经常使用的数学模型。blog
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612170709528-1039864985.png" width="440" align=center />
一个神经元前向传播的实例代码以下:
class Neuron(object): # ... def forward(inputs): """ 假设输入和权重是1-D的numpy数组,误差是一个数字 """ cell_body_sum = np.sum(inputs * self.weights) + self.bias firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid激活函数 return firing_rate
注意:这种对于生物神经元的数学建模是很是粗糙的。
3 经常使用激活函数
3.1 Sigmoid与Tanh
Sigmoid与Tanh非线性函数图像以下所示:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612171939309-401906057.png" width="440" align=center />
3.1.1 Sigmoid
sigmoid非线性函数的数学公式是$\sigma(x)=1 /\left(1+e^{-x}\right)$,它输入实数值并将其“挤压”到0到1范围内。更具体地说,很大的负数变成0,很大的正数变成1。
然而如今sigmoid函数实际不多使用了,这是由于它有两个主要缺点:
- sigmoid神经元有一个很差的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。
- sigmoid函数的输出不是零中心的,这一状况将影响梯度降低的运做。
3.1.2 Tanh
tanh非线性函数将实数值压缩到[-1,1]之间。和sigmoid神经元同样,它也存在饱和问题,可是和sigmoid神经元不一样的是,它的输出是零中心的。
注意tanh神经元是一个简单放大的sigmoid神经元,具体说来就是:$\tanh (x)=2 \sigma(2 x)-1$。
3.2 ReLU与Leaky ReLU
3.2.1 ReLU
下图中左边是ReLU(校订线性单元:Rectified Linear Unit)激活函数,当x=0时函数值为0。当x>0函数的斜率为1。右边是从 Krizhevsky等的论文中截取的图表,指明使用ReLU比使用tanh的收敛快6倍。
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612172313070-1281869077.png" width="440" align=center />
在近些年ReLU变得很是流行。它的函数公式是$f(x)=\max (0, x)$。
ReLU的优势:
- 相较于sigmoid和tanh函数,ReLU对于随机梯度降低的收敛有巨大的加速做用。
- sigmoid和tanh神经元含有指数运算等耗费计算资源的操做,而ReLU能够简单地经过对一个矩阵进行阈值计算获得。
ReLU的缺点:
在训练的时候,ReLU单元比较脆弱而且可能“死掉”。
举例来讲,当一个很大的梯度流过ReLU的神经元的时候,可能会致使梯度更新到一种特别的状态,在这种状态下神经元将没法被其余任何数据点再次激活。若是这种状况发生,那么今后因此流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,由于这致使了数据多样化的丢失。
例如,若是学习率设置得过高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。经过合理设置学习率,这种状况的发生几率会下降。
3.2.2 Leaky ReLU
Leaky ReLU是为解决“ReLU死亡”问题的尝试。
ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,好比0.01。因此其函数公式为$f(x)=1(x<0)(\alpha x)+1(x>=0)(x)$。其中$\alpha$是一个小的常量。
3.3 Maxout
一些其余类型的单元被提了出来,它们对于权重和数据的内积结果再也不使用$f\left(w^{T} x+b\right)$函数形式。
一个相关的流行选择是Maxout神经元。Maxout是对ReLU和leaky ReLU的通常化概括,它的函数是:$\max \left(w_{1}^{T} x+b_{1}, w_{2}^{T} x+b_{2}\right)$。ReLU和Leaky ReLU都是这个公式的特殊状况(好比ReLU就是当$w_{1}, b_{1}=0$的时候)。
这样Maxout神经元就拥有ReLU单元的全部优势(线性操做和不饱和),而没有它的缺点(死亡的ReLU单元)。
然而和ReLU对比,它每一个神经元的参数数量增长了一倍,这就致使总体参数的数量激增。
4 神经网络结构
4.1 概述
神经网络被建模成神经元的集合,神经元之间以无环图的形式进行链接。也就是说,一些神经元的输出是另外一些神经元的输入。在网络中是不容许循环的,由于这样会致使前向传播的无限循环。
对于普通神经网络,最普通的层的类型是全链接层(fully-connected layer)。全链接层中的神经元与其先后两层的神经元是彻底成对链接的,可是在同一个全链接层内的神经元之间没有链接。
下面是两个神经网络的图例,都使用的全链接层:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612174511500-1707309660.png" width="440" align=center />
左边是一个2层神经网络,隐层由4个神经元(也可称为单元(unit))组成,输出层由2个神经元组成,输入层是3个神经元。
右边是一个3层神经网络,两个含4个神经元的隐层。
有如下几点须要补充:
(1)当咱们说N层神经网络的时候,咱们没有把输入层算入。 (2)和神经网络中其余层不一样,输出层的神经元通常是不会有激活函数的 (3)用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另外一个是参数的个数,用上面图示的两个网络举例:
第一个网络有4+2=6个神经元(输入层不算),[3x4]+[4x2]=20个权重,还有4+2=6个偏置,共26个可学习的参数。
第二个网络有4+4+1=9个神经元,[3x4]+[4x4]+[4x1]=32个权重,4+4+1=9个偏置,共41个可学习的参数。
(4)含有一个隐层的神经网络就能近似任何连续函数。
既然一个隐层就能近似任何函数,那为何还要构建更多层来将网络作得更深?答案是:虽然一个2层网络在数学理论上能完美地近似全部连续函数,但在实际操做中效果相对较差。
在实践中3层的神经网络会比2层的表现好,然而继续加深(作到4,5,6层)不多有太大帮助。卷积神经网络的状况却不一样,在卷积神经网络中,对于一个良好的识别系统来讲,深度是一个极端重要的因素(好比数十(以10为量级)个可学习的层)。
4.2 如何设置层的数量和尺寸
在面对一个具体问题的时候该肯定网络结构呢?究竟是不用隐层呢?仍是一个隐层?两个隐层或更多?每一个层的尺寸该多大?
首先,要知道当咱们增长层的数量和尺寸时,网络的容量上升了。即神经元们能够合做表达许多复杂函数,因此表达函数的空间增长。
例如,若是有一个在二维平面上的二分类问题。咱们能够训练3个不一样的神经网络,每一个网络都只有一个隐层,可是每层的神经元数目不一样:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612175748671-146248055.png" width="440" align=center />
对于上图,更大的神经网络能够表达更复杂的函数。数据是用不一样颜色的圆点表示他们的不一样类别,决策边界是由训练过的神经网络作出的。
然而对于“有更多神经元的神经网络能够表达更复杂的函数”这个现象来讲。这既是优点也是不足,优点是能够分类更复杂的数据,不足是可能形成对训练数据的过拟合。
看起来若是数据不是足够复杂,则彷佛小一点的网络更好,由于能够防止过拟合。然而并不是如此,防止神经网络的过拟合有不少方法(L2正则化,dropout和输入噪音等)。在实践中,使用这些方法来控制过拟合比减小网络神经元数目要好得多。
不要减小网络神经元数目的主要缘由在于小网络更难使用梯度降低等局部方法来进行训练。
虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,可是这些最小值通常都不好,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。
在实际中,你将发现若是训练的是一个小网络,那么最终的损失值将展示出多变性:某些状况下运气好会收敛到一个好的地方,某些状况下就收敛到一个很差的极值。
从另外一方面来讲,若是你训练一个大的网络,你将发现许多不一样的解决方法,可是最终损失值的差别将会小不少。这就是说,全部的解决办法都差很少,并且对于随机初始化参数好坏的依赖也会小不少。
最后拿正则化来讲,其强度是控制神经网络过拟合的好方法。看下图结果:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612180724453-684123878.png" width="440" align=center />
上图中每一个神经网络都有20个隐层神经元,可是随着正则化强度增长,它的决策边界变得更加平滑。