因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这一篇文章介绍的是图像分类中的经典的卷积神经网络架构—ResNet的学习笔记。
1 为什么要用 ResNet
前面已经证明过网络层次更深,能提取更高层次的特征,但是会遇到两个问题,梯度消失或爆炸和网络退化。梯度消失、爆炸问题,在几十层的网络结构中很大程度上可以通过标准的初始化、正则化层、足够的数据集等来解决。但网络层数成百上千呢?梯度消失或者爆炸的问题仍然存在。
什么是网络退化?简单说就是:网络层数加深,测试准确率会先上升,然后饱和,再持续增加就下降的过程。产生的机制可以这样理解:假设一个网络的理论最优结构是 18 层,设计时因为未知理论层数大小,有根据网络层数越多效果越好的经验,设计了一个 34 层的网络结构。那其实 18 层之后的 16 层就是冗余的,要是这16 层只做恒等传递还好,但实际情况是这 16 层也要网络参数学习,此时的学习就相当于是要求每层的输入输出完全一致,这就加大了学习的难度,反而使模型出现退化的现象。注意,退化并不是由过拟合产生的,而是由冗余的网络层学习到的参数不是恒等映射的参数造成的。
基于这个问题,ResNet 最初的灵感就产生了。假设一个网络较浅的层次就能达到饱和的准确率,那么后面再加上的网络层,如果是几个 y=x 的全等映射层,是不是至少不会导致误差增加?
2 什么是 ResNet
ResNet 是 2015 年何凯明,张翔宇,任少卿,孙剑共同提出的。ResNet 使用了一个新的思想,即假设一个网络层,存在最优化的网络层次,那么往往设计的深层次网络会有很多是冗余的,如果这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同,那此时的学习目标就变成了差值学习的过程。数学语言描述就是:假定某段神经网络的输入是 x,期望输出是 H(x),如果直接把输入 x 传到输出作为初试结果,那么此时需要学习的目标就是 F(x)=H(x)-x。ResNet 做的事就是相当于将学习目标改变了,不再学习一个完整的输出 H(x),只是输出和输入的差别H(x)-x,即残差。
下图是 ResNet 的一个残差学习单元(Residual Unit):
ResNet 的整个网络就是由一个个的残差学习单元组成,具体地,VGGNet-19 以及一个 34 层深的普通卷积网络,和 34 层深的 ResNet 网络的示意图:
论文指出:由此结构对比性的证明了残差学习单元的引入可以解决模型退化的问题。为了证明能够进一步的控制参数数量并加深网络层,获取更好的性能,又提出了两种模块,具体如下图所示:
最后配置不同的网络结构:
3 讨论
ResNet 的关键人之处在于,很大程度上解决了深度网络头中的网络退化问题。
使用残差网络结构 h(x)=F(x)+x 代替原来的没有 shortcut connection 的 h(x)=x,这样更新冗余层的参数时需要学习 F(x)=0 比学习 h(x)=x 要容易得多。而 shortcut connection的引入又巧妙的保证了反向传播更新参数时,梯度为 0 的现象不再高发,从而也不会再有梯度消失的问题。