网络压缩之参数量化(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) 比较大的限制,它比较不容易过拟合,所以用二值权重反而可以达到防止过拟合的效果。

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

相关推荐
哥布林学者10 分钟前
深度学习进阶(十六) 混合注意力 CBAM
机器学习·ai
STLearner27 分钟前
SIGIR 2026 | LLM × Graph论文总结(图增强LLM,GraphRAG,Agent,多模态,知识图谱,搜索,推
人工智能·python·深度学习·神经网络·机器学习·数据挖掘·知识图谱
txzrxz34 分钟前
动态规划——背包问题
算法·动态规划
Yingye Zhu(HPXXZYY)37 分钟前
洛谷 P15553 [CCPC 2025 哈尔滨站] 液压机
算法
老陈说编程1 小时前
12. LangChain 6大核心调用方法:invoke/stream/batch同步异步全解析,新手也能轻松学会
开发语言·人工智能·python·深度学习·机器学习·ai·langchain
谭欣辰1 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法
m0_629494731 小时前
LeetCode 热题 100-----17.缺失的第一个正数
数据结构·算法·leetcode
Cando学算法1 小时前
鸽笼原理(抽屉原理)
c++·算法·学习方法
Tisfy1 小时前
LeetCode 0796.旋转字符串:暴力模拟
算法·leetcode·题解·模拟·字符串匹配
BlockChain8881 小时前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链