2025版李宏毅机器学习卷积神经网络笔记:从理论到工程实践的关键技术解析

1次阅读
没有评论

共计 1917 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:CNN 在边缘计算的三大挑战

最近在做智能终端的图像分类项目时,发现直接用 PyTorch 训练好的 ResNet-50 模型根本跑不动——模型大小超过 90MB,推理延迟高达 300ms,还经常因为内存不足崩溃。这其实是边缘计算场景的典型问题:

2025 版李宏毅机器学习卷积神经网络笔记:从理论到工程实践的关键技术解析

  • 参数量爆炸 :VGG16 的 138M 参数在树莓派上加载都困难
  • 计算延迟高 :常规 CNN 的 FLOPs 在终端芯片上难以实时处理
  • 硬件适配差 :不同设备的计算单元(如 NPU/GPU/DSP)需要特定优化

技术方案三件套

1. 量化训练(QAT)实战

传统 PTQ(训练后量化)会导致 >3% 的精度损失,我们采用 Quantization-Aware Training 方案:

# PyTorch 实现核心代码
import torch.quantization

model = resnet18()
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')
model_prepared = torch.quantization.prepare_qat(model.train())

# 特别注意:需要修改损失函数
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model_prepared.parameters(), lr=0.01, momentum=0.9)

for epoch in range(10):
    for data, target in train_loader:
        output = model_prepared(data) 
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

# 最终转换        
model_int8 = torch.quantization.convert(model_prepared.eval())

关键点:
– 使用 Straight-Through Estimator 处理量化不可导问题
– 建议从 FP32→FP16→INT8 分阶段量化
– 每层添加伪量化节点模拟量化误差

2. 动态剪枝的魔法

基于彩票假设理论(Lottery Ticket Hypothesis),我们发现:

  1. 先训练原始模型至收敛
  2. 计算各通道的 Group Lasso 重要性分数
  3. 迭代式剪掉分数低的通道(每次剪枝≤10%)
  4. 微调剩余子网络

实验对比(ImageNet-1k):
| 方法 | 参数量 | Top-1 Acc |
|—————–|——–|———–|
| 原始 ResNet-18 | 11.7M | 69.8% |
| 静态剪枝 | 6.3M | 67.2% |
| 动态剪枝(本文)| 5.8M | 69.1% |

3. 硬件感知 NAS 实战

针对树莓派 4B(RAM<1GB)的搜索策略:

# 定义搜索空间
from torchvision.ops import MobileNetV3

class SuperNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.blocks = nn.ModuleDict({'mb_k3_e1': MobileNetV3(expand_ratio=1),
            'mb_k5_e3': MobileNetV3(kernel_size=5, expand_ratio=3),
            # ... 其他候选块
        })

    def forward(self, x, arch_choice):
        return self.blocks[arch_choice](x)

搜索时需考虑:
– 目标设备的 L2 缓存大小(避免频繁换页)
– SIMD 指令集的向量化能力
– 内存带宽限制

性能验证

测试环境:Jetson Nano / 4GB RAM / 4 核 Cortex-A57

优化阶段 时延 (ms) 内存 (MB) Top-1 Acc
原始模型 312 345 69.8%
仅量化 89 98 69.5%
量化 + 剪枝 53 62 68.9%
全方案优化 41 55 68.7%

避坑指南

  1. 量化训练梯度爆炸
  2. 使用梯度裁剪(grad_clip=1.0)
  3. 初始阶段禁用量化(num_bn_folding=0)

  4. 剪枝后校准

  5. 在验证集上重新计算 BatchNorm 的 running_mean/var
  6. 对剪枝后的全连接层进行 Kaiming 初始化

  7. 跨平台部署

  8. 使用 ONNX 作为中间格式
  9. 提前测试目标平台的算子支持(如 TFLite 的 CONV_2D)
  10. 必要时实现自定义算子

开放性问题

当前方案下 ResNet-18 仍有 5MB 大小,要压缩到 1MB 以下可能需要:
– 知识蒸馏(用大模型指导小模型)
– 混合精度量化(关键层保持 FP16)
– 更激进的稀疏化(90%+ 稀疏率)

期待听到你们的实战经验!

正文完
 0
评论(没有评论)