网络压缩之参数量化(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

相关文章

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.

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4