模型压缩系列之sep-net

SEP-Nets: Small and Effective Pattern Networks. Zhe Li Xiaoyu Wang Xutao Lv Tianbao Yang

深度CNN在各类任务上被证明会随着深度加深模型增大而效果变好,但是预测速度是比较慢的,而且在嵌入式上速度更慢且对模型体积有严格限制。resnet34的模型在服务器cpu上大概要200ms左右,手机上要400ms~1s左右,因此模型裁剪和压缩是一个较新的技术方向用来提升预测速度。原理上有两类:一是通过裁剪模型的冗余参数来保证精度不怎么降低的情况下计算量减小,比如蒸馏、mobilenet、squeeze等等;另一类是通过量化模型参数,使得参数之间的预算由浮点变成定点甚至是0/1运算,比如binary/ternary、定点化等方法。这个paper是cvpr2017上的一篇,作者xiaoyu说前人的paper其实是比较难复现的,而且全量定点化或者binarize精度会下降的比较多,是一个比较新的工作。

Motivation:

之前的量化工作都是所有参数全部量化,这会导致精度降低很多,因此作者选取了个折衷的办法只量化部分参数来达到提升速度减小体积的同时精度不会降低很多;另外为了便于大家实现设计,提出了一个新的量化module:pattern residual block,可以方便的加入网络结构中。

基本原理:

做binarize的基本过程如下:

1. 训练一个正常的网络,比如googlenet或者resnet

2. 把大于1X1的卷积核二值化

3. finetune 二值卷积核的scalar参数和1X1卷积核参数

简洁明了,关于为什么只对大于1X1的卷积核做量化,作者做了个分析,从最小化参数的量化误差来看,1X1的卷积核参数W量化之后的误差比其他的卷积核要大一个数量级:

模型压缩系列之sep-net_第1张图片

量化的方式也比较简单,就是参数>0的时候就设置为1,<0的设置为-1.

为了解决网络较大的问题,作者提出了一个新的block:图2(a)是一个pattern residual block,一个float的1x1卷积加上一个二值化的3x3卷积,

可以用1x1的结果来弥补3x3的量化损失。基于这个block网络的module如figure3(f),

相比于其他的网络module,就是在bottlenet的resnet上把3*3改成二值化的3*3再加上1*1,保留了identity mapping的连接。

模型压缩系列之sep-net_第2张图片

最终的网络结构如figure.4所示,除此之外,还跟mobilenet一样对所有的卷积层使用了group conv,N=4,如figure.2所示,

这样使得参数变为原来的1/N,其中conv1-5应该还是float类型的卷积层。

模型压缩系列之sep-net_第3张图片

实验结果:

在cifa10上做了个对比验证,直接把resnet里面的3*3做二值化,其他的不变,可以看到直接二值化之后的结果基本没法看,但是refine之后的结果就还不错,而且看上去网络越深的与原始结果越接近,是否因为网络较深参数较多的情况下其实参数的冗余也是比较多的?

模型压缩系列之sep-net_第4张图片

在imagenet上和googlenet做了对比实验,证明了量化大于1*1的卷积层是效果与原始模型相当的:

模型压缩系列之sep-net_第5张图片

最后和mobilenet、squeezenet做了个对比,分别采用float的SEP-net,加入binary pattern block的sep-net和在此基础上对其他参数做8bit量化的sep-net,

不过目前这些量化或者裁剪的模型结果都比真正的state-of-art差的太多,dpn的top1应该是80%左右,在更高的baseline上来做这个对比实验应该会更有意义。

模型压缩系列之sep-net_第6张图片


你可能感兴趣的:(模型压缩系列之sep-net)