机器学习模型在现实世界中会运用在一些资源有限制的设备上,若模型过于庞大,会导致设备没有足够空间存储模型,运算会比较耗时。因此神经网络压缩的办法可以为模型在这些设备上的使用提供可能。
一 Network Pruning
神经网络模型通常具有非常多的参数,但是并不是没有一个参数都对模型起到作用,神经网络剪枝的基本思想是将没用的参数去掉。去除参数的方法有两种,一种是依据权重的重要性,另一种是依据神经元的重要性。
依据权重的重要性进行剪枝,会导致神经网络架构不规则,以致于难以实现算法。一种做法是将需要剪枝的权重置为0,然而这种做法并没有实际上减小模型的参数,因此并没有实现模型的加速。
依据神经元的重要性进行剪枝,通过将没有用的神经元去掉,从而达到缩小神经网络模型规模的目的,克服了剪枝后神经网络架构不规则以及难以加速的问题。
神经网络模型的大小会影响模型训练的容易程度。一般大模型比起小模型更容易进行训练。Lottery Ticket Hypothesis为剪枝后的神经网络模型仍起作用提供了一种解释,这个假说是指对于一个大的神经网络是由许多的子神经网络组成的,每个子神经网络能否训练成功都具有一定的概率,只要有一个子神经网络能够训练成功,那么整个神经网络就能够训练成功。比起一个随机初始化的神经网络,剪枝后的神经网络的参数是根据原来模型进行初始化,相当于通过剪枝的神经网络是取自子神经网络,因此剪枝后的神经网络能够被训练起来。
二 Knowledge Distillation
知识蒸馏的基本思想是将大的神经网络看作是老师,小的神经网络看作是学生,对于相同的输入,小的神经网络去学习大的神经网络的输出,使二者的输出尽可能的越接近越好。
为了避免学生直接学习到老师的正确答案,需要将老师的神经网络输出的概率尽可能的分散。一种做法是修正softmax函数,对于原来的softmax函数的每一项都处以一个T,从而尽可能的分散概率。
三 Parameter Quatization
Parameter Quatization的基本思想是用更少的比特去表示参数。一种做法是weight clustering,将神经网络的参数根据大小划分成不同的cluster,用cluster中的每一个参数的平均值代表这个cluster。另一种是Binary Weights,只使用正负一来表示参数。
四 Architecture Design
另一种压缩神经网络的方式是通过架构的设计来减少参数,其中较为典型的就是Depthwise Separable Convolution。Depthwise Separable Convolution分为两部分,分别是Depthwise Convolution和Pointwise Convolution。前者根据input的channel的数目来决定filter的数目,每一个filter只负责一个channel,最终得到了和input的channel数目相同的output,但是这种情况每一个channel间没有联系,有一些pattern需要通过channel间的互动才能够被发现。因此在这基础上,还需要做Pointwise convolution,这种做法是将每一个filter的kernel设置为1x1,filter的channel数置为input的channel数,这样确保了不同channel间的联系。
这里对Depthwise Separable Convolution的压缩效率进行分析。假设输入的channel的数目是I,输出的channel数目是O,kernel size是kxk。对于传统的CNN,参数的个数是kxkxIxO;对于Depthwise Separable Convolution,参数的个数是kxkxI+IxO,后者参数的个数比上前者的参数个数为1/O+1/(kxk),可以看出这种做法明显的减少了神经网络使用的参数的数目。
至于为什么这种做法能够减少参数的数量,一种解释是Depthwise Separable Convolution相当于在两层神经网络间再添加了一层神经元,并且添加的层的神经元数目要远小于输入和输出。
五 Dynamic Computation
当同一个模型运用在不同的设备上或者是运用在同一个设备不同状态下时,由于资源的限制,模型的运行效率会不一样,我们希望根据设备的状态能够动态的调整模型。
一种做法是对模型的深度进行动态的调整。当输入经过每一层都能够输出结果。当资源充足的情况下,模型可以跑完所有层,当资源不够时,模型只需要跑完部分层即可。可以这么做的一个理由是有些输入不需要跑完所有层就可以得到正确的答案。
另一种做法是对模型的宽度进行调整,通过调整每一层神经元的数目对输入进行动态的计算。
这种做法的一个问题是,对于某些输入,动态地调整深度和宽度可能不奏效。因为这些输入必须要跑完整个模型才能够得到正确答案。