模型压缩的主要目标是将一个庞大而复杂的预训练模型转化为一个精简的小模型,使其在保持较高性能的前提下,显著减少模型的存储空间和计算量。一方面考虑将模型的存储空间从 GB 甚至是 TB压缩到 MB 甚至更小;另一方面要降低模型的计算复杂度,减少浮点运算次数FLOPS,让模型的推理速度更快;同时还要优化模型的结构让它能够更好的适配 GPU 、 NPU等硬件设备提高资源利用率,降低能耗。
最重要的是压缩后的模型得和原来的大模型性能差不多
具体来说,模型压缩的目标包括以下几种:量化、剪枝、蒸馏(知识蒸馏)、二值化
一、量化
在模型压缩里面可以说是关键的一环,核心原理是减少表示每个权重所需的Bit数(传统深度学习模型里,权重通常就是用数字,比如32位浮点数来存储的,就好比用一个大箱子存储小物件,既占地方计算起来也麻烦,而量化就好比是将这些大箱子换成合适的小盒子)
《Improving the speed of neural networks on CPUs》
量化就是将浮点数权重转换为 8 位、 4 位甚至 1位的整数,使模型的存储空间和计算量大幅的减少(根据范霍克(Vanhouke)等人研究表明:8位参数量化在损失最小精度的情况下,可以把模型的存储空间压缩到原来的1/4,计算复杂度也会大大降低,低精度的整数运算比浮点数运算要高效的多)。
适合调整量化精度在压缩效果和模型性能之间找到平衡
方法主要有 3 类:
训练后量化(PTQ):模型训练后,直接对权重进行量化(Google的TensorFlow Lite就提供这样的工具)。缺点:量化没有考虑训练中的动态变化,可能会让模型的精度下降
量化感知训练(QAT):模型训练中就引用量化操作,让模型提前适应低精度的表示形式(英伟达的TensorRT支持)从而让模型量化后还能保持较好的性能。缺点:训练过程更复杂,需要更多的计算资源
量化感知微调(QAF):基于预训练模型进行微调,同时加入量化操作,结合了预训练模型的优势和量化技术的高效性,减少存储和计算开销。缺点:性能上比不上从头开始训练的量化感知训练模型
优势:
1 、显著减少存储空间
2 、计算效率大大提升(比如8位量化,能够在不明显降低精度的情况下,把推理速度提升2-3倍)
3 、而且量化后的模型在 GPU 、 NPU 等硬件上也能运行得更好,充分发挥硬件的并行计算能力
局限性:
1 、精度损失是个大问题,尤其是使用 1 位或者2 位这种低精度量化时,精度会下降很多
2 、不同模型对量化的敏感度不一样,有些模型量化后性能依然优秀,有些会大幅下降
3 、量化感知训练、量化感知微调,需要修改训练过程,从而增加了训练的难度和计算资源需求
二 、剪枝
原理:去除神经网络里不重要的连接或者神经元这些对最终结果影响不大的部分,从而达到压缩模型的目的(韩松(Han)等就提出了基于权重重要性的剪枝方法),通过分析权重对模型输出的影响,把那些影响小的权重“减掉”,在不怎么降低性能的同时,大幅减少模型的参数数量
《Learning both Weights and Connections for Efficient Neural Networks》
方法有两种 :非结构化剪枝(Unstructured Pruning)、结构化剪枝(Structured Pruning)
1 、非结构化剪枝(Unstructured Pruning):
随机移除单个权重或者连接
优点:实现很高的压缩比,可以精准去除对模型输出影响最小的权重
问题:产生的稀疏结构在硬件上很难高效实现(硬件喜欢规整的矩阵操作)
一些实验中,非结构化剪枝能够把模型参数减少 50% 以上,但是推理速度提升并不明显
2 、结构化剪枝(Structured Pruning):
按照一定规则(比如:移除整个神经元、滤波器或者层),这种方法产生的稀疏结构更适合硬件加速(像滤波器级剪枝就可以去掉卷积层中不重要的滤波器,降低卷积操作的计算量),虽然结构化剪枝的压缩比可能比不上非结构化剪枝,但是在提升推理方面表现更好(在某些卷积神经网络中能够把推理速度提高2-3倍)
优点:
<1>减少模型的大小(一些实验中可减少50%~80%)
<2>提高推理速度,降低能耗
<3>能够降低模型的过拟合风险,提高泛化能力(原因:剪枝去掉了冗余信息)
缺点:
精度损失问题,尤其是剪枝比例高的时候
一些剪枝方法需要修改训练过程,增加训练的复杂性和计算资源需求
不同模型对剪枝的敏感度也不同(有些模型会很稳定,有些则会出现较大的波动)
三、蒸馏(知识蒸馏)----deepseek 采用的就是知识蒸馏
把大模型的复杂模型(教师模型)的知识迁移到小型的简单模型(学生模型),教师模型参数多、结构复杂能够学到丰富的特征和模式,但是难以部署在资源受限的设备上,而学生模型通过学习教师模型的输出(比如:软标签、中间特征……),就能够在保持小巧身材的同时尽可能接近教师模型的性能
举个例子:
在图像分类的任务中,教师模型可能是深度为 50 的ResNet,它输出的软标签包含了对每个类别的置信度信息,学生模型可以是一个较浅的网络,可以通过学习这些软标签,就能够学到更加丰富的类别区分信息,从而在分类任务中表现的更好
知识蒸馏的流程:
1 、首先需要训练一个大型复杂且性能优异的教师模型,让它在大规模数据集上学习,积累丰富的知识
2、然后选择一个较小的模型作为学生模型,并且进行初始化(虽然结构简单,但是要有一定的学习能力)
3、接着进入蒸馏训练阶段,把教师模型的输出当作额外的监督信息和学生模型的输出进行对比通过优化损失函数来训练学生模型
损失函数通常包含两部分:
3.1:学生模型的原始损失(比如:交叉熵损失)
3.2:学生模型输出和教师模型输出之间的差异(经常使用KL散度来衡量)
4、 最后在蒸馏训练结束后,可以对学生模型进行微调,进一步提升它的性能。其中温度参数相当于知识蒸馏的“难度调节旋钮”,高温模式下可以学习到复杂的关联关系,而在低温模式下答案回接近原始分布,适合简单任务。当然也可以考虑动态模式初期用高温广泛吸收知识后期降温再聚焦关键的特征,像是在自然语言处理领域。研究人员通常会把预训练的 BERT 模型当作教师模型把轻量级的 LSTM 模型作为学生模型经过蒸馏阶段学生模型能够学到教师模型的语言表示能力在文本分类、情感分析等任务中取得不错的成绩。
优势:
1 、模型压缩效果十分显著(学生模型参数量能够减少到教师模型的1/10甚至更少)
2 、推理速度提高好几倍(因为教师模型的软标签中包含丰富的类别区分信息,学生模型在学习后泛化能力更强,能够更好的应对新的数据)
3 、应用范围广 (图像分类、目标检测、自然语言处理任务都能通过知识蒸馏实现压缩)
不足:
1 、学生模型的性能很大程度上依赖教师模型的质量
2 、需要同时考虑教师模型、学生模型的训练过程
3 、虽然在一定程度上能保持模型性能,但是在复杂任务中学生模型的精度还会略低于教师模型
选择合适的教师模型和学生模型也是个挑战,不同模型组合蒸馏效果会相差很大
四、二值化
极端的量化技术,它把神经网络中的权重和激活值限制在两个值上(通常是+1和-1),就好比把所有的选择都简化成了“YES”or “NO”,极大的减少了模型的存储空间和计算复杂度。
二值化的权重和激活值用一个Bit就能表示,而不是传统的 32 位 浮点数,存储空间减少了 32 倍。计算过程也相对简单很多,由于权重和激活值只有两个可能的值,所以乘法运算可以用简单的加法和位移操作替代,大幅提升计算效率。
《BinaryConnect:Training Deep Neural Networks with binary weights during propagations》
在自然语言处理过程中,可以通过二值化技术压缩预训练的Transformer模型,显著减少模型的存储空间和推理延迟
优点:
1 、压缩率极高
2 、推理速度提升(一些实验中二值化网络的推理速度能够提高10倍以上)
不足:
1 、精度损失比较严重
2 、训练需要特殊的技巧和方法(比如用直通估计器来处理不可导的二值化操作)
综上所述:
二值化适合精度要求不高的任务
注重计算效率,显著提高模型的推理速度同时对模型精度还有要求,量化和结构化剪枝是不错的选择
保持较高模型性能的前提下进行压缩,知识蒸馏就是理想之选