当前位置: 首页 > article >正文

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言

在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄像头、机器人等资源受限的设备上。
于是我们就想出了一个办法:给模型“瘦身”,让它又快又轻,还能保持不错的准确率。
这就是——模型压缩!
模型压缩有三种最常用的方法:
模型剪枝
模型量化
知识蒸馏

下面我们分别来通俗地讲讲它们是什么、怎么做的、为什么有用。


二、模型剪枝(Model Pruning)——“砍掉不重要的部分”

定义:

模型剪枝是指通过移除神经网络中“不重要”的权重连接或通道,从而减少模型大小和计算量的方法。想象你有一台超级豪华的电脑,里面有很多复杂的部件。有些零件非常重要(比如 CPU 和显卡),有些其实可有可无(比如多余的风扇、装饰灯)。模型剪枝就像是在做“减法”——把那些不太重要的部分删掉,让整台电脑更轻便,性能也差不多。

核心原理:

核心原理:

  • 权重剪枝:神经网络中有成千上万的连接(权重),其中一些对结果影响很小,移除接近零的权重,影响不大;
  • 通道剪枝(Channel Pruning):移除卷积层中影响较小的通道;
  • 结构化剪枝 vs 非结构化剪枝
    • 结构化剪枝:剪掉整个通道或层,便于硬件加速;
    • 非结构化剪枝:剪掉任意位置的权重,压缩效果更强但难以加速;

必要性:

  • 减少模型体积,利于部署;
  • 提高推理速度,降低内存占用;
  • 在有限算力设备上运行大模型;

举个例子:

你有一个 YOLOv8s 模型,它本来有 100 层。经过分析发现其中有 10 层几乎没用,那我们就直接删掉这 10 层,剩下的 90 层再训练(微调)一下,就能得到一个更快、更小的模型!


三、模型量化(Model Quantization)——“用更少的比特表示同样的信息”

定义:

模型量化是将模型中的浮点数(FP32)转换为低精度表示(如 INT8、FP16)的过程,从而减少模型大小并提升推理速度。你在学校考试时,满分是 100 分,但有时候老师会说:“60 分以上就算及格”。也就是说,你并不需要精确到每个分数,只要知道大致等级就可以了。
模型量化也是类似的思想:我们不需要用“32位浮点数”这么高精度的数字来表示神经网络中的参数,可以用“8位整数”代替,这样计算更快、占用空间更小。
一句话总结:模型量化 = 用更小的数字类型表达原来的模型,减少存储和计算量。

核心原理:

  • 训练感知量化(QAT, Quantization-Aware Training)
    • 在训练过程中模拟量化过程,使模型适应低精度;
  • 后训练量化(PTQ, Post-Training Quantization)
    • 不需要重新训练,直接对已训练好的模型进行量化,把原本使用 32 位浮点数(FP32)的参数,转换为 8 位整数(INT8);;
  • 校准机制:使用少量数据统计激活值范围,用于量化映射;

必要性:

  • 显著减少模型体积(INT8 相比 FP32 可减少 4 倍);
  • 提升推理速度(INT8 运算更快);
  • 支持嵌入式平台(如 Jetson Nano、树莓派)部署;

举个例子:

一个 FP32 的数字占用 4 字节,而一个 INT8 的数字只占 1 字节。如果你把整个模型从 FP32 转成 INT8,那模型体积就缩小了 4 倍,推理速度也提升了 2~3 倍!
一般的操作方式如下:

# 示例:使用 TorchVision 导出 ResNet 为 ONNX 并量化
import torch
from torchvision import modelsmodel = models.resnet18(pretrained=True)
dummy_input = torch.randn(1, 3, 224, 224)torch.onnx.export(model, dummy_input, "resnet18.onnx")# 使用 ONNX Runtime 进行量化
from onnxruntime.quantization import quantize_dynamic, QuantTypequantize_dynamic(model_input="resnet18.onnx",model_output="resnet18_quantized.onnx",weight_type=QuantType.QInt8
)

四、知识蒸馏(Knowledge Distillation)——“学生模仿老师的学习方法”

定义:

知识蒸馏是一种模型压缩技术,其核心思想是让一个小模型(学生模型)模仿一个大模型(教师模型)的行为,从而获得更优的性能。你是一个小学生,正在学数学题。你可以自己慢慢摸索,也可以找一个成绩很好的同学当老师,他怎么做题你就跟着学。这样你就能快速学会解题技巧,虽然你不如老师厉害,但能做得还不错。
知识蒸馏就是这个道理:我们用一个小模型去模仿一个大模型的行为,从而提升小模型的能力。
一句话总结:知识蒸馏 = 让小模型模仿大模型的行为,从而获得更好的性能。

核心原理:

  • 先训练一个强大的大模型(叫教师模型,教师模型输出 soft labels(概率分布);
  • 然后让一个小模型(叫学生模型)去学习大模型的输出,学生模型同时学习 hard label(真实标签)和 soft labels;
  • 学生不仅学正确答案,还学大模型给出的“置信度”,使用 KL 散度等衡量两者输出差异,最终学生模型就可以学到老师的“经验”,表现得更好;
  • 公式示例:

L t o t a l = α ⋅ L h a r d + ( 1 − α ) ⋅ T 2 ⋅ L s o f t \mathcal{L}_{total} = \alpha \cdot \mathcal{L}_{hard} + (1 - \alpha) \cdot T^2 \cdot \mathcal{L}_{soft} Ltotal=αLhard+(1α)T2Lsoft

其中 T 是温度系数, α \alpha α控制 hard label 的权重。

必要性:

  • 小模型通常泛化能力差,蒸馏能显著提升性能;
  • 可用于压缩 DETR、Vision Transformer 等复杂模型;
  • 适合资源受限的部署环境;

举个例子:

你想做一个能在手机上运行的目标检测模型,但是手机算力有限。你可以先训练一个大模型(如 YOLOv8l),然后让学生模型(如 YOLOv8n)去模仿它。这样即使学生模型很小,也能做出不错的结果。


五、三者对比:区别与关联性

维度模型剪枝模型量化知识蒸馏
目的减少参数数量减少计算精度提升小模型性能
核心操作删除冗余权重或通道将 FP32 → INT8/FP16小模型模仿大模型
是否改变结构✅(剪枝可能删除层)
是否需要微调
是否依赖教师模型
部署友好度✅(结构化剪枝)✅(INT8 加速明显)✅(蒸馏后模型可进一步压缩)

关联性总结:

  • 剪枝 + 量化:先剪枝再量化,双重压缩;
  • 蒸馏 + 量化:先蒸馏得到高性能小模型,再量化部署;
  • 剪枝 + 蒸馏:剪枝后的模型可通过蒸馏恢复精度;
  • 三者结合:可用于构建极致轻量、高性能、易部署的小模型(如 Tiny-YOLO、MobileViT 蒸馏模型);

六、实战应用指南:如何利用三者提升模型性能与部署效率?

场景一:YOLOv8 部署优化

步骤:
  1. 模型剪枝:对骨干网络进行通道剪枝,减少参数;
  2. 知识蒸馏:用 YOLOv8l 蒸馏 YOLOv8s,提升小模型精度;
  3. 模型量化:将剪枝+蒸馏后的模型导出为 INT8;
  4. 部署:使用 TensorRT / OpenVINO 部署,实现毫秒级推理;

💡 效果:相比原模型,推理速度提升 2x,模型大小缩小 4x,精度下降 < 1%。


场景二:Vision Transformer 压缩部署

步骤:
  1. 知识蒸馏:使用 DeiT 蒸馏出 MobileViT;
  2. 模型剪枝:对注意力头或 MLP 中的部分通道进行剪枝;
  3. 模型量化:将 ViT 转换为 INT8 模型;
  4. 部署:使用 ONNX Runtime 或 NCNN 部署到手机端;

💡 效果:Transformer 模型在移动端部署不再是难题。


场景三:工业质检中的模型轻量化部署

步骤:
  1. 原始模型:ResNet-101;
  2. 知识蒸馏:蒸馏为 ShuffleNet;
  3. 模型剪枝:对 ShuffleNet 进行通道剪枝;
  4. 模型量化:导出为 INT8;
  5. 部署:使用 TensorRT 加速,在产线摄像头中部署;

💡 效果:从 177M 参数 → 1.2M 参数,推理速度从 10 FPS → 60 FPS。


七、推荐实践路线图

[大模型] ↓(剪枝)
[轻量模型]↓(量化)
[INT8/FP16 模型]↓(蒸馏)
[高性能小模型]↓(部署)
[ONNX / TensorRT / CoreML]

八、结语:模型压缩是迈向落地的关键一步

在实际工程中,我们往往不会只使用一种压缩技术,而是多种方法协同使用,例如:

  • 先剪枝再量化;
  • 蒸馏 + 量化;
  • 剪枝 + 蒸馏 + 量化;

相关文章:

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...