Pruning
了解剪枝如何通过移除冗余参数来优化 Ultralytics YOLO26 等神经网络。探索适用于 Edge AI 的结构化和非结构化方法。
剪枝是一种战略性的模型优化技术,通过移除不必要的参数来减小神经网络的规模和计算复杂度。就像园丁修剪枯死或过度生长的枝条以帮助树木茁壮成长一样,剪枝算法会识别并消除对模型预测能力贡献很小的冗余权重和偏置。其主要目标是创建一个经过压缩的“稀疏”模型,在保持较高准确率的同时显著减少内存和能耗。这种缩减对于改善推理延迟至关重要,使先进架构能够在手机和嵌入式设备等资源受限的硬件上高效运行。
机制与方法#
现代深度学习模型通常存在参数过多的问题,这意味着它们包含的连接数量远超解决特定任务所需的数量。剪枝利用了这一点,移除数值接近零的连接,前提是这些连接对输出的影响可以忽略不计。移除参数后,模型通常会经过微调过程,即进行短暂的重新训练,以调整剩余权重并恢复损失的性能。这一概念与彩票假设密切相关,该假设认为,大型网络中包含能够达到相近准确率的小型高效子网络。
剪枝策略主要分为两类:
- 非结构化剪枝:这种方法根据权重的大小移除单个权重,而不考虑其所在位置。虽然它能有效减少参数总量,但会产生不规则的稀疏矩阵,如果没有专用软件,标准CPUs和GPUs可能难以高效处理这些矩阵。
- 结构化剪枝:这种方法会移除卷积神经网络 (CNN)中的完整几何结构,例如神经元、通道或层。结构化剪枝保留了矩阵结构,因此与标准硬件加速器高度兼容,通常能够立即提升实时推理速度。
实际应用#
在硬件资源有限的各个行业中,剪枝对于实现边缘 AI不可或缺:
-
自主无人机:用于搜救的无人飞行器依靠计算机视觉在复杂环境中导航。经过剪枝的目标检测模型可以让这些设备在本地实时处理视频流,避免云通信带来的延迟问题。
-
移动医疗:用于超声分析的手持医疗设备利用经过剪枝的模型直接在设备上检测异常。这既能确保患者的数据隐私,又能在没有互联网接入的偏远地区实现复杂的诊断。
实现示例#
虽然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}%")剪枝与相关优化技术的对比#
要有效地针对部署优化模型,区分剪枝与其他策略会很有帮助:
- 模型量化:量化与移除连接的剪枝不同,它会降低权重的精度(例如,将 32 位浮点数转换为 8 位整数)。这两种技术可以结合使用,以最大限度地提升嵌入式系统的效率。
- 知识蒸馏:这种方法会训练一个较小的“学生”模型,使其模仿较大的“教师”模型的行为。剪枝直接修改原始模型,而蒸馏则会训练一个新的紧凑架构。
对于包括训练、标注和部署优化模型在内的完整生命周期管理,用户可以利用Ultralytics Platform。它简化了从数据集管理到将模型导出为适合硬件的格式(如ONNX或TensorRT)的工作流程。









