目前看来,深度神经网络需要为其大规模的参数提供巨大的内存。 诸如AlexNet和VGG-16之类的经典神经网络分别需要大约240 MB和552 MB。 通常依靠权重剪枝或量化、权重矩阵的SVD分解之类的技术,来减少神经网络的文件大小。
“深度压缩”将剪枝,量化和霍夫曼编码结合到一个三级结构中,该结构将AlexNet的大小减少了35倍,将VGG-16的大小减少了49倍。 这使得AlexNet从240 MB减少到6.9 MB,VGG-16从552 MB减少到11.3 MB。
该结构包括三个层次:
剪枝,量化和霍夫曼编码
剪枝
剪枝描述了在深度神经网络中掩盖某些权重的过程。 这需要在神经网络层上实现掩码,以使它们通过y = Wx + b操作进行不同的迭代。 权重剪枝并不是简单地将某些权重设置为0,而是掩盖权重低于某个阈值的情况。 例如,如果权重介于[-0.5,0.5]的区间,则将其屏蔽。
剪枝后,权重以“压缩的稀疏行(Compressed Sparse Row )”格式表示,这样做是为了不浪费稀疏权重矩阵的空间。 下图描述了这种CSR格式:
量化
量化是一种通过权重共享来减少神经网络中每个权重存储位数的技术。 深度神经网络中的权重通常由32位浮点数表示,形式为“ 2.70381”。
在量化中,使用k均值算法来搜索描述网络中权重的聚类。 如果权重用3位表示,则2³= 8个质心用于对权重进行聚类。 然后将每个权重映射到其各自的质心。 例如,“ 2.70381”→“ 2”。 因此,这8个质心构成了“ Codebook”,用于将原始权重映射到相应的3位权重,然后在训练期间对密码本进行微调。
可以通过与经典backprop / SGD类似的机制对Codebook进行微调。 计算每个权重的偏导数,并将它们合并为离散的3位权重。 例如,一系列的“ 2”个3位权重可能具有相应的偏导数更新“ 0.2”,“ 0.1”,“ 0.2”和“ 0.3”。 这些导数经过汇总,将“ 2”优化为“ 2.2”。
此过程描述如下:
霍夫曼编码
霍夫曼编码是一种流行的压缩技术,可以利用偏斜/有偏的值分布。 例如,如果20个权重映射为'2',10个权重映射为'3',而3个权重映射为'8',则将2编码为'00',将3编码为'10,将8可以编码为“ 1110”这类有意义的码。 在这种情况下,使用霍夫曼编码来减少表示量化码本中权重所需的位数。
小结
我觉得比较有趣的问题是,剪枝和权重量化如何在不破坏网络准确性的前提下协同工作。 我希望通过使用分布式同步SGD之类的机制,利用这项技术来缩短元学习算法的周转时间。
希望你觉得本文有用,并找到用于移动和嵌入式系统的深度学习应用程序。
参考https://towardsdatascience.com/deep-compression-7b771b3aa773