赞
踩
本次阅读的论文是斯坦福大学韩松的博士论文《DEEP COMPRESSION: COMPRESSING DEEP NEURAL
NETWORKS WITH PRUNING, TRAINED QUANTIZATION
AND HUFFMAN CODING》
近年来,神经网络在人们实际生活中取得了巨大成功,但是,神经网络这类算法存在着一个鲜明的特点,它是一种计算密集型和存储密集型的算法,这就导致神经网络很难在嵌入式设备上部署,本文就旨在解决这一个限制。
作者在文章中提出了一种叫做“Deep Compression"的方法,主要分为三个步骤:pruning, trained quantization and Huffman coding。剪枝(pruning)就是将权重中一些相对不重要的参数剪去(设为0),量化(trained quantization)则是用低比特的数据表示高比特的数据,Huffman coding则是一种常见的数据无损的压缩算法。
通过Deep Compression, 在ImageNet数据集上, 作者将AlexNet模型的存储所需空间缩小了35倍(240MB->6.9MB),并且没有精度损失,同样,将VGG-16模型所占用的存储空间缩小了49倍(552MB->11.3MB),同样也没有精度上的损失。
近年来,深度神经网络已经成为了计算机视觉领域十分有力的一个工具,但是,这些强大的深度神经网络都有相当数量的参数,对存储空间和存储带宽提出了很高的要求。
文章针对这种情况,主要实现以下目标:
1、解决存储空间占用过大的问题
2、解决功耗过高的问题
于是,作者提出了deep compression的方法,将模型的大小压缩至原来的数十倍,使得模型参数能完全放在SRAM内,免去了对DRAM的访问,大大降低了功耗,最终实现了很高的加速比和功率效率。
剪枝是一种能有效压缩模型大小和防止过拟合的方法,所谓剪枝,就是剪去一些不重要的连接:设置某个阈值,低于每个阈值的权重都被永久置为0,不再参与今后的计算。每次剪枝之后,我们还可以对模型进行retrain,微调权重,这样不断迭代,直至结果满意为止。
在本文中,我们通过剪枝将AlexNet模型的大小缩减了9倍,将VGG-16的模型大小缩减了13倍。
剪枝之后,模型中绝大多数参数都会被置为0,因此,剪枝之后的权重矩阵是一个稀疏矩阵,针对稀疏矩阵的存储方式有很多,例如CSR、CSC等,本文作者采用CSR来存储稀疏化后的权重。
如上图所示,AA数组存储的是稀疏矩阵中非零元素的值,JA数组存储A中每一行第一个非零元素在AA中的索引,JA中最后一个元素为非零元素个数+1,而IC数组存储的是AA中对应元素的列号,若设A中非零元素有a个,A矩阵有n行,那么采用CSR存储只需要2a+n+1个数据即可。
那么如果有乘法A*v,则操作如下:
for(i=1;i<=n;i++){
y0=0;
for(k=JA[i];k<JA[i+1];k++)
y0+=AA[k]*v[IC[k]];
y[i]=y0;
}
量化即用低比特的权重来代替高比特的权重,权重共享则是指让多个权重共享一个值。本文在剪枝之后,即对模型进行量化和权值共享,并且重新训练微调模型。
如图,是我们进行量化和权值共享的示意图,在上图中,输入神经元为4个,权重矩阵为4x4,我们将这16个权重分为4组,每组的颜色相同,并且它们共享同一个值,这些共享的值则没有必要使用32bit来表示,因为他们可能的取值很少,因此可以用低bit来表示这些共享的全值。下方的矩阵则是梯度矩阵,按照权重矩阵的分组对梯度矩阵分组,相同组内的梯度值相加,乘以学习率后对相应的共享权值进行更新。
在本文中,作者对剪枝后的AlexNet模型进行了量化,将卷积层权重量化为8bit,全连接层权重量化为5bit。
为了计算这种方法的压缩率,作者假定权重有k个组,组的索引则需要
l
o
g
2
(
k
)
log_2(k)
log2(k)bit,整个权重矩阵共有n个权重,每个权重用b比特表示,那么压缩率为
r
=
n
b
n
l
o
g
2
(
k
)
+
k
b
r=\dfrac{nb}{nlog_2(k)+kb}
r=nlog2(k)+kbnb
作者在本文中采用k-means聚类算法进行权值的共享,设有n个权重,目标是分为k组,那么每组中所有的权重都共享一个权值。
在进行k均值聚类时,初始的k个聚类中心的选取对聚类结果有较大影响,本文介绍了三种初始化聚类中心的方法:
在数据集中随机选取k个点作为k个聚类中心。
基于密度进行选取。
在[xmin,xmax]区间内等距离的选取k个点作为聚类中心。
略
作者一共剪枝、量化、哈夫曼编码了4个神经网络,两个基于MNIST,两个基于ImageNet。
LeNet-300-100是一个全连接神经网络,共有两个隐藏层,分别有300和100个神经元,而LeNet-5则是一个卷积神经网络,有两个卷积层和两个全连接层,他们在MNIST的错误率分别为1.6%和0.8%。
下表是四个神经网络的实验结果
下面两个表是两个Lenet的压缩情况
下表是AlexNet的实验结果,压缩前后模型精度基本无损失。
下表是VGG-16的实验结果。
作者通过实验发现,剪枝和量化一起使用的效果要好于剪枝或量化单独使用时的效果。
下图是不同压缩方法下模型准确率和压缩率的关系,可以看到,剪枝和量化一起使用时的效果是最佳的。
下图则是量化前是否进行剪枝对最终量化结果的影响。
作者比较了三种聚类中心初始化方法对模型最终结果的影响,如下图
可以看到,uniform init优于其余两种方法。
作者指出,deep compression主要用于对延迟比较敏感的场合,需要设备作出实时的反应,因此,batchsize不等于1是不符合实际应用场景的,下面讨论batchsize=1下的情况。
我们知道,在卷积神经网络中,FC层占据了整个网络超过90%的权重参数,因而本文的模型压缩方法主要还是对FC层起作用,为了比较Deep Compression前后的差别,我们把主要目光聚焦在全连接层,作者在三个平台上进行了实验,分别是
1.NVIDIA GeForce GTX Titan X as desktop processor
2.Intel Core i7 5930K as desktop processor
3.NVIDIA Tegra K1 as mobile processor
下图显示了不同平台上剪枝后模型的Speeding up
下图显示了不同平台上剪枝前后的Energy Efficiency
此外,作者还讨论了是否进行Batch Process的不同,如果进行Batch,那么每次读入一个矩阵,并和权重矩阵相乘,访存为
O
(
n
2
)
O(n^2)
O(n2),计算为
O
(
n
3
)
O(n^3)
O(n3),则存储-计算比为
O
(
1
/
n
)
O(1/n)
O(1/n),而如果不进行Batch,那么每次读入的是一个向量,和权重矩阵相乘,类似的可以得到存储-计算比为O(1),由此可见,不进行Batch时存储-计算比较低,
S
o
r
e
d
u
c
i
n
g
t
h
e
m
e
m
o
r
y
f
o
o
t
p
r
i
n
t
i
s
c
r
i
t
i
c
a
l
f
o
r
t
h
e
n
o
n
−
b
a
t
c
h
i
n
g
c
a
s
e
.
\color{#FF0000}{So~ reducing ~the ~memory ~footprint ~is ~critical~ for~ the ~non-batching~ case.}
So reducing the memory footprint is critical for the non−batching case.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。