三张图看懂深度学习模型加速及压缩,三张图看懂深度学习模型加速及压缩
三张图看懂深度学习模型加速及压缩,三张图看懂深度学习模型加速及压缩训练期间与训练后的压缩 模型压缩有很多出发点:模型占用更少的磁盘空间,减少推理期间占用的内存,或使其计算更快。直观地说,上面这些模型的压缩优点是相互交织的:模型做得更小,通常也会更快。模型太慢 大模型效果很大,但是很难投入实际使用。预训练模型在使用之前需要进行微调,大量的参数会占用大量的GPU资源,同时在实际使用时,大模型需要更多的存储空间以及运行内存。尽管BERT等模型效果很好,但是你能想象如果一个对话机器人一秒钟只能处理一条信息会是什么场景吗。因此模型的加速和压缩很有必要。模型压缩概述
本文主要探讨如何让像 BERT 这样的深度学习模型 更小更快 ,主要内容如下:
- 为什么需要模型压缩
- 如何进行模型压缩以及解释为何模型加速要难于参数的压缩
- 在使用TensorFlow Lite quantization 方法对BERT进行模型压缩
模型压缩的动机
模型太大
现在在自然语言处理和计算机视觉中都使用了巨大的网络结构,以语言处理模型为例:BERT XLNet 以及 ERNIE 2.0是当前效果最好的预训练模型,这些模型都有亿万的参数量。
模型太慢
大模型效果很大,但是很难投入实际使用。预训练模型在使用之前需要进行微调,大量的参数会占用大量的GPU资源,同时在实际使用时,大模型需要更多的存储空间以及运行内存。尽管BERT等模型效果很好,但是你能想象如果一个对话机器人一秒钟只能处理一条信息会是什么场景吗。因此模型的加速和压缩很有必要。
模型压缩概述
模型压缩有很多出发点:模型占用更少的磁盘空间,减少推理期间占用的内存,或使其计算更快。直观地说,上面这些模型的压缩优点是相互交织的:模型做得更小,通常也会更快。
训练期间与训练后的压缩
模型压缩意味着参数或精度的减小。模型压缩可以在模型训练时进行也可以在模型训练好之后进行。您可以选择:后期训练可以更快,通常不需要训练数据,而训练期间压缩可以保持更高的准确性并导致更高的压缩率。下面会仔细阐述几类模型压缩的方法。
模型量化
模型量化示意
理论解释
量化意味着降低模型权重的数值精度。一种有效的方法是k均值量化:给定模型的浮点数权重矩阵W,将它们全部分组为N个簇。然后,我们将W转换为来自[1..N]的整数值矩阵,每个矩阵都是指向N个簇中心之一的指针。这样,我们将矩阵的每个元素从32位浮点数压缩到仅log(N)位整数。计算机体系结构通常只允许降至8位或1位。1位的情况就是二值化网络 - 使权重参数仅包含0或1,因此可能会大大降低模型的精度。
实际应用
值得注意的是,像k-means量化这样的方法并不能减少内存占用或加速摩西。因为模型在推理前,必须对每个权重矩阵重建,即再次用32位浮点数(聚类中心)填充。TensorFlow Lite工具包中实现了一种简单的方法 通过应用简单的“中心 - 比例”变换将32位浮点矩阵转换为8位整数:W_8 = W_{32} / scale shift(每个权重矩阵单独确定比例和移位)。这样,8位W用于矩阵乘法,然后仅通过反向应用“中心 - 缩放”操作来校正结果。
在训练期间量化模型
除了上述所说的在模型训练好后进行量化,还可以在模型训练时就进行量化操作。训练流程如下所示:对于每个训练步骤
- 量化权重
- 计算量化网络中的损失函数
- 计算相对于未量化权重的损失梯度
- 更新未量化的权重
在训练之后,使用量化好的模型进行预测。
模型剪枝
模型剪枝示意图
去除权重连接
剪枝会删除模型的某些部分,使其更小更快。简单的权重剪枝使用权重的大小作为连接重要性的度量,通过将权重矩阵的相应权值设置为0来删除连接。因此不会使权重矩阵变小或加快计算速度。要实际节省存储空间或内存空间,应使用稀疏矩阵格式来存储权重矩阵。模型加速度取决于稀疏矩阵乘法的特定实现。TensorFlow中的稀疏乘法并不比正常(密集)乘法快很多,OpenAI提供了GPU上实现更快的稀疏乘法。TensorFlow的模型优化工具目前提供了对Keras模型权重剪枝的工具。
去除神经元
与权重剪枝相比,神经元剪枝去除了整个神经元,意味着删除权重矩阵中的某列(或行)。神经元激活和误差梯度,通常用来作为神经元重要性的衡量标准。与权重剪枝不同,神经元去除剪枝能够加速模型的计算同时节省模型的存储。
去除权重矩阵
最近有工作, 从transformer-based 大型模型中删除了整个attentional heads,并且精度损失较小。这种简单的方法看起来很有吸引力。然而,去除整个权重矩阵忽略了单个神经元的重要性。另一方面,较高的压缩率并不能保证更快的运行速度:神经元剪枝会导致不同大小的权重矩阵,使得矩阵乘法更难以有效地并行化。
知识蒸馏
知识蒸馏示意图
从大型模型中学习较小的模型
知识蒸馏不是模型压缩技术,但它能够达到相同的目标和效果。在训练了一个大而慢的模型(教师)之后,训练一个较小的模型(学生)来模仿教师的行为,包括输出以及内部特征的表示。不管是CNN还是LSTM,都可以通过蒸馏实现速度和尺寸的改进。通常建议学生的网络结构应该比教师更深更薄,不同网络结构之间也可以进行知识的转移,甚至还可以使用BERT教一名Bi-LSTM小学生。
知识蒸馏与其他方法结合
更好地理解大型网络可以更好的让知识向学生模型传播:知道了BERT模型不同部分的表现,可以更好地设计学生网络,或让其学习教师模型最重要的内部表征。从这个意义来看,量化和剪枝有助于查看教师模型那部分是最重要的。
下一篇,将介绍如何使用量化算法压缩BERT模型,欢迎关注 AI新视野!