深度学习《残差网络简单学习》
一:残差网络
VGG网络将网络达到了19层的深度,GoogleNet的深度是22层,一般而言,深度越深,月面临如下问题:
1:计算量增大
2:过拟合
3:梯度消失和梯度爆炸
4:网络退化
第一个问题呢可以用GPU集群并行计算来解决。
第二个问题和第三个问题,可以用(Early stop,Data expading,正则化,dropout,BatchNorm,Gradient clapping)等多重方式解决。
而问题四就得需要残差网络的思路来解决:
一般而言,网络的深度越深,理想情况下是期望越能获得更高维度的数据特征的,理想情况下,越深层的网络是要比浅层的网络要好,起码不要劣化才对,是否真的是能够简单地通过不断叠加深层网络来获得性能更优的网络呢?
答案不是的,在实践中发现,如果仅仅单纯的把网络叠起来的深层网络的效果,有时候反而不如合适层数的较浅的网络效果。直观的表现是,当你再增加网络深度的话,训练集loss反而会增大,难道不应该是起码不劣化才对么?
这时候残差网络就出现了,它包含了大量的如下所示的残差块,重复叠加而成。
这里将浅层的输出跳跃式的送到下下面几层,中间跨了几层后,和这几层的运算做累加操作。
这样做的好处是,即便深层的网络不能很好的训练,最差也不会劣化到某个浅层网络。从反向传播的梯度运算上来看,有了这个跳跃,梯度不会下降到很低,避免了出现梯度消失,浅层的网络可以得到参数更新。
说到这里,有点相似于RNN的思想,将一些已经产生的数据送到了后面的计算层。
上图是两个残差Block的示意图
二,残差网络的种类
残差网络有很多版本,有res18,res34,res50等等,后面的数字就是网络层数
比如res18
比如res34
下面给出一个总结列表
可以照着这个列表,实现出各种的残差网络,因为存在大量的重复结构,基本的结构样式都是一致的。