重新载入后模型准确率降低_【知识星球】模型压缩和优化板块上线

88b6d7240422a04fb000737993ba5067.png

欢迎大家来到《知识星球》专栏,这里是网络结构1000变小专题,最近星球开始上线模型压缩相关内容。

作者&编辑 | 言有三

1 模型优化与压缩

模型优化与压缩涉及到紧凑模型的设计,量化与剪枝以及相关的工业界使用技巧共3个大方向。最近会集中上线一些内容,已有内容欢迎大家预览。

Deep Compression

b3a9bd5c0ad183efb07f4356a9f5b17d.png

Deep Compression是一个模型量化和压缩框架,

包含剪枝(pruning), 量化(trained quantization)和编码(Huffman coding)三个步骤。

Deep Compression综合应用了剪枝、量化、编码三个步骤来进行模型压缩,是2016 ICLR最佳论文。在不影响精度的前提下,把500M的VGG压缩到了11M,使得深度卷积网络移植到移动设备上成为可能。

如上所示,包括三个步骤:

(1) 网络剪枝

即移除不重要的连接,包括3个步骤,分别是普通网络训练,删除权重小于一定阈值的连接得到稀疏网络,对稀疏网络再训练,这是一个反复迭代的过程。这一步对于AlexNet和VGG-16模型,分别将参数降低为原来的1/9和1/13。

(2) 权重量化

权值量化是把网络的连接权值从高精度转化成低精度的操作过程,例如将32位浮点数float32转化成8位定点数int8或二值化为1bit,转换后的模型准确率等指标与原来相近,但模型大小变小,运行速度加快。一般操作是先训练模型,再进行量化,测试时使用量化后的模型。

如下图,这是一个4×4的权值矩阵,量化权重为4阶,即2bit,分别对应浮点数-1.0,0,1.5,2.0。

a9829525fd3171daf1fdfe43b0996914.png

对weights矩阵采用cluster index进行存储后,原来需要16个32bit float,现在只需要4个32bit float,与16个2bit uint,参数量为原来的(16×2+4×32)/(16×32)=0.31。

这就完成了存储,那如何对量化值进行更新呢?事实上,文中仅对码字进行更新,也就是量化后的2bit的权重。

将索引相同的地方梯度求和乘以学习率,叠加到码字,这就是不断求取weights矩阵的聚类中心。原来有成千上万个不同浮点数的weights矩阵,经过一个有效的聚类后,每一个值都用其聚类中心进行替代,作者的研究表明这样并不会降低网络的效果。而聚类的迭代过程,通过BP的反向传播完成。

(3) 霍夫曼编码

霍夫曼编码是一种成熟的编码技巧,与CNN无关,它有效地利用了权重的有偏分布,可以进一步减少需要存储的参数体积。

性能如何呢?下表展示了LeNet,AlexNet,VGG的结果。

e5e485294cdadf992a961ac65c53e881.png

d76d8750ff2c9d6e2b79a60a4a9f9c6d.png

可知道在不降低精度的前提下,LeNet-5,AlexNet,VGG的压缩倍率分别达到了40,35,49。在卷积层和全连接层的量化阶数分别为8/5,8/4的配置下,模型性能几乎无损,验证了这是一种非常优异的模型压缩技巧。

[1] Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding[J]. arXiv preprint arXiv:1510.00149, 2015.

DeepRebirth

432d24ef3ad3cac144b65ea19fa76d81.png

在深度学习模型中有许多的非tensor网络层虽然参数很少,但是有较大的计算量,因此模型在最终部署到移动端时经常合并这些网络层从而进一步提高推理速度。

模型压缩有许多的方法,比如使用小卷积,多尺度,去除全连接层,瓶颈结构等思路设计紧凑的网络,也有对权重进行量化剪枝等方法,而DeepRebirth则采用了另外一种思路,即将Non-tensor layer(包括pooling、BN、LRN、ReLU等)合并到tensor层中,因为它们虽然参数不多,但是有很大的计算量,下面首先看看经典网络中这些层的计算时间比例:

d65c19eb7916b43aee10f9d9281bf0b7.png

f2a7c77181725465a1b41943d6856302.png

可以看出这些非卷积层占据了很大比例的计算时间,在Intel x86上甚至能占到一半,如果能够将其去除将大幅度的提升模型的运算速度。

作者提出了两种思路,分别是StreamLine Merging和Branch Merging。

StreamLine Merging是一种串行的合并方式,如下:

00ea07d9b936328fb4d4245a5141eafc.png

通常来说,就是将Pooling、LRN,BN等网络层与相邻近的Conv层进行合并,上图的案例中经过合并后从153.8ms直接降低到了16.6ms。这里卷积本身的计算时间也大大降低,是因为pool2融合进了conv,使其步长从1变为2。

现今更为常见的情况是将BN,Scale等网络层和相邻的Conv层合并,也能降低不少计算量。

Branch Merging是一个分支的合并方式,如下:

8a0c0f3da01b3495858be3aed962db1b.png

如上图,将1*1卷积层以及Pooling层分支分别合并到和它并行的3*3卷积和5*5卷积分支中。另外考虑到3*3卷积和5*5卷积分支输出通道增加会增大参数量和运算量,因此调整这些分支的输入通道进行压缩。

在进行以上的合并后,模型的性能通常会降低,所以需要重新训练,作者采用的方式是合并得到的新层使用标准的初始化方式,将其他层的参数固定不变,然后将新层的学习率设置为其他层的10倍后进行finetuning。

那么实验效果如何呢?以GoogLeNet为基准模型的实验结果如下:

656a878cd50405d2f127432da085d75d.png

07757edd7992a8f08358050edb5e8524.png

上表展示了对不同的网络层使用以上合并策略,可以发现各种网络层的速度都有很大提升,在精度只降低0.4%的时候,能有超过3倍的速度提升。

这是非常实用且强大的一个提升模型运行速度的方法,在实际进行模型部署时,常常会对BN等网络层进行合并。

[1] Li D, Wang X, Kong D. Deeprebirth: Accelerating deep neural network execution on mobile devices[C]//Thirty-Second AAAI Conference on Artificial Intelligence. 2018.

更多可见。

1a8833658ac5f79d0b6f404678913b77.png

7a8e7781946d17db1d2750f8388dcdef.png

2 如何掌握网络结构设计和数据使用

关于如何系统性学习网络结构设计和数据使用,可以阅读我们对星球生态的介绍,有三风格的干货,相信你不会失望。

如何系统性掌握深度学习模型设计和优化

如何系统性掌握深度学习中的数据使用

有三AI知识星球的内容非常多,大家可以预览一些内容如下。

d1ee4df6f0a8e2360715eb025349c574.png

9501cd8922b6cdc488c2403f76a0e46d.png

c64829e457d6f5032136648ee66c31b3.png

a9f69b0812b5d0e1e1deedd8fee12110.png

9638ded1b310abd949b74788fcbbef5a.png

355348ffab53e09ea02e26147cda6f67.png

54c5d6c1cb8bd6248f92f0fd8240dcae.png

28b1cc443181e720c9d16b2b6fca3163.png

67c2a3c2fa017bfbbb1d46cc2752820e.png
以上所有内容
加入有三AI知识星球即可获取
来日方长
点击加入
不见不散
更多精彩
每日更新

48aa3663a2fea590297fea5f463e98e1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值