解决梯度消失和梯度爆炸的ResNets

!非常非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸的问题,利用跳远连接构建能够训练深度网络的ResNets,有时深度可能超过一百层。ResNets是由残差块构建的,什么是残差块呢?
解决梯度消失和梯度爆炸的ResNets

这里的g是指Relu非线性函数,信息流从a[l]—>a[l+2]需要经过以上所有步骤,在残差网络中有一点变化:我们将a[l]直接拷贝到神经网络的深层,在线性**之后,Relu非线性**之前加上a[l],这使a[l]的信息直接到达神经网络的深层,不再沿着主路经传递, 加上的a[l]产生了一个残差块,即a[l+2]的生成式变为:
解决梯度消失和梯度爆炸的ResNets
所以跳远连接就是a[l]跳过一层或者好几层,将信息传递到神经网络的更深层,通过求偏导我们就能看出,这样就算深度很深,梯度也不会消失了。
解决梯度消失和梯度爆炸的ResNets

解决梯度消失和梯度爆炸的ResNets
由普通网络变为ResNet的方法是加上所有的跳远连接,一个连接构成一个残差块,5个残差块连接在一起,构成一个残差网络。**对于传统网络而言,理论上,网络深度越深,训练的应该越来越好,**但如过没有残差网络,对传统网络来说,深度越深意味着用优化算法越难训练,随着网络的深入,训练错误会越来越多,但如果有ResNet,可以保证我们在训练更深网络的同时,保证其良好的性能,实践证明,ResNet确实在训练深度网络方面非常有效。

!使用1×1的卷积:通道为一的矩阵卷积1×1的卷积核只是相当于对矩阵乘以某个数字,但如果是多通道的矩阵如32通道,使用一个1×1×32的卷积核,就会把各个通道的数据乘以卷积核的值再求和成为一维
例如其的一个应用:28×28×192的输入层,我们可以用池化层压缩它的高度和宽度,但如果通道很大,如何把它的维度压缩为28×28×32维度的层呢,这里可以使用32个1×1×192维的核来压缩通道,这里1×1的主要目的在于保证长宽不变。解决梯度消失和梯度爆炸的ResNets

!什么是梯度消失:例如,对于下图所示的含有3个隐藏层的神经网络,梯度消失问题发生时,接近于输出层的hidden layer 3等的权值更新相对正常,但前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。因此所有的权重通常会满足|wj|<1,而s‘是小于0.25的值,当神经网络特别深的时候,梯度呈指数级衰减,导数在每一层至少会被压缩为原来的1/4,当z值绝对值特别大时,导数趋于0,正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致神经网络无法被优化,训练永远不会收敛到良好的解决方案。
解决梯度消失和梯度爆炸的ResNets
什么是梯度爆炸
当我们将w初始化为一个较大的值时,例如>10的值,那么从输出层到输入层每一层都会有一个s‘(zn)*wn的增倍,当s‘(zn)为0.25时s‘(zn)*wn>2.5,同梯度消失类似,当神经网络很深时,梯度呈指数级增长,最后到输入时,梯度将会非常大,我们会得到一个非常大的权重更新,这就是梯度爆炸的问题,在循环神经网络中最为常见.图中的曲线表示权值更新的速度:
解决梯度消失和梯度爆炸的ResNets

其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU**函数取代sigmoid**函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。