2.5 浅层/深层神经网络

2.5 浅层/深层神经网络

学习目标

  • 目标

    • 知道浅层/深层神经网络的前向和反向计算过程

    • 掌握**函数的使用以及选择

    • 知道神经网络的参数和超参数

  • 应用

神经网络的表达能力

    2.5 浅层/深层神经网络

2.5.1 浅层神经网络的前向传播与反向传播

浅层神经网络表示

2.5 浅层/深层神经网络

2.5 浅层/深层神经网络

2.5 浅层/深层神经网络

**函数的前向传播和反向传播(了解)

2.5 浅层/深层神经网络

2.5 浅层/深层神经网络

 

 

2.5.2 神经网络**函数的选择

涉及到网络的优化时候,会有不同的**函数选择有一个问题是神经网络的隐藏层和输出单元用什么**函数。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多,大多数通过实践得来,没有很好的解释性。

2.5 浅层/深层神经网络

2.5.2.1 为什么需要非线性的**函数

2.5 浅层/深层神经网络

2.5.2.2 **函数对比总结

  • Sigmoid函数饱和使梯度消失。sigmoid神经元有一个不好的特性,就是当神经元的**在接近0或1处时会饱和:在这些区域,梯度几乎为0。

  • Tanh:和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。

  • Relu:

    • 优点:

      • 相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用,这是由它的线性,非饱和的公式导致的。

      • sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。

    • 缺点:在训练的时候,ReLU单元比较脆弱并且可能“死掉”。

      • 举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被**)。通过合理设置学习率,这种情况的发生概率会降低。

  • Leaky ReLU:

    • Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。所以其函数公式为2.5 浅层/深层神经网络其中2.5 浅层/深层神经网络是一个小的常量。有些研究者的论文指出这个**函数表现很不错,但是其效果并不是很稳定。何凯明等人在2015年发布的论文Delving Deep into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。(但是这里的a不是固定下来的,而是可学习的)然而该**函数在在不同任务中均有益处的一致性并没有特别清晰。

一句话:“那么该用那种呢?”用ReLU非线性函数。注意设置好学习率,或许可以监控你的网络中死亡的神经元占的比例。如果单元死亡问题困扰你,就试试Leaky ReLU,不要再用sigmoid了。

为什么使用深层网络

1、神经网络在实践中非常好用,是因为它们表达出的函数不仅平滑,而且对于数据的统计特性有很好的拟合。同时,网络通过最优化算法(例如梯度下降)能比较容易地学习到这个函数。类似的,虽然在理论上深层网络(使用了多个隐层)和单层网络的表达能力是一样的,但是就实践经验而言,深度网络效果比单层网络好。

2、对于人脸识别等应用,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。

通过例子可以看到,随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。

2.5.3 深层神经网络表示

2.5.3.1 什么是深层网络?

2.5 浅层/深层神经网络

2.5.4.1 前向传播

2.5 浅层/深层神经网络

2.5.4.2 反向传播

2.5 浅层/深层神经网络

2.5.5 参数与超参数

2.5.5.1 参数

参数即是我们在过程中想要模型学习到的信息(模型自己能计算出来的),例如 W[l]W[l],b[l]b[l]。而超参数(hyper parameters)即为控制参数的输出值的一些网络信息(需要人经验判断)。超参数的改变会导致最终得到的参数 W[l],b[l] 的改变。

2.5.5.2 超参数

典型的超参数有:

  • 学习速率:α

  • 迭代次数:N

  • 隐藏层的层数:L

  • 每一层的神经元个数:n[1],n[2],...

  • **函数 g(z) 的选择

当开发新应用时,预先很难准确知道超参数的最优值应该是什么。因此,通常需要尝试很多不同的值。应用深度学习领域是一个很大程度基于经验的过程。

2.5.5.3 参数初始化

  • 为什么要随机初始化权重

如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候,W 参数要进行随机初始化,不可以设置为 0。b 因为不存在上述问题,可以设置为 0。

以 2 个输入,2 个隐藏神经元为例:

W = np.random.rand(2,2)* 0.01

b = np.zeros((2,1))

  • 初始化权重的值选择

这里将 W 的值乘以 0.01(或者其他的常数值)的原因是为了使得权重 W 初始化为较小的值,这是因为使用 sigmoid 函数或者 tanh 函数作为**函数时,W 比较小,则 Z=WX+b 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。而如果 W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。

ReLU 和 Leaky ReLU 作为**函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。

2.5 浅层/深层神经网络

2.5.5.4 设置层的数量和尺寸

在面对一个具体问题的时候该确定网络结构呢?到底是不用隐层呢?还是一个隐层?两个隐层或更多?每个层的尺寸该多大?

  • 首先,要知道当我们增加层的数量和尺寸时,网络的容量上升了。即神经元们可以合作表达许多复杂函数,所以表达函数的空间增加。例如,如果有一个在二维平面上的二分类问题。可以训练3个不同的神经网络,每个网络都只有一个隐层,但是每层的神经元数目不同,更大的神经网络可以表达更复杂的函数。数据是用不同颜色的圆点表示他们的不同类别,决策边界是由训练过的神经网络做出的。

2.5 浅层/深层神经网络

举例来说,有20个神经元隐层的网络拟合了所有的训练数据,但是其代价是把决策边界变成了许多不相连的红绿区域。而有3个神经元的模型的表达能力只能用比较宽泛的方式去分类数据。它将数据看做是两个大块,并把个别在绿色区域内的红色点看做噪声。在实际中,这样可以在测试数据中获得更好的泛化(generalization)能力。

总结:

  • 1、看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2正则化,dropout和输入噪音等),后面会详细讨论。

  • 2、不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练:虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,但是这些最小值一般都很差,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。因为神经网络是非凸的,就很难从数学上研究这些特性。

    • 还是有一些文章尝试对这些目标函数进行理解,例如The Loss Surfaces of Multilayer Networks这篇论文。在实际中,

      • 如果训练的是一个小网络,那么最终的损失值将展现出多变性:某些情况下运气好会收敛到一个好的地方,某些情况下就收敛到一个不好的极值。从另一方面来说,

      • 如果你训练一个大的网络,你将发现许多不同的解决方法,但是最终损失值的差异将会小很多。这就是说,所有的解决办法都差不多,而且对于随机初始化参数好坏的依赖也会小很多。

2.5.6 总结

  • 浅层神经网络的前向计算与反向计算过程

  • 深层网络的前向与反向传播计算过程

  • **函数的使用以及选择

  • 浅层/深度网络的理解