残差连接是什么
虽然普遍认为神经网络模型越深,拟合能力越好,但是由于梯度消失/爆炸等问题,在深度到达了一定程度后, 模型的表现会不升反降。
2015年的ResNet是针对模型退化现象提出来的,通过residual connection 残差连接让上百层的模型得以收敛,从而也在分类任务中达到了更高的精度,在2016年的改进版中更是达到了上千层。
其实残差结构非常简单:
所谓残差连接指的就是将浅层的输出和深层的输出求和作为下一阶段的输入,这样做的结果就是本来这一层权重需要学习是一个对
其实残差连接可以看成一种特殊的跳跃连接,15年还有一篇Highway高速公路神经网络使用了类似的结构,但是在旁路中设置了可训练参数,效果没有ResNet好,似乎就验证了保持旁路畅通无阻的重要性。
实现起来也非常简单:
# Pytorch 官方实现
# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
if self.downsample is not None:
identity = self.downsample(x)
out += identity # 与输入求和
out = self.relu(out)
而ResNet的整体模型结构借鉴了VGG的模块式搭建,比较重要的区别是使用了Batch Normalization 批量正则化。
残差连接为什么有用
作者原文中提出的假设是当梯度接近零时,比起让参数直接拟合一个恒等映射,将残差函数逼近到0更容易,那么短接的这一路可不可以再给他加些花样(参数)呢? 那其实就是更广泛意义上的跳跃连接, 对此的研究其实由来已久, 被大家用来解决梯度消失,爆炸的问题,有学者起了一个形象的名字高速公路网络, 因为这样的结构使得特定信息可以无损地通过"高速公路"直达目的地。但是Highway 网络的表现并不如ResNet, 似乎说明了保持高速公路的畅通无阻(恒等映射)更加有用。
关于残差网络高效的原因有另外一篇论文Residual Networks Behave Like Ensembles of Relatively Shallow Networks提出了一种补充观点: 残差网络可以看成多个神经网络地集成, 其实到一定深度的层数是不必要的,因为恒等映射它们并没有做出什么贡献。
残差网络
2015 Deep Residual Learning for Image Recognition
推出了50,101,152层的版本。
2016 Identity Mappings in Deep Residual Networks
推出了1000层的版本。
2017 Aggregated Residual Transformations for Deep Neural Networks
感觉加深已经到尽头了, 开始在对模块进行加宽。
ResNeXt
ResNeXt有101和152,结合ResNet堆叠思想和inception的split、transform、aggregate思想,引入分组卷积。
ResNeXt保留了VGG和ResNet用重复模块构建模型的策略,同一个block共享一组相同的超参数,每当特征图被下采样到1/2时,block的宽度将会乘2.
同时借鉴了Inception系列 split-transform-merge 分离变换再融合的思想,在精度提高的同时,计算量却没有增加。其实ResNet可以看成分成两路的神经网络,其中一路是恒等映射。
增加 cardinality(势, 表示集合的大小) 可以提高模型的表现。