背景
人工智能在诸多领域都取得了突破性进展,例如计算机视觉,nlp等。但是,各种机器学习模型存在一个很致命的问题:神经网络巨大的计算量+访存量,这对性能提出了较高的要求(能耗、延时、访存等)。一种可行的解决方案:充分利用机器学习模型中的稀疏性。所谓的稀疏性是指在计算中不必要,没用的计算。通过减少计算量,就可以保证降低不必要的存储和计算,提升机器学习模型部署时的性能。
稀疏性的分布
根据稀疏性的来源,我们可以基本分为以下几类。
- 科学计算和传统的机器学习
- 神经网络:神经网络(CNN,DNN)中存在大量的不需要计算的数据。例如大量的非零权重,dropout,一些典型模型构建和操作(如Relu,dropout)等操作将大量零值引入到activation中。为了解决这些不必要的计算,一些主流神经网络压缩技术(如稀疏化和量化)通过对神经网络模型参数的稀疏化来压缩模型大小。稀疏化就是跳过不必要的计算,包含剪枝。量化是指将需要浮点数表示的小数用int或者二值来表示。一般稀疏性分为权重和activation两种。
- 输入数据
CNNs
用于图像(自动驾驶)。CNN的特征是包括大量的全连接层(FC)和卷积层(Conv),前面的层提取低纬的信息(图像中物体的边缘),后面的层提取高维的信息(分类)。CNNs的稀疏性主要来源于
- 激活函数:例如relu会引入大量的中间变量的稀疏性。
- Dropout:这个是为了解决过拟合的问题。目前有target dropout和weight dropout等,这些会一如fc和conv的稀疏性。
- 参数的稀疏性:一般会利用一些剪枝的算法。根据剪枝出来的粒度可以分为
Structured sparsity / unstructured sparsity
结构化稀疏就是指我们需要剪掉的计算的分布是有一定规律的,这种对硬件更加友好,但是在影响模型的精度方面是有很大的负面影响的;非结构化稀疏是指我们需要剪掉的计算的分布没有什么规律,因此我们可以剪掉完全的0值,这样对精度的影响很小,但是这种会对硬件的加速非常不友好。
结构化稀疏根据粒度可以分为下面的几个方面:
- vector-level:它相对于细粒度更大,属于对卷积核内部的剪枝,例如剪掉一行或者一列。
- kernel-level:即去除某个卷积核的