训练深层神经网络时,如果深度特别大,其实是很难训练下去的,因为会遇到梯度消失和梯度爆炸的问题。残差网络可以帮助我们更好地训练深层神经网络。

一、残差块

python残差神经网络 残差神经网络算法_卷积


在神经网络的两层中,会执行如下运算过程(主路径)

python残差神经网络 残差神经网络算法_python残差神经网络_02


如果将python残差神经网络 残差神经网络算法_神经网络_03拷贝到最后一个linear之后,ReLU之前,这个路径称作是捷径(shortcut):

python残差神经网络 残差神经网络算法_python残差神经网络_04


有时候这个捷径(shortcut)也称作远跳连接(skip connection)

python残差神经网络 残差神经网络算法_python残差神经网络_05

通过这种方式,计算过程有一些改变,如下所示。

python残差神经网络 残差神经网络算法_python残差神经网络_06

二、残差神经网络

首先给出一个普通神经网络

python残差神经网络 残差神经网络算法_神经网络_07


要使它变成残差神经网络,就是加上远跳连接。

每两层增加一个捷径,构成一个残差块,残差块组合在一起形成一个残差网络。

python残差神经网络 残差神经网络算法_神经网络_08


残差神经网络在训练深层神经网络时,有效预防了梯度爆炸/消失的问题,也解决了网络结构臃肿的问题,相比普通神经网络效果更佳。

python残差神经网络 残差神经网络算法_神经网络_09

三、为什么残差网络如此有效?

python残差神经网络 残差神经网络算法_图像识别_10


权重w和偏差b都取0的时候,python残差神经网络 残差神经网络算法_python残差神经网络_11,这种恒等式不会影响到网络的效率,通过那两层还可以学习到一些特征信息,反倒可以提高网络效率。

值得注意的是python残差神经网络 残差神经网络算法_python残差神经网络_12python残差神经网络 残差神经网络算法_神经网络_03应该具有相同的维度才能实现加法运算!在ResNet中使用了许多same卷积方式,所以使得python残差神经网络 残差神经网络算法_神经网络_03维度可以等于输出的维度,从而实现了远跳连接。

python残差神经网络 残差神经网络算法_神经网络_15

四、残差网络作图像识别

普通神经网络

python残差神经网络 残差神经网络算法_神经网络_16


残差神经网络

python残差神经网络 残差神经网络算法_卷积_17


每两层卷积就添加一个捷径形成一个残差块,从而形成一个大型的残差网络。由于大量使用了same卷积方式,所以维度得以保留,从而实现远跳连接中的同纬度相加过程。