超全总结:神经网络加速之量化模型 | 附带代码

量化模型(Quantized Model)是一种模型加速(Model Acceleration)方法的总称,包括二值化网络(Binary Network)、三值化网络(Ternary Network),深度压缩(Deep Compression)等。鉴于网上关于量化模型的不多,而且比较零散,本文将结合 TensorLayer 来讲解各类量化模型,并讨论一下我们过去遇到的各种坑。文章最后会介绍一些关于人工智能芯片的技术。

TensorLayer 是一个基于 TensorFlow 的高级开发工具,提供大量数据处理和建模 API,具备灵活性高、运行速度快等优点。今年 3 月,TensorLayer 提供了一套搭建量化网络的试验版本 API,不过目前这套 API 依然用矩阵乘法而不是加减或 bitcount 运算来加速(我们等会会提到)。

因此,这套 API 并不能加速,关于产品部署,目前可以用 TensorLayer 训练模型,然后用自定义的 C/C++ 实现的二值化计算(TensorLayer 有可能会提供一套额外的专门运行二值化网络的框架,并支持可以从 TensorLayer 那读取模型)。

注意,作为试验版本,这套 API 有可能会被修改。更多关于模型加速的技术,可关注:https://github.com/tensorlayer/tensorlayer/issues/416

Keywords:模型压缩(Model Compression),模型加速(Model Acceleration),二值化网络(Binary Network),量化模型(Quantized Model)

随着神经网络深度增加,网络节点变得越来越多,规模随之变得非常大,这是对移动硬件设备非常不友好的,所以想要在有限资源的硬件设备上布置性能良好的网络,就需要对网络模型进行压缩和加速,其中量化模型由于在硬件上移植会非常方便,在理论上来讲,是非常有发展潜力的。

比较有名气的量化模型有 Deepcompression,Binary-Net,Tenary-Net,Dorefa-Net,下面对这几种量化模型进行介绍。

DeepCompression

SongHan 这篇文章可以说是神经网络压缩领域开山之作,怎么说呢这篇文章很早就注意到了,也复现了,做了很多实验。也一直想用到硬件参数压缩以及模型加速当中,在这个过程中遇到了很多问题,现在提出来跟大家一起探讨。

算法整体框架如图:

02e7ef17bc95efe1243feeafa0b5c0e736d14e53

DeepCompression 主要分为三个主要的部分:剪枝,量化,哈夫曼编码,下面分别探讨这几种方法并且分析他们在硬件前向配置的加速潜力。

剪枝(purning):其实这个思路的核心非常简单,就是当网络收敛到一定程度的时候,作者认为阈值小于一定权重的权重对网络作用很小,那么这些权重就被无情的抛弃了。注意,是抛弃,彻底抛弃,在复现的时候这个地方是一个大坑,被剪掉的权重不会再接收任何梯度。

然后下面的套路简单了,就是很简单的将网络 reload,然后重新训练至收敛。重复这个过程,直到网络参数变成一个高度稀疏的矩阵。这个过程最难受的就是调参了,由于小的参数会不断被剪枝,为了持续增大压缩率,阈值必须不断增大,那么剩下的就看你的调参大法 6 不 6 了。

当初为了解决这个问题还专门设计了一个基于准确率损失和压缩率上升的公式,用于压缩。算是效果还可以,自己调参真的很难受。

猜你喜欢

转载自my.oschina.net/u/3611008/blog/1823853