这里不再讲特别多的基础知识,也基本不会放图片,其实,到了2019年并且做深度学习的人,真的有谁不知道或者没看过ResNet的文章、或者博文吗。
ResNet刚刚提出来的时候,想法就是很简单,就是,原因也很直白,层数太多会有
的情况,那么不如把前边的给它直接怼过去?作者一开始说了那么多话,也掩饰不住这个连接是拍脑袋搞出来的,或者说是最简单的试试就work了,所以开始的比较也并没有比如为参数是1不是0.5之类的问题(这些都在v2中给了实验)。而另一个比较神奇的地方就是
,作者敢在16年就这么大规模的用,确实很有勇气。后来的注解也说明了,普通的
也是OK的,这么用就是为了省点参数,梯度的问题也完全没有被
所解决,而这样的结构就如此广泛地被所有后续paper所接受,感觉还是有一些改进的空间。
不得不说,ResNet这篇paper写的是真的好,娓娓道来,实验充分,图表充足,这样的paper不得best还有谁能得呢?
后续给出了ResNet-v2,这个paper作者确实是用力了,把之前没讨论的形式基本都讨论了一遍,比如为啥这一部分的系数是1而不是0.5:
第L层可以被表示为:
那么Loss对第l层的偏导就是:
因此,如果第i层项有个系数
,第L层就会被表示为:
(
代表省略后续累加项的常数参数)
则第l层对Loss的偏导就变成了:
所以你看,前边的系数就参与了BP,大了吧梯度爆炸,小了吧梯度消失。
还有很多实验分析这里不一一介绍,但是结论还是要知道的:
(1)直接累加就挺好
(2)当项的顺序是
时是最好的。
然后一个有意思但是至今一个意见不太统一的地方就是,的时候究竟要不要一个
。v1说要,v2说不要,不过很多后续paper或者工程其实还是要了的,不过作者也说了,层数少可以搞一个,层数多了就算了,这也是蛮神奇的地方,我觉得思路可能和ResNet本身要解决的问题倒有一点相似,层数变多、结构复杂未必好,或者说,未必好训。一般来讲,ResNet-50差不多可以用,我明天试试。之所以单独提50,就是因为这基本上是个工业界非常喜欢的结构,用的非常非常多。
然后时过境迁,就到了ResNeXt,这个工作作者说直接motivation是Inception,恩,看起来也很没有创意的样子。作者吭哧吭哧画了3个图,然后就说,我们使用的版本实现了下,它们其实差不多等价!我去,这也太不严谨了吧,好歹在cifar上验证下也行啊。打算闲下来了也同样做个实验。这里有个需要注意的就是,参数量差不多的时候ResNeXt的(输入)channel可以更多一点(毕竟每个conv的数量减少了嘛),这样就可以把模型搞得宽,效果也好一点。
然后就很有意思了,既然有了,那为啥不把它搞到
呢,于是就将其命名为
,(注:这里我没有完全按照时间线来分析,只是这个思路确实比较好懂,有利于大脑理解),也就有了mobile net。
然后就向2条不同的路延伸了,一条在优化的路上一路向前,有了v2,v3,shuffle net,顺便说下v2,它的改进好像只有2个,1.
,2.最后一个
换了个
作为激活,这不就是把原来ResNet的
抄了过来嘛(当然维度变化情况是不一样的);是另一条在“如何创建更好的shortcut”上一路向前,有了densenet,甚至还有了“是不是shortcut点别的东西也会有奇效”的路,比如residual-attention net,senet,cbam。其实最后者一般被称为attention,不过图像attention这个东西吧,本来就不算特别让人信服,它的实现机制简直就是一个并联的conv。要是说senet真的读取了channel attention的信息,那么它根本不应该gap之后去做fc,毕竟fc也实现了每个channel信息的交互啊!作者要么应该gap后之间连,要么用
去做一点处理,总的来说,不应该有信息的交互。这也是一个我打算尝试下的点。倒不是说这几个点有什么用,只是为了解疑答惑,让自己信服。