96SEO 2026-02-20 07:58 19
。

这些模型可能包含数十亿个参数#xff0c;通常需要配备大量显存的GPU来加速推理过程。
因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。
在这一领域中LLMs通常因为体积过大而无法在消费级硬件上运行。
这些模型可能包含数十亿个参数通常需要配备大量显存的GPU来加速推理过程。
因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。
在这一领域中一个主要的技术被称为量化。
在这篇文章中我将在语言建模的背景下介绍量化并逐一探讨各个概念探索各种方法论、用例以及量化背后的原理。
大型语言模型之所以得名是因为它们包含的参数数量。
这些模型通常拥有数十亿个参数存储这些参数可能相当昂贵。
所以我们希望尽可能有效地表示数十亿个数值最小化存储给定值所需的空间。
在计算机科学中一个给定的数值通常表示为浮点数或称为浮点即带有小数点的正数或负数。
这些数值由“位”或二进制数字表示。
IEEE-754标准描述了如何使用位来表示一个值的三个功能之一符号、指数或小数部分或称尾数。
range而两个相邻数值之间的距离被称为精度precision。
这些位的一个巧妙特性是我们可以计算设备存储给定值需要多少内存。
由于一字节内存中有8位我们可以为大多数形式的浮点表示创建一个基本公式。
实际上在推理过程中需要的VRAM量还与上下文大小和架构等因素有关。
但是这部分影响比较小我们暂时忽略不计。
现在假设我们有一个模型包含700亿个参数。
大多数模型默认使用32位浮点数通常称为全精度表示仅加载模型就需要280GB的内存。
因此最小化表示模型参数的位数包括在训练期间变得非常重要。
但是随着精度的降低模型的准确性通常也会下降。
所以我们希望在保持准确性的同时减少表示数值的位数……这就是量化的用武之地
量化旨在将模型参数的精度从高位宽如32位浮点数降低到低位宽如8位整数。
在减少表示原始参数的位数时通常会有一些精度细粒度的损失。
为了说明这种效应我们可以拿任何一幅图像仅使用8种颜色来表示它。
放大部分看起来比原图更“粗糙”因为我们用更少的颜色来表示它。
量化的主要目标是在尽可能保持原始参数的精度的同时减少表示原始参数所需的位数颜色。
首先让我们来看看常见的数据类型以及使用它们替代32位称为全精度或FP32表示的影响。
为了获得与原始FP32相似的数值范围后来又引入了一种名为bfloat
BF16使用与FP16相同的位数但可以表示更广泛的数值范围常用于深度学习应用中。
当我们进一步减少位数时我们接近基于整数的表示而不是浮点表示。
例如从FP32转换到只有8位的INT8结果是原始位数的四分之一
根据硬件不同基于整数的计算可能比浮点计算更快但这并不总是如此使用更少的位进行计算通常会更快。
每次减少位数时都会执行一个映射将初始的FP32表示“压缩”到较低的位数中。
3.4e38]映射到INT8。
我们只需要找到一种方法将我们数据的范围模型的参数的最大值和最小值内映射到INT8。
在对称量化中原始浮点值的范围被映射到量化空间中以零为中心的对称范围。
在之前的例子中注意量化前后的范围如何保持围绕零对称。
为了检索原始的FP32值我们可以使用先前计算的缩放因子(*s)来去量化量化值。
这通常被称为量化误差我们可以通过找出原始值和反量化值之间的差异来计算这一误差。
与对称量化不同的是非对称量化不是围绕零对称的。
它将浮点范围中的最小值β和最大值α映射到量化范围的最小值和最大值。
看到0的位置如何发生了变化吗这就是为什么它被称为非对称量化。
在范围[-7.59,
由于其位置的偏移我们必须为INT8范围计算零点才能执行线性映射。
像之前一样也必须计算一个比例因子s。
由于需要计算INT8范围内的零点z来移动权重这个过程略显复杂。
为了将从INT8量化的数据反量化回FP32需要使用之前计算的比例因子s和零点z。
在之前的例子中探讨了如何将给定向量中的值范围映射到较低位的表示。
尽管这允许将向量值的完整范围映射出来但它带来了一个主要的缺点即异常值。
其中一个值比其他所有值都大得多可以被认为是一个异常值。
如果我们要映射这个向量的完整范围所有小的值都会被映射到相同的较低位表示并且失去它们的区分因素
这就是我们之前使用的absmax方法。
如果我们不应用裁剪非对称量化也会发生同样的行为。
所以我们可以选择裁剪某些值。
裁剪涉及设置原始值的不同动态范围使得所有异常值获得相同的值。
5]那么所有超出该范围的值将被映射到-127或127无论它们的实际值如何
其主要优点是显著降低了“非异常值”的量化误差。
但是会导致离群值的量化误差增大。
5]任意范围的简单方法。
选择这个范围的过程被称为校准其目的是找到一个范围包括尽可能多的值同时最小化量化误差。
我们可以将LLM的权重和偏置视为静态值因为在运行模型之前就已知这些值。
例如Llama
由于偏置的数量百万级远少于权重十亿级偏置通常保持较高的精度如INT16量化的主要工作集中在权重上。
手动选择输入范围的百分位数优化原始权重和量化权重之间的均方误差MSE最小化原始值和量化值之间的熵KL散度
这些值被称为激活因为它们通常会通过某些激活函数如sigmoid或relu。
与权重不同激活会随着在推理过程中输入模型的每个数据而变化这使得准确量化它们变得具有挑战性。
由于这些值在每个隐藏层之后更新所以只有在输入数据通过模型时才能知道它们在推理过程中的状态。
训练后量化PTQ——在训练之后进行量化量化感知训练QAT——在训练/微调期间进行量化
最有名的量化技术之一是训练后量化PTQ。
它涉及在训练模型之后对模型的参数包括权重和激活进行量化。
权重的量化使用对称量化或非对称量化来执行。
但是激活的量化需要推断模型以获取它们的潜在分布因为我们不知道它们的范围。
然后使用这些激活值的分布来计算量化输出所需的零点z和比例因子s值
与动态量化不同静态量化不是在推理过程中而是在之前计算零点z和比例因子s。
为了找到这些值需要使用一个校准数据集将其提供给模型以收集这些潜在的分布。
值因此可能更准确。
但是这会大大增加计算时间因为需要计算这些值。
将量化位数降低到低于8位已被证明是一项艰巨的任务因为每减少一位量化误差都会增加。
但是有几种灵巧的方法可以将位数减少到6位、4位甚至2位尽管通常不建议使用这些方法将位数降低到低于4位。
在这个逐层量化过程中它首先将层的权重转换为逆-赫塞矩阵Hessian。
赫塞矩阵是模型损失函数的二阶导数它告诉我们模型输出对每个权重变化的敏感度。
它本质上展示了每个权重在层中的逆重要性。
与赫塞矩阵中较小值相关联的权重更为关键因为这些权重的小变化可能会导致模型性能的显著变化。
在逆-赫塞矩阵中较低的值表示更“重要”的权重。
我们对权重矩阵中的第一行的权重进行量化然后反量化
这个过程允许我们计算量化误差q我们可以使用之前计算的逆赫塞h_1来加权这个量化误差。
接下来需要将这个加权量化误差重新分配到行中的其他权重上。
这有助于维持网络的整体功能和输出。
.3x_2这样做我们会将量化误差q乘以第二个权重的逆赫塞h_2
这个方法之所以行之有效是因为权重通常是相互关联的。
所以当一个权重发生量化误差时相关的权重会相应地更新通过逆赫塞。
虽然GPTQ是一个在GPU上运行完整LLM的出色量化方法但我们可能没有那么强大的GPU。
所以可以使用GGUF将LLM的任何层卸载到CPU上。
这可以在VRAM不足的情况下同时使用CPU和GPU。
GGUF的量化方法经常更新可能取决于位量化的级别。
我们这里总结一般的原则。
首先给定层的权重被分割成包含一组“子”块的“超级”块。
从这些块中我们提取比例因子s和alphaα
为了量化给定的“子”块可以使用之前使用过的absmax量化。
记住它将给定的权重乘以比例因子**(s)**
比例因子是使用“子”块的信息计算的但使用“超级”块的信息量化后者拥有自己的比例因子
这种块量化使用“超级”块的比例因子s_super来量化“子”块的比例因子s_sub。
每个比例因子的量化级别可能不同“超级”块通常具有比“子”块的比例因子更高的精度。
根据量化类型可能需要一个额外的最小值m来调整零点。
这些与比例因子s)一样被量化。
上面我们已经介绍了如何在训练之后量化一个模型。
这种方法的一个缺点是量化并不考虑实际的训练过程。
而量化感知训练QAT与训练后量化PTQ在模型训练完成之后进行量化不同QAT旨在在训练期间学习量化过程。
QAT通常比PTQ更精确因为量化过程已在训练中被考虑。
其工作原理如下
在训练过程中引入所谓的“假”量化。
这是一个首先将权重量化为例如INT4然后再反量化回FP32的过程
这个过程允许模型在训练、损失计算和权重更新过程中考虑量化过程。
QAT试图探索损失中的“宽”极小值以最小化量化误差因为“窄”极小值往往会导致较大的量化误差。
例如假设我们在反向传播过程中没有考虑量化。
根据梯度下降选择损失最小的权重。
如果它处于“窄”极小值那将引入更大的量化误差。
如果我们考虑量化将在一个“宽”极小值中选择一个不同的更新权重其量化误差将大大降低。
所以尽管PTQ在高精度例如FP32中有更低的损失但QAT在低精度例如INT4中会获得更低的损失
正如我们之前看到的量化到4位已经相当小了但如果我们进一步减少呢
这就是BitNet的用武之地它使用**-1或1**来表示模型权重的单一位。
它通过将量化过程直接注入到Transformer
这些线性层通常用更高的精度表示如FP16并且是大多数权重所在的地方。
而BitNet用它们称为BitLinear的东西替换了这些线性层
BitLinear层的工作方式与普通线性层相同根据权重乘以激活来计算输出。
但是BitLinear层使用1位来表示模型的权重并使用INT8来表示激活
BitLinear层如量化感知训练(QAT)在训练期间执行一种“假”量化形式以分析权重和激活量化的效果:
这种方法显著减少了模型的存储和计算需求使得在资源受限的环境中部署大型语言模型变得可行。
同时通过这种极端的量化方法BitNet在维持性能的同时大幅降低了能耗和运行成本
在论文中他们使用γ而不是α但由于我们在这个示例中使用了a所以我继续使用这个名词。
另外请β与我们在零点量化中使用的不同是平均绝对值。
在训练过程中权重存储在INT8中然后使用一种称为符号函数的基本策略将其量化为1位。
它将权重的分布移动到以0为中心然后将0左边的所有值赋值为-1右边的所有值赋值为1
为了量化激活值BitLinear使用absmax量化将激活值从FP16转换为INT8因为在矩阵乘法×中它们需要更高的精度。
1。
使用这种方法作者观察到随着模型大小的增长1位和FP16训练之间的性能差距变得越来越小。
被引入以改进之前提到的扩展问题。
在这种新方法中每个权重不再只是
首先让我们回顾一般的矩阵乘法是如何工作的。
在计算输出时将一个权重矩阵乘以一个输入向量。
下面可视化了第一层权重矩阵的第一次乘法
通过使用三元权重基本上可以避免乘法操作因为三元权重本质上告诉你以下信息
通过将给定的权重设置为0就可以忽略它而不是像1位表示那样要么添加要么减去权重。
它简单地压缩权重的分布并使用绝对平均值α来量化值。
然后这些值被四舍五入为
本文深入探讨了量化技术在大型语言模型LLMs中的应用特别介绍了几种量化方法包括训练后量化PTQ、量化感知训练QAT、GPTQ、GGUF和BitNet。
量化技术通过减少模型的参数精度来降低存储和计算需求从而使模型能在资源受限的环境中高效运行。
PTQ和QAT分别在训练后和训练过程中实施量化以优化模型性能和减小量化误差。
GPTQ和GGUF则是针对特定硬件环境优化的量化策略如使用GPU或CPU。
特别值得一提的是BitNet和其进阶版本BitNet
1.58b它们通过将模型权重量化到极低的位数如1位和1.58位显著提升了计算效率并降低了模型体积。
希望这篇文章能让你更好地理解量化、GPTQ、GGUF和BitNet的潜力。
谁知道将来模型会变得多小呢
https://avoid.overfit.cn/post/11536319ad704103b39ec8da734eeb3c
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback