ResNet的发展历程的总结和一点思考

这里不再讲特别多的基础知识,也基本不会放图片,其实,到了2019年并且做深度学习的人,真的有谁不知道或者没看过ResNet的文章、或者博文吗。

ResNet刚刚提出来的时候,想法就是很简单,就是H(x)=F(x)+x,原因也很直白,层数太多会有degradation的情况,那么不如把前边的给它直接怼过去?作者一开始说了那么多话,也掩饰不住这个连接是拍脑袋搞出来的,或者说是最简单的试试就work了,所以开始的比较也并没有比如为参数是1不是0.5之类的问题(这些都在v2中给了实验)。而另一个比较神奇的地方就是bottleneck,作者敢在16年就这么大规模的用,确实很有勇气。后来的注解也说明了,普通的building\:block也是OK的,这么用就是为了省点参数,梯度的问题也完全没有被1\times1\:conv所解决,而这样的结构就如此广泛地被所有后续paper所接受,感觉还是有一些改进的空间。

不得不说,ResNet这篇paper写的是真的好,娓娓道来,实验充分,图表充足,这样的paper不得best还有谁能得呢?

后续给出了ResNet-v2,这个paper作者确实是用力了,把之前没讨论的形式基本都讨论了一遍,比如为啥+x这一部分的系数是1而不是0.5:

L层可以被表示为:
x_L=x_l+\sum^{L-1}_{i=l}F(x_i,W_i)
那么Loss对第l层的偏导就是:
\frac{\partial Loss}{\partial x_l}=\frac{\partial Loss}{\partial x_L}\:\frac{\partial x_L}{\partial x_l}=\frac{\partial Loss}{\partial x_L}(1+\frac{\partial}{\partial x_l} \sum^{L-1}_{i=l} F(x_i,W_i))
因此,如果第i+x_i项有个系数\lambda_i,第L层就会被表示为:
x_L=(\prod_{i=l}^{L-1}\lambda_i)x_i+\sum^{L-1}_{i=l}\hat{F}(x_i,W_i)\hat{F}代表省略后续累加项的常数参数)
则第l层对Loss的偏导就变成了:
\frac{\partial Loss}{\partial x_l}=\frac{\partial Loss}{\partial x_L}((\prod_{i=l}^{L-1}\lambda_i)+\frac{\partial}{\partial x_l}(\hat{F}(x_i,W_i))
所以你看,前边的系数就参与了BP,大了吧梯度爆炸,小了吧梯度消失。

还有很多实验分析这里不一一介绍,但是结论还是要知道的:
(1)直接累加就挺好
(2)当H(x)项的顺序是BN \rightarrow relu \rightarrow conv \rightarrow BN \rightarrow relu \rightarrow conv时是最好的。

然后一个有意思但是至今一个意见不太统一的地方就是,shortcut的时候究竟要不要一个1\times1\:conv。v1说要,v2说不要,不过很多后续paper或者工程其实还是要了的,不过作者也说了,层数少可以搞一个,层数多了就算了,这也是蛮神奇的地方,我觉得思路可能和ResNet本身要解决的问题倒有一点相似,层数变多、结构复杂未必好,或者说,未必好训。一般来讲,ResNet-50差不多可以用,我明天试试。之所以单独提50,就是因为这基本上是个工业界非常喜欢的结构,用的非常非常多。

然后时过境迁,就到了ResNeXt,这个工作作者说直接motivation是Inception,恩,看起来也很没有创意的样子。作者吭哧吭哧画了3个图,然后就说,我们使用group\:conv的版本实现了下,它们其实差不多等价!我去,这也太不严谨了吧,好歹在cifar上验证下也行啊。打算闲下来了也同样做个实验。这里有个需要注意的就是,参数量差不多的时候ResNeXt的(输入)channel可以更多一点(毕竟每个conv的数量减少了嘛),这样就可以把模型搞得宽,效果也好一点。

然后就很有意思了,既然有了group\:conv,那为啥不把它搞到group=channel呢,于是就将其命名为deepwise\:conv,(注:这里我没有完全按照时间线来分析,只是这个思路确实比较好懂,有利于大脑理解),也就有了mobile net。

然后就向2条不同的路延伸了,一条在优化mobile\:net的路上一路向前,有了v2,v3,shuffle net,顺便说下v2,它的改进好像只有2个,1.relu\rightarrow relu6,2.最后一个1\times 1\:conv换了个identity()作为激活,这不就是把原来ResNet的bottleneck抄了过来嘛(当然维度变化情况是不一样的);是另一条在“如何创建更好的shortcut”上一路向前,有了densenet,甚至还有了“是不是shortcut点别的东西也会有奇效”的路,比如residual-attention net,senet,cbam。其实最后者一般被称为attention,不过图像attention这个东西吧,本来就不算特别让人信服,它的实现机制简直就是一个并联的conv。要是说senet真的读取了channel attention的信息,那么它根本不应该gap之后去做fc,毕竟fc也实现了每个channel信息的交互啊!作者要么应该gap后之间连,要么用deepwise\:conv去做一点处理,总的来说,不应该有信息的交互。这也是一个我打算尝试下的点。倒不是说这几个点有什么用,只是为了解疑答惑,让自己信服。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容