我没有看原文,近期准备好好看一下:Deep Residual Learning for Image Recognition
附上论文详细解读
对ResNet的理解主要来自吴恩达的课件、CNN入门讲解:什么是残差网络Resnet(视频)以及CSDN上相关资料。
深度网络的好处:
1.特征的等级随着网络深度的加深而变高;
2.很深的深度使得网络具有极强大的表达能力。
但深度网络会产生两个问题:
1.梯度消失及梯度爆炸
梯度爆炸的问题基本不用担心,因为ReLu的最大梯度是1,sigmoid的最大梯度是0.25,下图是sigmoid的梯度分布图:
主要担心梯度消失的问题,链式求导w很小,推到最初几层网络的参数变得非常小,梯度参数基本就消失了。
2.网络退化
在深层网络能够收敛的前提下,随着网络深度的增加,正确率开始饱和甚至下降,称之为网络的退化(degradation)问题。
为什么会产生网络退化,有如下解释:
本来随着网络深度增加准确率越来越好的网络出现了诡异的变化。深层网络应该优于浅层网络,可以说是所有人都认同的的事实,但是随着网络的加深,一些层通常是没有必要出现的,如果训练好的参数随着后面的网络扰动,会被类似于白噪音的问题使参数重新偏移变差。
我对这个解释不是很满意。应该明确,深度学习是一门实验性的科学。实验性科学就是先观察到现象,然后根据现象找解释。这可能是唯一一个研究对象是人造的实验性的科学领域。
如何解决这两个问题,又能保持深度网络较好的学习能力?残差网络出现了。
1.缓解网络退化问题
首先,一个2层的网络可以拟合任意一个函数。我们希望输出H(x)应尽量接近x,即F(x)->0,这样这个残差模块基本相当于恒等映射,网络退化的问题就缓解了。因此我们希望这个2层网络能拟合函数f(x)=x。
如何使得F(x)->0呢,还是梯度下降。对于这个残差模块来说,下图中红框的增项a[l]就是short cut带来的。
这个项出现的意义等同于对z[l+2]的正则化,会使得w[l+2]与b[l+2]变小,因此会使得F(x)->0,使得这个残差模块基本相当于恒等映射。
还有一个值得说明的问题:残差期望F(x)要比原始期望映射H(x)更容易优化,解释如下:
据说还有ReLu的影响,请看参考资料。
2.缓解梯度消失的问题
看我画的红圈圈,如果是plain网络,是没有1的,那么梯度是非常小的,很多非常小的梯度链式相乘变得更小,梯度消失。因为有了short cut加上了1,梯度变成比1大一点点,在这个环节上保持了链式梯度的稳定性。
就是说加上short cut的前后,在网络退化问题上,由输入输出较大的线性变化,变成了基本相当的恒等映射。
如果加上short cut之后变成完全恒等的映射,梯度变成1,那么不加任何模块也能达到这个效果。
实际上,虽然F(x)->0,但F(x)并不等于0,用吴恩达的话说:
“当然我们的目标不仅仅是保持网络效率,还要提升它的效率。想象一下,如果这些(残差模块中的)隐层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好。
加上残差模块,能确定网络性能不会受到(较大)影响(因F(x)->0),很多时候甚至可以提高效率(F(x)虽然很小,还是学习到了新的特征),或者说至少不会降低网络效率。因此创建类似残差网络可以提升性能。”
我们来比较一下加残差模块、什么也不加、加不带short connection(我觉得还是connection比cut合适)的plain模块的区别:
加残差模块:梯度为1+min_num,基本恒等映射,但就是(基本恒等映射-完全恒等映射)的F(x)可能学习到了有用的信息,使得网络进一步优化。
什么也不加:梯度为1,完全恒等映射,对网络优化没有贡献。
加不带short connection的plain模块:梯度为min_num,加强了梯度消失;映射的线性变化很大,过大,可能把已经优化好的参数又改变了,是网络退化的原因。步子迈得太大,扯着蛋了。
因此残差模块虽然迈着小步,但是在稳步前进。至于这个(基本恒等映射-完全恒等映射)的F(x)为什么大多数情况下是学习到了有用的信息,而不是扰乱了已经优化好的参数,我只能说:深度学习是个实验性的科学,这是一个基于统计的结果。在我的知识范围内不能解释。
最后再来看一张图:
看红圈圈,这些模块是没有short connection的。为什么不能把一个深度网络中的层都搞成残差模块,如果都是残差模块了,梯度都变成了1+min_num,链式乘起来会发生梯度爆炸的事件,会导致训练不收敛,因此必须中间有几个min_num,以保证最初几层的梯度参数在一个合理范围之内。