图解ResNet:深度学习的半壁江山
一般从事过深度学习相关领域的小伙伴,或多或少的都接触过残差网络,有的可能是直接使用残差网络,有的可能是借鉴了残差的思想,比如大名鼎鼎的Transformer中就应用了残差的结构。
虽然在很多模型中都有残差的身影,但是可能有的小伙伴和我一样,知道个大概,但是具体的原理没有细究过,前阵子我查阅学习了蛮多资料,认真学习了一下,在这里分享给大家,相信大家看完一定能有所收获。
1.残差网络提出的背景
残差网络是何恺明等作者在2015年提出的,在各大比赛和数据集中疯狂屠榜。在2015年以前,大家普遍认为不同的网络层可以提取出不同的特征信息,因此按道理网络越深,性能应该越好。但是随着网络层数的加深,奇怪的现象出现了:
1.1、网络的训练和测试误差都在随之增大,没有减小。

但这并不是过拟合,因为过拟合在训练集上表现应该是正常的,而图中显示深层网络的训练集表现也很不理想,出现退化。
1.2、随着网络的越来越深,梯度爆炸和梯度消失很难杜绝。
因此深层次的网络变得难以训练,无法收敛,如何训练深层次网络成为一个难点。
这表明更深的网络并没有学习到更好的特征,反而把网络之前学习到的特征破坏了。如果当前特征很好,此时网络层应该直接跳过或者直接传递特征给下一层,而不是为了学习而学习,反而扭曲了特征,丢失了重要信息,因此网络层需要有恒等映射的能力,在不需要学习时,原封不动的把数据传递给下一层。

2、核心思想:残差结构
因此我们的问题在于如何让网络能学会恒等映射的能力。
2.1、恒等映射的难点
在线性函数中,恒等映射很简单,原封不动的输出嘛,但是在神经网络这种非线性模型中,要让它去拟合恒等映射这种线性能力,无疑于逼它做不擅长的事。
这需要多个非线性函数互相抵消,并且要求权重矩阵精确的配合,与此同时,任何一层参数微小的变化,都会在非线性层中被放大变形,参数优化无异于走钢丝。
2.2、另辟蹊径:两个相同的输入x
如果我们一直考虑如何去提高非线性模型的恒等映射能力,无疑会走进死胡同,现在我们知道了答案,何恺明等作者另辟蹊径,引入了残差结构:

在残差结构中,最最关键的一点在于同一个输入,被分成同样的两份,兵分两路却又殊途同归的到达了终点。
我把输入画成两个更好理解一些:

因此我们最终的输入可以视作被copy了一份,一份经过网络层去提取特征,另一份被原封不动地保送到终点。正是这个结构,解决了恒等映射的问题。
2.3、网络学习目标发生变化
假设我们网络最终的输出为H(x),网络拟合的函数是F(x)。在只有一个输入x时,x在经过网络函数后,得到F(x),此时H(x)=F(x)。为了使得输入=输出,H(x)=x,需要H(x)=F(x)=x。
我们加了一个快捷连接结构,使得一个x直达终点,则H(x)=F(x)+x,为了使得输入=输出,H(x)=x,需要F(x)=0。

至此残差网络的主要结构已经叙述完了,除此之外,网络中还加入了 Batch Normalizationd,BN的主要思路是对每次前向传播的过程中对数据进行正态分布的归一化调整。
2.4、优化结果
在加入残差结构后,网络的层数大大增加,并且没有出现网络退化和梯度爆炸消失的问题,为此作者也进行了实验对比:网络越深效果显著,但是也不是一味加深网络就越强,大力出奇迹过了头,1202层网络反而过拟合了,100层网络够用啦,杀鸡焉用牛刀。

3、疑问
学习完了残差网络的结构有几个疑问与大家一同分享。
3.1、F(x)=0为何比F(x)=x简单?
前面已经说过为何F(x)=x很难,这需要让一个非线性函数去拥有先线性能力,是一个非常困难的问题,难为CNN了。

但是F(x)=0的方式就五花八门了,可以将网络层的权重直接推向0,对于ReLu函数,当其输入是负数时,输出也是0,因此网络有很多种方式可以使得F(x)≈0。
想象一个弹簧。把它压缩到恰好1厘米的长度(H(x)=x)需要精确控制力道。而把它完全放松到自然状态(F(x)=0)则简单得多——只需要松手就行。权重衰减和初始化就像是那个让弹簧自然放松的力。
3.2、F(x)=0中间层还有何意义?
这涉及到了残差网络的必要性原则了,这些网络层并不是完全没有起作用,它们只是在必要时被激活,对于有些x,如果特征足够好,则不需要处理,直接恒等映射;但是对于另一些x,如果需要微调或者特征提取,那么这些层则会学习到非0的F(x),对特征进行补充或者修正,网络层也是双标的。
因此残差结构的意义在于:足够好的,我直接给你,需要修正的,我来微调,给到你的永远最最好。
3.3、F(x)咋知道是否该为0?
当然我们的网络还没有智能到这个程度,事实上这个还是需要依据损失函数来引导的,损失函数通过损失函数值,从而知道目前权重的调整的调整状况,进而采用梯度下降,来达到最好的效果。
小伙伴们需要注意的一点是,这个过程不是一下完成的,而是逐步探索而得到。
4、小结
在学习完以上内容之后,我们知道了加入了残差结构,使得网络的学习目标发生了转化。f(x)=0比f(x)=x更容易学习,这就是残差网络的精髓之处了。
有人可能会说,这么简单的结构为啥这么久才想到?一部分也是因为思维定势,另一方面,早期的浅层网络也已经够用了,随着数据的爆炸,算力的提升,网络加深也成为了大家需要面临的问题,因此也就被拉上舞台啦。
如果觉得还不错,大家可以加个关注,有什么疑问也可以在评论区一起探讨~

更多推荐
所有评论(0)