神经网络中的量化与蒸馏

本文将深入研究深度学习中精简模型的技术:量化和蒸馏

深度学习模型,特别是那些具有大量参数的模型,在资源受限环境中的部署几乎是不可能的。所以就出现了两种流行的技术,量化和蒸馏,它们都是可以使模型更加轻量级,而不会对性能造成太大影响。但是它们需要什么,它们又如何比较呢?

量化:牺牲精度换取效率

量化是关于数字精度的。通过减少模型中权重和激活的位宽度,缩小模型大小,从而潜在地提高推理速度。

神经网络有相互连接的神经元,每个神经元都有在训练过程中调整的权重和偏差。这些参数值一般存储在32位浮点数中,这样虽然保证了精度,但占用了大量内存。例如,一个50层的ResNet需要168MB来存储2600万32位权重值和1600万32位激活值。

量化旨在通过使用较低的位数(如8位整数)来表示权重和激活,来减少内存占用。但这引入了量化误差,所以量化的目标是在精度和内存使用之间取得平衡。像每通道量化、随机舍入和再训练这样的先进技术可以最大限度地减少对模型精度的影响。

最常见的两种量化情况是:float32 -> float16和float32 -> int8。

量化背后的数学理论:

上面公式提供了一种将实数转换为量化整数的简单且计算效率高的方法,使其成为许多量化方案中的流行选择。

如何量化机器学习模型?

训练后量化:这就像用一支普通的笔写整本书,在你写完之后,用一支更好的更细笔重写它,使它更小。你不需要改变故事的任何内容;只要把字改小一点就行了。这是非常容易的,但有时较小的文字可能更难阅读(这意味着神经网络的准确性可能会下降)。

量化感知训练:这就像从一开始就用一支好笔写书。当你写的时候,你会意识到字母应该有多小,所以你会在写的时候调整你的写作风格。这样最终小版本从一开始就更容易阅读,因为你一直在为小版本的书进行考虑(这意味着神经网络从一开始就被训练成可以很好地与更小的量化版本一起工作)。

在这两种情况下,目标都是使书(或神经网络)更小、更高效,同时又不失去故事的本质(或网络的准确性)。

优点:

  • 减小模型大小:例如,从32位浮点数转换为8位整数可以将模型大小减小四倍。
  • 速度和硬件兼容性:在特定的硬件加速器上,低精度的算法可以更快。
  • 内存效率:更少的数据意味着更少的内存带宽需求。

缺点

  • 准确性权衡:较低的精度有时会影响模型性能。
  • 实现挑战:量化,特别是量化感知训练,可能会很棘手。

蒸馏:老师到学生传递知识

蒸馏包括训练一个较小的神经网络(称为学生)来模仿一个更大的预训练网络(即教师)。

下面的举例我们都以书籍写作为例,这样可以更加清晰

从广义上讲,蒸馏有三种类型的分类:

离线蒸馏:一个作家正在从一本已经出版的成功的书中学习。出版的书(教师模型)是完整和固定的。新作者(学生模式)从这本书中学习,试图根据所获得的见解写出自己的作品。在神经网络的背景下,这就像使用一个经过充分训练的、复杂的神经网络来训练一个更简单、更有效的网络。学生网络从教师的既定知识中学习,而不修改它。

在线蒸馏:想象一个有作家和一个经验丰富的作家同时写他们的书。当经验丰富的作者开发新的章节(更新教师模型)时,新作者也会编写他们的章节(更新学生模型),并在此过程中向经验丰富的作者学习。这两本书同时写作,两个作者的作品相互启发。在神经网络中,这意味着同时训练教师和学生模型,让他们一起学习和适应,增强学生模型的学习过程。

自蒸馏:一本书作者既是老师又是学生。他以目前的技能水平开始写书。当他获得新的见解并提高写作水平时,会修改前面的章节。这是一种自学习的模式,作者根据自己不断发展的理解不断完善自己的作品。在神经网络中,这种方法涉及单个网络学习和自我改进,使用其更高级的层或后期的训练来增强其较早的层或初始阶段,有效地教会自己变得更高效和准确。

蒸馏背后的数学理论:

精馏的目的是尽量减少教师预测和学生预测之间的差异。这种散度最常用的度量是Kullback-Leibler散度:

优点

  • 大小灵活性:学生模型的架构或大小可以定制,从而在大小和性能之间提供平衡。
  • 精度更好:一个训练有素的学生模型可以达到接近老师的成绩,并且更小。

缺点

  • 再训练是必须的:与量化不同,蒸馏要求对学生模型进行再训练
  • 训练开销:训练学生模型需要时间和计算资源。

总结

量化通常在特定于硬件的部署中找到它的位置,而精馏则是在需要性能接近大型对应模型的轻量级模型时需要的方法。在许多情况下,两者可以结合——提炼一个模型,然后量化它——可以带来两个方法的好处。将选择与部署需求、可用资源以及在准确性和效率方面的可接受权衡相结合是至关重要的。

如果你对这两个技术感兴趣,请看这两篇综述

https://avoid.overfit.cn/post/f2c1456d33094a439903409792f75729

作者:Aaditya ura

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192115.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL8 绿色版安装

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: MySQL学习 ✨特色专栏: My…

Selenium浏览器自动化测试框架简单介绍

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google …

ARM Linux 基础学习 / 系统相关,文件系统,文件属性

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程&#xf…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版…

STM32——STM32F4系统架构

文章目录 前言STM32F4XX系统架构 前言 本篇文章为STM32F4系列的系统架构,因为最近在学习F4的板子,暂时先更F4的,有需要F1的后续再更新。 主系统由 32 位多层 AHB 总线矩阵构成,可实现以下部分的互连: STM32F4XX系统架…

Latex在图表标题里面引用参考文献时,出现参考文献顺序混乱的解决方案(适用于bibtex)

问题描述 如果你在figure环境的\caption或\captionof中使用\cite,但是参考文献的顺序仍然不正确,可能是因为LaTeX的处理流程导致了这个问题。 比如图片在第二章节但里面引用了参考文献,在文章末尾的参考文献第二章图片的参考文献顺序&#…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣(LeetCode) 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

kafka+ubuntu20.04+docker配置

记录一次配置过程 安装docker 参加下面链接的第一部分 Ubuntu20.04使用docker安装kafka服务-CSDN博客 安装zookeeper docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper安装kafka服务 docker run -d --name kafka …

序列化模块-json和pickle

一、json json是所有语言都通用的一种序列化格式 ,只支持 列表、 字典、 字符串、 数字 , 字典的key必须是字符串 1、dumps、loods # 在内存中做数据转换 : # durps 数据类型 转成 字符串 序列化 # loods 字符串 转成 数据类型 反序…

Postman for Mac(HTTP请求发送调试工具)v10.18.10官方版

Postman for mac是一个提供在MAC设备上功能强大的开发,监控和测试API的绝佳工具。非常适合开发人员去使用。此版本通过Interceptor添加了对请求捕获的支持,修正了使用上下文菜单操作未复制响应正文的问题和预请求脚本的垂直滚动条与自动完成下拉列表重叠…

桥接模式 rust和java的实现

文章目录 桥接模式介绍应用实例优点缺点使用场景关键角色 实现javarsut rust代码仓库 桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间…

大数据-之LibrA数据库系统告警处理(ALM-12045 网络读包丢包率超过阈值)

告警解释 系统每30秒周期性检测网络读包丢包率,并把实际丢包率和阈值(系统默认阈值0.5%)进行比较,当检测到网络读包丢包率连续多次(默认值为5)超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置…

【Python】【应用】Python应用之一行命令搭建http、ftp服务器

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Python应用&…

041:vue中 el-table每个单元格包含多个数据项处理

第041个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

基于SSM的超市积分管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

JavaWeb——HTML常用标签

目录 1. 标题标签 2. 段落标签 3. 换行/分割线标签 4. 列表标签 4.1. 有序列表 4.2. 无序列表 5. 超链接标签 6. 多媒体标签 6.1. img 图片标签 6.2. audio 音频标签 6.3. video 视频标签 7. 表格标签(重点) 8. 表单标签(重点) 1. 标题标签 …

vue3配置环境变量,小白简单易学

环境变量的意义就是防止我们更新打包的时候写错变量,合并代码这些一系列问题 首先看看效果 左边是本地测试环境,右边是打包后的生产环境,写这个环境变量的好处就是,你在本地开发的时候变量随便改,不会影响生产环境&am…

数字货币swap交易所逻辑系统开发分析方案

随着数字货币市场的快速发展, Swap交易所已成为一种重要的交易方式。本文将对数字货币Swap交易所逻辑系统开发进行分析,并探讨其优势、开发难点和解决方案。 一、数字货币Swap交易所逻辑系统开发的优势 数字货币Swap交易所是一种点对点的交易方式&#x…

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 (1)控制及状态寄存器 (2)重装载数值寄存器 (3)当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …

使用阿里云服务器学习Docker

首先我这里选择的系统服务器是CentOS 7.9 64位 因为centos系统里面的安装指令是:yum,而非apt-get. yum install docker -y试着建立一个容器: docker run -d -p 80:80 httpd启动docker的守护进程: sudo systemctl start docker 查看Docke…