对神经网络的深度加深是最有效的提升性能的办法,同时网络越深,梯度消失和梯度爆炸的问题,会给优化带来极大的困难。我们前面介绍了加强优化的几种通用技术:
1、隐藏单元。最明显的改变来自于sigmoid改为ReLU。
2、优化算法。从简单的SGD到动量算法,再到RMSProp和Adam。
3、输出单元。最明显的改变是分类中MSE改为交叉熵,一种来自于极大似然估计的做法。
4、BatchNormalization.削弱层与层之间协调更新的问题。
在几乎任何深度学习的任务中,我们都会用到以上几种方法。我们已经在实践中看到了这些有助于我们训练更好的参数但是我们接下来的课程可能会涉及到比较深的网络,还有两种技术是非常值得介绍的:
1、一种叫做SELU的隐藏单元,它可以构建出一个自归一化的神经网络(Self-Normalizing Neural Networks),在很多实践中证明,这样的网络更容易优化(Klambauer ,2017)。
2、另一种是著名的ResNet(Kaiming He,2015 ),它采用了跨层的连接,这种highway network的思想并不是由ResNet首创,但是ResNet中恒等连接使得梯度更快更好地到达之前highway network无法有效到达的层。目前在很深的网络中,ResNet提出残差模块几乎是必须存在的。
在这里,我们以理论和实践相结合的方式来介绍这两种“神奇”的技术。
自归一化神经网络:SELU
我们在《常见隐藏单元》中提到过ELU隐藏单元,它具有软饱和和输出均值为零的特性:
而所谓的SELU似乎也很简单,它将这个式子变为了:
乘以
,则是将在
时原本为1的梯度稍微变大了一点点,其中有两个关键点:
1、权重系数服从均值为零,方差为
的高斯分布。
2、参数
和
(保留两位小数)。
其中第一点是第二点的前提,不使用激活函数就可以推出来,而第二点的证明太过冗余,此处不做详解。回忆一下,我们在对每一层做Batch Normalization,目的就是希望让每一层的输出都是一个均值为零,方差为1的正态分布。那么SELU作为激活函数,就是希望能将通过激活函数来直接得到均值为0,方差为1的正态分布。
根据中心极限定理,我们假设输入变量X服从均值为0,方差为1的高斯分布,即:
那么在进入激活函数之前,就有:
我们希望
,那么就有:
从这里看出,依据我们对输入均值为零的假设,无论怎样,z的均值总是零的,但我们为顺利推导出方差的关系,最好也将权值的均值也设为零。
同时我们希望
,那么就有:
这个二阶项可以拆成两部分来计算,因为它只包含了权重与输入的平方项和交叉项:
所以上述一项可以被写为:
此时我们再推导
,就利用了权值均值为零的条件,使得我们可以简单的将其看作对权值平方求平均的结果,就是我们的方差,所以我们就得到了
我们就得到了第一个对权值的要求。在具体的实践中,这一点往往不太好保证,但是我们可以将权值的初始化服从该分布。
越来越深的利器:ResNet
实践中发现,网络层数的增加会使得性能不佳,这当然不是深度模型的容量不够或者产生了过拟合,而是因为深层模型更难训练。一般来说,我们在BP算法中可以看到,随着网络层数的增加,浅层的梯度计算链也会变的越来越长。即便引入了Batch Normalization,也只是削弱层与层的依赖性,更有利于优化。
如图,在CIFAR-10上的数据集上,左图代表着训练误差,右图代表着测试误差,我们可以发现,更深的网络并不会带来更好的性能,反而比浅层的网络还要弱。
我们可以假设,如果深层网络相比于浅层的网络多出的层,并没有执行学习任务,而是只是将浅层所得到的表示,复制到下一层。在反向传播时,我们对这些只执行复制任务的层不进行更新,训练完成之后,我们将这些层再加进去。
表面看起来,这是个深层网络,实际上却等价于一个浅层网络。这个假设有什么用吗?ResNet中所添加的恒等映射本质上也是添加了一个跨层的复制操作:
图中展示了ResNet的基本结构,直观看来,如果这一层本来学得的特征分布为F(x),我们只是将某一层的输入x跨层与F(x)相加,那么就有最后学得的特征分布H(x)=F(x)+x。
F(x)的参数更新依赖于H(x)-x,如果残差为零,说明H(x)=x,那么只是简单跨层的复制操作,至少不会使得深度网络比浅层网络更差。
我们仍然采用简化版的神经网络来分析梯度,可见有2层,每一层都只有一个神经元,没有阈值,并且不使用激活函数,同时在第3层添加恒等映射,那么就有输出:
那么对于第三层的反向传播,权值参数、的更新会给出:
如图,我们在执行反向传播的过程中,假设每流经一层,梯度流都需要乘以0.1,意味着在训练中会产生梯度消失,但是在流经恒等映射块的时候,梯度保持不变,在最后相加的时候,就仍然能享有较大的梯度。
作者:唐僧不用海飞丝
如需转载,请后台留言,遵守转载规范
本文暂时没有评论,来添加一个吧(●'◡'●)