:從自注意力到長文本大模型)
2017年我讀到《Attention Is All You Need》時(shí)印象其實(shí)是矛盾的。一方面self-attention的全局建模能力確實(shí)漂亮另一方面O(n2)復(fù)雜度讓我下意識(shí)覺得這種架構(gòu)只會(huì)停留在中等長度序列上撐不起真正的長文本場(chǎng)景。后來的發(fā)展大家都看到了transformer不僅成了NLP的默認(rèn)底座還一路蔓延到圖像、語音、多模態(tài)甚至連近年大模型里最核心的算法選型也都圍繞transformer架構(gòu)在不斷演進(jìn)。我想把這幾年觀察到的“核心算法是如何一步步被改出來的”講清楚從Q/K/V注意力本身到復(fù)雜度優(yōu)化、位置編碼、歸一化策略、注意力頭配置再到Decoder-only范式。不管你是要做模型訓(xùn)練、推理優(yōu)化還是單純想理解大模型底層這條演進(jìn)線都值得過一次。這里不會(huì)只堆結(jié)論我會(huì)把每一步背后的動(dòng)機(jī)、代價(jià)和實(shí)際取舍都拆開說。理解這些比記住一堆模型名字更能幫你應(yīng)對(duì)新出的模型。1. 起點(diǎn)問題為什么循環(huán)網(wǎng)絡(luò)會(huì)被自注意力取代1.1 RNN序列建模的硬傷遠(yuǎn)不止“不能并行”先從RNN說起。RNN的致命問題不是簡(jiǎn)單的不支持并行而是序列建模的方式?jīng)Q定了信息必須沿著時(shí)間步逐步傳遞。每一步隱狀態(tài)既要表達(dá)當(dāng)前輸入又要保留過去的記憶這個(gè)隱狀態(tài)本質(zhì)上是個(gè)“有損壓縮瓶口”。LSTM注入門控以后緩解了梯度消失但距離很遠(yuǎn)的位置之間要經(jīng)過多層門控復(fù)合信號(hào)早就衰減或扭曲了。機(jī)器翻譯里把整句編碼成一個(gè)向量的做法尤其明顯句子越長語義細(xì)節(jié)越難塞進(jìn)一個(gè)固定向量。比如一篇新聞稿把開頭的主語和結(jié)尾的時(shí)間地點(diǎn)強(qiáng)行壓縮到同一個(gè)向量里中間的轉(zhuǎn)折關(guān)系很容易被平均掉。這個(gè)問題不是靠加深循環(huán)層就能解決的因?yàn)闊o論堆多少層路徑仍然是線性的信息依然要一站一站傳下去。真正讓序列建模發(fā)生質(zhì)變的是把“路徑距離”這個(gè)概念直接抹平。Transformer讓任意兩個(gè)token之間都有一條直連路徑不需要經(jīng)過中間token的中轉(zhuǎn)。從信息論視角看這相當(dāng)于把一條容易衰減的串行信道換成了全連接網(wǎng)絡(luò)。代價(jià)是每條路徑都要顯式建模相關(guān)性于是就有了自注意力那個(gè)n×n的相似度矩陣。1.2 Attention機(jī)制從輔助走向主角的臨界點(diǎn)Attention也不是Transformer原創(chuàng)的。2014年前后Bahdanau等人在神經(jīng)機(jī)器翻譯里引入的attention本質(zhì)上是動(dòng)態(tài)加權(quán)源端隱狀態(tài)讓decoder每一步能“按需查閱”源端信息而不是只靠最后一個(gè)向量。這個(gè)思路解決了一個(gè)實(shí)際問題但還沒有脫離RNN的主干。Transformer的突破在于把a(bǔ)ttention完全提升到主架構(gòu)層面每一個(gè)位置的表示都通過它與其他所有位置的注意力來生成。于是任意兩個(gè)token之間的距離被拉到了1長距離依賴不再是經(jīng)過若干步傳播而是直接計(jì)算相關(guān)性。這在算法設(shè)計(jì)上是個(gè)根本轉(zhuǎn)變用全局檢索代替順序傳遞同時(shí)讓所有位置的計(jì)算天然可以并行。所以討論Transformer的核心算法演進(jìn)起點(diǎn)其實(shí)是這個(gè)選擇為什么要放棄順序結(jié)構(gòu)答案不是“RNN不好”這么簡(jiǎn)單而是RNN的串行瓶頸和長程衰減在規(guī)?;?xùn)練里太吃虧。Transformer把這條路跳過去之后后面所有演進(jìn)都圍繞兩個(gè)核心問題展開一是如何讓注意力更快、更省、能處理更長序列二是如何在保持表達(dá)力的同時(shí)讓訓(xùn)練更穩(wěn)定。理解了這兩個(gè)靶子后面所有改進(jìn)就都能對(duì)號(hào)入座。2. 自注意力精算Q/K/V設(shè)計(jì)、縮放點(diǎn)積與多頭的數(shù)學(xué)邏輯2.1 Attention運(yùn)算中的“查詢-鍵-值”到底在做什么要理解自注意力可以先把它想成一個(gè)數(shù)據(jù)庫檢索系統(tǒng)。每個(gè)輸入token經(jīng)過三套不同的線性變換分別得到查詢Query、鍵Key和值Value。查詢是“我想找什么”鍵是“我身上有什么索引”值是“我實(shí)際提供的內(nèi)容”。某個(gè)請(qǐng)求與前一個(gè)位置的鍵越匹配注意力權(quán)重越大輸出就越偏向前一個(gè)位置的值。在自注意力場(chǎng)景中這個(gè)機(jī)制是模型自己對(duì)自己的序列做檢索每個(gè)token都能根據(jù)整個(gè)序列的內(nèi)容決定自己的表示。從實(shí)現(xiàn)角度看所有token的Q、K、V可以被組織成矩陣因此可以用矩陣乘法一次算完所有token之間的相似度。這也是并行性的來源不再是逐步計(jì)算而是一次性算出一張完整的關(guān)系表。具體公式可以寫成Attention(Q, K, V) softmax(Q * K^T / sqrt(d_k)) * V矩陣Q和K的每一行對(duì)應(yīng)一個(gè)token的查詢和鍵。Q和K的轉(zhuǎn)置相乘得到n×n的相似度分?jǐn)?shù)矩陣softmax把每行歸一化成概率分布最后用這些概率對(duì)V做加權(quán)求和得到每個(gè)token的新表示。2.2 縮放因子sqrt(d_k)一個(gè)經(jīng)常被忽略的穩(wěn)定性設(shè)計(jì)公式里除以sqrt(d_k)很多入門文章把它當(dāng)作“經(jīng)驗(yàn)性技巧”實(shí)際上這里藏著訓(xùn)練穩(wěn)定性的關(guān)鍵。假設(shè)Q、K中的元素是均值0、方差1的隨機(jī)變量那么單個(gè)維度乘積的均值是0、方差是1對(duì)d_k個(gè)維度的點(diǎn)積結(jié)果來說方差會(huì)累積到d_k。如果不對(duì)點(diǎn)積做縮放當(dāng)d_k變大時(shí)點(diǎn)積數(shù)值的方差也會(huì)變大。Softmax的輸入一旦落到兩端飽和區(qū)梯度會(huì)變得非常小模型幾乎無法學(xué)習(xí)。除以sqrt(d_k)可以讓點(diǎn)積方差回到1左右讓softmax保持在梯度敏感的區(qū)間。這是基于隨機(jī)變量方差性質(zhì)的推導(dǎo)不是拍腦袋的經(jīng)驗(yàn)。實(shí)際訓(xùn)練中不縮放也能跑通小模型但深層模型和長序列場(chǎng)景下會(huì)明顯難訓(xùn)。很多復(fù)現(xiàn)Transformer失敗的項(xiàng)目最后排查下來就是漏了這個(gè)因子或者實(shí)現(xiàn)時(shí)數(shù)據(jù)類型精度不對(duì)。2.3 多頭注意力如何讓模型同時(shí)看到多種關(guān)系一個(gè)注意力頭只能有一組線性映射也就是說它只能用一種相似度度量來衡量任意兩個(gè)token的關(guān)系。但一段文本里的關(guān)系是多種多樣的有的頭適合關(guān)注相鄰詞有的頭適合追蹤句法依存有的頭適合捕捉跨句話題。如果只用單頭模式會(huì)被迫壓縮到同一個(gè)空間里。多頭注意力把輸入投影到h個(gè)平行子空間每個(gè)頭獨(dú)立計(jì)算注意力最后拼接再經(jīng)過一次輸出投影。由于每個(gè)頭的初始線性映射不同它們會(huì)被逼著分化成不同的語義角色。實(shí)驗(yàn)和后來的分析都表明這種分工是自動(dòng)出現(xiàn)的而不是人為指定的。Transformer原始論文里d_model512、h8、每個(gè)頭維度64這個(gè)配置到今天仍是很多模型的起點(diǎn)。多頭付出的額外參數(shù)不算大但讓模型表達(dá)空間立刻豐富起來這是它能以相對(duì)較低成本碾壓?jiǎn)晤^注意力的主要原因。3. 復(fù)雜度突圍稀疏、線性與IO感知的注意力演進(jìn)3.1 平方復(fù)雜度在長序列場(chǎng)景中先卡住顯存自注意力的直接計(jì)算復(fù)雜度是O(n2·d)n是序列長度d是特征維度。表面上看這是個(gè)“計(jì)算量”問題實(shí)際第一卡點(diǎn)是顯存注意力權(quán)重矩陣本身是一個(gè)n×n的矩陣需要在顯存里顯式存下來。我算過一個(gè)直觀數(shù)據(jù)n8192、float32時(shí)單層注意力矩陣就是8192×8192×4字節(jié)約268MB。如果模型有三四十層又不用任何優(yōu)化顯存很快會(huì)被中間矩陣占滿。所以當(dāng)大家想把Transformer用到長文本、長視頻序列時(shí)“平方”根本不是細(xì)節(jié)而是第一堵墻。后面所有高效注意力算法目標(biāo)都是拆掉這堵墻。這里容易有個(gè)誤區(qū)以為O(n2)只是慢實(shí)際上它同時(shí)限制了批量大小和序列長度。很多時(shí)候不是算不動(dòng)而是顯存放不下連batch size 1都跑不了。理解這一點(diǎn)再看稀疏注意力和FlashAttention的動(dòng)機(jī)就會(huì)清楚很多。3.2 稀疏注意力用局部全局連接近似完整關(guān)系最早被大量驗(yàn)證的做法是稀疏注意力。Longformer的思路很直接保留一個(gè)滑動(dòng)窗口讓每個(gè)token只看附近若干token同時(shí)額外設(shè)置少數(shù)全局token比如CLS讓信息可以通過它們跨區(qū)域傳播。BigBird在此基礎(chǔ)上又加了隨機(jī)連接證明窗口、隨機(jī)、全局三種模式的組合能夠在理論上逼近完整注意力的表達(dá)能力。視覺里的Swin Transformer也采用了類似哲學(xué)。它把注意力限制在局部窗口內(nèi)再用窗口移位獲得跨窗口連接既把復(fù)雜度降下來了又保留了層次化的視覺感知。稀疏注意力的核心代價(jià)是必須人工決定哪些位置需要被關(guān)注。任務(wù)不同最佳模式也不同長文本問答里局部窗口可能不夠全局token的選點(diǎn)需要試驗(yàn)圖像任務(wù)里窗口大小本身就是超參數(shù)。 它不像標(biāo)準(zhǔn)自注意力那樣“無腦”調(diào)起來更麻煩。3.3 線性注意力把softmax換成特征映射后的計(jì)算重排另一個(gè)方向是從數(shù)學(xué)上消掉n×n矩陣。完整softmax注意力要先算QK^T再softmax再乘以V。線性注意力把softmax中的指數(shù)相似度拆成兩個(gè)獨(dú)立特征映射的內(nèi)積形式然后利用矩陣結(jié)合律把運(yùn)算順序改成φ(Q) * (φ(K)^T * V)這樣先算φ(K)^T * V得到一個(gè)d×d的小矩陣再與φ(Q)相乘復(fù)雜度從O(n2)降到了O(n)。這類方法在超長序列檢索、DNA序列建模等場(chǎng)景有應(yīng)用但效果普遍不如完整注意力因?yàn)樗裺oftmax的歸一化競(jìng)爭(zhēng)性抹掉了。沒有了歸一化模型很難通過注意力權(quán)重做“選哪個(gè)、忽略哪個(gè)”的離散判斷。我自己的經(jīng)驗(yàn)是線性注意力更適合序列非常長、但對(duì)質(zhì)量要求不極端嚴(yán)苛的任務(wù)如果資源允許優(yōu)先嘗試FlashAttention往往更劃算。3.4 FlashAttention的真實(shí)貢獻(xiàn)不省計(jì)算省內(nèi)存搬運(yùn)FlashAttention經(jīng)常被誤歸為近似注意力這其實(shí)是最大的誤解。它計(jì)算的注意力結(jié)果和標(biāo)準(zhǔn)注意力完全一致只是改變了計(jì)算順序和存儲(chǔ)策略。GPU有兩塊存儲(chǔ)片上SRAM很快但很小顯存HBM很大但慢。標(biāo)準(zhǔn)做法是頻繁把QK^T等中間矩陣寫到HBM再從HBM讀出來一遍遍搬運(yùn)。FlashAttention把Q、K、V分塊放到SRAM里每個(gè)block內(nèi)做完整softmax再用online softmax的思想逐步累積結(jié)果全程不落盤完整注意力矩陣。效果是顯存占用從O(n2)降到O(n)速度提升明顯。它優(yōu)化的是IO搬運(yùn)而不是計(jì)算量?,F(xiàn)在主流訓(xùn)練框架里FlashAttention基本可以無腦開啟這也讓長上下文在工程上變得現(xiàn)實(shí)了很多。如果項(xiàng)目里發(fā)現(xiàn)訓(xùn)練長序列時(shí)GPU利用率低先確認(rèn)是不是沒開FlashAttention開了以后瓶頸往往會(huì)從前向計(jì)算轉(zhuǎn)移到通信或數(shù)據(jù)加載這是我自己踩過的坑。4. 位置編碼演進(jìn)出sin/cos、相對(duì)編碼與RoPE4.1 為什么自注意力必須額外補(bǔ)充位置信息自注意力有個(gè)性質(zhì)如果把輸入序列打亂順序輸出也只會(huì)隨之打亂而不會(huì)改變?nèi)我鈨蓚€(gè)位置之間的關(guān)系結(jié)構(gòu)。因?yàn)樗豢磧?nèi)容相似度不看誰在誰前面。對(duì)語言來說順序就是信息?!皬埲蛄死钏摹焙汀袄钏拇蛄藦埲钡脑~完全一樣語義完全相反。所以Transformer在最初設(shè)計(jì)中就必須顯式加入位置信息。這個(gè)模塊看似配角實(shí)際撐起了今天長文本外推能力的大半。很多項(xiàng)目訓(xùn)練時(shí)一切正常一換序列長度就崩往往就是位置編碼選型的問題。位置編碼本身也從最初的固定三角函數(shù)一路演進(jìn)到可學(xué)習(xí)絕對(duì)位置編碼、相對(duì)位置編碼、旋轉(zhuǎn)位置編碼RoPE再到零參數(shù)的ALiBi。4.2 絕對(duì)位置編碼的兩種形態(tài)固定式與可學(xué)習(xí)式原始Transformer使用固定三角函數(shù)編碼不同維度用不同頻率的sin/cos生成。好處是參數(shù)少、不學(xué)習(xí)、可以嘗試外推更關(guān)鍵的是由于三角函數(shù)的和差化積公式理論上編碼后兩個(gè)位置向量的點(diǎn)積能包含相對(duì)位置信息。不過在深層網(wǎng)絡(luò)里這種相對(duì)信息能不能被有效利用并不一定。到了BERT時(shí)代大家發(fā)現(xiàn)直接用可學(xué)習(xí)的位置embedding更簡(jiǎn)單效果當(dāng)時(shí)也更好所以大量預(yù)訓(xùn)練模型都采用了它??蓪W(xué)習(xí)絕對(duì)位置編碼的問題是訓(xùn)練長度固定模型見過多長就只能處理多長。如果訓(xùn)練時(shí)最長512推理時(shí)來了1024超出部分的位置embedding是從未訓(xùn)練過的隨機(jī)值效果自然崩。后來為了讓模型能處理長文檔大家才重新轉(zhuǎn)向相對(duì)位置類編碼因?yàn)橄鄬?duì)距離比絕對(duì)序號(hào)更容易泛化你說“隔了兩句話的關(guān)系”比說“第5個(gè)詞和第120個(gè)詞的關(guān)系”更本質(zhì)。4.3 相對(duì)位置編碼與Transformer-XL的外推思路絕對(duì)位置編碼把“第i個(gè)位置”當(dāng)作獨(dú)立標(biāo)簽相對(duì)位置編碼則直接建?!暗趇和j個(gè)位置相距多遠(yuǎn)”。Transformer-XL使用相對(duì)位置編碼后模型在訓(xùn)練長度之外也能延續(xù)一定距離因?yàn)榫嚯x關(guān)系比絕對(duì)序號(hào)更容易遷移。T5的處理更直接給注意力分?jǐn)?shù)加一個(gè)由相對(duì)距離決定的可學(xué)習(xí)bias讓模型在打分時(shí)知道兩個(gè)token離得遠(yuǎn)還是近。這類設(shè)計(jì)的直覺是語言中“相鄰”“相隔兩個(gè)詞”“跨句”這些距離模式是穩(wěn)定的而具體出現(xiàn)在第幾段并不重要。不過相對(duì)位置編碼的實(shí)現(xiàn)細(xì)節(jié)通常更繞比如需要調(diào)整K和V的拆分方式網(wǎng)絡(luò)層數(shù)一變就容易搞混。我在復(fù)現(xiàn)Transformer-XL時(shí)曾花了大半天排查維度不對(duì)齊的問題原因就是相對(duì)位置索引的偏移量沒寫對(duì)。位置編碼雖然看著只有幾行代碼但確實(shí)是實(shí)現(xiàn)時(shí)最容易出錯(cuò)的地方之一。4.4 RoPE為什么成了LLM的事實(shí)標(biāo)準(zhǔn)旋轉(zhuǎn)位置編碼RoPE是近幾年大模型里用得最多的位置編碼。它的核心想法很漂亮把每個(gè)位置對(duì)應(yīng)的Q或K向量在高維空間里旋轉(zhuǎn)一個(gè)與該位置相關(guān)的角度。兩個(gè)旋轉(zhuǎn)后的向量做內(nèi)積時(shí)旋轉(zhuǎn)不改變向量長度只改變相位所以內(nèi)積結(jié)果恰好只依賴兩個(gè)位置的旋轉(zhuǎn)角之差也就是相對(duì)位置。這種設(shè)計(jì)把位置信息與注意力計(jì)算融合得不露痕跡同時(shí)具備相對(duì)位置編碼的外推優(yōu)勢(shì)。更重要的是后續(xù)對(duì)RoPE做長度外推很方便直接對(duì)旋轉(zhuǎn)角做線性插值或NTK插值就可以把模型推到訓(xùn)練長度之外不需要改動(dòng)模型結(jié)構(gòu)。Llama、Qwen這些開源模型都用它生態(tài)工具也都對(duì)齊了所以它成為事實(shí)標(biāo)準(zhǔn)不是偶然。如果需要在超長上下文場(chǎng)景部署模型RoPE加插值方案是目前最成熟的方向之一。4.5 外推替代方案ALiBi如果你不想引入復(fù)雜的旋轉(zhuǎn)公式ALiBi是另一個(gè)有趣的思路。它完全不做位置embedding而是在注意力分?jǐn)?shù)上直接減去一個(gè)與兩個(gè)位置距離成正比的懲罰項(xiàng)讓模型天然對(duì)“遠(yuǎn)距離”降低權(quán)重。這種設(shè)計(jì)幾乎零參數(shù)在短訓(xùn)練、中長推理的外推場(chǎng)景上表現(xiàn)不錯(cuò)。我實(shí)際測(cè)評(píng)中發(fā)現(xiàn)ALiBi在需要較長外推的任務(wù)里比較省心但訓(xùn)練充分的大模型里RoPE配合插值通常更穩(wěn)。位置編碼沒有銀彈關(guān)鍵是定義清楚你手里的序列長度需求和外推目標(biāo)。如果訓(xùn)練和推理長度一致可學(xué)習(xí)絕對(duì)位置編碼足夠如果要外推RoPE或ALiBi是更穩(wěn)的選擇。這個(gè)判斷越早做后面返工越少。5. 同是Transformer外殼內(nèi)部件一直在換歸一化、激活、共享頭5.1 Post-LN到Pre-LN的穩(wěn)定化改動(dòng)原始Transformer把LayerNorm放在殘差相加之后也就是Post-LN。理論上Post-LN表達(dá)能力更強(qiáng)因?yàn)樗粚?duì)殘差路徑做額外限制但實(shí)際訓(xùn)練大模型時(shí)容易不穩(wěn)定需要warmup和精細(xì)調(diào)參。后來GPT-2和很多開源模型改用Pre-LN先對(duì)輸入做LayerNorm再進(jìn)行注意力或前饋網(wǎng)絡(luò)最后殘差直接相加。Pre-LN的殘差路徑更干凈梯度更容易跨層流動(dòng)訓(xùn)練更穩(wěn)定。代價(jià)是模型最終效果可能略弱于Post-LN但和“能不能訓(xùn)起來”相比這個(gè)代價(jià)非常好接受。工程上我見過不少照著原始Transformer搭模型的朋友第一版堆不出深度改成Pre-LN以后幾十層就能穩(wěn)定跑了。現(xiàn)在看主流LLM的開源代碼幾乎都是Pre-LN或者它的變體。如果你自己從零訓(xùn)練Transformer先把這一步改對(duì)比調(diào)一堆學(xué)習(xí)率更有效。5.2 從LayerNorm到RMSNorm的一步簡(jiǎn)化LayerNorm要計(jì)算均值和方差然后做歸一化。RMSNorm的研究者發(fā)現(xiàn)均值那一步其實(shí)可以省掉只要用RMS均方根做縮放就足夠穩(wěn)定而且省了不少計(jì)算。聽起來像小改動(dòng)但對(duì)幾十億參數(shù)模型來說省一個(gè)reduce對(duì)訓(xùn)練吞吐是有實(shí)際影響的。LLaMA系列用的就是RMSNorm。從算法演進(jìn)角度看RMSNorm少了一次中心化偏移的可學(xué)習(xí)參數(shù)也少了一層統(tǒng)計(jì)耦合訓(xùn)練時(shí)更干脆。如果你的模型在訓(xùn)練時(shí)發(fā)現(xiàn)LayerNorm統(tǒng)計(jì)均值長期偏離0仿照RMSNorm砍掉中心化通常會(huì)更快收斂。當(dāng)然這不是萬能技巧但在很多場(chǎng)景下確實(shí)能讓歸一化這塊更簡(jiǎn)潔?,F(xiàn)在新開源模型普遍用RMSNorm也說明這種簡(jiǎn)化在工程上是劃算的。5.3 激活函數(shù)ReLU到GELU、SwiGLU的演進(jìn)Transformer前饋網(wǎng)絡(luò)里的激活函數(shù)也在演進(jìn)。原始論文用ReLU簡(jiǎn)單高效但負(fù)數(shù)區(qū)域梯度完全為0容易造成神經(jīng)元死亡。BERT和GPT-1開始用GELU它用標(biāo)準(zhǔn)正態(tài)累積分布做平滑門控0附近不是尖點(diǎn)梯度更連續(xù)訓(xùn)練更穩(wěn)。后來PaLM、LLaMA、很多LLM用SwiGLU把門控線性單元和Swish組合起來等于一個(gè)分支負(fù)責(zé)“內(nèi)容”另一個(gè)分支負(fù)責(zé)“門控”。SwiGLU在同等計(jì)算量下通常能帶來穩(wěn)定的效果提升但會(huì)額外增加參數(shù)。實(shí)際使用時(shí)常常要把中間層維度縮小比如從4倍降到約2.67倍來抵消參數(shù)增量。這里給個(gè)參數(shù)建議表激活函數(shù)典型中間層倍數(shù)特點(diǎn)ReLU4倍簡(jiǎn)單快速容易神經(jīng)元死亡GELU4倍平滑梯度預(yù)訓(xùn)練更穩(wěn)SwiGLU約2.67倍門控機(jī)制效果好但參數(shù)多這個(gè)維度調(diào)整看起來小但對(duì)訓(xùn)練吞吐影響很大。我見過有人把SwiGLU的中間層繼續(xù)設(shè)成4倍結(jié)果參數(shù)量爆炸訓(xùn)練速度直線下降效果卻沒提升。激活函數(shù)選型時(shí)一定要連同維度一起看。5.4 從MHA到MQA/GQA推理成本驅(qū)動(dòng)的頭結(jié)構(gòu)變化注意力頭結(jié)構(gòu)的最大演進(jìn)動(dòng)力來自推理階段的KV cache。標(biāo)準(zhǔn)多頭注意力MHA每個(gè)頭都獨(dú)立存K和V序列越長顯存越大。推理時(shí)這些KV要一直存在所以有人做了MQA讓所有頭共享同一個(gè)K和V。共享以后KV cache大幅縮小但表達(dá)能力下降模型質(zhì)量可能有折扣。折中方案是GQA把注意力頭分成若干組組內(nèi)共享一組K/V。GQA在質(zhì)量和KV cache之間取得了平衡比如Llama 2 70B就用了GQA。如果你在做長上下文服務(wù)的部署KV cache是繞不開的工程問題。MQA/GQA這類結(jié)構(gòu)改動(dòng)遠(yuǎn)比單純加顯存更實(shí)際。下面這張表可以幫你快速?zèng)Q策類型K/V共享方式KV cache開銷適用場(chǎng)景MHA每頭獨(dú)立最高訓(xùn)練階段追求表達(dá)上限MQA所有頭共享一組最低輕量推理接受質(zhì)量回落GQA組內(nèi)共享折中生成式LLM質(zhì)量與顯存平衡實(shí)際開發(fā)時(shí)訓(xùn)練階段可以用MHA充分訓(xùn)練推理階段再做GQA轉(zhuǎn)換或量化這種思路在一些部署實(shí)踐中已經(jīng)很常見。不過要注意訓(xùn)練和推理的注意力頭配置不一致時(shí)需要做參數(shù)重構(gòu)不能簡(jiǎn)單改名了事。6. 范式位移Decoder-only與條件計(jì)算帶來的新問題6.1 BERT與GPT左右兩條路的結(jié)果從Transformer衍生出來的早期路線分兩支。BERT走Encoder-only架構(gòu)用雙向上下文預(yù)訓(xùn)練在GLUE、SQuAD等理解類任務(wù)上統(tǒng)治了很久。GPT走Decoder-only架構(gòu)用因果語言模型做生成一開始更擅長續(xù)寫。當(dāng)時(shí)很多研究者的判斷是兩種架構(gòu)各司其職理解歸BERT生成歸GPT。后來的發(fā)展大家都清楚生成式AI成為大模型主流后兩邊在規(guī)模、生態(tài)、社區(qū)投入上開始明顯傾斜。這種偏差背后有算法理念的原因BERT的預(yù)訓(xùn)練目標(biāo)需要額外任務(wù)頭才能遷移而GPT的自回歸目標(biāo)天然把所有任務(wù)統(tǒng)一成“預(yù)測(cè)下一個(gè)token”下游使用時(shí)幾乎不需要架構(gòu)改動(dòng)。看起來只是訓(xùn)練目標(biāo)的差別實(shí)際變成了整個(gè)產(chǎn)品形態(tài)的差別。6.2 為什么生成式大模型把Decoder-only當(dāng)成默認(rèn)架構(gòu)除了統(tǒng)一任務(wù)很方便Decoder-only在工程上也更好擴(kuò)展。因果注意力意味著所有位置只看左側(cè)顯存中KV的形態(tài)整齊推理時(shí)逐token生成天然符合KV cache的更新方式。Encoder-Decoder架構(gòu)雖然雙向理解更強(qiáng)但生成時(shí)仍然要從Decoder走一遍編碼端和解碼端的調(diào)度更復(fù)雜推理開銷也更大。再加上近年一些對(duì)照實(shí)驗(yàn)顯示在同等參數(shù)量和訓(xùn)練數(shù)據(jù)下Decoder-only在下游任務(wù)上比Encoder-Decoder不弱甚至更強(qiáng)。這直接推動(dòng)元模型、Llama、Qwen等幾乎所有主流大模型都選了Decoder-only。倒不是說Encoder-Decoder沒有價(jià)值而是在當(dāng)前規(guī)?;傻姆妒街蠨ecoder-only的工程優(yōu)勢(shì)太明顯。如果只是做純理解任務(wù)Encoder-only依舊有其價(jià)值但如果你要做一個(gè)通用助手Decoder-only幾乎是最省事的起點(diǎn)。6.3 MoE、多模態(tài)等架構(gòu)層面的新變量說Transformer架構(gòu)演進(jìn)還不能不提MoE。MoE不是改注意力算法而是把FFN層換成多個(gè)專家網(wǎng)絡(luò)并通過門控網(wǎng)絡(luò)對(duì)每個(gè)token動(dòng)態(tài)選擇專家。它以條件計(jì)算的方式讓模型參數(shù)量大幅增加但單次推理只激活一部分參數(shù)。Mixtral、DeepSeek等模型把MoE和Transformer結(jié)合后長上下文的性價(jià)比進(jìn)一步提升。多模態(tài)方向則出現(xiàn)把圖像、音頻都當(dāng)作token序列輸入到Transformer的做法。核心算法時(shí)代的很多技巧都能原樣保留只是模態(tài)編碼器不同。這些都說明Transformer的核心算法演進(jìn)不會(huì)停在“注意力本身怎么算”而會(huì)在“結(jié)構(gòu)算法如何匹配實(shí)際算力”上繼續(xù)延伸。我入行這幾年最大的感受是很多看似理論優(yōu)雅的演進(jìn)最初都來自工程上的“卡脖子”問題。FlashAttention來自顯存瓶頸Pre-LN來自深度訓(xùn)練不穩(wěn)定GQA來自推理KV cache膨脹。如果你自己做項(xiàng)目別急著追新模塊先看看當(dāng)前流程卡在哪一層序列一長就崩優(yōu)先看注意力復(fù)雜度模型越深越難收斂?jī)?yōu)先看歸一化和殘差服務(wù)端KV cache太吃顯存優(yōu)先看GQA。按這個(gè)思路去選架構(gòu)算法比復(fù)制別人的配置要有效得多。這也是我把前面那些演進(jìn)串成一條邏輯線的意義把每個(gè)新模塊的名字都還原成它原本要解決的問題用的時(shí)候自然知道怎么選。