当我的初中历史老师第一次讲到韩信带兵多多益善时,神情流露出对兵神的拜服与对他屈居刘邦之下的惋惜。
这时有个学生道:“兵越多当然实力越强,当然越容易胜利咯。”
老师摇头苦笑:“你5岁时画画,给你的油画棒越多、画纸越大,你反而越难以画出精确的图案哪。”
随着神经网络层数的增加,它也好像有着过多工具的孩童,学习效果反而下降。今天介绍的ResNet则能教会这个“巨婴”用好手头的运算能力。
1.
网络退化问题
传统观念中,深度学习网络的深度越深,其非线性的表达能力越强,该网络也就能提取更加复杂深入的特征。CNN网络从5层和8层发展到VGGNet的16-19层似乎印证了这个规律。
因此,当你听说今天我们介绍的深度残差网络(Deep residual network, ResNet)有多达152层的网络深度,你是否也觉得这是以量取胜的范例呢?
事实上,我们发现传统的CNN网络结构随着层数加深到一定程度之后,网络效果反而下降。
以下是56层与20层常规CNN网络的分类准确率对比图:
图1
无论是左侧的训练集还是右侧的测试集,56层的神经网络都始终显示出更高的错误率。
较常见的过拟合现象发生时,训练集上的损失不断减小,测试集的损失先减小再增大。图1的现象显然不同,这种网络加深后的精确度下降被形象地称为网络退化问题(Degradation problem)。
当我们堆叠一个模型时,效果越堆越好是理所当然的结论。因为,假设一个比较浅的网络已经可以达到不错的效果,那么即使之后堆上去的网络什么也不做,模型的效果也将维持。
然而事实上,这却是问题所在。“什么都不做”恰好是当前神经网络最难做到的事情之一。一种假设是强大的“非线性”计算能力让神经网络模型运算得过多,以至于特征很难在层层向前传播中得到完整保留。
2.
ResNet提出的解决方案
由于ResNet的里程碑意义正是来自其解决了深度模型难以训练的问题。
图2
如图所示,右边网络与左边网络的唯一区别是右边网络加深了三层。假设左边网络输出值为x,右边网络的倒数第四层的输出也应当为x。
设右边网络的最终输出结果为H(x),那么,只有当右边网络的精确度好于,至少是等于左边网络精确度时,其加深才有意义。
换言之,即我们尚能接受H(x)=x的结果。而如果网络每部分至少维持理应达到最低精度的状况外加能提高精确度的部分,就能使结果改观。
H(x)=x这一让输出等于输入的方式,就是恒等映射(identity mapping)。
而ResNet的初衷,就是让网络拥有恒等映射的能力,总能保证深层网络的表现至少和浅层网络持平。
因此我们现在的思路是:要阻止网络退化,就要做到恒等映射。然而,传统的神经网络不善于拟合潜在的恒等映射函数H(x)=x。
但如果把表达式改为H(x)=F(x)+x,即直接把恒等映射作为网络的一部分,就可以把问题转化为学习一个残差函数F(x)=H(x)-x,当F(x)=0,即构成恒等映射。训练的目标也就变为使残差F(x)逼近于0。实际上,拟合残差也确实比拟合恒等映射容易得多。
残差网络的基本结构如图所示:
图3
通过在较浅层于较深层之间建立捷径(Shortcut connection)(即图3右边的曲线),ResNet把较深层的输出结果初始化为较浅层的输出,x,随后再将x与残差F(x)相加,得到实际输出H(x)。
对比18层和34层的神经网络,可以发现ResNet确实有效解决网络退化问题:
图4
参考网址:
https://www.bilibili.com/read/cv5071566/
https://zhuanlan.zhihu.com/p/106764370
https://www.jianshu.com/p/15e413985f25