我们都知道随着神经网络深度的加深,训练过程中会很容易产生误差的积累,从而出现梯度爆炸和梯度消散的问题,这是由于随着网络层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定(特别大或特别小),出现最多的还是梯度消散问题。残差网络解决的就是随着深度增加网络性能越来越差的问题。
resnet中最典型的模块就是上面的部分,通过这样一个“短路”的方式,使得短路前的层再差也能保证其训练好,即,如果被短路的层能被训练好(能提升网络性能),则保留其路线,否则跳过它们不进行训练
在resnet的这样一个短路unit中,被证明效果最好的是上述两种结构,这样的结构首先要保证其不会有维度的衰减和channel的衰减,这样才能起到短路的效果,即短路和不短路出来的维度和通道数都要相同。
为什么不采用相同conv层的堆叠?以后面三层的resnet块为例。
如果堆叠3*3,64的卷积层,其参数量有256*256*3*3 约为600k个
使用如图所示的结构,其参数量有256*64*1*1+64*64*3*3+64*256*1*1约为70k个
通过减少网络参数,使得堆叠更深的网络结构成为可能。
左边是基础的VGG19,中间是基于VGG扩增到34层的网络,右边是34层的残差网络,从这样的结构变化和上述原理不难总结出,resnet是对其他网络的一种改进,它允许网络在训练过程中自己决定怎样调整训练层数和参数会使得网络性能更好。
但需要明确的是,resnet不能无限的加深网络深度,因为目前每个残差块后面都有一个relu激活,这样一个操作虽然在少量层数不会有很大影响,但是在1000层甚至更多层就会阻碍网络的前向和反向传播(relu会使部分神经元处于未激活状态即0状态)
最新评论