(转)如何解析深度学习 Inception 从 v1 到 v4
原链接:如何解析深度学习 Inception 从 v1 到 v4 的演化? - 运筹OR帷幄的回答 - 知乎
关于 Inception有2点疑问:
-
网上关于Inception为么能work的解释是比较趋同的:Inception使用split-transform-merge策略把multi-scale filter生成的不同感受野的特征融合到一起,有利于识别不同尺度的对象。但另一方面,很多state-of-the-art的网络没有使用multi-scale filters,但也取得了非常好的结果,比如VGG和ResNet。所以,multi-scale filters是Inception成功的关键吗?
-
自ResNet [5]横空出世,后续CNN基本上都会使用identity shortcut,包括DenseNet、DPN(dual path net)和ResNeXt等。然而,Inceptiont系列始终坚持不用identity shortcut,但在性能上却能跟用了identity shortcut的网络打得难解难分。更奇怪的是,Inception v4这篇paper中验证了增加identity shortcut对于Inception精度的提升非常有限,仅仅是加速了训练而已。为什么对其它结构可以立竿见影涨点的identity shortcut,对于Inception来说却略显无力?
Inception的进化史
这里我们只关心Inception在结构上的演化,而忽略一些训练上的细节(auxiliary loss和label smoothing等)。
Inception v1
Inception v1即大名鼎鼎的GoogLeNet,Google在2014年ImageNet比赛中夺冠的大杀器。相比之前的AlexNet和ZFNet,Inception v1在结构上有两个突出的特点:
-
Multi-branch结构。
每个inception module分为四个branch,输出时对所有branch的输出做concatenation。 -
Heterogeneous branch结构。
每个branch的结构都是不一样的,主要表现在branch的depth和kernel size两方面。
Inception v1的这两个特点被后续的Inception版本一直沿续,可以看作是Inception系列的标志。
BN-Inception
BN-Inception在Inception v1的基础上引入了Batch Normalization(BN)操作,提高训练效率的同时也大幅提升了Inception的性能
Inception v2 v3
Inception v2和v3是在同一篇文章中提出来的。相比Inception v1,结构上的改变主要有两点:
1)用堆叠的小kernel size(33)的卷积来替代Inception v1中的大kernel size(55)卷积;
2)引入了空间分离卷积(Factorized Convolution)来进一步降低网络的复杂度。
Inception v4 Inception-ResNet
Inception v4在模块设计上并没有提出非常有insight的princple,感觉只是把之前的Inception module变得更复杂了,然后对网络的stem进行了一定的修改。Inception-ResNet在Inception module中引入了residual connection。
-
Multi-branch结构。Inception v1的作者受人脑结构的启发,认为CNN内部的连接应该具有一定的稀疏性,所以在Inception module中引入了multi-branch的结构。因为每个branch内部1*1conv的应用,使得Inception module相比single branch结构的FLOPs要低
-
Heterogeneous branch结构。Inception中每个branch的结构都是不一样的,特别是kernel size。作者认为同类别的对象在不同图片中的size可能是不同的,所以应该在同一个module内部融合不同size的kernel产生的feature,有利于CNN识别不同size的对象。
上述两种理解都是非常符合直觉的,但是仔细想想却又不完全经得起推敲。首先,multi-branch结构在实现上等于组卷积(group convoltuion),而CVPR17的一篇叫deep root的文章已经证实了单纯使用group convolution可以有效降低CNN的复杂度,对于性能提升并没有明显帮助。其次,在CNN内部集成不同size的kernel更像是一种锦上添花的做法,而非不可或缺。因为VGG、ResNet和ResNeXt都只用了11(VGG没有用)和33卷积,但性能并不差于同时期的Inception。所以,除了上述这两种直觉上的解释,是否还存在更深层的原因?
Identity shortcuts
ResNet提出时,大家纷纷被kaiming天外飞仙般的identity shortcut操作所折服了。但关于identity shortcut为什么能work的解释有很多种,比较主流的解释有:
- 降低了网络在加深时的优化难度;
- 缓解了BP时的梯度消失问题;
- 实现了前馈过程中的低层特征的复用。
不管大家认可哪一种具体的解释,ResNet超高的性能让大家相信identity shortcut应该成为state-of-the-art网络的标配。事实上,后来的DenseNet,ResNeXt,SE-ResNet,SE-ResNeXt都可以看作是ResNet的扩展。
Inception中隐含的shortcut
在这样的大背景下,Inception家族却始终不采纳identity short,但性能上又能与ResNet打得难解难分,不由让人好奇。另一方面,Inception-ResNet在加上identity shortcut后性能并没有明显提升(但训练速度加快了),仿佛Inception本身并不太需要identity short,这又是为何?
Inception module中本来就有近似的identity shortcut。
大家之前对于Inception module的关注点主要集中在包含33和55的branch,忽略了另外两条只包含11的branch。11 branch是对前层feature的融合,然后与其它branch的feature concat到一起作为Inception module的输出。大家有没有想过,11 conv只是在input feature的channel方向上做了简单的融合,所以其输出在很大程度上是携带了原始input feature的信息的。也就是说11 conv其实可以看作是一种近似的identity branch,可以有效地实现低层特征的复用。大家可能会说,Inception module在output是用的是concatenation,而residual block用的是element-wise addition,怎么能说它们近似呢。其实,这两种融合的方式并没有很大差别。事实上,ShuffleNet v2用的就是Inception的这种融合方式。
因此,正是因为Inception中有近似的identity shortcut,所以Inception v3 v4才可以搭建那么深却依然能够训练;因为Inception中有近似的identity shortcut,所以Inception-ResNet中添加一条shortcut并没有带来明显的涨点(相当于多了一条功能上重复的shortcut)。
其实不管是Inception还是ResNet,都是在强调“信息直路”对于深层卷积网络训练的重要性。在这个层面上,目前所有state-of-the-art的网络结构都达成了共识。