【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM

news2024/11/24 2:19:46
BitNet:用1-bit Transformer训练LLM
《BitNet: Scaling 1-bit Transformers for Large Language Models》

论文地址:https://arxiv.org/pdf/2310.11453.pdf

相关博客
【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM
【自然语言处理】BitNet b1.58:1bit LLM时代
【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer
【自然语言处理】【大模型】MPT模型结构源码解析(单机版)
【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)
【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)

一、简介

​ 语言模型的规模不断扩大,这对部署带来了巨大的挑战。本文设计了一种可扩展且稳定的1-bit Transformer架构来实现大语言模型,称为BitNet。具体来说,使用BitLinear作为标准nn的替代品。实验结果表明BitNet能够显著减少存储占用和能力消耗,并且与最先进的8-bit量化和FP16 Transformer能力相当。此外,BitNet也表现出了类似于全精度Transformer的scaling law,这也表明其有潜力在保持效率和性能的同时,能够更加有效的扩展至更大的语言模型。

二、BitNet

在这里插入图片描述

​ BitNet采用与Transformer相同的布局,但是采用BitLinear而不是标准的矩阵乘法,其他组件仍保持高精度。原因如下:(1) 残差连接和Layer Normalization的计算代价对于LLM可以忽略不计;(2) 随着模型增大,QKV变换的计算代价远小于投影;(3) 保留输入/输出嵌入层的精度,因为语言模型必须使用高精度来执行采样。

1. BitLinear

​ 在二值化前将权重中心化为0均值来增加有限数值范围的容量,然后使用sign函数将权重二值化为+1或-1。二值化后使用缩放因子 β \beta β来降低实值权重和二值化权重之间的 l 2 l2 l2误差。因此,二值化权重 W ∈ R n × m W\in\mathcal{R}^{n\times m} WRn×m可以形式化为:
W ~ = Sign ( W − α ) (1) \widetilde{W}=\text{Sign}(W-\alpha) \tag{1} \\ W =Sign(Wα)(1)

Sign ( W i j ) = { + 1 , if    W i j > 0 − 1 , if    W i j l e q 0 (2) \text{Sign}(W_{ij})=\begin{cases} +1,&&\text{if}\;W_{ij}>0 \\ -1,&&\text{if}\;W_{ij}leq 0 \\ \end{cases} \tag{2} \\ Sign(Wij)={+1,1,ifWij>0ifWijleq0(2)

α = 1 n m ∑ i j W i j (3) \alpha=\frac{1}{nm}\sum_{ij}W_{ij} \tag{3} \\ α=nm1ijWij(3)

接下来使用absmax将激活量化至b-bit,即乘以 Q b Q_b Qb再除以输入矩阵的最大绝对值,从而将激活缩放至 [ − Q b , Q b ] ( Q b = 2 b − 1 ) [-Q_b,Q_b](Q_b=2^{b-1}) [Qb,Qb](Qb=2b1)
x ~ = Quant ( x ) = Clip ( x × Q b γ , − Q b + ϵ , Q b − ϵ ) (4) \tilde{x}=\text{Quant}(x)=\text{Clip}(x\times\frac{Q_b}{\gamma},-Q_b+\epsilon,Q_b-\epsilon) \tag{4}\\ x~=Quant(x)=Clip(x×γQb,Qb+ϵ,Qbϵ)(4)

Clip ( x , a , b ) = max ⁡ ( a , min ⁡ ( b , x ) ) , γ = ∥ x ∥ ∞ (5) \text{Clip}(x,a,b)=\max(a,\min(b,x)),\quad\gamma=\parallel x\parallel_\infty \tag{5} \\ Clip(x,a,b)=max(a,min(b,x)),γ=∥x(5)

其中 ϵ \epsilon ϵ是防止裁剪时溢出的小浮点数。

​ 对于非线性函数之前的激活,通过减去输入中的最小值将其缩放至 [ 0 , Q b ] [0,Q_b] [0,Qb],从而使得所有值均为非负:
x ~ = Quant ( x ) = Clip ( ( x − η ) × Q b γ , ϵ , Q b − ϵ ) , η = min ⁡ i , j x i j (6) \tilde{x}=\text{Quant}(x)=\text{Clip}((x-\eta)\times\frac{Q_b}{\gamma},\epsilon,Q_b-\epsilon),\quad\eta=\min_{i,j}x_{ij}\tag{6} \\ x~=Quant(x)=Clip((xη)×γQb,ϵ,Qbϵ),η=i,jminxij(6)
本文中将激活量化至8-bit。此外,为了稳定性和效率,在训练期间按张量执行量化,而在推理时则按token执行量化。

​ 基于上面的量化等式,矩阵乘法可以写作:
y = W ~ x ~ (7) y=\widetilde{W}\tilde{x}\tag{7} \\ y=W x~(7)
假设 W W W中的元素和 x x x是独立同分布的。那么,输出 y y y的方差可以估计为:
Var ( y ) = n Var ( w ~ x ~ ) = n E [ w ~ 2 ] E [ x ~ 2 ] = n β 2 E [ x ~ 2 ] ≈ E [ x ~ 2 ] \begin{align} \text{Var}(y)&=n\text{Var}(\tilde{w}\tilde{x}) \tag*{(8)} \\ &=nE[\tilde{w}^2]E[\tilde{x}^2] \tag*{(9)} \\ &=n\beta^2E[\tilde{x}^2]\approx E[\tilde{x}^2] \tag*{(10)} \end{align} \\ Var(y)=nVar(w~x~)=nE[w~2]E[x~2]=nβ2E[x~2]E[x~2](8)(9)(10)
对于全精度计算,若使用标准数据化方法,输出方差 Var ( y ) \text{Var}(y) Var(y)则为1,对于训练稳定性有益。为了在量化后保持方差,在激活量化前引入了LayerNorm函数。这样,输出 y y y的方差估计为 Var ( y ) ≈ E [ LN ( x ~ ) 2 ] = 1 \text{Var}(y)\approx E[\text{LN}(\tilde{x})^2]=1 Var(y)E[LN(x~)2]=1,其大小与全精度 Var ( y ) \text{Var}(y) Var(y)是相同量级。在标准的Transformer中,这种方式称为SubLN。利用SubLN和上述量化方法,得到BitLinear
y = W ~ x ~ = W ~ Quant ( LN ( x ) ) × β γ Q b (11) y=\widetilde{W}\tilde{x}=\widetilde{W}\text{Quant}(\text{LN}(x))\times\frac{\beta\gamma}{Q_b}\tag{11} \\ y=W x~=W Quant(LN(x))×Qbβγ(11)

LN ( x ) = x − E ( x ) Var ( x ) + ϵ , β = 1 n m ∥ W ∥ 1 (12) \text{LN}(x)=\frac{x-E(x)}{\sqrt{\text{Var}(x)+\epsilon}},\quad\beta=\frac{1}{nm}\parallel W\parallel_1 \tag{12} \\ LN(x)=Var(x)+ϵ xE(x),β=nm1W1(12)

SubLN操作之后,使用absmax函数对激活进行量化。然后1-bit权重和量化后的激活之间执行矩阵乘法。输出的激活使用 { β , γ } \{\beta,\gamma\} {β,γ}进行重新缩放,从而反量化至原始精度。

基于分组量化和规范化的模型并行。训练大语言模型的一项重要技术是模型并行,其在多个设备上划分矩阵乘法。现有模型并行方法的先决条件是张量在划分维度上是独立的。然而,所有参数 α \alpha α β \beta β γ \gamma γ η \eta η是从整个张量计算出来的,打破了独立性条件。为此,本文提出了一种简单且高效的模型并行方案。将权重和激活分为多个组,然后独立地估计每个组的参数。通过这种方式,可以在不需要额外通信的情况下本地计算这些参数。这种方法称为分组量化(Group Quantization),形式化为:

​ 对于权重矩阵 W ∈ R n × m W\in\mathcal{R}^{n\times m} WRn×m,将其沿着划分维度分为 G G G组,每个组的尺寸为 n G × m \frac{n}{G}\times m Gn×m。我们独立的估计每个组的参数:
α g = G n m ∑ i j W i j ( g ) , β g = G n m ∥ W ( g ) ∥ 1 (13) \alpha_g=\frac{G}{nm}\sum_{ij}W_{ij}^{(g)},\quad\beta_g=\frac{G}{nm}\parallel W^{(g)}\parallel_1 \tag{13} \\ αg=nmGijWij(g),βg=nmGW(g)1(13)
其中 W ( g ) W^{(g)} W(g)是第 g g g个组的权重矩阵。类似地,对于激活,我们能将输入矩阵 x ∈ R n × m x\in\mathcal{R}^{n\times m} xRn×m划分为 G G G组,每个组计算参数
γ g = ∥ x ( g ) ∥ ∞ , η g = min ⁡ i j x i j ( g ) (14) \gamma_g=\parallel x^{(g)}\parallel_\infty,\quad\eta_g=\min_{ij}x_{ij}^{(g)}\tag{14} \\ γg=∥x(g),ηg=ijminxij(g)(14)
对于LN,应用分组规范化(Group Normalization)技术来计算均值和方差:
LN ( x ( g ) ) = x ( g ) − E ( x ( g ) ) Var ( x ( g ) ) + ϵ (15) \text{LN}(x^{(g)})=\frac{x^{(g)}-E(x^{(g)})}{\sqrt{\text{Var}(x^{(g)})+\epsilon}} \tag{15} \\ LN(x(g))=Var(x(g))+ϵ x(g)E(x(g))(15)
通过分组量化和归一化能有效地实现模型并行,且不需要额外的通信。

2. 模型训练

直通估计器(Straight-through estimator, STE)。为了能够训练1-bit模型利用STE来在反向传播过程中近似梯度。该方法在反向传播过程中会绕开Sign或者Clip这样的不可微函数。因此,STE允许梯度在网络中流动而不受这些不可微函数的影响,使得训练量化模型成为可能。

混合精度训练。虽然权重和激活被量化为低精度,但是梯度和优化器状态仍然是按高精度存储,从而确保训练稳定性和准确率。遵循先前的工作,我们为可学习参数保持高精度格式的潜在权重,以累计参数更新。潜在权重在前向传播过程中被动态二值化,但是不会用在推理过程中。

大学习率。1-bit权重优化的挑战是小的更新量可能不会对权重有任何影响。在训练的开头,这个问题将更加的严重,因此期望模型尽快收敛。为了解决这个问题,探索了各种方法。最终,提高学习率是加速优化最简单且最好的方法。实验表明,大学习率能够使得BitNet很好的收敛,而FP16 Transformer使用大学习率会导致发散。

3. 计算效率

​ 矩阵乘法是大语言模型计算的主要成本,因此这里也仅关注矩阵乘法的计算。

算术操作的能量。不同的算术操作的能量消耗估计如下:
在这里插入图片描述

​ 在标准Transformer中,若维度为 m × n m\times n m×n n × p n\times p n×p矩阵乘法能量消耗为

E a d d = m × ( n − 1 ) × p × E ^ a d d (16) E_{add}=m\times(n-1)\times p\times\hat{E}_{add} \tag{16} \\ Eadd=m×(n1)×p×E^add(16)

E m u l = m × n × p × E ^ m u l (17) E_{mul}=m\times n\times p\times\hat{E}_{mul}\tag{17} \\ Emul=m×n×p×E^mul(17)

对于BitNet,由于权重是1-bit,因此矩阵乘法的能量消耗是由加法运算决定的。乘法运行仅应用于因子 β \beta β γ Q b \frac{\gamma}{Q_b} Qbγ缩放输出,因此乘法的能量消耗可以计算为:
E m u l = ( m × p + m × n ) × E ^ m u l (18) E_{mul}=(m\times p+m\times n)\times\hat{E}_{mul}\tag{18} \\ Emul=(m×p+m×n)×E^mul(18)
其明显小于Transformer。
在这里插入图片描述

W1A8 BitNet相较于全精度(32-32)和半精度(16-16)的结果如上表1所示。可以看到,BitNet能够显著的节约能源。

三、与FP16 Transformer的比较

1. 设置

​ 训练了一系列自回归BitNet模型,尺寸从125M至30B。这些模型是在英文语料上训练,包含Pile、Common Crawl 、RealNews和CC-Stories数据集。使用Sentencepiece tokenizer来预处理数据,词表尺寸为16K。除了BitNet,也用相同的数据集训练了Transformer baselines用于公平比较。

2. Inference-Optimal Scaling Law

在这里插入图片描述

​ 标准Transformer自然语言模型已经被证明可以预测缩放的结果,损失值的大小由训练所使用的计算量决定。这使得能够确定计算预算的最佳分配,并从较小的模型中预测大型语言模型的性能。

​ 为了研究二值化Transformer的scaling law,绘制了BitNet和FP16 Transformer的scaling curve。上图3展示了BitNet的loss scaling,类似于FP16 Transformer,遵循幂律。这里用一个不可约损失项来拟合scaling law:
L ( N ) = a N b + c (19) L(N)=aN^b+c\tag{19} \\ L(N)=aNb+c(19)
​ 为了评估scaling law是否能够准确预测loss,从125M至6.7B的模型来拟合幂律中的参数,并使用该定律来预测13B和30B的损失。结果表明,拟合后的scaling law能够准确的预测BitNet的损失函数。此外,随着模型尺寸的增加,BitNet和FP16 Transformer之间的差距越来越小。

​ 上面的scaling law并没有正确地建模损失值和实际计算之间的关系。先前的工作通过计算FLOPs来估计计算量,但是其不适用于由整数计算主导的1-bit模型。此外,其主要是用于衡量训练的计算量,而不是推理。为了更好地理解神经语言模型的scaling效率,这里引入了Inference-Optimal Scaling Law。这主要是关注推理的成本,因此其会随着模型的使用而增加,但训练成本只有一次。上图3展示了7nm处理器相对于推理能力成本的scaling curve,其表明BitNet有更高的scaling效率。在给定固定计算预算的情况下,BitNet实现了更好的loss。此外,推理成本要小得多,可以获得与FP16模型相同的性能。

3. 下游任务结果

在这里插入图片描述

​ 除了loss以外,还关注BitNet下游任务的能力。与loss相比,由于神经语言模型的涌现能力更难以预测。为了能够以可解释的度量来评估能力,在下游任务上测试了0-shot和4-shot的结果。上图4展示了不同规模的BitNet和FP16 Transformer的平均结果。与loss scaling curve类似,下游任务的性能可以随着计算预算的增加而增加。

4. 稳定性测试

在这里插入图片描述

​ 训练低精度Transformer的主要挑战是稳定性。因此,通过训练一系列具有不同峰值学习率的模型,对BitNet和FP16 Transformer进行了稳定性测试。上图5a展示了稳定性测试结果,表明BitNet可以以较大的学习率收敛,而FP16 Transformer则不能。上图5b展示了BitNet可以从增加的学习率中受益,实现PPL更好的收敛。

四、与Post-training量化的比较

1. 设置

​ 这里将BitNet与最先进的量化方法进行了比较,包含AbsmaxSmoothQuantGPTQQulP。这些方法在FP16 Transformer模型上的post-training量化,其遵循与BitNet相同的训练设置和数据。其中,AbsmaxSmoothQuant对权重和激活进行量化,而GPTQ和QulP只能降低权重的精度。应用这些方法在各种量化级别。对于weight-only量化,用W4A16和W2A16进行实验。对于权重和激活同时量化,将FP16 Transformer量化为W8A8、W4A4和W1A8。BitNet则使用二值权重和8-bit激活,其bits数小于等于baseline。

2. 结果

在这里插入图片描述

​ 上面3是BitNet和各种baseline在四个基准数据集上zero-shot性能的详细分析。为了进行公平的比较,所有模型的大小均为6.7B。

在这里插入图片描述

​ BitNet的zero-shot与8-bit模型相当,但是推理成本要低得多。对于4-bit模型,weight-only量化方法优于weight-and-activation量化方法,主要是因为激活更难量化。BitNet作为1-bit模型,显著优于各种量化方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)0基础入门到精通!

温馨提示: 初学者最好不要上手就去搞漏洞挖掘,因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫,而且难度较大…… 较合理的途径应该从漏洞利用入手,不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料,分…

手写分布式配置中心(四)增加实时刷新功能(长轮询)

上一篇文章中实现了短轮询,不过短轮询的弊端也很明显,如果请求的频率较高,那么就会导致服务端压力大(并发高);如果请求的频率放低,那么客户端感知变更的及时性就会降低。所以我们来看另一种轮询…

总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)

Kubernetes,亦被称为K8s,是业界公认的容器编排巨擘,以其卓越的能力简化了容器化应用的部署、扩展和管理流程。通过其强大的功能,Kubernetes不仅提升了应用的可靠性和可伸缩性,还优化了资源利用率,为开发者和…

MM配置1-定义、复制、删除、检查工厂

配置步骤,如下图: 双击“复制,删除,检查工厂选项” 点击“复制”按钮,输入参考工厂,和要新建的工厂 复制完成后,返回到上一界面,双击“定义工厂”选项 选中新建的1070工厂&#xff0…

java常用技术栈,java面试带答案

前言 我们从一个问题引入今天的主题。 在日常业务开发中,我们可能经常听到 DBA 对我们说“不要”(注意:不是禁止)使用 join,那么为什么 DBA 对 join 这么抵触呢?是 join 本身有问题,还是我们使…

HarmonyOS 数据持久化之首选项 preferences

接下来 我们来说说数据持久化的问题 我们平时处理的数据都是在内存中处理的 我们应用一点重启 所有数据都消失了 肯恩是不符合一些场景的 harmonyos中 提供了比较多的解决方案 最多的两种是 用户首选项 关系型数据库 本文的话 我们就来看看 用户首选项 首先,什么…

Android开发新手入门教程,android笔试面试题

前言 尤其是在最近一段时间内,感觉一天天的时间过得又慢又快,慢的是感觉复工了以后在公司的8.9个小时简直算是煎熬了,快的是常常感觉时间一天天,一月月的过去了,可是发现自己还在原路踏步走。看似每天忙成狗&#xff…

【数学建模】层次分析

1.建立递阶层次结构模型 2.构造出各层次中的所有判断矩阵 对指标的重要性进行两两比较,构造判断矩阵,科学求出权重 矩阵中元素aij的意义是,第i个指标相对第j个指标的重要程度 对角线1,aijaji1 矛盾——>一致性检验

win11配置Mask DINO小白踩坑记录

win11配置Mask DINO踩坑记录 1 准备工作2 创建python环境和安装detectron22.1 安装前提2.2 安装流程2.2.1 cl.exe的错误2.2.2 SetuptoolsDeprecationWarning的错误 3 MaskDINO运行3.1 运行demo 前情提要:需要复现Mask DINO,但是实验室没有Linux的电脑&am…

+++

解法&#xff1a; 显然a可以为aik&#xff08;i为整数&#xff09;&#xff0c;b可以为bjk(j为整数&#xff09;。 若aikbjk。假定i>j&#xff0c;那么a<b。可以得到b-a(i-j)k 我是傻逼&#xff0c;不放代码了 #include<iostream> #include<vector> #inc…

Tomcat基础与Nginx的动静分离

一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 在配置文件中讲到&#xff0c;当接受到请求后&#xff0c;会匹配符合要求的Host&#xff0c;在配置文件中的Host只有一个&#xff0c;且规定了自动解压war包 自动解压war包 .war&#xff1a;WebApp打包,类zip格…

【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种常见的串行通信协议&#xff0c;用于在微控制器和外部设备之间进行…

Qt QtCreator打开pro项目时出现假死现象

在Windows系统下&#xff0c;QtCreator打开pro项目时出现假死现象&#xff0c;左侧项目树形图无法展开&#xff0c;项目根节点一直在转圈。尝试关掉所有QtCreator进程&#xff0c;重新打开pro也是无济于事。 解决方案&#xff1a; 打开“运行”窗口&#xff08;快捷键&#x…

鸿蒙文章专题-2021年鸿蒙相关的文章废弃

#原因 至于为什么说2021年我的鸿蒙专栏的文章废弃了&#xff0c;只是说没有了参考意义&#xff0c;是因为鸿蒙4.0以前的版本语言从以Java为主过渡为以ArkTS为主。以前的Java版本的工程已经无法再使用了&#xff0c;后续的开发都必须以ArkTS开发语言为主。 其中而且整个项目结构…

操作教程|使用MeterSphere对恒生UFX系统进行压力测试

恒生UFX&#xff08;United Finance Exchange&#xff0c;统一金融交换&#xff09;系统&#xff08;以下简称为“UFX系统”&#xff09;&#xff0c;是一款帮助证券公司统一管理外部接入客户的系统&#xff0c;该系统整体上覆盖了期货、证券、基金、银行、信托、海外业务等各类…

Python 服务实现可观测性最佳实践

前言 本次实践主要是介绍 Python 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境&#xff1a;主机环境开发语言&#xff1a;Python2.7APM 探针包&#xff1a;ddtrace 接入方案 准备工作 安装 DataKit 主机安装 DataKit # 需要把token 改成观测云…

xss.haozi.me靶机 通关

0x00 没有任何过滤可以直接注入<img srcx οnerrοralert(1)> 0x01 使用了testarea标签将我们的输入内容以普通的字符串进行展示 但是我们可以将标签进行闭合 </textarea><img srcx οnerrοralert(1)> 0x02 我们依然可以先闭合之后添加属性a" οncl…

Mendix 使用OIDC组件实现SSO|Azure Microsoft Entra ID 集成(原名:AD)

引言 在快节奏的软件开发领域&#xff0c;Mendix作为一款领先的低代码开发平台&#xff0c;为企业提供了快速构建、部署和迭代应用程序的能力。这种灵活性和效率使得Mendix成为了推动数字化转型的强大工具。随着企业应用数量的激增&#xff0c;单点登录&#xff08;SSO&#x…

【debug】element-ui时间控件回显后不可编辑且显示为空

问题&#xff1a;使用element-ui的时间控件回显数据&#xff0c;编辑数据没有反应&#xff1a;点时间和“确认”按钮都没反应。 输入框中会显示数据&#xff0c;但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…