AI学习_模型优化:剪枝、蒸馏、量化

量化、剪支、蒸馏
注意:这三种方法是三选一!不能同时用
Q:为什么不能同时用?
A:技术上可以同时用,但没有必要
每一种优化(压缩)方式都会对模型精度有一定的影响,同时用更会叠加这种影响。如果精度损失过大,就得不偿失了

优化方式:剪枝

面试会问!dropout和剪枝的区别
dropout:以批次为单位,每批次随意抑制神经元(下一批次可能就不抑制了)
剪枝:完全减去参数

正则化的介绍:
https://baijiahao.baidu.com/s?id=1653085297096293714

L1正则化基础:在损失函数中增加——取参数的绝对值,让参数尽可能为0,减少网络规模
L2:在L1基础上,只使参数尽可能“变小”

剪枝分为两种:结构化剪枝/ 非结构化剪枝:
结构化剪枝:剪去的是网络层,会改变模型的结构,(对模型影响比较大)
非结构化剪枝:剪的是神经元不会改变模型的结构
【注意!有的硬件是不支持非结构化剪枝的!】

全局剪枝:只支持非L1结构化剪枝
由于是“删去加起来的总共20%权重”,所以会着重减中间的+不可控,所以不推荐
全局剪枝删权重的思路
不同剪枝的差异:
剪枝方式间的图片差异
剪枝的步骤(及其根本问题):
每次剪枝后都要重新训练,效率极低
用的最多的是量化
剪枝步骤
查看参数变化的方法:
list( module.named_parameters() )
这个方法可以打印模型参数,也会保留原版参数

剪枝知识点概览:
剪枝概览

优化方式:蒸馏

从复杂的网络中,提取有用部分,组成一个小模型
图解蒸馏
原理即为“教导”
教导的方式:
输出一组概率(软目标),而不是简单的一组one_hot(硬目标)。是一种“极大似然估计”

蒸馏过程:“学习”和“考试”
蒸馏的操作之一:加入T作为softmax的输入(教师和学生都加),使大值更大,小值更小

蒸馏的应用场景:
蒸馏的应用场景

前提:当网络只能刚刚好拟合时,就不能再蒸馏了(目前大部分网络都过大了)
而且也不能无限缩小(小网络的损失要合适)

————————————————————
蒸馏的具体操作
蒸馏小网络的具体操作
这里的参数“小写t”,要根据具体情况而定(整数,1~3这种)

蒸馏调整参数后的变化对比大小会影响“输出概率的平缓程度”,也可以用来调整“老师/学生输出之间的相似度”
越大会让曲线越平缓,越小会让曲线越陡峭

选择学习时、损失函数的选择:
交叉熵:两条分布曲线相似
相对熵(KL散度):不仅相似,距离也要接近
请添加图片描述
使用注意:记得带上这个参数

蒸馏知识点概览:
蒸馏概览

优化方式:量化

量化:最实用
但pytorch对量化的支持不好
常用程度:量化 > 蒸馏 > 剪枝

量化:将训练好的网络的权值,激活值从高精度转化为低精度的操作过程

优点:
1.减少内存和存储的占用
2.降低功耗
3.提升计算速度

量化的对象:
1.权重
2.激活函数的输出
3.梯度(用于降低分布式计算的通讯成本)

pytorch的量化还在测试,还只支持CPU

知道最大值的数据,可以直接÷最大值来量化
不知道最大值的数据,用标准化(用方差和期望/平均值)来量化

在使用标准化时,dtype=quint8

量化知识点概览:
量化概览

### 模型剪枝 模型剪枝是一种通过移除神经网络中冗余权重或连接来减小模型大小的技术。这种方法的核心在于识别并删除那些对最终预测结果贡献较小的参数,从而实现模型简化而不显著降低其性能[^3]。 剪枝通常分为两种主要形式:结构化剪枝和非结构化剪枝。前者专注于移除整个层或者通道,便于硬件加速;后者则关注单个权重级别的裁剪,虽然能进一步缩小模型尺寸,但在实际部署中可能面临更多挑战。 ```python import torch.nn.utils.prune as prune # 示例代码展示如何进行简单的模型剪枝操作 model = ... # 定义一个PyTorch模型实例 module = model.some_layer # 获取目标层 prune.l1_unstructured(module, name='weight', amount=0.3) # 对权重量化修剪30% ``` --- ### 知识蒸馏 知识蒸馏是一种将大型复杂模型的知识迁移到小型高效模型的方法。具体而言,它利用教师模型产生的软标签(即概率分布)指导学生模型学习过程,使学生能够更好地捕捉数据模式的同时保持较低的计算开销[^2]。此方法特别适合于需要高性能但又受制于资源约束的应用场合,比如移动端AI服务。 ```python def knowledge_distillation_loss(student_output, teacher_output, labels, temperature=4): soft_targets = F.softmax(teacher_output / temperature, dim=-1) student_probs = F.log_softmax(student_output / temperature, dim=-1) kl_div_loss = nn.KLDivLoss()(student_probs, soft_targets) * (temperature ** 2) ce_loss = nn.CrossEntropyLoss()(student_output, labels) total_loss = kl_div_loss + ce_loss return total_loss ``` --- ### 模型量化 模型量化是指用低比特数表示原本高精度浮点数值的过程,以此达到减少存储需求以及提升运行效率的目的。例如,从FP32转换到INT8甚至更低位宽的数据类型可以极大地节省空间并加快运算速度,不过这也伴随着一定的准确性折损风险[^4]。 ```python from tensorflow import keras converter = tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations = [tf.lite.Optimize.DEFAULT] quantized_tflite_model = converter.convert() with open('quantized_model.tflite', 'wb') as f: f.write(quantized_tflite_model) ``` --- ### 应用场景分析 上述提到的各种优化手段各有侧重,在不同环境下发挥着独特的作用: - **边缘计算**:由于物联网设备往往存在严格的功耗预算限制,因此采用诸如量化之类轻量级方案显得尤为必要。 - **移动平台上的实时处理**:为了满足用户体验要求,开发者倾向于运用综合策略如TinyBERT那样结合多种压缩技巧共同作用。 - **云端推理服务成本控制**:尽管服务器端相对富裕算力支持,但从经济效益角度出发仍然有必要探索合理范围内的精简措施以降低成本。 #### 注意事项 尽管理论上各种技术可联合施加,但实际上每增加一层变换都可能导致额外误差累积效应加剧,所以需谨慎评估收益与代价之间的平衡关系。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值