网络压缩之参数量化(parameter quantization)

2024-09-01 03:04

本文主要是介绍网络压缩之参数量化(parameter quantization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        参数量化(parameter quantization)。参数量化是说能否只 用比较少的空间来储存一个参数。举个例子,现在存一个参数的时候可能是用64位或32位。 可能不需要这么高的精度,用16或8位就够了。所以参数量化最简单的做法就是,本来如果 存网络的时候,举例来说,我们是16个位存一个数值,现在改成8个位存一个数值。储存空 间,网络的大小直接就变成原来的一半,而且性能不会掉很多,甚至有时候把储存参数的精度 变低,结果还会稍微更好一点。还有一个再更进一步压缩参数的方法,即权重聚类(weight clustering。

        如图1 所示,举个例子,先对网络的参数做聚类,按照这个参数的数值来分群。数值 接近的放在一群,要分的群数会先事先设定好,比如设定好要分四群。比较相近的数字就被当 做是一群。每一群都只拿一个数值来表示它。比如黄色的群所有数字的平均值是−0.4,就用 −0.4 来代表所有黄色的参数。储存参数时,就只要记两个东西:一个是表格,这个表格是记 录说每一群代表的数值是多少。另外一个要记录的就是每一个参数属于哪一群。假设群的数 量设少一点,比如说设四群,这样只要两个位就可以存一个参数了。本来存一个参数可能要 16 位或8位,再进一步压缩到存一个参数只需要两个位就好。

图1 权重聚类

        其实还可以把参数再更进一步做压缩,使用哈夫曼编码(Huffmanencoding)。哈夫曼编 码的概念就是比较常出现的东西就用比较少的位来描述它,比较罕见的东西再用比较多的位 来描述它。这样的好处平均起来,储存数据需要的位的数量就变少了,所以这个就是哈夫曼编 码,所以可以用这些技巧来压缩参数,让我们储存每一个参数的时候需要的空间比较小,最终 可以压缩到只拿一个位来存每一个参数。

        网络里面的权重不是+1,就是−1。假设所有的权重只有正负1两种可能,每一个权重 只需要一个位就可以存下来了。像这样子的这种二值权重(binaryweight)的研究其实还蛮多 的,具体可相关论文。

        虽然二值网络(binary network)参数值不是 +1,就是 −1,但这个网络的性能不一定会 很差。二值网络里面的其中一个经典的方法,即二值连接(binary connect)。把二值连接这 个技术用在三个图像识别的问题上,从最简单的MNIST,还有稍微难一点的CIFAR-10以及SVHN 数据集。用二值连接结果居然是比较好的,所以用二值网络结果居然还比正常的网络 的性能好一点。用二值网络的时候,给了网络比较大的限制,给网络容量(networkcapacity) 比较大的限制,它比较不容易过拟合,所以用二值权重反而可以达到防止过拟合的效果。

        其实权重聚类有一个很简单的做法。权重聚类是需要在训练的时候就考虑的。但是 有一个简单的做法是,先把网络训练完,再直接做权重聚类。但这样直接做可能会导致 聚类后的参数跟原来的参数相差太大。所以有一个做法是在训练的时候,要求网络的 参数彼此之间比较接近。训练的量化可当做是损失的其中一个环节,直接塞到训练的 过程中,让训练的过程中达到参数有权重聚类的效果。

这篇关于网络压缩之参数量化(parameter quantization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125759

相关文章

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.