LLM基礎(chǔ)模型系列:深入注意力機(jī)制
大模型技術(shù)論文不斷,每個(gè)月總會(huì)新增上千篇。本專欄??精選論文???重點(diǎn)解讀,主題還是圍繞著行業(yè)實(shí)踐和工程量產(chǎn)。若在某個(gè)環(huán)節(jié)出現(xiàn)卡點(diǎn),可以回到??大模型必備腔調(diào)???或者??LLM背后的基礎(chǔ)模型???新閱讀。而??最新科技(Mamba,xLSTM,KAN)??則提供了大模型領(lǐng)域最新技術(shù)跟蹤。
1.自注意力Self-Attention
自注意力的主要功能是從輸入序列本身生成上下文感知向量,而不是像基于RNN的編碼器-解碼器架構(gòu)那樣同時(shí)考慮輸入和輸出。在繼續(xù)往下之前,還是需要幫助大家溫習(xí)下之前的內(nèi)容,也請(qǐng)各位能夠認(rèn)真的理解自注意力。
在例句中,“火車準(zhǔn)時(shí)離開車站”中有 7 個(gè)Tokens,可以得到一個(gè) 7x7 的自注意力得分矩陣。根據(jù)圖中描繪的自注意力得分,“火車”一詞更關(guān)注“車站”一詞,而不是關(guān)注其他單詞。自注意力分?jǐn)?shù)有助于理解給定句子中單詞的上下文含義。例如,這里的“車站”一詞用于火車站的上下文,而不是用于其他上下文,如加油站或公共汽車站等。
自注意力分?jǐn)?shù)是通過余弦相似度計(jì)算的,即兩個(gè)詞向量的點(diǎn)積。它用于評(píng)估兩個(gè)詞向量之間的關(guān)系強(qiáng)度或比較詞向量之間的相似程度。
這些自注意力分?jǐn)?shù)最后會(huì)被按照權(quán)重進(jìn)行加權(quán)累加,最終輸出一個(gè)向量可以理解為已經(jīng)將上下文進(jìn)行編碼。例如,當(dāng)前詞為“站”這個(gè)詞時(shí),與“站”密切相關(guān)的詞對(duì)總和的貢獻(xiàn)更大(包括“站”這個(gè)詞本身),而不相關(guān)的詞幾乎不會(huì)貢獻(xiàn)任何詞。由此產(chǎn)生的向量作為“站”一詞的新表示,并結(jié)合了周圍的上下文。在理解這句話的時(shí)候,火車站的上下文信息就被編碼到最后的輸出。
2.多頭注意力Multi-Head Attention
在剛才提到的點(diǎn)積注意力中,如下圖所示,輸入序列通過代表查詢Q、鍵K和值V的三個(gè)矩陣進(jìn)行轉(zhuǎn)換然后計(jì)算自注意力。其中綠色x(2)為一個(gè)Embedding向量。
而在多頭注意力的背景下,某種意義三個(gè)矩陣可以被看作是一個(gè)單獨(dú)的注意力頭。增加單個(gè)自注意力頭的輸出維度和使用多個(gè)注意力頭之間的區(qū)別在于模型如何處理數(shù)據(jù)并從中學(xué)習(xí)。雖然這兩種方法都增加了模型表示數(shù)據(jù)不同特征或方面的能力,但它們的方式基本不同。
上面這張圖想表達(dá)的是一個(gè)輸入的Embedding可以和多套的QKV協(xié)同運(yùn)算。論文上描述的是多個(gè)W變換到子空間,但是實(shí)現(xiàn)上一般采用分段的方式。大白話說是將Embedding的長(zhǎng)度切分為n段分別做運(yùn)算。比如原來Embedding是512維,假定32頭,那么Embedding 會(huì)被切分成512/32=16維,相當(dāng)于多個(gè)子空間。
例如,多頭注意力機(jī)制中的每個(gè)注意力頭理論上可以學(xué)習(xí)集中在輸入序列的不同部分,捕捉數(shù)據(jù)中的各種方面或關(guān)系。這種多樣性是多頭注意力成功的關(guān)鍵,畢竟每一個(gè)Embedding基本上都是高維度,通過多頭分別捕獲數(shù)據(jù)在各個(gè)層面的依賴和關(guān)系。
例如有的頭專門捕獲感情因子,有的頭專門捕獲地域特征,有的頭專門捕獲人物關(guān)系等等……
多頭注意力也可以更高效,特別是在并行計(jì)算方面。每個(gè)頭部可以獨(dú)立處理,使其非常適合現(xiàn)代硬件加速器,如擅長(zhǎng)并行處理的 GPU 或 TPU。簡(jiǎn)而言之,使用多個(gè)注意力頭不僅僅是為了增加模型的容量,而是為了增強(qiáng)其學(xué)習(xí)數(shù)據(jù)中多樣特征和關(guān)系的能力。
3.交叉注意力Cross-Attention
除輸入部分外,交叉注意力計(jì)算與自注意力相同。交叉注意力說白了就是Q來至一個(gè)序列,而KV來至另一個(gè)序列。這些序列都是相同維度的嵌入序列。相比之下,自注意力輸入是單個(gè)嵌入序列。而交叉注意力則是其中一個(gè)序列用作Q輸入,而另一個(gè)序列用作K和V輸入。
讀者可以仔細(xì)觀察上圖,在傳統(tǒng)的Transformer的架構(gòu)中,自注意力機(jī)制一般在Encoder(下圖左),而交叉注意力機(jī)制一般在Decoder(下圖右)。
其實(shí)也很好理解,對(duì)大模型的提問輸入在Encoder中經(jīng)過自注意力抽取出查詢的上下文信息,然后輸入為K和V供給給Decoder,而Decoder一方面不斷地工作產(chǎn)生新的Token,一方面不斷地將已經(jīng)輸出的序列嵌入輸出Q,再次和Encoder的K和V做交叉注意力,供后續(xù)的組件吐出下個(gè)Token的概率分布。
4.因果注意力Causal-Attention
因果自注意的起源來至序列中某個(gè)位置的輸出僅僅依賴于先前位置的已知輸出,而不是基于未來位置。比如說Decoder,它是按照順序產(chǎn)生Token,先產(chǎn)生的Token肯定無法依賴后產(chǎn)生的Token。因此對(duì)于處理的每個(gè)Token,因果注意力機(jī)制屏蔽了未來的Token。所謂的未來,就是在當(dāng)前Token之后的尚未生成的Tokens。因此原來的自注意力矩陣則成為上三角矩陣,因?yàn)橛幸话胧遣恍枰?jì)算的。
例如life生成的時(shí)候只需要計(jì)算和自己,當(dāng)生成到life is的時(shí)候,則只需要計(jì)算is和life,is和自己,如此類推……
值得一提的是,每次生成的注意力矩陣每一行都需要?dú)w一化。這里有個(gè)小小的技巧,可以將尚未生成的Token標(biāo)記為-∞,然后在由softmax進(jìn)行歸一化。
附錄:多頭注意力的變換過程全景圖
推導(dǎo)步驟1:
推導(dǎo)步驟2:
推導(dǎo)步驟3:
推導(dǎo)步驟4:
本文轉(zhuǎn)載自 魯班模錘,作者: 魯肅
