Pruning
学习剪枝 (Pruning) 如何通过移除冗余参数来优化 Ultralytics YOLO26 等神经网络。探索适用于边缘 AI 的结构化和非结构化剪枝方法。
剪枝是一种战略性的模型优化技术,用于通过移除不必要的参数来减小神经网络的规模和计算复杂度。就像园丁修剪枯死或过度生长的枝叶以帮助树木茁壮成长一样,剪枝算法可以识别并剔除那些对模型预测能力贡献甚微的冗余权重和偏置。其主要目标是创建一个经过压缩的“稀疏”模型,在保持高准确率的同时,消耗更少的内存和能量。这种缩减对于改善推理延迟至关重要,使先进的架构能够在手机和嵌入式设备等资源受限的硬件上高效运行。
Link to this section机制与方法论#
现代深度学习模型往往存在参数过多的情况,这意味着它们包含的连接远超解决特定任务所需。剪枝利用这一点,移除那些值接近于零的连接,假设它们对输出的影响可以忽略不计。参数移除后,模型通常会经历一个微调过程,即进行短暂的再训练,以调整剩余的权重并恢复损失的性能。这一概念与彩票假设密切相关,该假设认为大型网络中包含较小的、高效的子网络,这些子网络能够达到相似的准确率。
剪枝策略主要分为两大类:
- 非结构化剪枝:此方法基于权重的大小来移除单个权重,而不考虑其位置。虽然它有效地减少了总参数量,但会产生不规则的稀疏矩阵,标准CPU和GPU在没有专门软件的情况下可能难以高效处理这些矩阵。
- 结构化剪枝:此方法移除整个几何结构,例如卷积神经网络 (CNN) 中的神经元、通道或层。通过保留矩阵结构,结构化剪枝与标准硬件加速器高度兼容,通常能为实时推理带来即时的速度提升。
Link to this section实际应用#
在硬件资源有限的各个行业中,剪枝对于实现边缘 AI 是不可或缺的:
-
自主无人机:用于搜救的无人驾驶飞行器依靠计算机视觉在复杂环境中导航。经过剪枝的目标检测模型使这些设备能够实时在本地处理视频流,从而避免与云端通信相关的延迟问题。
-
移动医疗:用于超声分析的手持医疗设备利用剪枝模型直接在设备上检测异常。这确保了患者的数据隐私,并使在没有互联网连接的偏远地区进行复杂的诊断成为可能。
Link to this section实现示例#
虽然像 YOLO26 这样的一流模型专为高效而设计,但开发者可以使用像 PyTorch 这样的库对层进行剪枝,以进一步优化模型。下面的示例演示了如何对卷积层应用非结构化剪枝。
import torch
import torch.nn.utils.prune as prune
# Initialize a standard convolutional layer
layer = torch.nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3)
# Apply L1 unstructured pruning to remove 30% of weights with the lowest magnitude
prune.l1_unstructured(layer, name="weight", amount=0.3)
# Verify sparsity (percentage of zero parameters)
sparsity = 100.0 * float(torch.sum(layer.weight == 0)) / layer.weight.nelement()
print(f"Sparsity achieved: {sparsity:.2f}%")Link to this section剪枝与相关优化技术的比较#
为了有效地优化模型以便部署,区分剪枝与其他策略会有所帮助:
- 模型量化:与移除连接的剪枝不同,量化会降低权重的精度(例如,将 32 位浮点数转换为 8 位整数)。这两种技术可以结合使用,以最大化嵌入式系统上的效率。
- 知识蒸馏:这涉及训练一个较小的“学生”模型来模仿大型“教师”模型的行为。剪枝是直接修改原始模型,而蒸馏则是训练一个新的紧凑架构。
对于包含训练、标注和部署优化模型在内的全面生命周期管理,你可以利用 Ultralytics Platform。它简化了从数据集管理到将模型导出为硬件友好格式(如 ONNX 或 TensorRT)的工作流程。






