模型量化技術(shù)綜述:揭示大型語(yǔ)言模型壓縮的前沿技術(shù)
大型語(yǔ)言模型(LLMs)通常因?yàn)轶w積過(guò)大而無(wú)法在消費(fèi)級(jí)硬件上運(yùn)行。這些模型可能包含數(shù)十億個(gè)參數(shù),通常需要配備大量顯存的GPU來(lái)加速推理過(guò)程。
因此越來(lái)越多的研究致力于通過(guò)改進(jìn)訓(xùn)練、使用適配器等方法來(lái)縮小這些模型的體積。在這一領(lǐng)域中,一個(gè)主要的技術(shù)被稱為量化。
在這篇文章中,我將在語(yǔ)言建模的背景下介紹量化,并逐一探討各個(gè)概念,探索各種方法論、用例以及量化背后的原理。
大型語(yǔ)言模型(LLMs)的問(wèn)題
大型語(yǔ)言模型之所以得名,是因?yàn)樗鼈儼膮?shù)數(shù)量。這些模型通常擁有數(shù)十億個(gè)參數(shù),存儲(chǔ)這些參數(shù)可能相當(dāng)昂貴。
在推理過(guò)程中,激活值是輸入和權(quán)重的乘積,同樣可能非常龐大。
所以我們希望盡可能有效地表示數(shù)十億個(gè)數(shù)值,最小化存儲(chǔ)給定值所需的空間。
讓我們從頭開(kāi)始,探索在優(yōu)化之前如何首先表示數(shù)值。
如何表示數(shù)值
在計(jì)算機(jī)科學(xué)中,一個(gè)給定的數(shù)值通常表示為浮點(diǎn)數(shù)(或稱為浮點(diǎn)),即帶有小數(shù)點(diǎn)的正數(shù)或負(fù)數(shù)。
這些數(shù)值由“位”或二進(jìn)制數(shù)字表示。IEEE-754標(biāo)準(zhǔn)描述了如何使用位來(lái)表示一個(gè)值的三個(gè)功能之一:符號(hào)、指數(shù)或小數(shù)部分(或稱尾數(shù))。
這三個(gè)方面一起可以用來(lái)計(jì)算給定一組位值的值:
我們用越多的位來(lái)表示一個(gè)值,它通常就越精確:
內(nèi)存限制
可用的位數(shù)越多,能表示的數(shù)值范圍就越大。
可表示數(shù)字的區(qū)間被稱為動(dòng)態(tài)范圍(dynamic range),而兩個(gè)相鄰數(shù)值之間的距離被稱為精度(precision)。
這些位的一個(gè)巧妙特性是,我們可以計(jì)算設(shè)備存儲(chǔ)給定值需要多少內(nèi)存。由于一字節(jié)內(nèi)存中有8位,我們可以為大多數(shù)形式的浮點(diǎn)表示創(chuàng)建一個(gè)基本公式。
實(shí)際上,在推理過(guò)程中,需要的(V)RAM量還與上下文大小和架構(gòu)等因素有關(guān)。但是這部分影響比較小,我們暫時(shí)忽略不計(jì)。
現(xiàn)在假設(shè)我們有一個(gè)模型,包含700億個(gè)參數(shù)。大多數(shù)模型默認(rèn)使用32位浮點(diǎn)數(shù)(通常稱為全精度)表示,僅加載模型就需要280GB的內(nèi)存。
因此最小化表示模型參數(shù)的位數(shù)(包括在訓(xùn)練期間)變得非常重要。但是隨著精度的降低,模型的準(zhǔn)確性通常也會(huì)下降。所以我們希望在保持準(zhǔn)確性的同時(shí)減少表示數(shù)值的位數(shù)……這就是量化的用武之地!
量化簡(jiǎn)介
量化旨在將模型參數(shù)的精度從高位寬(如32位浮點(diǎn)數(shù))降低到低位寬(如8位整數(shù))。
在減少表示原始參數(shù)的位數(shù)時(shí),通常會(huì)有一些精度(細(xì)粒度)的損失。為了說(shuō)明這種效應(yīng),我們可以拿任何一幅圖像,僅使用8種顏色來(lái)表示它。
放大部分看起來(lái)比原圖更“粗糙”,因?yàn)槲覀冇酶俚念伾珌?lái)表示它。量化的主要目標(biāo)是在盡可能保持原始參數(shù)的精度的同時(shí),減少表示原始參數(shù)所需的位數(shù)(顏色)。
常見(jiàn)數(shù)據(jù)類型
首先讓我們來(lái)看看常見(jiàn)的數(shù)據(jù)類型以及使用它們替代32位(稱為全精度或FP32)表示的影響。
FP16
讓我們看一個(gè)從32位到16位(稱為半精度或FP16)浮點(diǎn)數(shù)的例子:
FP16能表示的數(shù)值范圍比FP32小很多。
BF16
為了獲得與原始FP32相似的數(shù)值范圍,后來(lái)又引入了一種名為bfloat 16的“截?cái)郌P32”類型:
BF16使用與FP16相同的位數(shù),但可以表示更廣泛的數(shù)值范圍,常用于深度學(xué)習(xí)應(yīng)用中。
INT8
當(dāng)我們進(jìn)一步減少位數(shù)時(shí),我們接近基于整數(shù)的表示而不是浮點(diǎn)表示。例如,從FP32轉(zhuǎn)換到只有8位的INT8,結(jié)果是原始位數(shù)的四分之一:
根據(jù)硬件不同,基于整數(shù)的計(jì)算可能比浮點(diǎn)計(jì)算更快,但這并不總是如此,使用更少的位進(jìn)行計(jì)算通常會(huì)更快。每次減少位數(shù)時(shí),都會(huì)執(zhí)行一個(gè)映射,將初始的FP32表示“壓縮”到較低的位數(shù)中。
在實(shí)際應(yīng)用時(shí)我們不需要將整個(gè)FP32范圍[-3.4e38, 3.4e38]映射到INT8。我們只需要找到一種方法,將我們數(shù)據(jù)的范圍(模型的參數(shù)的最大值和最小值內(nèi))映射到INT8。
常見(jiàn)的壓縮/映射方法有對(duì)稱和非對(duì)稱量化,它們是線性映射的形式。
對(duì)稱量化
在對(duì)稱量化中,原始浮點(diǎn)值的范圍被映射到量化空間中以零為中心的對(duì)稱范圍。在之前的例子中,注意量化前后的范圍如何保持圍繞零對(duì)稱。
這意味著浮點(diǎn)空間中零的量化值在量化空間中恰好是零。
對(duì)稱量化的一個(gè)很好的例子被稱為絕對(duì)最大值(absmax)量化。
給定一系列值,我們?nèi)∽畲蟮慕^對(duì)值(α)作為執(zhí)行線性映射的范圍。
請(qǐng)注意,[-127, 127] 的值范圍代表受限范圍。不受限的范圍是 [-128, 127],這取決于量化方法。
由于這是一個(gè)以零為中心的線性映射,公式非常直接。
我們首先使用以下公式計(jì)算比例因子(*s*):
- b 是我們想要量化到的字節(jié)數(shù)(8),
- α 是最大的絕對(duì)值,
然后,我們使用 s 來(lái)量化輸入 x:
填入這些值會(huì)得到以下結(jié)果:
為了檢索原始的FP32值,我們可以使用先前計(jì)算的縮放因子(*s)來(lái)去量化量化值。
應(yīng)用量化和去量化的過(guò)程來(lái)檢索原始流程圖解,如下所示:
可以看到某些值,例如 3.08 和 3.02,在量化為 INT8 時(shí)被賦予了相同的值,即 36。這是因?yàn)閷⑦@些值反量化回 FP32 時(shí),它們會(huì)失去一些精度,不再能夠被區(qū)分開(kāi)來(lái)。
這通常被稱為量化誤差,我們可以通過(guò)找出原始值和反量化值之間的差異來(lái)計(jì)算這一誤差。
一般來(lái)說(shuō),比特?cái)?shù)越低,我們的量化誤差就越大。
非對(duì)稱量化
與對(duì)稱量化不同的是,非對(duì)稱量化不是圍繞零對(duì)稱的。它將浮點(diǎn)范圍中的最小值(β)和最大值(α)映射到量化范圍的最小值和最大值。
我們將要探討的方法稱為零點(diǎn)量化。
看到0的位置如何發(fā)生了變化嗎?這就是為什么它被稱為非對(duì)稱量化。在范圍[-7.59, 10.8]內(nèi),最小/最大值到0的距離是不同的。
由于其位置的偏移,我們必須為INT8范圍計(jì)算零點(diǎn),才能執(zhí)行線性映射。像之前一樣也必須計(jì)算一個(gè)比例因子(s)。
由于需要計(jì)算INT8范圍內(nèi)的零點(diǎn)(z)來(lái)移動(dòng)權(quán)重,這個(gè)過(guò)程略顯復(fù)雜。
如之前所述,公式如下:
為了將從INT8量化的數(shù)據(jù)反量化回FP32,需要使用之前計(jì)算的比例因子(s)和零點(diǎn)(z)。
當(dāng)把對(duì)稱和非對(duì)稱量化放在一起時(shí),可以很快看到方法之間的區(qū)別:
可以明顯的看到對(duì)稱量子化的零中心特性與非對(duì)稱量子化的偏移量。
范圍映射與裁剪
在之前的例子中,探討了如何將給定向量中的值范圍映射到較低位的表示。盡管這允許將向量值的完整范圍映射出來(lái),但它帶來(lái)了一個(gè)主要的缺點(diǎn),即異常值。
假設(shè)有一個(gè)向量,其值如下:
其中一個(gè)值比其他所有值都大得多,可以被認(rèn)為是一個(gè)異常值。如果我們要映射這個(gè)向量的完整范圍,所有小的值都會(huì)被映射到相同的較低位表示,并且失去它們的區(qū)分因素:
這就是我們之前使用的absmax方法。如果我們不應(yīng)用裁剪,非對(duì)稱量化也會(huì)發(fā)生同樣的行為。
所以我們可以選擇裁剪某些值。裁剪涉及設(shè)置原始值的不同動(dòng)態(tài)范圍,使得所有異常值獲得相同的值。
在下面的例子中,手動(dòng)將動(dòng)態(tài)范圍設(shè)置為[-5, 5],那么所有超出該范圍的值將被映射到-127或127,無(wú)論它們的實(shí)際值如何:
其主要優(yōu)點(diǎn)是顯著降低了“非異常值”的量化誤差。但是會(huì)導(dǎo)致離群值的量化誤差增大。
校準(zhǔn)
上面展示了一種選擇[-5, 5]任意范圍的簡(jiǎn)單方法。選擇這個(gè)范圍的過(guò)程被稱為校準(zhǔn),其目的是找到一個(gè)范圍,包括盡可能多的值,同時(shí)最小化量化誤差。
執(zhí)行這一校準(zhǔn)步驟對(duì)所有類型的參數(shù)來(lái)說(shuō)并不相同。
權(quán)重(和偏置)
我們可以將LLM的權(quán)重和偏置視為靜態(tài)值,因?yàn)樵谶\(yùn)行模型之前就已知這些值。例如,Llama 3的~20GB文件主要由其權(quán)重和偏置組成。
由于偏置的數(shù)量(百萬(wàn)級(jí))遠(yuǎn)少于權(quán)重(十億級(jí)),偏置通常保持較高的精度(如INT16),量化的主要工作集中在權(quán)重上。
對(duì)于已知且固定的權(quán)重,可選擇范圍的校準(zhǔn)技術(shù)包括:
- 手動(dòng)選擇輸入范圍的百分位數(shù)
- 優(yōu)化原始權(quán)重和量化權(quán)重之間的均方誤差(MSE)
- 最小化原始值和量化值之間的熵(KL散度)
選擇一個(gè)百分位數(shù)會(huì)導(dǎo)致我們之前看到的類似裁剪行為。
激活
在LLM中持續(xù)更新的輸入通常被稱為“激活”。
這些值被稱為激活,因?yàn)樗鼈兺ǔ?huì)通過(guò)某些激活函數(shù),如sigmoid或relu。與權(quán)重不同,激活會(huì)隨著在推理過(guò)程中輸入模型的每個(gè)數(shù)據(jù)而變化,這使得準(zhǔn)確量化它們變得具有挑戰(zhàn)性。由于這些值在每個(gè)隱藏層之后更新,所以只有在輸入數(shù)據(jù)通過(guò)模型時(shí)才能知道它們?cè)谕评磉^(guò)程中的狀態(tài)。
有兩種方法用于校準(zhǔn)權(quán)重和激活的量化方法:
- 訓(xùn)練后量化(PTQ)——在訓(xùn)練之后進(jìn)行量化
- 量化感知訓(xùn)練(QAT)——在訓(xùn)練/微調(diào)期間進(jìn)行量化
訓(xùn)練后量化
最有名的量化技術(shù)之一是訓(xùn)練后量化(PTQ)。它涉及在訓(xùn)練模型之后對(duì)模型的參數(shù)(包括權(quán)重和激活)進(jìn)行量化。
權(quán)重的量化使用對(duì)稱量化或非對(duì)稱量化來(lái)執(zhí)行。但是,激活的量化需要推斷模型以獲取它們的潛在分布,因?yàn)槲覀儾恢浪鼈兊姆秶?/span>
所以這里又引出了激活的量化的兩種形式:
動(dòng)態(tài)量化
數(shù)據(jù)通過(guò)隱藏層后,其激活值被收集:
然后使用這些激活值的分布來(lái)計(jì)算量化輸出所需的零點(diǎn)(z)和比例因子(s)值:
每次數(shù)據(jù)通過(guò)新層時(shí)都會(huì)重復(fù)此過(guò)程。每一層都有其自己的z 和 s 值,因此具有不同的量化方案。
靜態(tài)量化
與動(dòng)態(tài)量化不同,靜態(tài)量化不是在推理過(guò)程中,而是在之前計(jì)算零點(diǎn)(z)和比例因子(s)。
為了找到這些值,需要使用一個(gè)校準(zhǔn)數(shù)據(jù)集,將其提供給模型以收集這些潛在的分布。
在收集了這些值之后,就可以計(jì)算推理過(guò)程中執(zhí)行量化所需的s 和 z 值。
在進(jìn)行實(shí)際推理時(shí),s 和 z 值不會(huì)重新計(jì)算,而是全局使用,量化所有激活。
通常,動(dòng)態(tài)量化由于僅嘗試計(jì)算每個(gè)隱藏層的s 和 z 值,因此可能更準(zhǔn)確。但是這會(huì)大大增加計(jì)算時(shí)間,因?yàn)樾枰?jì)算這些值。
靜態(tài)量化的準(zhǔn)確性雖然較低,但由于已經(jīng)知道用于量化的s 和 z 值,因此速度更快,所以一般都會(huì)使用靜態(tài)量化。
4位量化
將量化位數(shù)降低到低于8位已被證明是一項(xiàng)艱巨的任務(wù),因?yàn)槊繙p少一位,量化誤差都會(huì)增加。但是有幾種靈巧的方法可以將位數(shù)減少到6位、4位,甚至2位(盡管通常不建議使用這些方法將位數(shù)降低到低于4位)。
這里將介紹在HuggingFace上常見(jiàn)的兩種方法:
GPTQ
GPTQ 是目前最著名的4位量化方法之一。
它使用非對(duì)稱量化,并且逐層進(jìn)行,每層獨(dú)立處理完畢后再繼續(xù)到下一層:
在這個(gè)逐層量化過(guò)程中,它首先將層的權(quán)重轉(zhuǎn)換為逆-赫塞矩陣(Hessian)。赫塞矩陣是模型損失函數(shù)的二階導(dǎo)數(shù),它告訴我們模型輸出對(duì)每個(gè)權(quán)重變化的敏感度。它本質(zhì)上展示了每個(gè)權(quán)重在層中的(逆)重要性。
與赫塞矩陣中較小值相關(guān)聯(lián)的權(quán)重更為關(guān)鍵,因?yàn)檫@些權(quán)重的小變化可能會(huì)導(dǎo)致模型性能的顯著變化。
在逆-赫塞矩陣中,較低的值表示更“重要”的權(quán)重。我們對(duì)權(quán)重矩陣中的第一行的權(quán)重進(jìn)行量化然后反量化:
這個(gè)過(guò)程允許我們計(jì)算量化誤差(q),我們可以使用之前計(jì)算的逆赫塞(h_1)來(lái)加權(quán)這個(gè)量化誤差。
本質(zhì)上是根據(jù)權(quán)重的重要性創(chuàng)建了一個(gè)加權(quán)量化誤差:
接下來(lái)需要將這個(gè)加權(quán)量化誤差重新分配到行中的其他權(quán)重上。這有助于維持網(wǎng)絡(luò)的整體功能和輸出。
例如,如果我們對(duì)第二個(gè)權(quán)重,即 .3(x_2)這樣做,我們會(huì)將量化誤差(q)乘以第二個(gè)權(quán)重的逆赫塞(h_2)
我們也可以對(duì)給定行中的第三個(gè)權(quán)重進(jìn)行相同的處理:
我們重復(fù)這個(gè)過(guò)程,將加權(quán)量化誤差重新分配,直到所有值都被量化。
這個(gè)方法之所以行之有效,是因?yàn)闄?quán)重通常是相互關(guān)聯(lián)的。所以當(dāng)一個(gè)權(quán)重發(fā)生量化誤差時(shí),相關(guān)的權(quán)重會(huì)相應(yīng)地更新(通過(guò)逆赫塞)。
GGUF
雖然GPTQ是一個(gè)在GPU上運(yùn)行完整LLM的出色量化方法,但我們可能沒(méi)有那么強(qiáng)大的GPU。所以可以使用GGUF將LLM的任何層卸載到CPU上。這可以在VRAM不足的情況下同時(shí)使用CPU和GPU。
GGUF的量化方法經(jīng)常更新,可能取決于位量化的級(jí)別。我們這里總結(jié)一般的原則。
首先,給定層的權(quán)重被分割成包含一組“子”塊的“超級(jí)”塊。從這些塊中,我們提取比例因子(s)和alpha(α):
為了量化給定的“子”塊,可以使用之前使用過(guò)的absmax量化。記住它將給定的權(quán)重乘以比例因子(s):
比例因子是使用“子”塊的信息計(jì)算的,但使用“超級(jí)”塊的信息量化,后者擁有自己的比例因子:
這種塊量化使用“超級(jí)”塊的比例因子(s_super)來(lái)量化“子”塊的比例因子(s_sub)。每個(gè)比例因子的量化級(jí)別可能不同,“超級(jí)”塊通常具有比“子”塊的比例因子更高的精度。
我們介紹幾個(gè)常用的量化級(jí)別(2位、4位和6位):
根據(jù)量化類型,可能需要一個(gè)額外的最小值(m)來(lái)調(diào)整零點(diǎn)。這些與比例因子(s)一樣被量化。
量化感知訓(xùn)練
上面我們已經(jīng)介紹了如何在訓(xùn)練之后量化一個(gè)模型。這種方法的一個(gè)缺點(diǎn)是,量化并不考慮實(shí)際的訓(xùn)練過(guò)程。
而量化感知訓(xùn)練(QAT)與訓(xùn)練后量化(PTQ)在模型訓(xùn)練完成之后進(jìn)行量化不同,QAT旨在在訓(xùn)練期間學(xué)習(xí)量化過(guò)程。
QAT通常比PTQ更精確,因?yàn)榱炕^(guò)程已在訓(xùn)練中被考慮。其工作原理如下:
在訓(xùn)練過(guò)程中,引入所謂的“假”量化。這是一個(gè)首先將權(quán)重量化為例如INT4,然后再反量化回FP32的過(guò)程:
這個(gè)過(guò)程允許模型在訓(xùn)練、損失計(jì)算和權(quán)重更新過(guò)程中考慮量化過(guò)程。QAT試圖探索損失中的“寬”極小值以最小化量化誤差,因?yàn)椤罢睒O小值往往會(huì)導(dǎo)致較大的量化誤差。
例如,假設(shè)我們?cè)诜聪騻鞑ミ^(guò)程中沒(méi)有考慮量化。根據(jù)梯度下降選擇損失最小的權(quán)重。如果它處于“窄”極小值,那將引入更大的量化誤差。
如果我們考慮量化,將在一個(gè)“寬”極小值中選擇一個(gè)不同的更新權(quán)重,其量化誤差將大大降低。
所以盡管PTQ在高精度(例如FP32)中有更低的損失,但QAT在低精度(例如INT4)中會(huì)獲得更低的損失
1位大型語(yǔ)言模型的時(shí)代:BitNet
正如我們之前看到的,量化到4位已經(jīng)相當(dāng)小了,但如果我們進(jìn)一步減少呢?
這就是BitNet的用武之地,它使用-1或1來(lái)表示模型權(quán)重的單一位。它通過(guò)將量化過(guò)程直接注入到Transformer 架構(gòu)中實(shí)現(xiàn)這一點(diǎn)。
Transformer 架構(gòu)是大多數(shù)LLM的基礎(chǔ),它由涉及線性層的計(jì)算組成:
這些線性層通常用更高的精度表示,如FP16,并且是大多數(shù)權(quán)重所在的地方。
而BitNet用它們稱為BitLinear的東西替換了這些線性層:
BitLinear層的工作方式與普通線性層相同,根據(jù)權(quán)重乘以激活來(lái)計(jì)算輸出。但是BitLinear層使用1位來(lái)表示模型的權(quán)重,并使用INT8來(lái)表示激活:
BitLinear層,如量化感知訓(xùn)練(QAT),在訓(xùn)練期間執(zhí)行一種“假”量化形式,以分析權(quán)重和激活量化的效果:
這種方法顯著減少了模型的存儲(chǔ)和計(jì)算需求,使得在資源受限的環(huán)境中部署大型語(yǔ)言模型變得可行。同時(shí),通過(guò)這種極端的量化方法,BitNet在維持性能的同時(shí)大幅降低了能耗和運(yùn)行成本
在論文中,他們使用γ而不是α,但由于我們?cè)谶@個(gè)示例中使用了a,所以我繼續(xù)使用這個(gè)名詞。另外,請(qǐng)β與我們?cè)诹泓c(diǎn)量化中使用的不同,是平均絕對(duì)值。
下面我們看看他是如何工作的
權(quán)重量化
在訓(xùn)練過(guò)程中,權(quán)重存儲(chǔ)在INT8中,然后使用一種稱為符號(hào)函數(shù)的基本策略,將其量化為1位。
它將權(quán)重的分布移動(dòng)到以0為中心,然后將0左邊的所有值賦值為-1,右邊的所有值賦值為1:
此外,它還跟蹤一個(gè)值 β(平均絕對(duì)值),因?yàn)樯院髮⒂盟M(jìn)行去量化。
激活量化
為了量化激活值,BitLinear使用absmax量化將激活值從FP16轉(zhuǎn)換為INT8,因?yàn)樵诰仃嚦朔ǎā粒┲兴鼈冃枰叩木取?/span>
此外,它還跟蹤了 α(絕對(duì)值),因?yàn)樯院髮⒂盟M(jìn)行去量化。
去量化
上面跟蹤了 α(激活值的最大絕對(duì)值) 和 β(權(quán)重的平均絕對(duì)值),這些值將幫助我們將激活值反量化回FP16。
輸出激活值使用 {α, γ} 重新縮放,以將其反量化到原始精度:
這個(gè)過(guò)程相對(duì)簡(jiǎn)單,并允許模型僅用兩個(gè)值表示,要么是 -1,要么是 1。使用這種方法,作者觀察到隨著模型大小的增長(zhǎng),1位和FP16訓(xùn)練之間的性能差距變得越來(lái)越小。
并且作者發(fā)現(xiàn),這僅適用于較大的模型(>30B 參數(shù)),而在較小的模型中,差距仍然相當(dāng)大。
所有大型語(yǔ)言模型都可以變?yōu)?.58位
BitNet 1.58b 被引入以改進(jìn)之前提到的擴(kuò)展問(wèn)題。在這種新方法中,每個(gè)權(quán)重不再只是 -1 或 1,而是還可以取 0 作為值,使其變成 三元。僅添加 0 極大地改進(jìn)了BitNet,并且允許更快的計(jì)算。
0的力量
那么,為什么添加0是如此重要的改進(jìn)呢?
這與矩陣乘法有關(guān)!
首先,讓我們回顧一般的矩陣乘法是如何工作的。在計(jì)算輸出時(shí),將一個(gè)權(quán)重矩陣乘以一個(gè)輸入向量。下面可視化了第一層權(quán)重矩陣的第一次乘法:
這種乘法涉及兩個(gè)動(dòng)作,即乘輸入和單個(gè)權(quán)重,然后將它們加在一起。
BitNet 1.58b 通過(guò)使用三元權(quán)重基本上可以避免乘法操作,因?yàn)槿獧?quán)重本質(zhì)上告訴你以下信息:
- 1 — 我想添加這個(gè)值
- 0 — 我不需要這個(gè)值
- -1 — 我想減去這個(gè)值
所以如果權(quán)重量化到1.58位,只需要進(jìn)行加法操作:
這不僅可以顯著加速計(jì)算,還允許進(jìn)行特征過(guò)濾。
通過(guò)將給定的權(quán)重設(shè)置為0,就可以忽略它,而不是像1位表示那樣要么添加要么減去權(quán)重。
量化
為了進(jìn)行權(quán)重量化,BitNet 1.58b 使用了 absmean 量化,這是我們之前看到的 absmax 量化的一個(gè)變種。
它簡(jiǎn)單地壓縮權(quán)重的分布,并使用絕對(duì)平均值(α)來(lái)量化值。然后這些值被四舍五入為 -1、0 或 1:
與BitNet相比,激活量化基本相同,但是激活不再縮放到范圍 [0, 2??1],而是使用 absmax 量化 縮放到 [-2??1, 2??1]。
所以1.58位量化主要需要兩個(gè)技巧:
- 添加 0 創(chuàng)建三元表示 [-1, 0, 1]
- absmean 量化 用于權(quán)重
這樣就得到了輕量級(jí)模型,因?yàn)樗鼈冎恍枰?.58位的計(jì)算效率!
總結(jié)
本文深入探討了量化技術(shù)在大型語(yǔ)言模型(LLMs)中的應(yīng)用,特別介紹了幾種量化方法,包括訓(xùn)練后量化(PTQ)、量化感知訓(xùn)練(QAT)、GPTQ、GGUF和BitNet。量化技術(shù)通過(guò)減少模型的參數(shù)精度來(lái)降低存儲(chǔ)和計(jì)算需求,從而使模型能在資源受限的環(huán)境中高效運(yùn)行。
PTQ和QAT分別在訓(xùn)練后和訓(xùn)練過(guò)程中實(shí)施量化,以優(yōu)化模型性能和減小量化誤差。GPTQ和GGUF則是針對(duì)特定硬件環(huán)境優(yōu)化的量化策略,如使用GPU或CPU。特別值得一提的是BitNet和其進(jìn)階版本BitNet 1.58b,它們通過(guò)將模型權(quán)重量化到極低的位數(shù)(如1位和1.58位),顯著提升了計(jì)算效率并降低了模型體積。
希望這篇文章能讓你更好地理解量化、GPTQ、GGUF和BitNet的潛力。誰(shuí)知道將來(lái)模型會(huì)變得多小呢?