/ ai资讯

基于MATLAB/Simulink实现压缩深度学习模型

发布时间:2026-08-25 15:46:06

| 本文翻译与整理:MathWorks 中国资深应用工程师 刘海伟

深度学习网络模型通常会占用较多内存。如果网络需要满足特定的内存限制,例如要部署到资源受限的嵌入式硬件上,通常需要减小模型规模。MATLAB( Deep Learning Toolbox Model Compression Library ),支持对神经网络进行压缩。

神经网络的内存占用主要来自两个方面:状态和可学习参数。层状态是在层运算过程中计算并保留下来的信息,用于该层后续的前向传播,例如 LSTM 层的元胞状态和隐藏状态。可学习参数则包含网络学习到的特征,例如卷积层和全连接层中的权重。

可以使用以下两种方法之一来压缩网络。

结构压缩:减少状态和可学习参数的数量。MATLAB 提供两种结构压缩技术:剪枝和投影。

量化:将状态和可学习参数转换为精度更低的数据类型。

可以根据层类型和整体网络架构,组合使用这些技术来减小网络规模。为获得更好的压缩效果,建议依次执行剪枝、投影和量化。随后生成代码,并将网络部署到目标硬件。为获得最佳结果,需要在每一步之后对网络进行微调。有关结合剪枝、投影和量化以满足固定内存要求的示例,请参阅 训练并压缩用于道路损伤检测的 AI 模型。

MATLAB 提供直观的工具 Deep Network Designer app,通过压缩分析评估网络的内存压缩潜力。在 Deep Network Designer 中打开网络,然后点击Analyze for Compression。此功能需要安装 Deep Learning Toolbox Model Compression Library 附加组件。

压缩分析报告会显示以下信息:

最大可能内存缩减量

对剪枝、投影和量化的支持情况

网络架构对单个层可剪枝能力的影响

层内存

你可以根据压缩分析报告选择合适的网络压缩技术。

结构压缩通过减少状态和可学习参数的数量来减小网络大小。MATLAB 提供两种结构压缩技术:剪枝和投影。

剪枝

对神经网络进行剪枝,是指移除最不重要的参数,以在保持预测质量的同时减小网络大小。

可以通过观察移除一组参数后损失函数的变化,来衡量这组参数的重要性。如果损失显著变化,说明这些参数较为重要;如果损失变化不明显,则说明这些参数影响较小,可以剪除。

当网络参数数量很大时,无法逐一计算所有参数组合对应的损失变化。因此,通常采用迭代式工作流。

计算每个可剪枝滤波器的重要性得分。

剪除最不重要的滤波器。

对剪枝后的网络进行微调。

在步骤 1 中,一种近似方法是将损失表示为单个网络参数的函数,并计算其泰勒展开。这种方法称为泰勒剪枝。

对于某些类型的层(包括卷积层),移除某个参数等价于将其设置为零。在这种情况下,剪枝参数 θ 导致的损失变化可表示如下。

|Δloss(X,θ)|=|loss(X,θ=0)-loss(X,θ)| 

这里,X是网络的训练数据。

将损失表示为参数θ的函数,并计算其一阶泰勒展开。

loss(X,θ)=loss(X,θ=0) (δloss/δθ)θ

随后,可以将损失变化表示为损失关于参数θ的梯度的函数。

|Δloss(X,θ)|=|(δloss/δθ)θ|

训练过程中已经会为反向传播计算该梯度,因此可以复用相同的计算结果,得到泰勒剪枝所需的梯度。

在 MATLAB 中,可以使用 compressNetworkUsingTaylorPruning 函数执行泰勒剪枝。该函数会迭代执行剪枝和微调,直到网络达到所需大小,或刚好满足指定的验证阈值。有关此工作流的示例,请参阅根据内存要求剪枝神经网络 。

如果无法使用 trainnet 函数训练网络,可以改用 taylorPrunableNetwork 函数创建自定义剪枝循环。具体而言,可使用 updateScore 函数计算可学习参数的重要性,并使用 updatePrunables 函数移除最不重要的 n 个可学习参数。有关此工作流的示例,请参阅 使用泰勒得分剪枝图像分类网络 。

有关如何使用泰勒剪枝压缩神经网络的示例,请参阅 根据内存要求剪枝神经网络和根据准确率要求剪枝神经网络。

投影

投影是一种逐层压缩技术,它用一个或多个参数总量更少的层替换原始层。

在神经网络中,数据通常表示为高维向量。并非所有维度对当前任务都同等重要。通常,只需要少量元素就能解释输出中的大部分方差。

主成分分析(PCA)可以将数据表示在一组按重要性排序的基向量上。第一个元素解释的方差最大,第二个元素解释的方差次之,依此类推,最后一个元素解释的方差最小。

神经网络投影利用 PCA,通过以下方式减小网络层的规模。

使用能够代表训练数据的数据集分析网络激活,并通过 PCA 识别可学习参数中使神经元激活方差最大的子空间。

将层输入投影到由最重要的 N 个方向张成的低维空间中。

在低维空间中执行层运算。

在输出末尾补充所需数量的零,并旋转回原始基,从而返回高维空间。

在 MATLAB 中,可以使用 compressNetworkUsingProjection 函数对神经网络进行投影。compressNetworkUsingProjection 函数会自动执行 PCA。

如果希望对同一网络执行多次投影,例如探索不同压缩级别,可以使用 neuronPCA函数单独执行 PCA。随后,可将其输出作为可选输入参数传递给 compressNetworkUsingProjection 函数。

完成投影后,建议重新训练模型,以恢复投影过程中损失的部分或全部准确率。

有关对序列分类网络进行投影的示例,请参阅 使用投影压缩神经网络。有关在估算电池荷电状态的整体工作流中对网络进行投影的示例,请参阅 评估压缩深度神经网络的代码生成推理时间 。

量化

量化是一种不改变网络架构的压缩技术,它通过降低可学习参数的精度来减小存储开销。在 Deep Learning Toolbox 中,网络参数默认以单精度格式存储。Deep Learning Toolbox Model Compression Library 支持包允许你使用精度更低的数据类型存储参数并部署网络。

量化工作流包含两个步骤。

确定网络中参数的动态范围。为此,需要使用能够代表训练数据的样本数据运行网络,并提取每个卷积层和全连接层中权重与偏置的最小值和最大值,以及网络中其他所有层激活值的最小值和最大值。

在每一层中,将参数转换为能够表示上一步所确定动态范围的整数。

要在 MATLAB 中量化深度学习模型,可以使用 dlquantizer 函数,也可以使用 Deep Network Quantizer App 。

命令行量化工作流可视化

整体上,该命令行工作流可以理解为:创建量化器 → 校准动态范围 → 模拟与查看量化详情 → 评估量化影响 → 准备网络 → 验证量化 → 部署到目标硬件。其中,“校准—评估—准备网络”可以根据指标结果反复迭代,直到网络在精度、内存和目标执行环境之间达到合适平衡。

有关如何使用命令行为不同执行环境量化神经网络的信息,请参阅以下示例。

量化语义分割网络并生成 CUDA 代码

使用量化 GoogLeNet 网络在 FPGA 上对图像进行分类 (Deep Learning HDL Toolbox)

为 Raspberry Pi 上的深度学习网络生成 INT8 代码 (MATLAB Coder)

Deep Network Quantizer App

也可以使用 Deep Network Quantizer App 完成量化工作流。输入 deepNetworkQuantizer从 MATLAB 命令提示符打开该 App。

有关如何使用 Deep Network Quantizer 为不同执行环境量化神经网络的信息,请参阅以下示例。

为 GPU 部署量化网络

为 CPU 部署量化网络

更多信息

有关量化的更多信息,请参阅 深度神经网络量化。有关 Deep Learning Toolbox 中量化工作流先决条件的信息,请参阅 量化工作流系统要求。有关如何为量化预处理数据的信息,请参阅 为网络量化准备数据。

兼容性注意事项

与剪枝和投影兼容的层

自R2026a起,compressNetworkUsingTaylorPruning 和 compressNetworkUsingProjection 函数支持压缩 networkLayer 对象中包含的层。

也可以使用 Deep Network Designer 分析网络与剪枝和投影的兼容性。

支持量化的网络和层取决于目标执行环境。有关量化支持层的更多信息,请参阅 量化支持的层。本文的主要参考MATLAB官方文档。

其他技术

前面介绍的技术属于 Deep Learning Toolbox Model Compression Library。MATLAB 中还提供其他几种压缩技术。

知识蒸馏

在知识蒸馏中,使用一个规模较大且准确率较高的教师网络,指导规模较小的学生网络进行准确预测 。通过这种技术,可以设计出满足内存要求的小型网络。有关 MATLAB 中知识蒸馏的示例,请参阅 使用知识蒸馏训练较小的神经网络 。

使用 NVIDIA TensorRT 库进行量化(GPU Coder)

可以使用 NVIDIA TensorRT 库生成用于 8 位整数预测的代码。有关示例,请参阅 使用 NVIDIA TensorRT 库进行深度学习预测。

使用 bfloat16 代码进行量化(MATLAB Coder)

脑浮点(bfloat16)格式是单精度浮点格式的截断版本,在计算机内存中仅占用 16 位。bfloat16 保留了与单精度浮点相同数量的指数位,因此具有大致相同的数值范围。有关如何为深度学习网络生成和部署 bfloat16 代码的信息,请参阅 以 bfloat16 格式压缩网络可学习参数 (MATLAB Coder)。

稀疏性

可以结合稀疏性和自定义重要性指标对网络进行剪枝。具体做法是识别最不重要的参数,将其置零,并将得到的权重矩阵存储为稀疏矩阵。

有关使用幅值评分和突触流评分进行剪枝的示例,请参阅 图像分类网络的参数剪枝和量化 。这两种指标都是无数据的重要性估计技术。

Fixed-Point Designer

要使用低精度类型为嵌入式硬件优化通用算法,请使用 Fixed-Point Designer。有关更多信息,请参阅 定点硬件的优势(Fixed-Point Designer)。

关于作者

刘海伟,MathWorks中国

MathWorks 中国资深应用工程师,专注科学计算,数据挖掘与人工智能方向,曾就职于斯伦贝谢(北京)BGC 和金风科技,负责数值优化、预测性维护和控制优化方向的工作,在 MATLAB 数据科学、人工智能领域有多年工作经验。毕业于北京航空航天大学和法国马赛中央理工学院,获得信息与通信工程硕士和法国工程师学位。

  • matlab matlab 关注

    关注

    190

    文章

    3047

    浏览量

    241319

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:bangqikeconnect@gmail.com