一个深度学习模型通常包含数以百万计甚至千万计的参数和十几层甚至几十层的网络,通常需要非常大的计算代价和存储空间。神经网络压缩是指通过改变网络结构或利用量化、近似的方法来减少网络的参数或存储空间, 在不影响神经网络性能的情况下,降低网络计算代价和存储空间。
简介神经网络压缩简单来说通过有关方法来减少网络的参数和存储空间,在神经网络性能影响不大的情况下。神经网络压缩大体上可以分为近似,量化和裁剪三类方法。近似类方法主要利用矩阵或张量分解的思想,通过少量参数重构原始网络参数矩阵或参数张量,以达到减少网络存储开销的目的。通常,在网络运行时,这些参数将会被适当重建,网络的运行时开销并没有得到有效减少。第二类方法是量化方法,量化方法的主要思想是将网络参数的可能值从实数域映射到有限数集,或将网络参数用更少的比特数来表示。量化的方法将原本具有无限种可能的参数约束到少数几种参数中,再对这些参数进行重用,就可以减少网络存储开销。通过改变参数的数据类型,如将原本的64位浮点型量化为整形甚至布尔型,网络的运行时开销也将得到大幅度减少。第三类方法是网络裁剪的方法,与前两种方法相比,网络裁剪的主要特点是会直接改变网络的结构。网络裁剪可以按粒度分为层级裁剪,神经元级裁剪和神经连接级裁剪。层级裁剪的裁减对象是网络层,裁剪的结果是获得更浅的网络。
需求神经网络压缩不但具有必要性,也具有可能性。首先,尽管神经网络通常是深度越深,效果越好,但针对具体的应用场景和需求,适当深度和参数数目的网络即能够满足。盲目加深网络复杂度所带来的微弱性能提升在许多应用场合意义并不大。其次,神经网络常常存在过参数化的问题,网络神经元的功能具有较大的重复性,即使在网络性能敏感的场景,大部分网络也可以被“安全地”压缩而不影响其性能。神经网络压缩可以有助于理解神经元作用机理和使神经网络模型部署在轻量级的设备上。
深度神经网络尽管在计算机视觉、语音识别、机器人技术等多个领域都取得了良好成果。深度学习的实际应用往往受限于其存储和运算规模。例如,VGG-16网络含有约1.4亿浮点数参数,假设每个参数存储为32位浮点数格式,则整个网络需要占用超过500兆存储空间。这样的计算量在只能通过高性能并行设备进行,且仍不具备很好的实时性。高性能并行计算设备具有体积大、能耗大、价格高的特点,在许多场合都不能使用。因此,如何在资源受限场合,如手机、平板电脑、各种嵌入式和便携式设备上运行神经网络,是深度学习走向日常生活的关键一步,也是学界和工业界研究的热点问题之一。
方法基于张量分解的网络压缩
张量是向量和矩阵的自然推广,向量可称为一阶张量,矩阵可称为二阶张量,将矩阵堆叠形成“立方体”,这种数据结构则称为三阶张量。一张灰度图像在计算机中由矩阵表示,是二阶张量。一张RGB三通道的彩色图像在计算机中则保存为三阶张量。当然,三阶张量也可以堆叠形成更高阶的张量。张量分解是张量分析中的重要组成部分,其基本原理是利用张量数据中的结构信息,将张量分解为形式更简单、存储规模更小的若干张量的组合。典型的张量分解方法有CP分解,Tucker分解等。在神经网络中,参数通常以“张量”的形式集中保存。对全连接层而言,全连接通过权重矩阵将输入向量变换到输出向量,其参数为二阶张量。对卷积层而言,设输入数据为具有?通道的三阶张量。则卷积层中的每一个卷积核也都是具有?通道的三阶卷积核,故一层卷积层所包含的一组卷积核构成了形如? × ? ×?×?的四阶张量。基于张量分解的网络压缩的基本思想,就是利用张量分解的技术将网络的参数重新表达为小张量的组合。重新表达后的张量组一般能够在一定的精度下近似与原张量相同,而所占用的空间又得到大大降低,从而获得网络压缩的效果。
基于量化的网络压缩
第二类网络压缩的方法是基于量化的方法。这里的量化主要包含两层含义,第一是用低精度参数代替高精度参数,对参数进行精度截取,其本质是均匀量化。第二是进行权重共享,限制网络权重可取的种类。有限的权重种类可以随后进行进一步编码,这种量化的手段本质是非均匀量化。降低权重精度的一种极限情况,在该文献中,卷积网络的权重被二值化为+1与-1,网络的运算速度得到大幅度提升,存储消耗大幅度降低,且二值化网络有潜在的利用硬件逻辑运算实现的可能性。值共享的量化将网络权重的取值从全体实数集映射到有限数集的过程1。
基于裁剪的网络压缩
基于张量分解和量化的网络压缩方法,其着眼点都是网络的参数。在网络压缩的过程中网络的拓扑结构保持不变。在基于裁剪的网络压缩中,网络的拓扑结构和数据的推断方法都可能发生改变。基于裁剪的网络压缩将直接改变网络的结构,其本质是将网络中的冗余部分剔除。
依据裁剪对象的不同,网络裁剪可以分为层级裁剪,神经元级裁剪,神经连接级裁剪等多个粒度。层级裁剪的裁剪对象是整个网络层,主要适合于网络层数较多的模型,裁剪的结果是神经网络变得更“浅”, 去除深度残差网络的若干模块,实际上就是一种层级裁剪。神经元级裁剪的裁剪对象是单个神经元或滤波器,裁剪的结果是神经网络变得更“瘦”。神经连接级裁剪的目标是单个神经网络连接权,裁剪的结果是使得神经网络更“稀疏”。一旦一个神经元被裁剪,则与它相连的所有连接权都被剪断。所以神经元裁剪实际上是神经连接裁剪的一种特殊情况。
层级裁剪由于粒度较粗糙,对层内特征表达影响很大,研究相对较少。神经连接级裁剪是研究较多的网络压缩方法之一,相对而言具有更精细的裁剪粒度。但它具有的副作用是,稀疏的神经连接的保存需要使用稀疏张量的存储和运算方法。稀疏张量的存储需要保存数据点位置的额外存储开销,其实际节约的存储空间小于裁减掉的参数数目。稀疏张量的计算需要用特殊的计算方法,不利于并行计算。我们称神经连接级的裁剪破坏了网络的“正规性”。
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所