活动介绍

神经网络量化:原理、方法与实践

立即解锁
发布时间: 2025-08-29 11:17:02 阅读量: 16 订阅数: 18 AIGC
### 神经网络量化:原理、方法与实践 #### 1. 量化粒度 在神经网络量化中,量化粒度是一个重要的概念。目前,常见的量化方式是为每个张量定义一组量化参数(量化器),分别用于权重和激活值,这被称为逐张量量化。在公式 11.5 中可以看到这种量化方式的体现。 不过,我们也可以为张量的各个分段(例如权重张量的输出通道)定义单独的量化器,从而提高量化粒度。在神经网络量化里,逐张量量化因其硬件实现较为简单,是最常用的粒度选择。在公式 11.5 中,所有累加器都使用相同的比例因子 swsx。 然而,增加量化粒度可以提升性能。例如,对于权重张量,我们可以为每个输出通道指定不同的量化器,这就是逐通道量化。逐通道量化在某些情况下能显著提高量化的准确性,尤其是当权重在不同通道间的分布差异较大时。但需要注意的是,并非所有硬件都支持逐通道量化,所以在选择目标设备时,需要确认其支持情况。 还有一些研究尝试超越逐通道量化,为一组权重或激活值应用单独的量化器。虽然增加分组的粒度通常能提高准确性,但会带来一些额外的开销,因为累加器需要处理具有不同比例因子的值的总和。目前,大多数现有的定点加速器并不支持这种逻辑,但随着该领域研究的发展,未来有望看到更多硬件对这些方法的支持。 #### 2. 量化模拟 为了测试神经网络在量化设备上的运行效果,我们通常会在用于训练神经网络的通用硬件上模拟量化行为,这就是量化模拟。其目的是使用浮点硬件来近似定点运算。与在实际量化硬件上进行实验或使用量化内核相比,量化模拟的实现要简单得多。它允许用户高效地测试各种量化选项,并为量化感知训练提供 GPU 加速。 在模拟过程中,我们需要考虑实际设备推理和模拟推理的差异。在实际设备推理中,硬件的所有输入(偏置、权重和输入激活值)都是定点格式。但在使用常见的深度学习框架和通用硬件进行量化模拟时,这些量是浮点格式。因此,我们在计算图中引入量化器块来模拟量化效果。 例如,在卷积层的模拟中,我们在权重和卷积之间添加量化器块来模拟权重量化,在激活函数之后添加量化器块来模拟激活量化。偏置通常不进行量化,因为它以更高的精度存储。量化器块实现了公式 11.9 的量化函数,每个量化器由一组量化参数(比例因子、零点、位宽)定义。量化器的输入和输出都是浮点格式,但输出位于量化网格上。 #### 3. 批量归一化折叠 批量归一化层是大多数现代计算机视觉神经网络的标准组件。它在添加比例和偏移之前对线性层的输出进行归一化。在设备推理中,这些操作会被折叠到前一个或下一个线性层中,这一步骤称为批量归一化折叠。 批量归一化折叠可以完全从网络中移除批量归一化操作,因为计算被吸收到线性层中。这样做不仅减少了额外的缩放和偏移计算开销,还避免了额外的数据移动和层输出的量化。 假设一个权重矩阵 $W \in R^{n×m}$,对每个输出 $y_k$($k = {1, ..., n}$)应用批量归一化,我们可以将批量归一化操作与线性层融合,得到新的权重和偏置。具体公式如下: - 批量归一化公式:$BatchNorm(x) = \gamma \left( \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \right) + \beta$ - 融合后的公式:$y_k = \tilde{W}_{k,:} x + \tilde{b}_k$ 其中,$\tilde{W}_{k,:} = \frac{\gamma_k W_{k,:}}{\sqrt{\sigma^2_k + \epsilon}}$,$\tilde{b}_k = \beta_k - \frac{\gamma_k \mu_k}{\sqrt{\sigma^2_k + \epsilon}}$ #### 4. 激活函数融合 在简单的量化加速器中,激活值的重新量化通常在矩阵乘法或卷积输出值计算之后进行。但在实际应用中,线性操作之后通常紧接着一个非线性操作。如果将线性层的激活值写入内存,然后再加载回计算核心以应用非线性操作,会造成资源浪费。 因此,许多硬件解决方案配备了一个硬件单元,在重新量化步骤之前应用非线性操作。在这种情况下,我们只需要模拟非线性操作之后的重新量化。例如,ReLU 非线性可以很容易地通过重新量化块来建模,只需将该激活量化的最小可表示值设置为 0。 然而,对于一些更复杂的激活函数,如 sigmoid 或 Swish 函数,需要更专门的支持。如果没有这种支持,我们需要在图中的非线性操作之前和之后添加量化步骤,这可能会对量化模拟的准确性产生很大影响。虽然像 Swish 函数这样的新激活函数在浮点运算中能提高准确性,但在定点硬件上部署可能会很困难且效率低下。 #### 5. 其他层的量化 神经网络中还有许多其他类型的层,它们的量化建模很大程度上取决于具体的硬件实现。有时,模拟量化和目标设备性能之间的不匹配是由于某些层没有被正确量化导致的。以下是一些常见层的量化模拟指导: - **最大池化**:由于输入和输出值位于相同的量化网格上,因此不需要进行激活量化。 - **平均池化**:整数的平均值不一定是整数,所以在平均池化之后需要进行量化步骤。但由于量化范围不变,我们对输入和输出使用相同的量化器。 - **逐元素加法**:尽管这个操作看似简单,但准确模拟却很困难。在加法过程中,两个输入的量化范围必须完全匹配。如果范围不匹配,需要额外的处理来确保加法按预期工作。目前没有单一的公认解决方案,但添加重新量化步骤可以粗略地模拟添加的噪声。另一种方法是通过绑定输入的量化网格来优化网络,这可以避免重新量化步骤,但可能需要微调。 - **拼接**:被拼接的两个分支通常不共享相同的量化参数,这意味着它们的量化网格可能不重叠,因此需要进行重新量化步骤。与逐元素加法类似,也可以优化网络,使拼接的分支具有共享的量化参数。 #### 6. 实际考虑因素 在对多层神经网络进行量化时,我们面临着众多的量化选择,包括量化方案、粒度、位宽等。为了缩小搜索空间,我们需要考虑一些实际因素。 ##### 6.1 对称与非对称量化 在每个权重和激活量化步骤中,我们需要选择量化方案。非对称量化由于有一个额外的偏移参数,表达能力更强,但可能会带来计算开销。例如,当非对称权重 $\tilde{W} = s_w(W_{int} - z_w)$ 与非对称激活 $\tilde{x} = s_x(x_{int} - z_x)$ 相乘时,会产生额外的计算项。 $\tilde{W}\tilde{x} = s_w s_x W_{int} x_{int} - s_w s_x z_w x_{int} - s_w s_x W_{int} z_x + s_w s_x z_w z_x$ 其中,第一项与对称格式下的计算相同,第三项和第四项只取决于已知的比例、偏移和权重值,可以预先计算并添加到层的偏置项中,几乎不产生额外成本。但第二项取决于输入数据 $x$,这意味着在每次推理时,对于每一批数据都需要计算一个额外的项,这会导致显著的延迟和功耗开销,相当于添加了一个额外的通道。因此,常见的做法是对激活使用非对称量化,对权重使用对称量化。 ##### 6.2 逐张量和逐通道量化 逐张量量化在一段时间内一直是权重和激活量化的标准方法,因为它得到了所有量化推理加速器的支持。但逐通道量化的权重可以提高准确性,特别是当权重在不同通道间的分布差异较大时。从公式 11.5 的量化 MAC 操作中可以看出,每个累加器可以应用单独的权重比例因子来实现逐通道权重量化。然而,激活的逐通道量化实现起来要困难得多,因为我们无法从求和中提取比例因子。 以下是不同量化范围设置方法在权重和激活量化上的比较表格: | 方法 | ResNet18 (W8) | ResNet18 (W6) | ResNet18 (W4) | MobileNetV2 (W8) | MobileNetV2 (W6) | MobileNetV2 (W4) | | --- | -
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

模型生产化:从本地部署到云端容器化

# 模型生产化:从本地部署到云端容器化 ## 1. 引入 FastAPI 在将模型投入生产的过程中,我们首先要安装 FastAPI。由于 FastAPI 是一个 Python 模块,我们可以使用 pip 进行安装。打开一个新的终端,运行以下命令: ```bash $ pip install fastapi uvicorn aiofiles jinja2 ``` 这里我们安装了一些 FastAPI 所需的额外依赖项。uvicorn 是一个用于设置 API 的底层服务器/应用程序接口,而 aiofiles 则使服务器能够异步处理请求,例如同时接受和响应多个独立的并行请求。这两个模块是 FastA

强化学习与合成数据生成:UnityML-Agents深度解析

# 强化学习与合成数据生成:Unity ML - Agents 深度解析 ## 1. 好奇心奖励与超参数设置 在强化学习中,为了激发智能体的好奇心,可以传递与外在奖励相同的超参数。具体如下: - **好奇心奖励信号超参数**: - `reward_signals->curiosity->strength`:用于平衡好奇心奖励与其他奖励(如外在奖励)的缩放系数,取值范围在 0.0 到 1.0 之间。 - `reward_signals->curiosity->gamma`:根据奖励实现所需的时间来调整奖励感知价值的第二个缩放系数,与外在奖励的 `gamma` 类似,取值范围也在

多视图检测与多模态数据融合实验研究

# 多视图检测与多模态数据融合实验研究 ## 1. 多视图检测实验 ### 1.1 实验数据集 实验参考了Wildtrack数据集和MultiviewX数据集,这两个数据集的特点如下表所示: | 数据集 | 相机数量 | 分辨率 | 帧数 | 区域面积 | | ---- | ---- | ---- | ---- | ---- | | Wildtrack | 7 | 1080×1920 | 400 | 12×36 m² | | MultiviewX | 6 | 1080×1920 | 400 | 16×25 m² | ### 1.2 评估指标 为了评估算法,使用了精度(Precision)、

模糊推理系统对象介绍

# 模糊推理系统对象介绍 ## 1. fistree 对象 ### 1.1 概述 fistree 对象用于表示相互连接的模糊推理系统树。通过它可以创建一个相互关联的模糊推理系统网络。 ### 1.2 创建方法 可以使用以下语法创建 fistree 对象: ```matlab fisTree = fistree(fis,connections) fisTree = fistree( ___ ,'DisableStructuralChecks',disableChecks) ``` - `fisTree = fistree(fis,connections)`:创建一个相互连接的模糊推理系统对象

二维和三维偏微分方程耦合求解及生命科学中常微分方程问题的解决

### 二维和三维偏微分方程耦合求解及生命科学中常微分方程问题的解决 #### 1. 二维和三维偏微分方程耦合求解 在求解二维和三维偏微分方程时,有几个具体的问题和解决方法值得探讨。 ##### 1.1 获取相同网格点的 v 值 要在与 u 相同的网格点上获取 v 值,可以输入以下命令: ```matlab >> T_table=tri2grid(p,t,u(length(p)+1:end,end),x,y) ``` 示例结果如下: ``` T_table = 0.6579 0.5915 0.5968 0.6582 0 0.6042 0.4892 0.5073 0.6234 0 0.543

利用Kaen实现PyTorch分布式训练及超参数优化

### 利用Kaen实现PyTorch分布式训练及超参数优化 #### 1. 启用PyTorch分布式训练支持 在进行模型训练时,我们可以使用Kaen框架来支持PyTorch的分布式训练。以下是相关代码示例: ```python train_glob = os.environ['KAEN_OSDS_TRAIN_GLOB'] if 'KAEN_OSDS_TRAIN_GLOB' in os.environ else 'https://raw.githubusercontent.com/osipov/smlbook/master/train.csv' val_glob = os.environ['

PyTorch神经网络构建与训练全解析

### PyTorch 神经网络构建与训练全解析 #### 1. 特征标准化 在很多情况下,对特征进行标准化是一个很好的做法,即使并非总是必要(例如当所有特征都是二元特征时)。标准化的目的是让每个特征的值具有均值为 0 和标准差为 1 的特性。使用 scikit-learn 的 `StandardScaler` 可以轻松完成这一操作。 然而,如果你在创建了 `requires_grad=True` 的张量后需要进行标准化操作,就需要在 PyTorch 中直接实现,以免破坏计算图。以下是在 PyTorch 中实现特征标准化的代码: ```python import torch # Creat

电力电子中的Simulink应用:锁相环、静止无功补偿器与变流器建模

# 电力电子中的Simulink应用:锁相环、静止无功补偿器与变流器建模 ## 1. 锁相环(PLL) ### 1.1 锁相环原理 锁相环(PLL)是一种控制算法,用于确定正弦输入的频率和相位角。它主要用于两个系统之间的频率匹配,匹配完成后会存在一个恒定的相位差,从而实现相位“锁定”。PLL由相位检测机制、PID控制器和用于生成相位角信息的振荡器组成。此外,系统中还包含一个低通滤波器,用于获取正弦输入的频率信息。在柔性交流输电系统(FACTS)设备中,PLL增益对稳定系统性能起着至关重要的作用。 ### 1.2 Simulink环境下的PLL设置 为了直观展示PLL如何反映频率和相位的变化

使用PyTorch构建电影推荐系统

### 使用 PyTorch 构建电影推荐系统 在当今数字化时代,推荐系统在各个领域都发挥着至关重要的作用,尤其是在电影推荐领域。本文将详细介绍如何使用 PyTorch 构建一个电影推荐系统,从数据处理到模型训练,再到最终的推荐生成,为你呈现一个完整的推荐系统构建流程。 #### 1. 数据探索与处理 首先,我们需要对 MovieLens 数据集进行探索和处理。该数据集包含用户对电影的评分信息,其中存在一些缺失的评分值,用 NaN 表示。我们的目标是利用非空评分训练推荐系统,并预测这些缺失的评分,从而为每个用户生成电影推荐。 以下是处理数据集的代码: ```python import p

利用PyTorch进行快速原型开发

### 利用 PyTorch 进行快速原型开发 在深度学习领域,快速搭建和验证模型是非常重要的。本文将介绍两个基于 PyTorch 的高级库:fast.ai 和 PyTorch Lightning,它们可以帮助我们更高效地进行模型的训练和评估。 #### 1. 使用 fast.ai 进行模型训练和评估 fast.ai 是一个基于 PyTorch 的高级库,它可以让我们在几分钟内完成模型的训练设置。下面是使用 fast.ai 训练和评估手写数字分类模型的步骤: ##### 1.1 模型训练日志分析 在训练过程中,我们可以看到冻结网络的第一个训练周期,然后是解冻网络的两个后续训练周期。日志中