base-llm 1.4.3 深入理解transformer

Transformer 來自2017年Google研究團隊的名為《Attention is All You Need》的論文。其思想拋棄了傳統(tǒng)RNN和卷積網(wǎng)絡(luò),整個模型基于注意力機制來構(gòu)建。它憑借出色的并行計算能力極大提升了訓(xùn)練效率,更有效地捕捉了文本中長距離依賴關(guān)系,為后續(xù)Bert、GPT等大規(guī)模預(yù)訓(xùn)練模型的誕生提供了架構(gòu)基礎(chǔ)。

一、 自注意力機制

1.1 自注意力與交叉注意力的區(qū)別

區(qū)別: 信息的來源和流動方向,交叉注意力用于對齊和聚合兩個不同序列之間的信息,自注意力用于理解和重構(gòu)單個序列內(nèi)部的依賴關(guān)系。
交叉注意力: Query來自解碼器(帶邊當前目標序列狀態(tài)), key和value 來自編碼器的所有輸出(代表完整的源序列信息)。生成目標序列的每一步時,從源序列中尋找最相關(guān)的信息。
自注意力機制: 信息在同一個序列內(nèi)部,Query,Key,Value都來自輸入序列。目的是為了捕捉輸入序列內(nèi)部的依賴關(guān)系,重新計算序列中每個詞元的表示,使其包含更豐富的上下文信息。

1.2 自注意的計算過程

(1)生成Q,K,V向量:對輸入序列的每個詞元,獲取其詞嵌入向量Xi,分別與其可學(xué)習(xí)的,在整個模型中共享的權(quán)重矩陣相乘,生成該詞元專屬的向量。


image.png

這三個矩陣的作用是:將原始的詞嵌入向量投影到不同的、專門用于注意力計算的表示空間中,賦予模型更大的靈活性。

(2)注意力分數(shù): query和所有詞元的key向量計算點積,得到注意力分數(shù)


image.png

(3)縮放與歸一化:用softmax做歸一化,對score除以根號dk(dk是key的向量維度)。


image.png

縮放因子根號dk的目的: 首先向量維度越大,導(dǎo)致點積結(jié)果的方差就會越大,導(dǎo)致softmax函數(shù)的結(jié)果可能會極小,從而導(dǎo)致梯度消失,影響模型學(xué)習(xí)。

(4)加權(quán)求和:權(quán)重對所有詞元的value進行加權(quán)求和,得到i個詞元經(jīng)過注意力計算后得到的新表示zi.


image.png

二、多頭注意力

目的: 一組Q,K,V的權(quán)重矩陣,只能表示一個視角。通常文本可能會表達多層次的關(guān)系。
為了讓模型能夠綜合利用不同維度和視角提出的信息。Transformer提出多頭注意力機制。
思想: 并行執(zhí)行多次自注意力計算,每一次計算都是一個獨立的head,有自己的權(quán)重矩陣,并且可以學(xué)習(xí)去關(guān)注一種特定類型的上下文關(guān)系。

具體步驟:
(1)并行計算:假設(shè)有h個頭,就初始化h組QKV權(quán)重矩陣
(2)獨立注意力:每個頭單獨計算注意力,生成矩陣zi
(3)拼接與投影: 將多頭的輸出矩陣進行拼接
(4)最終輸出: 拼接后的矩陣乘以一個新的權(quán)重矩陣Wo,驚奇投影回原始的輸入維度,得到多頭注意力機制的最終輸出。

簡單理解就是:將輸入維度,拆分成多個組,也就是多頭,每個頭有單獨計算自己的注意力,拼接后乘以一個權(quán)重矩陣,最后輸出多頭注意力矩陣。通過拆分,不同的頭可以自發(fā)地學(xué)習(xí)到不同的關(guān)注模式。

GQA(分組查詢注意力) 的思想是Query拆分成多頭,KV拆分成多個組,多個頭共享一個組的KV權(quán)重。


image.png

三、Transformer 整體結(jié)構(gòu)

image.png

Transformer的Encoder和Decoder都是由N各功能相同的layer堆疊而成。

3.1 編碼器(Encoder)

編碼器作用: 理解和消化輸入的整個序列,為序列中的每個詞元生成一個復(fù)函上下文信息的表示編碼器層由兩個子層構(gòu)成(多頭注意力層和位置前饋網(wǎng)絡(luò))。每個子層的輸出乧經(jīng)過了殘差鏈接(Add)與層歸一化(Norm)處理。所以,一個編碼器層內(nèi)部的數(shù)據(jù)流可以表示為x->Sublayer1(x)->Add&Norm->Sublayer2(...)-> Add&Norm。

多頭注意力層:是雙向的自注意力,也就是一個詞元能看到序列中所有其他詞元,包括自己,前邊和后邊的。因為雙向性,編碼器非常擅長理解完整的輸入文本,并為每個詞元生成一個深度融合了上下文信息的表示。因此大量堆疊編碼器層而構(gòu)建的模型(Encoder-Only架構(gòu)),如BERT,在文本分類、命名實體識別等自然語言理解任務(wù)上取得了巨大成功。

3.2 解碼器(Decoder)

解碼器層包括三個子層(帶掩碼的多頭注意力層,交叉注意力層和位置前饋網(wǎng)絡(luò))。每個子層之間仍然采用了殘差鏈接和層歸一化。

關(guān)鍵特性:

  • 子層1: 帶掩碼的自注意力

    • 解碼器生成序列時必須是自回歸的,也就是用之前的值預(yù)測當前值,不能往后看。
    • 在并行的自注意力計算中,引入掩碼,將為了的詞掩碼,設(shè)置成極小的值,當softmax后,該位置權(quán)重會變?yōu)?,從而保證模型的單向性。
    • 自注意力機制,是為了分析自己已經(jīng)寫過的內(nèi)容。
  • 子層2: 交叉注意力

    • key和value來自編碼器最終輸出,query來自解碼器前一個子層(即帶掩碼的自注意力層)的輸出。
    • 這一層允許編碼器生成每個詞元是,能夠關(guān)注到輸入序列的所有部分,從而有針對性的提取所需信息。
  • 子層3: 位置前饋網(wǎng)絡(luò)(FFN)
    為模型提供非線性變換能力

  • 大模型應(yīng)用: 大量堆疊解碼器層而構(gòu)建的模型,如GPT系列,由于其天然的自回歸生成能力,引領(lǐng)了LLM發(fā)展浪潮。

3.3 組件解析

3.3.1 位置前饋網(wǎng)絡(luò)

由兩次線性變換和一個激活函數(shù)組成的全連接網(wǎng)絡(luò),獨立于序列中的每一個位置。
作用: 特征變換,注意力子層主要包含softmax故意一花;每個位置的非線性主要有FFN提供(常見ReLU/GELU)
內(nèi)部結(jié)構(gòu): 升維-激活-降維, 論文中中間層維度設(shè)置為4倍是經(jīng)驗值。


image.png

3.3.2 殘差鏈接與層歸一化(Add & Norm)

  • Add(殘差鏈接) : 解決深度網(wǎng)絡(luò)的模型退化問題。模型越深,在反向傳播的時候梯度對淺層的影響越小,導(dǎo)致模型訓(xùn)練難以收斂。所以使用y=x+Subplayer(x)方式,讓梯度能在1的基礎(chǔ)上下波動,而不是趨于0,穩(wěn)定了訓(xùn)練過程。
  • Norm(層歸一化):用于穩(wěn)定訓(xùn)練過程。獨立地對每個樣本的每個詞元的特征向量(也就是hidden_size維度)進行標準化。使其均值為0,方差變?yōu)?.因為了科學(xué)系的參數(shù),gama和beta,讓模型自主學(xué)習(xí)最佳的數(shù)據(jù)分布。


    image.png

這使得模型既能享受到歸一化帶來的穩(wěn)定性,又具備了根據(jù)任務(wù)需要恢復(fù)或調(diào)整原始分布的能力。相比Batch Norm (對一個批次中的所有樣本的統(tǒng)一特征進行歸一化) 相比,layer Norm 不受批次大小影響,更適合處理長度可變的自然語言序列。

簡單理解: 層歸一化是每個樣本的所有維度上的歸一化。 批歸一化是多個樣本的同一維度上的歸一化。目標都是為了提高訓(xùn)練穩(wěn)定性。

原論文采用 Post-LN(Subplayer-> Add->LayerNorm). 現(xiàn)在實現(xiàn)(如GPT系列)采用Pre-LN(layerNorm->Subplayer->Add),訓(xùn)練更穩(wěn)定、更易加深,但功能等價。

3.4 位置編碼

自注意力機制缺陷是位置無關(guān)性,因為計算完全并行,模型無法感知詞元的順序。Transformer在詞嵌入向量輸入之間,為他們加入了一個位置編碼。
(1)可學(xué)習(xí)的位置編碼

  • Encoder-only模型中常見;近年大型decoder類模型多采用相對/旋轉(zhuǎn)類位置編碼(如RoPE)
  • 實現(xiàn): 創(chuàng)建一個embedding層,大小為[max_sequence_langth,hidden_size]。max_sequence_length是模型能處理的最大序列長度。訓(xùn)練時,模型會想學(xué)embedding一樣,自動學(xué)習(xí)出每個位置最合適的向量表示。

(2)基于三角函數(shù)的固定編碼

  • 原版Transformer論文中使用的方法
  • 使用不同頻率的正弦和預(yù)先函數(shù)為每個位置生成一個獨特的固定的編碼向量


    image.png

    利用不同頻率的正弦和預(yù)先函數(shù),為d維編碼向量的每一個維度計算一個特定的值。每個位置的pos和每個維度i的組合都是獨一無二的。
    優(yōu)勢是不同位置的編碼向量之間存咋以固定的線性關(guān)系,這可能有主域模型推斷出詞元之間的相對位置。主要有點是不需要訓(xùn)練,理論上可以外推到比訓(xùn)練時遇到的更長的序列。

簡而言之: pos是詞元位置, i是向量的維度索引(0-d/2). 通過2i和2i+1來區(qū)分就。d是詞嵌入的維度。所以每個位置每個向量維度都是不一樣的。embendding 經(jīng)過乘以根號dim進行縮放后再加上位置編碼。

絕對 vs 相對位置編碼
上述兩種都屬于絕對位置編碼,每個絕對位置分配一個特定編碼,缺點是處理超長文本時可能存在泛化性問題。因此,現(xiàn)代大語言模型轉(zhuǎn)而采用相對位置編碼。這種方法不在關(guān)注詞元的絕對位置關(guān)系,而是直接注意力計算中建模詞元之間的相對距離(例如當前詞與前兩個詞之間的關(guān)系),這被證明在處理長序列時更有效、更靈活。

3.5 注意力掩碼

(1)因果掩碼: 用于解碼器的帶掩碼的自注意力子層,為了確包解碼過程遵循自回歸特性,即生成第i個詞元時能依賴前i-1個詞元的信息,讓注意力權(quán)重矩陣程下三角矩陣形態(tài),其他位置都屏蔽掉。主對角線以下的位置標記為可關(guān)注,主對角線以上標記為屏蔽。在softmax之前被屏蔽的注意力分數(shù)會被加上一個極大的負數(shù),迫使其注意力權(quán)重歸零,物理上切斷了信息的向后傳播路徑。
(2)填充掩碼: 應(yīng)用于編碼器和解碼器的所有注意力層,目的是為了解決變長序列批次處理時的padding問題。在計算注意力分數(shù)的時候,不計算padding的位置。

這兩種在加碼器的自注意力層通常結(jié)合使用,確包模型既不會關(guān)注到未來的信息,也不會關(guān)注到填充位。

3.6 解碼器推理與KV緩存

推理時,模型必須逐個生成詞元,是一個自回歸的過程。從[BOS]開始符,生成token1,再輸入[BOS],token1,生成token2. 知道生成[EOS] 結(jié)果符或達到最大長度。

如果按照這個流程直接計算,效率會非常低下,因為在每次需要重新計算輸入詞的QKV向量并參與注意力計算。但事實上,輸入詞的key和value向量之前的步驟已經(jīng)計算過了。
為了解決這種冗余計算,推理式會采用關(guān)鍵的優(yōu)化技術(shù):KV緩存。

  • 基本原理: 對于解碼器的每一層,都緩存下載至當前時刻已經(jīng)計算出的所有詞元的key和value向量。
  • 工作流程: 在生成第t個詞元時,模型只需要為當前輸入的第t-1個詞元計算出它自己的qt-1,kt-1,vt-1.然后從緩存中取出來歷史的K和V的cache. 最后把新的追加到緩存中,并用qt-1于更新后完整的Kcache,Vcache進行注意力計算。

通過KV緩存,每次解碼步驟計算量從O(T^2)相關(guān),降低到只與序列長度O(T)線性相關(guān),提高了文本生成速度。需要注意,KV緩存占用會隨步數(shù)線性增長,在多層多頭設(shè)置下需關(guān)注顯存開銷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容