本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Inception-V3
Inception-V3主要是在Inception-V1的结构上进行了进一步的优化,由于Inception结构的特殊性,很难在其上做出更进一步的改动,而时实践证明直接增加Incetption模块的通道数目来增加模型的容量是不合理的,收益相对于模型参数的增加是不佳的,这也违反了Inception设计的初衷。本文的贡献在于给出了Inception模块的改进设计准则和改进范例。
设计准则
作者提出了以下四个准则,虽然没有严格理论证明,但实践过程中偏离这些准则准则往往要付出较大的代价:
- 防止在网络设计,尤其是早期设计时出现表征瓶颈。表征瓶颈指的是特征的大量丢失,直观解释就是将特征图样通过一个极小的口子1,只留下其中的一部分。池化,大步长卷积都算是表征瓶颈。表征的大小应该是逐步减小的,而不该是突然压缩的。
- 特征的维度越高,网络训练起来更简单,因为可以获得更多的分解特征,更加容易产生高相关性,类似Hebbian理论。2
- 空间上的聚合可以在低尺度层面上进行而不怎么损失信息。也就是使用1*1conv先对特征降维再进行卷积是可行的。
- 网络的深度和宽度应该实现平衡,即同时增加或减少。
卷积分解
对称卷积分解
基于原则3,作者更进一步的认为视觉网络中相邻神经元的输出是高度相关的,我们可以先对它们降维再进行聚合,这应该和直接聚合有相同的表征能力。就此提出了将大尺度卷积进行分解的方法,对于一个5*5的卷积,我们可以将其分解为两个3*3卷积的组合,它们的感受野是一样的,而参数量则下降了28%(),如下图:
而作者也通过实验证明了虽然我们只是想通过两次3*3卷积来代替原始5*5的卷积,但两次卷积都附加非线性激活相比只在最后使用非线性激活效果更好。(其实作者还提到了个问题,这种替代真的不会带来表征能力的下降吗?但并没给出回答,很奇怪。)
非对称卷积分解
沿着卷积分解的思路,自然而然的想法就是为啥不继续用2*2的卷积来代替3*3卷积,因为作者给出了另一种非对称卷积的解决方案,用两次不同方向上的1*3卷积来代替3*3卷积,如下图:
这种非对称卷积使得参数下降了33%,而用2*2的卷积只能使得参数减少11%。理论上来说我们可用任意n*1和1*n卷积来代替n*n卷积,而在实践过程中发现网络早期这种替代表现并不好,当网络深入,特征图样大小来到中等尺寸(12~20)时效果才比较好。
高效降维
如果我们想要使得输出的通道数加倍而空间尺寸减小,常规方法就应该是如下右图所示的先卷积再池化,但这种方法需要的参数量很大。直接的降参数方法就是先池化再卷积,但这样实施就违反了原则1,中间的池化只允许一小部分的特征通过,成为了表征的瓶颈。
作者给出了如下的解决方法,在参数和特征丢失间取了折中,但自我感觉挺没道理的,感觉是在凑640个通道,旁支的池化层保留了前层特征,再后卷积后相当于后层的特征进行拼接,有啥意义呢?某种意义上的skip connection?
损失函数
对于多分类问题,最经典的损失函数就是交叉损失熵函数了,最小化交叉损失熵实际熵就是在拟合原始输入在标签空间的分布。通常我们会认为其分布是冲激函数,即。但这一分布假设的缺点就是太“硬”了,容易出现过拟合,同时会使得模型的泛化能力降低。解决方案就是让先验分布不那么“硬”,容忍一定的误判,也就是预设错误可能。将先验分布设定为:
就是我们预设的可容忍的错误分布,通常设置为均匀分布。相应的交叉损失熵函数就变成了:
也就是我们认为输入在标签空间的分布有的可能是冲激的,有 的可能是均匀的,分别计算和二者的差异再加权平均。
总结
总的来看,InceptionV3改动不大,有些地方自己看着也不是特别合理,但最后损失函数的设计倒挺有意思的。除此之外文章还对Inception-V1中的分枝做出了评价,这些旁支分类器意义不大,更多的是以regularizer的形式发挥作用,和使用Batch Normlization差别不大。