论文解读: Quantized Convolutional Neural Networks for Mobile Devices

本文提出了一种名为Quantized Convolutional Neural Networks(Q-CNN)的方法,旨在加速和压缩CNN模型。通过量化卷积层和全连接层的权重,最小化每层的响应误差,Q-CNN能在保持高准确率的同时实现4-6倍的计算速度提升和15-20倍的模型压缩。作者在ILSVRC-12上进行实验,证明该方法对于分类任务的损失很小,且在华为Mate7手机上实现了快速的图像分类。此外,实验显示Q-CNN可以显著减少计算耗时、存储空间和内存占用,而错误率仅轻微增加。
摘要由CSDN通过智能技术生成
关注SIGAI公众号,获取更多技术文章及资源
PDF全文地址:http://tensorinfinity.com/paper_118.html

论文地址:https://arxiv.org/abs/1512.06473
源码地址:https://github.com/jiaxiang-wu/quantized-cnn

其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

书的购买链接
书的勘误,优化,源代码资源

CNN网络在许多方面发挥着越来越重要的作用,但是CNN模型普遍很大,计算复杂,对硬件的要求很高,这也是限制CNN发展的一个因素。在这篇论文中,作者提出了一个加速和压缩CNN的方法——Quantized CNN,主要思想是对卷积层和全连接层中的权重进行量化,并最小化每层的响应误差。作者也在ILSVRC-12上做了大量的实验,证明对于分类任务在仅损失很小的准确率下,该方法可以达到4-6倍的加速,和15~20倍的压缩。作者也在实际手机设备中进行了实验,对于移动设备(华为Mate7)可以在1s内准确分类图片,其效果如图1所示。红色为原始网络的效果,蓝色为量化后的网络的效果。第一张图是耗时的比较,第二张图是存储空间的比较,第三张图是forward过程占用内存的比较,第四张图是错误率比较。发现该方法确实可以对CNN网络有很好的加速和压缩效果,同时并没有增加很多错误率。
在这里插入图片描述

图1 华为Mate7手机上AlexNet,CNN-S两个网络在量化前后的耗时、存储和准确率

一.简介

目前CNN网络尽管取得了很成功的发展,模型准确率在很多方面都远远高于传统方法,但是其参数个数,和计算复杂度始终是制约其快速发展的一个因素,例如8层的AlexNet就有60M参数,在分类一张图需要729M的浮点操作个数,尽管训练过程可以离线进行,GPU也可以有很好的加速效果,但是对于一般的个人电脑和移动设备,仅仅是测试中的forward过程就已经十分吃力,甚至是无法负担这样巨大的计算需求,再加上移动设备上存储条件的限制,当前很多效果很好的深度学习模型无法在移动端实现。因此网络模型的加速和压缩至关重要。
对于大多的CNN网络,卷积层是最耗时的部分,全连接层则是最占存储空间的部分,由于这两者在CNN网络的复杂度和空间占用上存在本质上的不同,因此大多的工作是针对其一进行的,比如【7,13,32,31,18,17】低秩估计和矩阵分解方法用于加速卷积层,另一方面【3,7,11,30,2,12,28】则针对全连接层研究参数压缩的方法。总体看上述工作都仅仅完成了加速网络,或压缩参数中的一个工作,却没有同时做加速和压缩。
本文提出的方法Quantized CNN(Q-CNN)可以在很小的准确率损失下同时加速和压缩CNN模型。该方法的核心是对参数进行量化(用少部分的参数来表示全体参数),并通过内积运算来估计卷积层和全连接层的输出。为保证准确率,该方法在参数量化过程中最小化每层输出的估计误差。同时为了减少多层量化导致的误差累积,本文采用的策略是每层的优化目标中考虑之前的估计误差。
第二节将先叙述一些基础知识,第三节将详细叙述本文提出的方法,第四节是相关实验部分,作者在MNIST,ILSVRC-12上分别进行了实验,针对AlexNet,CaffeNet,CNN-S,VGG16网络结构进行量化,总体实验结果表明,对每一种网络,Quantized CNN都可以达到4倍的加速,和15倍的压缩,并保证Top-5准确率下降不到1%。最后作者在实际的手机上也进行了实验,证明了该方法的实际效果。

二.基础

## 卷积的本质

在测试部分(也即推理过程中)由于大部分的计算在卷积层部分,而大部分的参数在全连接层部分,因此为了得到最有效率的forward过程,我们可以重点加速卷积层的计算,压缩全连接层的参数。
在CNN网络中,其实卷积操作和全连接操作都是通过矩阵乘法实现的(在视频中有详细介绍,im2col过程),而矩阵的乘法实际就是若干向量内积。那么我们如果将卷积层的输入特征图设为S,输出特征图设为T,且两个特征图的维度分别为
S ∈ R d s × d s × C s , T ∈ R d t × d t × C t S\in \mathbb{R}^{d_{s}\times d_{s}\times C_{s}},T\in \mathbb{R}^{d_{t}\times d_{t}\times C_{t}} SRds×ds×Cs,TRdt×dt×Ct
其中 d s d_s ds, d t d_t dt分别为输入、输出特征图的尺寸(这里以正方形图为例), C s C_s Cs, C t C_t Ct分别为输入、输出特征图的通道数,那么对于输出特征图,在 ρ s \rho _{s} ρs位置,第 c t c_t ct个通道的值(标量)可以通过如下计算表示
T p t ( c t ) = ∑ ρ t , ρ s ⟨ W c t , ρ k , S ρ s ⟩ T_{p_{t}}(c_{t})=\sum_{\rho _{t},\rho _{s}}\left \langle W_{c_{t},\rho _{k}},S_{\rho _{s}} \right \rangle Tpt(ct)=ρt,ρsWct,ρk,Sρs
式中 W c t ∈ R d k × d k × C s W_{c_{t}}\in \mathbb{R}^{d_{k}\times d_{k}\times C_{s}} WctRdk×dk×Cs表示第 C t C_t Ct个filter, d k d_k dk表示卷积kernel size的大小。 ρ k , ρ s ∈ R 2 \rho_{k},\rho _{s}\in \mathbb{R}^{2} ρk,ρsR2分别表示卷积参数和输入特征图的2维空间位置, W c t , ρ k , S ρ s ∈ R C s W_{c_{t},\rho _{k}},S_{\rho _{s}}\in \mathbb{R}^{C_{s}} Wct,ρk,SρsRCs,都是向量, ⟨ W c t , ρ k , S ρ s ⟩ \left \langle W_{c_{t},\rho _{k}},S_{\rho _{s}} \right \rangle Wct,ρk,Sρs则表示两个向量的内积,而卷积结果 T ρ t ( C t ) T_{\rho _{t}}(C_{t}) Tρt(Ct)(标量)实际上是 d k × d k d_k×d_k dk×dk个内积的和。(值得注意的是, ρ s \rho _{s} ρs是在输入特征图上取 d k × d k d_k×d_k dk×dk个位置,在累加过程中和 p k p_k pk变化是相同的,也即这个累加的次数为 d k × d k d_k×d_k dk×dk,具体过程在视频中im2col过程有介绍)
而对于全连接层,没有空间位置(spatial)的维度,因此第c_t个通道的值可以通过如下计算表示
T ( C t ) = ⟨ W C t , S ⟩ T(C_{t})=\left \langle W_{C_{t}},S \right \rangle T(Ct)=WCt,S
其中 S ∈ R C s , T ∈ R C t , W C t ∈ R C s S\in \mathbb{R}^{C_{s}},T\in \mathbb{R}^{C_{t}},W_{C_{t}}\in \mathbb{R}^{C_{s}} SRCs,TRCt,WCtRCs,分别表示输入特征图,输出特征图,参数中第 C t C_t Ct个filter

## 乘积量化

乘积量化在估计最近邻居的搜索中广泛应用,且有很好的效果。其思想是将一个特征空间分解成若干子空间的笛卡儿积(直积),其实很简单的概念,比如二维空间(x,y),拆分成两个子空间(x)和(y)。笛卡尔积的公式如下
A ⊗ B = { ( x , y ) ∣ x ∈ A , y ∈ B } A\otimes B=\left \{ (x,y)\mid x\in A,y\in B \right \} AB={ (x,y)xA,yB}
而乘积量化并不是仅仅拆分成两个子空间,而是拆分成多个子空间,不过定义是一样的。拆分后对每一个子空间,学习一个码书(用于量化该子空间中的所有向量),那么原特征空间中的任一向量都可以用所有子空间码书中的某个向量,做级联表示。
以图2.1所示,上面的向量为原本特征空间下的特征向量,我们将其拆分成m个子特征空间,如下面每行所示,每一行都对应一个子空间。倘若我们对每一个子空间都学习一个码书(可以看作一堆聚类中心向量,并按顺序排列,带有索引,那么我就可以根据索引来直接引用某一个聚类中心向量)那么每一个子空间中的向量(图2.1中的每一行)都可以用码书中的某一个聚类中心来表示,那么我们直接可以用索引来表示原本的向量就可以了(例如第一行的向量对应可以用第一个码书中的第 k 1 k_1 k1个聚类中心表示,di二行的向量可以用第二个码书中的第 k 2 k_2 k2个聚类中心表示,以此类推…,那么原本的向量就可以表示为 k 1 k_1 k1 k 2 k_2 k2 k m k_m km,这样可以减少存储数据占用的空间,当然我们还是需要额外的空间来存储每个子空间中的码书)。
在这里插入图片描述
图2.1 乘积量化的示意图
在本文中,即利用乘积量化来优化内积计算,假设两个向量分别为 x , y ∈ R D x,y\in \mathbb{R}^{D} x,yRD,首先我们将两个向量都分解成M个子向量,表示为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值