这篇博客会记录我通过各渠道学习到的模型压缩方法。后续会通过小项目实战的方式进一步理解模型压缩方法的具体实现。
模型压缩技术意在保持大型模型能力的同时,降低其计算与存储开销,以解决参数规模庞大、硬件资源需求高等问题。其核心目标是在尽可能减少模型性能损失的前提下,大幅降低存储占用和计算复杂度(减少浮点运算次数 Flops),从而提升推理速度。此外,模型压缩还涉及优化网络结构,使其更高效地适配 GPU、NPU 等硬件,加快计算过程,提高资源利用率,并降低能耗。
主要的几种模型压缩技术概述如下:
方法 | 原理 | 适用任务 | 优势 | 缺点 |
---|---|---|---|---|
量化 | 用低比特表示权重 (如 FP16, INT8) | CNN, NLP | 加速推理, 降低存储 | 可能降低精度 |
剪枝 | 移除不重要的权重/神经元 | CNN, Transformer | 保持精度, 计算量减少 | 可能需要重新训练 |
知识蒸馏 | 让小模型学习大模型的能力 | CNN, NLP | 适合部署, 训练高效 | 训练复杂度高 |
二值化 | 把权重变为 0/1 | 轻量级 AI | 极端压缩, 推理快 | 精度损失大 |
低秩分解 | 用矩阵分解减少计算量 | NLP, CNN | 降低计算量, 保持精度 | 适合大模型 |
可分离卷积 | 分解卷积核计算 | CNN | 轻量级, 适合端侧 AI | 仅适用于 CNN |
副网络剪枝 | 通过副网络预测剪枝策略 | 任何模型 | 剪枝效果更精准 | 计算复杂 |
NAS (网络架构搜索) | 自动寻找最优神经网络结构 | 任何 AI 任务 | 发现最优架构 | 计算量大 |
矩阵稀疏化 | 让权重变为 0,提高计算效率 | Transformer, CNN | 适合超大规模模型 | 硬件支持有限 |
此篇博文会进一步展开模型压缩的几个重要方法:量化、剪枝、蒸馏和二值化。
一、量化(Quantization)
1. 核心思想
降低模型参数的数值精度(如从32-bit浮点数转换为8-bit整数),以降低存储需求和计算复杂度,从而加速推理并减少能耗。
在深度学习模型中,权重和计算通常采用 32 位浮点数(FP32)存储和处理。然而,浮点运算的计算开销大、存储需求高,尤其是在边缘设备、移动设备、嵌入式系统等资源受限的环境中,使用高精度浮点计算并不高效。
2. 量化的主要优势
研究表明,8 位量化能够在几乎不损失模型精度的情况下,将存储需求减少4 倍,推理速度提升 2-3 倍。例如,Vanhoucke 等人在论文 “Improving the Speed of Neural Networks on CPUs” 中指出,在 CPU 上运行 8-bit 量化神经网络时,计算效率显著提升。
- 减少存储占用:从 FP32 → INT8(减少 4 倍)、INT4(减少 8 倍)、甚至 1-bit(减少 32 倍)。
- 加速推理计算:低精度整数运算比浮点运算更快,适合 GPU、NPU 等专用硬件加速。
- 降低功耗:计算资源减少,能耗降低,提升移动端、嵌入式设备的续航能力。
- 适配硬件并行计算:量化模型可以更好地适配 GPU/NPU 计算单元,提高吞吐量,充分发挥硬件的并行计算能力。
3. 量化的主要方法
3.1 训练后量化(PTQ)
PTQ 是最简单的量化方法,适用于已经训练完成的模型,直接对权重进行量化。它直接将 32-bit 浮点权重量化为 8-bit、4-bit 或 2-bit 以减少存储和计算开销。
主要特点:
- 操作简单:不需要重新训练模型,仅需后处理转换即可。
- 计算资源消耗低:适用于计算资源受限的设备(如手机、IoT 设备)。
- 可能存在精度损失:由于量化时未考虑训练中的动态变化,部分模型的推理精度可能会下降。
实际应用:
- TensorFlow Lite提供 PTQ 工具,可将 FP32 转换为 INT8。
- ONNX Runtime支持多种后训练量化方法,包括动态量化、静态量化等。
缺点:
- 对于某些任务影响较大,如 Transformer、语言模型等,由于 FP32 → INT8 量化后参数范围缩小,可能会影响推理效果。
3.2 量化感知训练(QAT)
QAT 是一种更先进的量化方法,它在模型训练阶段就模拟量化过程,让模型提前适应低精度的表示形式,使得模型在低精度计算环境下仍能保持较高精度。
主要特点:
- 精度保持较好:相比 PTQ,QAT 由于在训练过程中引入了量化模拟,使得模型更容易适应低精度运算。
- 计算资源消耗高:训练过程中会不断进行浮点数到整数的转换,因此训练成本更高。
- 更适合 CNN、Transformer 等复杂模型:QAT 适用于对精度要求较高的场景,如图像分类、目标检测等。
实际应用:
- TensorRT(NVIDIA)支持 INT8 QAT,适用于高性能 AI 加速。
- PyTorch & TensorFlow都提供了 QAT 相关 API。
缺点:
- 训练成本较高:需要重新训练模型,训练过程更为复杂,并增加计算开销。
3.3 量化感知微调(QAF)
QAF 结合了预训练模型的优势和 QAT 量化方法的高效性。它基于预训练模型进行微调,同时引入量化过程,从而在减少计算开销的同时,保持模型的精度。
主要特点:
- 适合迁移学习场景:如 NLP 任务中的 BERT 量化微调。
- 训练成本介于 PTQ 和 QAT 之间:比 PTQ 需要更多的训练资源,但比 QAT 更轻量。
- 适用于模型部署优化:对于已经存在的预训练模型,可以通过 QAF 进行微调,以适应特定任务并实现压缩。
实际应用:
- BERT 量化(TinyBERT, DistilBERT)将大规模语言模型进行量化优化,提升推理速度。
- ResNet 量化微调在 CV 任务中广泛使用,如图像分类、目标检测。
缺点:
- 相对于 QAT,效果可能稍逊:由于 QAF 主要基于微调,可能不如从头进行 QAT 训练的模型鲁棒性强。
量化方法 | 计算资源消耗 | 训练复杂度 | 精度损失 | 适用场景 |
---|---|---|---|---|
训练后量化(PTQ) | 低 | 低(无需修改训练) | 可能较大 | 计算受限设备,离线量化 |
量化感知训练(QAT) | 高 | 高(需修改训练流程) | 精度较好 | 需要高精度的推理任务 |
量化感知微调(QAF) | 中等 | 中等(基于预训练模型) | 适中 | 预训练模型的特定任务优化 |
4. 量化的局限性
- 精度损失:低比特量化(如 2-bit 或 1-bit)可能导致明显的精度下降,尤其是在 NLP 任务和大规模 CV 任务中。
- 模型敏感性:不同模型对量化的敏感度并不相同,有些模型量化后性能依旧出色,有些却会大幅下降。某些模型(如 BERT、GPT)对量化较敏感,可能需要特殊优化策略。
- 训练成本增加:QAT 和 QAF 要修改训练过程,需要额外的计算资源,增加了训练的难度和计算资源需求。
- 硬件支持问题:虽然 GPU、NPU 逐渐支持低精度计算,但仍然有部分设备对 INT8/INT4/1-bit 量化的支持不完善。
二、剪枝(Pruning)
1. 核心思想
分析神经网络的权重重要性,并移除不重要的部分,即对推理影响较小的权重,使模型结构更加稀疏,从而减少计算量。类似于修剪树木,去除不必要的枝叶,使模型更加高效。
在深度学习模型的训练过程中,神经网络往往会学习到大量冗余信息,这些冗余部分对最终推理的贡献较小。因此,可以去掉影响较小的权重或神经元,使模型变得更加紧凑,从而减少计算量、存储需求,并加速推理。
2. 剪枝的优势
Han 等人在论文 “Learning both Weights and Connections for Efficient Neural Networks” 中提出了一种基于权重重要性的剪枝方法,通过分析权重对模型输出的影响,把影响小的权重“剪掉”。证明了在不明显降低模型精度的前提下,剪枝可以大幅减少模型参数数量。
剪枝技术的主要优势包括:
- 减少存储需求:部分实验表明,剪枝后模型的参数量可减少 50% - 80%,大幅降低模型大小。
- 加速推理:结构化剪枝可以优化计算图,使推理速度提升 2-3 倍,适用于 GPU、NPU 等硬件加速。
- 降低能耗:剪枝减少了计算量,使得 AI 模型更适用于 移动端、嵌入式设备 等资源受限的环境。
- 提高泛化能力:剪枝可减少模型的冗余信息,降低过拟合风险,提高模型泛化能力,使模型在 未见数据上表现更好。
3. 剪枝的主要方法
剪枝方法主要分为非结构化剪枝和结构化剪枝:
剪枝类型 | 剪枝方式 | 计算资源消耗 | 硬件加速效果 | 适用场景 |
---|---|---|---|---|
非结构化剪枝 | 移除单个权重或连接 | 低 | 差 | 高压缩率的任务 |
结构化剪枝 | 移除整个神经元、滤波器或层 | 较高 | 优秀 | 需要加速推理的任务 |
3.1 非结构化剪枝
非结构化剪枝指的是随机移除单个权重或连接,使神经网络的权重矩阵变得稀疏。这种方式可以精准去除对模型影响最小的参数,从而实现高压缩率。
主要特点:
- 压缩率高:可减少 50% 以上 的参数量,同时维持较高精度。
- 灵活性强:可以逐个分析神经元权重的重要性,并选择性删除。
- 硬件加速效果较差:由于现代硬件(如 GPU)更适合规整的计算结构,非结构化剪枝后的稀疏矩阵运算可能无法高效加速。
实际应用:
- 神经网络稀疏化(Sparse Neural Networks):适用于研究剪枝后模型的稀疏性对学习能力的影响。
- 压缩大规模模型:如 Transformer、ResNet,减少存储开销。
缺点:
- 对硬件不友好:大多数深度学习加速硬件(如 Tensor Core)更擅长处理规整密集矩阵计算,非结构化剪枝产生的稀疏结构在硬件上很难高效实现,可能难以提高推理速度。
3.2 结构化剪枝
结构化剪枝是按照一定规则移除整个神经元、滤波器、通道或层,确保剪枝后的模型仍然具有规整的计算结构,以提升推理效率。这种方法产生的稀疏结构更适合硬件加速
主要特点:
- 硬件友好:剪枝后的网络仍然是密集计算结构,适用于 GPU、NPU 等加速器。
- 推理速度大幅提升:在 CNN 中,剪枝可以减少不必要的卷积计算,提高执行效率。
- 压缩率适中:相比非结构化剪枝,结构化剪枝的压缩率可能稍低,但它能带来实际的推理加速效果。
主要方法:
- 滤波器剪枝(Filter Pruning):移除 CNN 卷积层中的部分滤波器,减少计算量。
- 通道剪枝(Channel Pruning):移除 CNN 的某些通道(Channels),减少计算需求。
- 层剪枝(Layer Pruning):删除整个神经网络层(Layer),使模型更加紧凑。
实际应用:
- CNN 模型优化:如 MobileNet、ResNet,可以剪枝不重要的卷积滤波器,加速推理。
- Transformer 剪枝:如 BERT 剪枝(去掉冗余注意力头),减少计算复杂度。
缺点:
- 剪枝比例过高可能影响模型性能:需要在压缩率和模型精度之间找到平衡。
- 部分剪枝方法需要重新训练:如渐进式剪枝(Iterative Pruning)通常需要微调,以恢复剪枝后的性能。
4. 剪枝的缺点
虽然剪枝技术可以大幅优化模型,但仍然存在以下挑战:
- 精度损失问题:尤其是剪枝比例较高时,可能导致模型性能下降。
- 训练复杂度增加:部分剪枝方法(如渐进式剪枝)需要重新训练或微调,增加训练的复杂度与计算资源需求。
- 硬件适配问题:虽然结构化剪枝更适合硬件加速,但不同硬件平台对剪枝后模型的支持程度不同,可能需要额外优化。
- 模型剪枝敏感性不同:不同模型对剪枝的敏感度不同,有些模型剪枝后性能依旧稳定,有些则会出现较大波动。部分神经网络(如 CNN)适合剪枝,而 NLP 任务(如 BERT)剪枝后可能影响较大。
三、知识蒸馏(Knowledge Distillation, KD)
1. 核心思想
让一个小型的“学生模型”学习一个大型的“教师模型”的行为,使得学生模型能够接近教师模型的性能,同时显著减少计算资源的消耗。
在自然语言处理领域,研究人员经常会把预训练的BERT模型作为预训练模型,把轻量级的LSTM模型作为学生模型。经过蒸馏训练,学生模型能够学到教师模型的语言表示能力,在文本分类、情感分析等任务中取得不错的成绩。
2. 知识蒸馏的基本流程
知识蒸馏就是把大型的复杂模型(教师模型)的知识迁移到小型的简单模型(学生模型)。教师模型的参数多、结构复杂,能够学习到丰富的特征与模式,但是难以部署在资源受限的设备上。而学生模型通过学习教师模型的输出(如软标签、中间特征等),就能够在更小的参数规模下,尽可能的接近教师模型的性能。
知识蒸馏的训练过程通常包括以下几个关键步骤:
-
训练教师模型:选择一个性能优秀的大型复杂模型(如 ResNet-50, BERT),让它在大规模数据集上进行训练,学习丰富的特征信息。
-
初始化学生模型:然后选择一个较小的网络(如 MobileNet, TinyBERT)作为学生模型,并且进行初始化。学生模型的结构可以不同于教师模型,但应具备一定的学习能力。
-
蒸馏训练:使用教师模型的输出作为额外的监督信息,让学生模型模仿教师模型的预测。训练过程中,优化学生模型的损失函数,使其尽可能接近教师模型的行为。
-
损失函数通常会包括两部分,一部分是学生模型的原始损失,比如说交叉熵损失。另一部分是学生模型输出和教师模型输出之间的差异,经常用KL散度衡量。
-
微调学生模型:在蒸馏完成后,可以对学生模型进行额外微调,进一步提升性能。
其中,温度参数相当于知识蒸馏的“难度调节旋钮”,在高温模式下,可以学习到复杂的关联关系;在低温模式下,答案会接近原始分布,适合简单任务。
当然也可以考虑动态策略,即初期用高温广泛吸收知识,而后期降温再聚焦关键的特征。
3. 知识蒸馏的核心方法
知识蒸馏的方法可以按照不同的知识传递方式进行分类,主要包括:
知识蒸馏方法 | 知识传递方式 | 适用场景 | 计算成本 |
---|---|---|---|
软标签蒸馏(Soft Label Distillation) | 让学生模型学习教师模型的概率分布 | 图像分类、NLP 任务 | 低 |
特征匹配蒸馏(Feature-Based Distillation) | 让学生模型学习教师模型的中间特征 | 目标检测、图像分割 | 中等 |
自蒸馏(Self-Distillation) | 让模型的浅层学习深层信息 | Transformer、CNN 结构优化 | 高 |
3.1 软标签蒸馏(Soft Label Distillation)
核心概念:
- 在分类任务中,教师模型输出的不仅仅是最终类别,还包括每个类别的置信度分布(即“软标签”)。
- 学生模型通过学习这些软标签,能够理解不同类别之间的相似性,从而提升泛化能力。
举例:
- 图像分类任务:教师模型(ResNet-50)输出
猫: 80%
,狗: 18%
,狼: 2%
的概率分布,而不是直接预测猫
。 - 学生模型(ResNet-18) 通过模仿教师模型的这种“细腻认知”能力,提升分类效果。
关键参数:温度(Temperature)
- 温度
T
影响教师模型输出的平滑度:- 高温(T 大):类别之间的置信度分布更均匀,有助于学生模型学习复杂关联。
- 低温(T 小):答案接近原始分布,适用于简单任务。
- 动态温度策略:初期
T
较高,允许学生广泛吸收知识;后期T
降低,使其更聚焦关键特征。
3.2 特征匹配蒸馏(Feature-Based Distillation)
核心概念:
- 软标签蒸馏只学习最终输出,而特征匹配蒸馏要求学生模型学习教师模型的中间层特征。
- 这种方法更适用于复杂任务,如目标检测、图像分割,因为这些任务依赖多层特征信息。
举例:
- 在目标检测任务(如 Faster R-CNN)中,教师模型可能提取到边缘特征、颜色分布等高阶信息,学生模型需要学习这些信息,以确保检测精度不下降。
3.3 自蒸馏(Self-Distillation)
核心概念:
- 传统的知识蒸馏需要两个模型(教师 & 学生),但自蒸馏可以在同一个模型内进行。
- 让模型的深层监督浅层,使得整个网络的不同部分协同优化。
适用场景:
- 自蒸馏在 Transformer、CNN 结构优化中广泛应用,如 MobileBERT、T2T-ViT。
4. 知识蒸馏的优势
知识蒸馏的主要优势包括:
- 模型压缩显著:学生模型的参数量可减少到教师模型的十分之一,甚至更少,推理速度能提高数倍。
- 提升泛化能力:教师模型的软标签包含丰富的类别区分信息,学生模型学习后能更好地应对新数据,泛化能力更强。
- 广泛适用性:在图像分类、目标检测、NLP 任务等领域均有应用。
5. 知识蒸馏的挑战
知识蒸馏存在以下挑战:
- 教师模型质量决定学生模型性能:学生模型的性能很大程度上依赖教师模型的质量,如果教师模型的表现不佳,学生模型难以学到高质量知识。
- 训练过程较复杂:蒸馏需要额外的监督信息,要同时考虑教师模型和学生模型的训练过程,计算成本较高。
- 学生模型的精度仍略低于教师模型:特别是在复杂任务(如大规模语言模型)中,蒸馏后的模型仍可能有一定精度损失,学生模型的精度会略低于教师模型。
- 模型选择影响蒸馏效果:如何选择合适的教师模型与学生模型也是一个挑战。不同的教师-学生模型组合可能影响蒸馏效果,蒸馏效果可能相差很大,需要实验验证最优组合。
四、二值化(Binary Quantization)
1. 核心思想
二值化(Binary Quantization) 是一种极端的量化技术,它将模型中的权重和激活值限制为仅有两个可能的值(如 -1
和 +1
,或 0
和 1
),仅用1个比特就能表示,从而大幅减少存储需求,并使得推理过程中许多计算可以用高效的位运算(bitwise operations) 代替浮点运算,从而提高计算效率。
- 传统的 FP32 需要 32-bit 存储,而二值化只需 1-bit,因此模型大小可缩小 32 倍。
- 二值化网络的计算过程简单很多。由于权重与激活值只有两个可能的值,所以乘法运算可以用简单的加法与位移操作替代,大幅提升计算效率。
- 由于所有计算仅涉及 0/1 或 -1/+1,卷积运算可转化为XNOR(同或运算)和位操作,而这些操作在硬件上的执行效率非常高。
-1 * -1 = +1
等价于1 XNOR 1 = 1
-1 * +1 = -1
等价于1 XNOR 0 = 0
- 而且二值计算可减少访存开销,提高能效,适用于低功耗设备(如嵌入式系统、物联网设备)。
2. 二值化方法举例
方法 | 主要特点 | 适用任务 | 压缩率 | 计算效率提升 |
---|---|---|---|---|
BinaryConnect | 仅二值化权重,激活仍为浮点数 | 轻量级图像分类 | 高 | 中等 |
XNOR-Net | 权重和激活值均二值化 | 物联网、低功耗 AI | 极高 | 极高 |
Bi-Real Net | 在 XNOR-Net 上增加残差连接,提高性能 | 复杂 CV 任务 | 高 | 高 |
2.1 BinaryConnect
核心概念:
Courbariaux 等人提出的 BinaryConnect 方法(论文:BinaryConnect: Training Deep Neural Networks with Binary Weights during Propagations)。仅对权重进行二值化,激活值仍然保持浮点数,以减少精度损失。不仅能够大幅减少模型的存储空间和计算复杂度,在一些简单的图像分类任务中还能保持较高的精度。
适用场景:
在简单的图像分类任务(如 MNIST)中仍能保持较高精度,同时减少模型存储需求。
2.2 XNOR-Net
核心概念:
由 Rastegari 等人提出的 XNOR-Net(论文:XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks)。同时二值化权重和激活值,使计算可以完全转换为 XNOR 和位计数(bit-count)操作,大幅提升推理速度。
适用场景:
适用于资源受限的设备(如物联网设备、低功耗 AI)。在 ImageNet 分类任务上,XNOR-Net 仅使用标准 CNN 1/58 的计算量,但仍能保持 56% 的 Top-1 精度。
2.3 Bi-Real Net
核心概念:
在 XNOR-Net 的基础上引入残差连接(Residual Connections)。解决二值化模型精度下降的问题,提升在复杂任务中的表现。
适用场景:
适用于深度神经网络(如 ResNet-18, ResNet-34)优化,以提高精度。
3. 二值化优势
-
极高的模型压缩率:
- FP32 → 1-bit,模型存储需求减少 32 倍。
- 适用于边缘计算、移动端、嵌入式设备等存储受限环境。
-
大幅提升计算效率:
- 二值卷积可完全转换为 XNOR 和 bit-count 运算,相比浮点运算加速 10 倍以上。
- 而且二值化网络很适合硬件优化,比如使用专用的二值化硬件加速器。
-
低功耗计算:
- 由于计算量减少,二值化适用于低功耗 AI 应用,如智能家居、传感器、物联网。
4. 二值化缺陷
-
精度损失较大:
- 由于数值表示能力受限,二值化模型的精度远低于标准 FP32 模型。
- 特别是在复杂任务(如 NLP、目标检测)中,二值化导致较大性能损失。
-
训练难度增加:
- 二值化的权重 不可导,需要特殊的直通估计器(Straight-Through Estimator, STE) 处理梯度计算,否则无法进行有效的反向传播。
-
模型敏感性不同:
- CNN 在某些任务(如图像分类)中对二值化较为耐受,但 NLP 任务(如 Transformer 模型)二值化后通常损失较大。
五、总结
在深度学习模型的优化过程中,存储需求、计算复杂度和推理速度是影响实际部署的重要因素。模型压缩技术 通过减少参数量和计算量,使得神经网络能够在资源受限的设备上高效运行。
本文介绍的压缩方法包括量化(Quantization)、剪枝(Pruning)、知识蒸馏(Knowledge Distillation, KD)、二值化(Binary Quantization),对比如下。
方法 | 存储压缩比 | 计算加速 | 适用场景 | 影响精度 |
---|---|---|---|---|
量化(8-bit, 4-bit) | 4× ~ 8× | 适中 | 适用于大多数深度学习模型 | 轻微 |
剪枝(Pruning) | 2× ~ 10× | 适中 | 适用于 CNN, RNN | 轻微至中等 |
知识蒸馏(KD) | 2× ~ 5× | 适中 | 适用于 NLP, 计算机视觉 | 轻微 |
二值化(BinaryNet) | 32× | 极高 | 超低功耗设备, ASIC, FPGA | 较大 |
在实际应用中,需要根据不同的场景需求,综合考虑计算资源、存储需求和精度要求选择合适的模型压缩技术。
-
资源受限场景(如嵌入式设备、IoT 设备)
- 首选方法:二值化(BinaryNet)、量化(Quantization)。
- 原因:二值化可极大减少存储需求并加速计算,适用于精度要求不高的任务;量化则能通过调整量化精度在压缩效果与模型性能之间找到平衡。
-
计算效率优先(如边缘计算、实时推理)
- 首选方法:量化(Quantization)、结构化剪枝(Structured Pruning)。
- 原因:量化(如 INT8 量化)可显著减少计算复杂度,同时维持较高精度;结构化剪枝能够优化计算图,提高推理速度。
-
高精度要求(如云端推理、智能搜索)
- 首选方法:知识蒸馏(Knowledge Distillation)。
- 原因:蒸馏让小模型学习大模型的能力,在不显著降低精度的前提下压缩模型,适用于 NLP 任务(如 TinyBERT)。
-
混合优化方案(如 AI 手机应用、工业检测)
- 推荐方法:量化 + 剪枝、蒸馏 + 量化。
- 原因:剪枝减少冗余计算,量化加速推理,而蒸馏能保持模型精度,结合使用能发挥更佳效果。