探秘Transformer系列之(2)---總體架構(gòu)
探秘Transformer系列之(2)---總體架構(gòu)
0x00 概述
0.1 流程
使用Transformer來(lái)進(jìn)行文本生成其實(shí)就是用模型來(lái)預(yù)測(cè)下一個(gè)詞,完整流程包括多個(gè)階段,如分詞、向量化、計(jì)算注意力和采樣,具體運(yùn)作流程如下:
- 分詞(tokenize)。把用戶的輸入文本(此處假設(shè)是“Data visualization empowers users to”)拆解為若干獨(dú)立的詞匯單元,即token。
- 編碼。借助詞表把token映射為數(shù)字,每個(gè)token由一個(gè)唯一的數(shù)字表示。
- embedding(嵌入)化。embedding模塊將token代表的數(shù)字轉(zhuǎn)換為embedding向量,即將詞映射到一個(gè)向量空間,這樣LLM才能處理。此時(shí)還會(huì)加上位置編碼信息,因?yàn)槔斫庹Z(yǔ)言不僅關(guān)乎單詞,還關(guān)乎單詞的順序。位置編碼可以確保單詞的順序不會(huì)丟失。所有嵌入向量組合在一起形成嵌入矩陣。
- 注意力計(jì)算。這是語(yǔ)境化操作,若干堆疊的Transformer Block通過(guò)注意力機(jī)制將這些Embedding向量轉(zhuǎn)換成若干特征向量,構(gòu)建詞和詞之間的關(guān)系。在注意力計(jì)算過(guò)程中,每個(gè)token可以了解自己與其它token的相關(guān)性。最終每個(gè)token流經(jīng)Transformer最后一層之后得到的是一個(gè)代表語(yǔ)義的特征向量。
- 計(jì)算概率。將最后一個(gè)token(”to“)對(duì)應(yīng)的特征向量映射為下一個(gè)待預(yù)測(cè)詞的概率分布(logits)。具體操作是通過(guò)一個(gè)線性層把特征向量升維到詞表維度(即把解碼器的輸出轉(zhuǎn)化為與詞典大小相同的向量),并且通過(guò)softmax進(jìn)行歸一化,最終輸出一個(gè)概率分布。該分布表示對(duì)詞表中每個(gè)詞匹配這個(gè)特征向量的概率。
- 采樣。依據(jù)這些概率,按照一定的采樣規(guī)則來(lái)采樣下一個(gè)token,比如選取概率最高的”visualize“作為最有可能出現(xiàn)的下一個(gè)單詞。
- 再次使用分詞表將”visualize“對(duì)應(yīng)的整數(shù)轉(zhuǎn)換回原始的詞匯,形成推理結(jié)果句子。
- 不斷重復(fù)上述過(guò)程。直到LLM輸出結(jié)束流(EOS)標(biāo)記表示解碼結(jié)束或者已經(jīng)生成所需數(shù)量的token。
下圖將上述流程的核心部分作了可視化,也是本篇講解的基礎(chǔ),后續(xù)將對(duì)模型結(jié)構(gòu)和執(zhí)行流程進(jìn)行逐步細(xì)化。

0.2 說(shuō)明
本系列主要以下面幾項(xiàng)為基礎(chǔ):
- Transformer論文:Attention Is All You Need https://arxiv.org/abs/1706.03762v7。
- 其它相關(guān)經(jīng)典論文和精彩博客,參考將在各個(gè)篇幅的具體部分中給出。
- “The Annotated Transformer” 博客以及其源碼(后續(xù)簡(jiǎn)稱為哈佛源碼)。“The Annotated Transformer” 是Transformer論文的讀書筆記,而且博客作者用代碼實(shí)現(xiàn)了論文的模型,并且結(jié)合實(shí)現(xiàn)的模型對(duì)原始論文做了詳細(xì)解讀。與互聯(lián)網(wǎng)上可以獲取的其他Transformer的模型實(shí)現(xiàn)相比較,“The Annotated Transformer” 更適合學(xué)習(xí)和解讀。其地址為:
另外,本篇以文本翻譯功能為例來(lái)進(jìn)行說(shuō)明。
0x01 總體架構(gòu)
1.1 設(shè)計(jì)動(dòng)機(jī)
Transformer的新穎之處在于它是一個(gè)完全基于注意力機(jī)制實(shí)現(xiàn)的序列轉(zhuǎn)換架構(gòu),我們對(duì)Transformer的主要設(shè)計(jì)動(dòng)機(jī)分析如下:
- 解決長(zhǎng)距離依賴關(guān)系。論文希望解決RNN在序列長(zhǎng)距離上的限制,而注意力機(jī)制可以將序列中的任意兩個(gè)位置之間的距離是縮小為一個(gè)常量,從而在長(zhǎng)文本分析時(shí)可以捕獲更多的語(yǔ)義關(guān)聯(lián)關(guān)系。
- 提升訓(xùn)練并行度。論文希望克服RNN不能并行的缺點(diǎn),而注意力機(jī)制可以無(wú)視序列的先后順序來(lái)捕捉序列間的關(guān)系,因此具有更好的并行性,符合現(xiàn)有的GPU框架,能夠進(jìn)行分布式訓(xùn)練,提升模型訓(xùn)練效率。
因此,Jakob Uszkoreit(Transformer作者之一)提出了用自注意力機(jī)制來(lái)替換RNN對(duì)序列的編解碼過(guò)程。而Noam Shazeer(Transformer作者之一)在此基礎(chǔ)上提出了scaled dot-product attention、多頭注意力和位置表示。
1.2 模型結(jié)構(gòu)
首先我們來(lái)看看原始論文里面的架構(gòu)圖,接下來(lái)就以它為源頭進(jìn)行分析。

主體模塊
從網(wǎng)絡(luò)結(jié)構(gòu)來(lái)分析,Transformer 包括了四個(gè)主體模塊。
- 輸入模塊,對(duì)應(yīng)下圖的綠色圈。
- 編碼器(Encoder),對(duì)應(yīng)下圖的藍(lán)色圈。
- 解碼器(Decoder),對(duì)應(yīng)下圖的紅色圈。編碼器和解碼器都有自己的輸入和輸出,編碼器的輸出會(huì)作為解碼器輸入的一部分(位于解碼器的中間的橙色圈)。
- 輸出模塊,對(duì)應(yīng)下圖的紫色圈。
確切的說(shuō),藍(lán)色圈是編碼器層(Encoder layer),紅色圈是解碼器層(Decoder layer)。圖中的 \(N\times\) 代表把若干具有相同結(jié)構(gòu)的層堆疊起來(lái),這種將同一結(jié)構(gòu)重復(fù)多次的分層機(jī)制就是棧。為了避免混淆,我們后續(xù)把單個(gè)層稱為編碼器層或解碼器層,把堆疊的結(jié)果稱為編碼器或解碼器。在Transformer論文中,Transformer使用了6層堆疊來(lái)進(jìn)行學(xué)習(xí)。

多層
在Transformer中,第一層的輸入是嵌入矩陣。第一層的輸出隨后被用作第二層的輸入,依此類推。每一層都生成了一組嵌入,但這些嵌入不再直接與單個(gè)詞元相關(guān),而是與某種更復(fù)雜的詞元關(guān)系的理解相關(guān)聯(lián)。比如下圖給出了一個(gè)模型中的第6層和第7層之間的關(guān)系,該模型每層有12個(gè)注意頭。

對(duì)于多層的作用,目前也有不同的解釋。比較常見(jiàn)的解釋是分層的本質(zhì)是由下往上從不同上下文中逐步構(gòu)建不同層次的特征。比如底層學(xué)習(xí)單詞特征,中間層學(xué)習(xí)句法特征,高層學(xué)習(xí)語(yǔ)義特征等,每一層做各自的事情,不會(huì)相互影響。
輸入文本對(duì)應(yīng)的embedding在Transformer內(nèi)部各層流通時(shí)會(huì)不斷演變,這個(gè)過(guò)程類似于逐層“精煉”和“抽象”輸入的信息。每一層都會(huì)對(duì)輸入進(jìn)行不同級(jí)別的變換和抽象,都會(huì)在其輸入的基礎(chǔ)之上吸收更多上下文信息來(lái)豐富自己的表示,逐層提取出更高層次的特征,從而在綜合多層之后就會(huì)獲得更加強(qiáng)大的表達(dá)能力。隨著深度學(xué)習(xí)模型進(jìn)行訓(xùn)練,這些網(wǎng)絡(luò)層會(huì)逐漸學(xué)習(xí)到各種范疇之間的關(guān)系和相似性,從而在推理和回答問(wèn)題時(shí)能夠利用這些知識(shí)。當(dāng)embedding到達(dá)最后一層時(shí),其不僅僅代表對(duì)應(yīng)token獨(dú)立的含義,而是具備深刻的語(yǔ)境信息,反應(yīng)了該token與序列中其它token的綜合關(guān)系。我們可以把多層加工理解為工廠的流水線,假定要生產(chǎn)一件瓷器,我們要先通過(guò)印坯和修坯來(lái)確定器物形狀,然后通過(guò)刻花來(lái)在已經(jīng)干了的坯體上刻畫出各種精美的花紋或者圖案。接下來(lái)進(jìn)行施釉,在成型的陶瓷坯體表面施以釉漿;最后將瓷坯裝入匣缽,高溫入窯燒造。最終才能得到一件精美的瓷器。
針對(duì)分層中的每一層可能都會(huì)起到不同的作用這點(diǎn),研究人員做了深入的研究。
論文“What Does BERT Learn about the Structure of Language?”剖析了 BERT 所理解的英語(yǔ)結(jié)構(gòu)的復(fù)雜性。他們的研究發(fā)現(xiàn),BERT 的短語(yǔ)表示主要在神經(jīng)網(wǎng)絡(luò)的較低層捕捉短語(yǔ)級(jí)別的信息,并在中間層中編碼了語(yǔ)言要素的復(fù)雜層次結(jié)構(gòu)。這個(gè)層次結(jié)構(gòu)以表層特征作為基礎(chǔ),中間層提取語(yǔ)法特征,最上層呈現(xiàn)語(yǔ)義特征。
論文"Analyzing Memorization in Large Language Models through the Lens of Model Attribution"指出:
- 較深層的注意力模塊(最后25%的層)主要負(fù)責(zé)記憶。
- 較淺層的注意力模塊對(duì)模型的泛化和推理能力至關(guān)重要。
- 在深層注意力模塊應(yīng)用短路(short-circuit)干預(yù)可以顯著降低記憶所需內(nèi)存,同時(shí)保持模型性能。
論文”Interpreting Key Mechanisms of Factual Recall in Transformer-Based Language Models"則發(fā)現(xiàn)。語(yǔ)言模型存在一種普遍機(jī)制:防止過(guò)度自信(anti-overconfidence):在模型的最后若干層,語(yǔ)言模型總是在抑制正確答案的輸出。這種抑制具體又分為兩種:
- 通過(guò)注意力頭將輸入起始位置的信息復(fù)制到了最末位置,我們發(fā)現(xiàn)起始位置的信息似乎包含了很多高頻的token,模型可以通過(guò)這種方法來(lái)讓高頻token稀釋殘差流中的正確回答,降低回答的自信度。
- 末層的MLP似乎在將殘差流引導(dǎo)向一個(gè)“平均”token的方向(平均token是基于訓(xùn)練數(shù)據(jù)的詞頻,對(duì)token embedding加權(quán)平均得到的結(jié)果)。
另外,模型的效果往往和模型的參數(shù)量成正比,Transformer就是通過(guò)增加模型的層數(shù)來(lái)加大模型可學(xué)習(xí)的參數(shù)量,讓更多的參數(shù)來(lái)承載文本中深層次的信息。
1.3 注意力模塊
注意力機(jī)制是Transformer模型的心臟,它賦予模型洞察句子中每個(gè)單詞與其它單詞間錯(cuò)綜復(fù)雜關(guān)系的超能力。
分類
在Transformer中有三種注意力結(jié)構(gòu):全局自注意力,掩碼自注意力和交叉注意力,具體如下圖所示。交叉注意力主要用于處理兩個(gè)不同序列之間的關(guān)系;全局自注意力主要用于處理單個(gè)序列內(nèi)元素之間的關(guān)系;掩碼自注意力(也被稱做因果自注意力)通過(guò)掩碼來(lái)控制模型在計(jì)算注意力分?jǐn)?shù)時(shí)的關(guān)注范圍,從而確保在解碼時(shí)不會(huì)受到未來(lái)信息的影響。

位置
三種注意力模塊在Transformer網(wǎng)絡(luò)對(duì)應(yīng)位置如下圖所示。

作用
Transformer實(shí)際上是通過(guò)三重注意力機(jī)制建立起了序列內(nèi)部以及序列之間的全局聯(lián)系。論文中對(duì)這三種注意力作用的解釋如下圖所示。

我們具體分析下這三種注意力。
全局自注意力層
全局自注意力層(Global self attention layer)位于編碼器中,它負(fù)責(zé)處理整個(gè)輸入序列。在全局自注意力機(jī)制中,序列中的每個(gè)元素都可以直接訪問(wèn)序列中的其它元素,從而與序列中的其他元素建立動(dòng)態(tài)的關(guān)聯(lián),這樣可以使模型更好地捕捉序列中的重要信息。自注意力的意思就是關(guān)注于序列內(nèi)部關(guān)系的注意力機(jī)制,那么是如何實(shí)現(xiàn)讓模型關(guān)注序列內(nèi)部之間的關(guān)系呢?自注意力將query、key、value設(shè)置成相同的東西,都是輸入的序列,就是讓注意力機(jī)制在序列的本身中尋找關(guān)系,注意到不同部分之間的相關(guān)性。
對(duì)于全局自注意力來(lái)說(shuō),Q、K、V有如下可能:
- Q、K、V都是輸入序列。
- Q、K、V都來(lái)自編碼器中前一層的輸出。編碼器中的每個(gè)位置都可以關(guān)注編碼器前一層輸出的所有位置。
再細(xì)化來(lái)說(shuō),Q是序列中當(dāng)前位置的詞向量,K和V是序列中的所有位置的詞向量。
掩碼自注意力
掩碼自注意力層或者說(shuō)因果自注意力層(Causal attention layer)可以在解碼階段捕獲當(dāng)前詞與已經(jīng)解碼的詞之間的關(guān)聯(lián)。它是對(duì)解碼器的輸入序列執(zhí)行類似全局自注意力層的工作,但是又有不同之處。
Transformer是自回歸模型,它逐個(gè)生成文本,然后將當(dāng)前輸出文本附加到之前輸入上變成新的輸入,后續(xù)的輸出依賴于前面的輸出詞,具備因果關(guān)系。這種串行操作會(huì)極大影響訓(xùn)練模型的時(shí)間。為了并行提速,人們引入了掩碼,這樣在計(jì)算注意力時(shí),通過(guò)掩碼可以確保后面的詞不會(huì)參與前面詞的計(jì)算。
對(duì)于掩碼自注意力來(lái)說(shuō),Q、K、V有如下可能:
- Q、K、V都是解碼器的輸入序列。
- Q、K、V都來(lái)自解碼器中前一層的輸出。解碼器中的每個(gè)位置都可以關(guān)注解碼器前一層的所有位置。
再細(xì)化來(lái)說(shuō),Q是序列中當(dāng)前位置的詞向量,K和V是序列中的所有位置的詞向量。
交叉注意力層
交叉注意力層(Cross attention layer)其實(shí)就是傳統(tǒng)的注意力機(jī)制。交叉注意力層位于解碼器中,但是其連接了編碼器和解碼器,這樣可以刻畫輸入序列和輸出序列之間的全局依賴關(guān)系,完成輸入和輸出序列之間的對(duì)齊。因此它需要將目標(biāo)序列作為Q,將上下文序列作為K和V。
對(duì)于交叉注意力來(lái)說(shuō),Q、K、V來(lái)自如下:
- Q來(lái)自前一個(gè)解碼器層,是因果注意力層的輸出向量。
- K和V來(lái)自編碼器輸出的注意力向量。
這使得解碼器中的每個(gè)位置都能關(guān)注輸入序列中的所有位置。另外,編碼器并非只傳遞最后一步的隱狀態(tài),而是把所有時(shí)刻(對(duì)應(yīng)每個(gè)位置)產(chǎn)生的所有隱狀態(tài)都傳給解碼器,這就解決了中間語(yǔ)義編碼上下文的長(zhǎng)度是固定的問(wèn)題。

或者從另一個(gè)角度來(lái)理解,交叉注意力是序列到序列模式;雙向自注意力是自編碼模式;單向自注意力是自回歸模式。
1.4 執(zhí)行流程
我們?cè)賮?lái)結(jié)合模型結(jié)構(gòu)圖來(lái)簡(jiǎn)述推理階段的計(jì)算流程,具體如下圖所示。

假設(shè)我們進(jìn)行機(jī)器翻譯工作,把中文”我吃了一個(gè)蘋果“翻譯成英文”I ate an apple“,在假設(shè)模型只有一層,執(zhí)行步驟如下:
- 處理輸入。用戶輸入自然語(yǔ)言句子”我吃了一個(gè)蘋果“;tokenizer先把序列轉(zhuǎn)換成token序列;然后Input Embedding層對(duì)每個(gè)token進(jìn)行embedding編碼,再加入Positional Encoding(位置編碼),最終形成帶有位置信息的embedding編碼矩陣。編碼矩陣用 \(X_{n*d}\) 表示, n 是句子中單詞個(gè)數(shù),d 是表示向量的維度(論文中 d=512)。注:原論文圖上的輸入是token,本篇為了更好的說(shuō)明,把輸入設(shè)置為自然語(yǔ)言句子。
- 編碼器進(jìn)行編碼。編碼矩陣首先進(jìn)入MHA(Multi-Head Attention,多頭注意力)模塊,在這里每個(gè)token會(huì)依據(jù)一定權(quán)重把自己的信息和其它token的信息進(jìn)行交換融合;融合結(jié)果會(huì)進(jìn)入FFN(Feed Forward Network)模塊做進(jìn)一步處理,最終得到整個(gè)句子的數(shù)學(xué)表示,句子中每個(gè)字都會(huì)帶上其它字的信息。整個(gè)句子的數(shù)學(xué)表示就是Encoder的輸出。
- 通過(guò)輸入翻譯開(kāi)始符
來(lái)啟動(dòng)解碼器。 - 解碼器進(jìn)行解碼。解碼器首先進(jìn)入Masked Multi-Head Attention模塊,在這里解碼器的輸入序列會(huì)進(jìn)行內(nèi)部信息交換;然后在Multi-Head Attention模塊中,解碼器把自己的輸入序列和編碼器的輸出進(jìn)行融合轉(zhuǎn)換,最終輸出一個(gè)概率分布,表示詞表中每個(gè)單詞作為下一個(gè)輸出單詞的概率;最終依據(jù)某種策略輸出一個(gè)最可能的單詞。這里會(huì)預(yù)測(cè)出第一個(gè)單詞”I“。
- 把預(yù)測(cè)出的第一個(gè)單詞”I“和
一起作為解碼器的輸入,進(jìn)行再次解碼。 - 解碼器預(yù)測(cè)出第二個(gè)單詞”ate“。
針對(duì)本例,解碼器的每一步輸入和輸出具體如下表所示。

1.6 小結(jié)
Transformer總體架構(gòu)是一個(gè)有機(jī)整體,難以分割。組合的意義不在于構(gòu)成它的基本單元,而在于這些單元之間形成的復(fù)雜關(guān)系和涌現(xiàn)的行為。比如集體智能來(lái)自個(gè)體的組合,卻產(chǎn)生了所有個(gè)體都不具備的高階能力。
有些工作就將焦點(diǎn)轉(zhuǎn)移到 transformer 模塊的高級(jí)架構(gòu)上,并認(rèn)為其完整結(jié)構(gòu),而不僅僅是標(biāo)記混合注意力操作,對(duì)Transformer實(shí)現(xiàn)具有競(jìng)爭(zhēng)力的性能至關(guān)重要。
論文"Attention is not all you need"指出如果沒(méi)有skip connection(residual connection-殘差鏈接)和MLP,自注意力網(wǎng)絡(luò)的輸出會(huì)朝著一個(gè)rank-1的矩陣收縮。即,skip connection和MLP可以很好地阻止自注意力網(wǎng)絡(luò)的這種”秩坍塌(秩坍塌)退化“。這揭示了skip connection,MLP對(duì)self-attention的不可或缺的作用;
論文”MetaFormer is Actually What You Need for Vision“則描述了一種通用架構(gòu),在該結(jié)構(gòu)中,輸入首先經(jīng)過(guò)embedding,得到 ??。然后embedding送入重復(fù)的blocks中,第一個(gè)block主要包含了token mixer,使得不同的token能夠相互信息通信(Y = TokenMixer(Norm(X)) + X,);第二個(gè)block包含兩層MLP。該架構(gòu)通過(guò)指定token mixer的具體設(shè)計(jì),可以獲得不同的模型。如果將token mixer指定為注意力或spatial MLP,則MetaFormer將分別成為一個(gè)transformer或類似MLP的模型。

0x02 構(gòu)建
我們接下來(lái)結(jié)合哈佛源碼進(jìn)行分析和學(xué)習(xí)。哈佛代碼中的make_model()函數(shù)是Transformer模型的構(gòu)建函數(shù)。
2.1 參數(shù)
make_model()函數(shù)的參數(shù)有如下7個(gè):
- src_vocab:源語(yǔ)言詞表中單詞數(shù)目,即源詞典的大小。
- tgt_vocab:目標(biāo)語(yǔ)言詞表中單詞數(shù)目,即目標(biāo)詞典的大小。
- N=6:編碼器和解碼器堆疊數(shù),即編碼器層數(shù)和解碼器層數(shù)。
- d_model=512:模型所處理數(shù)據(jù)的維度,即詞向量(word embedding)的大小。
- d_ff=2048:FFN(前饋全連接層)中變換矩陣的維度,即隱層神經(jīng)元的數(shù)量。
- head=8:多頭注意力層中的注意力頭數(shù)。
- dropout=0.1:防止過(guò)擬合。
2.2 構(gòu)建邏輯
make_model()函數(shù)的主要思路就是用從小到大搭建積木的方式來(lái)構(gòu)建Transformer。我們先脫離代碼來(lái)構(gòu)思下,看看架構(gòu)圖上的哪些模塊可以作為積木。
- 輸入模塊:Input Embedding和Positional Encoding分別可以作為單獨(dú)的積木塊,它們結(jié)合在一起又可以作為一個(gè)新的積木塊。
- 編碼器層和解碼器層可以作為兩個(gè)單獨(dú)的大積木塊。其內(nèi)部的Masked Multi-Head Attention、Multi-Head Attention、Feed Forward和Add & Norm也都可以作為單獨(dú)的小積木塊。
- 輸出模塊:Linear和Softmax分別可以作為單獨(dú)的積木塊,它們結(jié)合在一起又可以作為一個(gè)新的積木塊。
有了這些積木塊,我們就可以很容易的構(gòu)建起Tranformer了。當(dāng)然,在make_model()函數(shù)中做了一定的抽象,有些小積木塊被用某些類進(jìn)行了封裝(比如Linear和Softmax被封裝在Generator類中,細(xì)節(jié)沒(méi)有在make_model()函數(shù)中展示出來(lái))。我們把這些模塊和代碼中一一對(duì)應(yīng)起來(lái)看,下圖中的數(shù)字代表代碼中某模塊出現(xiàn)的順序,這些數(shù)字在下面代碼的注釋中也有標(biāo)明。

具體的代碼邏輯如下。
- 把copy.deepcopy()這個(gè)深度拷貝函數(shù)重新命名為c,這樣后續(xù)代碼會(huì)比較簡(jiǎn)潔。deepcopy()函數(shù)會(huì)開(kāi)辟一個(gè)新內(nèi)存并將源實(shí)例完全復(fù)制過(guò)來(lái),復(fù)制過(guò)來(lái)的對(duì)象和源對(duì)象沒(méi)有任何關(guān)聯(lián)。后續(xù)各種類的構(gòu)造函數(shù)中會(huì)調(diào)用copy.deepcopy()來(lái)重新生成一個(gè)對(duì)應(yīng)實(shí)例,比如上面圖中的標(biāo)號(hào)1,2,3在解碼器端就分別被做了深度拷貝。這樣,兩個(gè)標(biāo)號(hào)1對(duì)應(yīng)的實(shí)例彼此之間相互獨(dú)立,不受干擾。
- 構(gòu)建 MultiHeadedAttention,PositionwiseFeedForward 和 PositionalEncoding 對(duì)象。
- 構(gòu)造 EncoderDecoder 對(duì)象,這是Transformer主體類,其參數(shù)是Encoder、Decoder、src-embed、tgt-embed和 Generator。我們先分析后面三個(gè)參數(shù)。
- src-embed是nn.Sequential(Embeddings(d_model, src_vocab), c(position))的返回結(jié)果,其意義是輸入編碼,對(duì)應(yīng)上圖的編號(hào)7(由編碼3和6組成)。nn.Sequential()函數(shù)構(gòu)建了順序容器,容器內(nèi)模塊的順序就是模型處理數(shù)據(jù)的順序;
- tgt-embed是nn.Sequential(Embeddings(d_model, tgt_vocab), c(position))的返回結(jié)果,其意義是輸入編碼,對(duì)應(yīng)上圖的編號(hào)9(由編碼3和8組成)。
- Generator對(duì)應(yīng)上圖的編號(hào)10,其包括了Linear和Softmax。Generator會(huì)把Decoder的輸出變成輸出詞的概率。
- Encoder和Decoder兩個(gè)類很像,我們以Encoder為例來(lái)說(shuō)明。Encoder由N個(gè)EncoderLayer構(gòu)成,EncoderLayer的參數(shù)是d_model, c(attn), c(ff), dropout,即word embedding維度、多頭注意力、FFN層和Dropout。可以看到,Encoder和Decoder類中的注意力都是MultiHeadedAttention的實(shí)例,只是因?yàn)閭鬟f參數(shù)的不同,才決定某個(gè)注意力是交叉注意力還是掩碼多頭注意力。
- 初始化模型參數(shù)。Xavier初始化可以參考論文"Understanding the difficulty of training deep feedforward neural networks"。
具體代碼如下。
def make_model(src_vocab, tgt_vocab, N=6, d_model=512, d_ff=2048, h=8, dropout=0.1):
"Helper: Construct a model from hyperparameters."
# copy.deepcopy是深度拷貝函數(shù),即重新生成一個(gè)新實(shí)例。重新命名可以讓后續(xù)代碼比較簡(jiǎn)潔
c = copy.deepcopy
# 構(gòu)建多頭注意力層的實(shí)例,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)1
attn = MultiHeadedAttention(h, d_model)
# 構(gòu)建前饋神經(jīng)網(wǎng)絡(luò)層的實(shí)例,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)2
ff = PositionwiseFeedForward(d_model, d_ff, dropout)
# 構(gòu)建位置編碼模塊的實(shí)例,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)3
position = PositionalEncoding(d_model, dropout)
# 總的Transformer模型
model = EncoderDecoder(
# EncoderLayer只包含一個(gè)Attention層,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)4。Encoder則包括外面的N
Encoder(EncoderLayer(d_model, c(attn), c(ff), dropout), N),
# DecoderLayer包含兩個(gè)Attention層,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)5,Decoder則包括外面的N
Decoder(DecoderLayer(d_model, c(attn), c(attn), c(ff), dropout), N),
# 輸入的Embedding和位置編碼,Embeddings對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)6,Sequential就是兩個(gè)編碼合并的結(jié)果,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)7
nn.Sequential(Embeddings(d_model, src_vocab), c(position)),
# 輸出的Embedding和位置編碼,Embeddings對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)8,Sequential就是兩個(gè)編碼合并的結(jié)果,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)9
nn.Sequential(Embeddings(d_model, tgt_vocab), c(position)),
# Generator類包括Linear層和Softmax層,對(duì)應(yīng)上圖的數(shù)字標(biāo)號(hào)10,負(fù)責(zé)依據(jù)Decoder的輸出來(lái)預(yù)測(cè)下一個(gè)token
Generator(d_model, tgt_vocab),
)
# This was important from their code.
# Initialize parameters with Glorot / fan_avg.
# 初始化模型參數(shù),這里采用xavier初始化,即如果參數(shù)的維度大于1,則將其初始化成一個(gè)服從均勻分布的矩陣
for p in model.parameters():
if p.dim() > 1:
nn.init.xavier_uniform_(p)
return model
2.3 主體類
EncoderDecoder類就是基于Transformer架構(gòu)的編碼器-解碼器實(shí)現(xiàn),其成員變量如下:
- encoder:Encoder類實(shí)例,這是編碼器的實(shí)現(xiàn)。
- decoder:Decoder類實(shí)例,這是解碼器的實(shí)現(xiàn)。
- src_embed:源語(yǔ)言的word embedding生成模塊,是一個(gè)nn.Sequential對(duì)象,包括Embebddings和PositionalEncoding。src_embed將對(duì)輸入進(jìn)行Embedding和位置編碼
- tgt_embed:目標(biāo)語(yǔ)言的word embedding生成模塊,是一個(gè)nn.Sequential對(duì)象,包括Embebddings和PositionalEncoding。tgt_embed將對(duì)再傳入的輸出進(jìn)行Embedding和位置編碼
- generator:Generator類的對(duì)象,包括Linear層和Softmax層,負(fù)責(zé)對(duì)Decoder的輸出做預(yù)測(cè),即依據(jù)Decoder的隱狀態(tài)輸出來(lái)預(yù)測(cè)當(dāng)前時(shí)刻的詞。隱狀態(tài)會(huì)輸入到全連接層(全連接層的輸出大小是詞典的大小),全連接層會(huì)接上一個(gè)softmax得到預(yù)測(cè)詞的概率。
EncoderDecoder類的forward()函數(shù)完成了編碼和解碼的工作,它接受四個(gè)函數(shù):
- src:源序列,其內(nèi)容是token在詞表對(duì)應(yīng)的編號(hào)。src的形狀是[batch_size, seq_len],舉例是[[ 0, 2, 4, 8, 1, 2, 2 ]] ,即批量大小為1,句子長(zhǎng)度是7,其中0為bos,1為eos,2為pad。
- tgt:目標(biāo)序列,具體含義類似src。
- src_mask:源序列掩碼,具體作用是對(duì)填充符號(hào)進(jìn)行掩碼。以[[ 0, 2, 4, 8, 1, 2, 2 ]]為例,其掩碼是[[True,True,True,True,True,False,False]],即對(duì)兩個(gè)填充的pad進(jìn)行掩碼。
- tgt_mask:目標(biāo)序列掩碼,其作用有兩種:不讓注意力計(jì)算看到未來(lái)的單詞;對(duì)填充符號(hào)進(jìn)行掩碼。其形狀是[batch_size, seq_len, seq_len],上面對(duì)應(yīng)的掩碼如下:
[True,False,False,False,False,False,False],
[True,True,False,False,False,False,False],
[True,True,True,False,False,False,False],
[True,True,True,True,False,False,False],
[True,True,True,True,True,False,False], # 例句是5個(gè)正式token,后面兩個(gè)pad被置為False
[True,True,True,True,True,False,False],
[True,True,True,True,True,False,False],
EncoderDecoder代碼具體如下:
# 繼承nn.Module
class EncoderDecoder(nn.Module):
"""
A standard Encoder-Decoder architecture. Base for this and many other models.
標(biāo)準(zhǔn)的編碼器-解碼器架構(gòu),這是很多模型的基礎(chǔ)。
"""
def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):
"""
初始化函數(shù)有5個(gè)參數(shù),從外部傳入?yún)?shù)的目的是更加靈活,可以更換組件
"""
super(EncoderDecoder, self).__init__()
self.encoder = encoder # 編碼器對(duì)象
self.decoder = decoder # 解碼器對(duì)象
# 源語(yǔ)言input embedding和position embedding的組合
self.src_embed = src_embed
# 目標(biāo)語(yǔ)言output embedding和position embedding的組合
self.tgt_embed = tgt_embed
self.generator = generator # 類別生成器對(duì)象
def forward(self, src, tgt, src_mask, tgt_mask):
# 前向傳播函數(shù)有四個(gè)參數(shù):源序列,目標(biāo)序列,源序列掩碼,目標(biāo)序列掩碼
"Take in and process masked src and target sequences."
# 1. 將source, source_mask傳入編碼函數(shù)encode(),讓編碼器對(duì)源序列進(jìn)行編碼,得到編碼結(jié)果memory
# 2. 將memory,source_mask,target,target_mask一同傳給解碼函數(shù)decode()進(jìn)行解碼
return self.decode(self.encode(src, src_mask), src_mask, tgt, tgt_mask)
# 編碼函數(shù),接受參數(shù)是源序列和掩碼
def encode(self, src, src_mask):
# 1. 對(duì)src編碼,得到input embedding
# 2. 計(jì)算位置編碼,將input embedding和位置編碼相加,得到word embedding
# 3. 使用編碼器encoder進(jìn)行編碼,編碼結(jié)果記作memory
return self.encoder(self.src_embed(src), src_mask)
# 解碼函數(shù),參數(shù)為:編碼器輸出(memory)、源序列掩碼、目標(biāo)序列和目標(biāo)序列掩碼
def decode(self, memory, src_mask, tgt, tgt_mask):
# 1. 對(duì)tgt編碼,得到得到input embedding
# 2. 計(jì)算位置編碼,將input embedding和位置編碼相加,得到word embedding
# 3. 使用編碼器decoder進(jìn)行解碼,解碼器輸出可以使用self.generator進(jìn)行最后的預(yù)測(cè)
return self.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_mask)
2.4 如何調(diào)用
模型調(diào)用的方式如下面代碼所示,forward()函數(shù)負(fù)責(zé)把輸入編碼成隱狀態(tài),然后把隱狀態(tài)解碼稱輸出logits(對(duì)數(shù)幾率)。其參數(shù)都從batch類的實(shí)例中獲取,具體如下:
- src:源句子列表。形狀是[batch size, max sequence length]。每個(gè)句子是從數(shù)據(jù)集提取出來(lái),經(jīng)過(guò)詞典處理過(guò)的,舉例為:[ 0, 5, 12,..., 1, 2, 2]。其中0為bos,1為eos,2為pad。
- tgt:目標(biāo)句子列表。具體意義同上。
- src_mask:注意力層要用的掩碼(后面章節(jié)會(huì)詳細(xì)分析)。
- tgt_mask:解碼器的掩碼自注意力層要用的掩碼(后面章節(jié)會(huì)詳細(xì)分析)。
out = model.forward(batch.src, batch.tgt, batch.src_mask, batch.tgt_mask)
0x03 輸入
3.1 輸入分類
我們還是用把中文”我吃了一個(gè)蘋果“翻譯成英文”I ate an apple“為例。模型的總體輸入是若干個(gè)單詞組成的句子,不同模型支持的句子最大長(zhǎng)度不同,如果句子較短,則會(huì)用某些特殊詞填充多余的位置。而源語(yǔ)言和目標(biāo)語(yǔ)言(或者說(shuō)編碼器和解碼器)分別對(duì)應(yīng)了兩種不同的獨(dú)立的輸入。
-
編碼器的輸入對(duì)應(yīng)圖上的Inputs,這是從原始的源序列文本得到的token列表。在機(jī)器翻譯業(yè)務(wù)中,Encoder是一次性接受一個(gè)完整的句子,然后進(jìn)行處理。比如”我吃了一個(gè)蘋果“這幾個(gè)字經(jīng)過(guò)tokenizer之后,得到了每個(gè)字對(duì)應(yīng)的唯一序號(hào),假設(shè)序號(hào)為[5, 4, 6,7, 8, 9, 10],然后會(huì)把[5, 4, 6,7, 8, 9, 10]作為inputs傳給Encoder層。
-
解碼器的輸入其實(shí)有兩種:
- Outputs(shifted right)。Outputs實(shí)際上是解碼器之前輸出的拼接,shifted right的目的是將序列整體右移一位。解碼器并不能一次性全部輸出"I ate an apple”,而是一個(gè)單詞一個(gè)單詞進(jìn)行輸出,或者說(shuō)是像RNN一樣循環(huán)執(zhí)行的,也就是這次的輸出(作為Outputs)會(huì)加到上次的輸入后面,作為下一次的輸入,以便生成后續(xù)的單詞。
- 編碼器的輸出。編碼器層把Inputs編碼成一個(gè)中間隱狀態(tài)(在Transformer實(shí)現(xiàn)中叫做memory,對(duì)應(yīng)了RNN的Hidden State)輸出給解碼器,或者說(shuō)是編碼器把源語(yǔ)言的完整句子一次性編碼輸出給解碼器。
具體如下圖所示。

3.2 輸入模塊
輸入模塊具體包括如下:
- Tokenizer(詞元分析器)。注:原論文圖上的輸入是token,本篇為了更好的說(shuō)明,把輸入設(shè)置為自然語(yǔ)言句子,也加入了tokenizer。
- 源語(yǔ)言文本嵌入層(對(duì)應(yīng)圖上的 Input Embedding)和位置編碼器(對(duì)應(yīng)圖上的Positional Encoding)。
- 目標(biāo)語(yǔ)言文本嵌入層(對(duì)應(yīng)圖上的Output Embedding)和位置編碼器(對(duì)應(yīng)圖上的Positional Encoding)。

3.3 文字轉(zhuǎn)換
回到本篇最開(kāi)始圖1的例子。“Data visualization empowers users to”這個(gè)句子并不能被模型理解,因此我們需要把自然語(yǔ)言進(jìn)行編碼,也就是對(duì)文字進(jìn)行向量化。具體分為以下幾個(gè)步驟:
- 對(duì)輸入文字進(jìn)行tokenize(分詞),得到token。
- 在詞表(假設(shè)詞表大小是10000)中找到每個(gè)token對(duì)應(yīng)的token id。
- 把每個(gè)token id轉(zhuǎn)化成一個(gè)token embedding(假設(shè)維度是512)。
- 給序列中的每個(gè)位置添加一個(gè)位置編碼。
- 把input embedding和位置編碼相加,得到最終的word embedding。
具體流程如下。

讓我們看看每個(gè)步驟是如何完成的。
分詞
分詞是將輸入文本分解為更小、更易于管理的語(yǔ)義片段的過(guò)程,這些片段被成為token。token是模型詞匯表的一部分,詞匯表是LLM在訓(xùn)練時(shí)使用的詞元列表。tokenizer(分詞器)會(huì)做兩件事:
-
首先,tokenizer會(huì)將輸入文本切分為更小、更易于管理的token。token可以是單詞或子詞(sub-word),比如單詞
"Data"就被映射成token,而單詞"empowers"則被分為兩個(gè)token:“em”和“powers”。 -
接下來(lái),tokenizer會(huì)把token映射成不同的整數(shù),這些整數(shù)就是詞表的索引。可以認(rèn)為這是一種one-hot編碼形式。
embedding化
我們接下來(lái)看看在NLP領(lǐng)域中,詞嵌入向量生成過(guò)程,即如何把單詞在詞表里面的索引轉(zhuǎn)換為一個(gè)Transformer可以使用的向量,也就是embedding(嵌入)。embedding是每個(gè)詞元的固定向量表示,它比純整數(shù)更適合深度學(xué)習(xí),因?yàn)樗蹲降搅藛卧~的語(yǔ)義意義。embedding向量的大小取決于模型維度。當(dāng)輸入中每個(gè)token的embedding堆疊在一起時(shí),它們構(gòu)成了輸入的嵌入矩陣。
在Transformer架構(gòu)圖中,Inputs和Outputs的上面分別有一個(gè)Embedding模塊,每個(gè)模塊都是由兩個(gè)子模塊組合而成。
- Inputs相關(guān)的embedding模塊包括Input Embedding和Positional Encoding。
- Input Embedding負(fù)責(zé)把token編碼。
- Positional Encoding負(fù)責(zé)給token加入位置信息。實(shí)際操作中,Transformer會(huì)一次性接收整個(gè)輸入句子的嵌入矩陣。這樣做的好處是可以并行操作,但是劣勢(shì)是缺少位置信息,比如模型無(wú)法區(qū)分“我愛(ài)你”和“愛(ài)你我” 。Positional Encoding就負(fù)責(zé)給每個(gè)詞增加位置信息。
- Outputs相關(guān)的embedding模塊包括Output Embedding + Positional Encoding:與上面類似,不再贅述。
Token Embedding
Token Embedding會(huì)將文字轉(zhuǎn)換成模型可以理解和處理的數(shù)學(xué)表示,即將每個(gè)token id(one-hot)和一個(gè)高維向量相關(guān)聯(lián),向量的每個(gè)維度對(duì)應(yīng)語(yǔ)義的某個(gè)方面。embedding通常是查表操作,即根據(jù)token_id的值,去embedding矩陣中查找第token_id行的數(shù)據(jù)作為embedding。向量的維度取決于模型,Transformer論文將每個(gè)token表示為512維向量。Token Embedding也叫word embedding。
Positional Encoding
一個(gè)句子中的文字先后順序很重要,比如以下兩句話的文字完全相同,但因?yàn)槲淖猪樞虿煌湔Z(yǔ)義完全不同。
- 買一張從上海到北京的車票。
- 買一張從北京到上海的車票。
因此,模型還需要對(duì)輸入句子中每個(gè)token的位置信息進(jìn)行編碼。
Word Embedding
最后,模型將token embedding和Positional Encoding相加,得到最終的嵌入表示。這種組合表示捕獲了標(biāo)記的語(yǔ)義及其在輸入序列中的位置。在 LLM(大型語(yǔ)言模型)中,將 word embedding(詞嵌入)加上位置編碼后的結(jié)果通常仍可以稱為 “輸入嵌入(Input Embeddings)” 或 “帶位置信息的詞嵌入”。為了講述方便,后續(xù)我們依然稱之為Word Emebdding 。
本階段輸出張量的形狀是[batch size, sequence length,embedding dimension]。以“Data visualization empowers users to”為例,5個(gè)單詞被切分成6個(gè)token,最終得到的word embedding是一個(gè)[batch size, sequence length, embedding dimension]的矩陣。因?yàn)橹挥幸痪湓挘詁atch size是1,sequence length是6,假設(shè)embedding dimension是512,則矩陣維度是[1,6,512]。
實(shí)際上,我們可以認(rèn)為embedding是LLM自己的語(yǔ)言系統(tǒng)(包括文本信息特征空間與位置信息特征空間)。輸入層的作用就是把自然語(yǔ)言、程序語(yǔ)言、視覺(jué)聽(tīng)覺(jué)語(yǔ)言等信息都映射(或者叫編碼)到這個(gè)高維的語(yǔ)言空間中。接下來(lái)會(huì)通過(guò)注意力機(jī)制從高維語(yǔ)言空間中提取各種豐富的知識(shí)和結(jié)構(gòu),加權(quán)積累與關(guān)聯(lián)生成自己的語(yǔ)言,最后再“編碼”回人類的語(yǔ)言。

0x04 Transformer Layer
Transformer處理的核心在于Transformer塊,它包括多頭注意力機(jī)制和多層感知器層。大多數(shù)模型由多個(gè)這樣的塊組成,這些塊一個(gè)接一個(gè)地順序堆疊。
從Transformer的構(gòu)造代碼可以看出來(lái),Encoder類實(shí)例是由N個(gè)EncoderLayer類實(shí)例構(gòu)建而成,Decoder類實(shí)例由N個(gè)DecoderLayer類實(shí)例構(gòu)建而成,這和論文相符合。
# EncoderLayer只包含一個(gè)注意力層,Encoder則包括外面的N參數(shù)
Encoder(EncoderLayer(d_model, c(attn), c(ff), dropout), N),
# DecoderLayer包含兩個(gè)注意力層,Decoder則包括外面的N參數(shù)
Decoder(DecoderLayer(d_model, c(attn), c(attn), c(ff), dropout), N),
EncoderLayer和DecoderLayer是基礎(chǔ)構(gòu)建塊,每個(gè)塊主要包括如下:
- 多頭注意力機(jī)制。它允許token與其他token進(jìn)行通信,彼此交流信息,從而捕獲上下文信息和單詞之間的關(guān)系。
- FFN層。一個(gè)對(duì)每個(gè)token 獨(dú)立運(yùn)行的前饋網(wǎng)絡(luò)。注意力層的目標(biāo)是在 token 之間路由信息,而 MLP 的目標(biāo)是細(xì)化每個(gè) token 的表示。
本小節(jié)先概要介紹多頭自注意力機(jī)制和FFN層,后續(xù)篇幅會(huì)對(duì)EncoderLayer和DecoderLayer進(jìn)行詳細(xì)介紹。
4.1 多頭自注意力機(jī)制
自注意力機(jī)制使模型能夠?qū)W⒂谳斎胄蛄械南嚓P(guān)部分,從而使其能夠捕獲數(shù)據(jù)內(nèi)的復(fù)雜關(guān)系和依賴關(guān)系。多頭注意力機(jī)制借鑒了CNN中multi-kernel 的思想,對(duì)不同頭使用不同的線性變換。多頭自注意力機(jī)制本質(zhì)上是構(gòu)造多個(gè)子空間,在這些子空間上再構(gòu)建多個(gè)注意力來(lái)替代單個(gè)注意力,這樣可以獲取更多維度的信息和相互關(guān)系。自注意力機(jī)制是LLM架構(gòu)中唯一計(jì)算序列中詞元間關(guān)系的地方,因此它構(gòu)成了語(yǔ)言理解的核心,涵蓋了對(duì)詞匯關(guān)系的理解。
讓我們看看多頭自注意力機(jī)制如何計(jì)算。為了簡(jiǎn)化說(shuō)明,這里假設(shè)編碼器也用到了掩碼,對(duì)于某些復(fù)合操作也分解說(shuō)明。
第 1 步:根據(jù)原始嵌入計(jì)算查詢、鍵和值矩陣

自注意力機(jī)制的輸入是n_tokens x n_embd的嵌入矩陣,其中每一行或向量表示一個(gè)獨(dú)立的詞元。LLM計(jì)算的第一部分從詞元嵌入矩陣中提取每個(gè)詞元的相關(guān)行。每個(gè) token 的word embedding被轉(zhuǎn)換為三個(gè)不同的向量,分別稱為query、 key和 value。這些向量是通過(guò)將輸入嵌入矩陣與學(xué)習(xí)到的\(W^Q\)、 \(W^K\)和 \(W^V\)權(quán)重矩陣相乘(這些矩陣是模型參數(shù)的一部分)得出的。query和key的點(diǎn)積被用來(lái)來(lái)判斷兩個(gè)向量之間的相似性,這也是論文中提到的點(diǎn)積注意力。
我們用淘寶搜索來(lái)類比,可以幫助我們對(duì)這些矩陣有更好的理解。假如我們?cè)谔詫毶线M(jìn)搜索”李寧鞋“。
- query是你在搜索欄輸入的查詢內(nèi)容。
- key是在頁(yè)面上返回的商品描述、標(biāo)題,其實(shí)就是淘寶商品數(shù)據(jù)庫(kù)中與候選商品相關(guān)的關(guān)鍵字。
- value是李寧鞋商品本身。因?yàn)橐坏┮罁?jù)搜索詞(query)搜到了匹配的商品描述、標(biāo)題(key),我們就希望具體看看商品內(nèi)容。
通過(guò)使用這些 QKV 值,模型可以計(jì)算注意力分?jǐn)?shù),從而確定每個(gè)token在生成預(yù)測(cè)時(shí)應(yīng)從其它token那里獲得多少關(guān)注。
第 2 步:掩碼自我注意力
掩碼自注意力允許模型通過(guò)關(guān)注輸入的相關(guān)部分來(lái)生成序列,同時(shí)防止訪問(wèn)未來(lái)的token。下圖展示了如何使用查詢、鍵和值矩陣來(lái)計(jì)算掩碼自注意力。

圖上具體分為三步:
- 使用點(diǎn)積來(lái)計(jì)算注意力分?jǐn)?shù)。使用Q和K矩陣的點(diǎn)積來(lái)決定了每個(gè)Q與每個(gè)K的對(duì)齊程度,點(diǎn)積結(jié)果是一個(gè)反映所有輸入token之間關(guān)系的矩陣。
- 對(duì)注意力分?jǐn)?shù)施加scaling(縮放)和掩碼。首先對(duì)注意力分?jǐn)?shù)進(jìn)行縮放,其次將掩碼應(yīng)用于注意力矩陣的上三角,以防止模型訪問(wèn)未來(lái)的標(biāo)記,因?yàn)槟P托枰獙W(xué)習(xí)如何在不“窺視”未來(lái)的情況下來(lái)預(yù)測(cè)下一個(gè)token。
- 施加Softmax和dropout操作。注意力分?jǐn)?shù)會(huì)通過(guò) softmax 運(yùn)算轉(zhuǎn)換為概率,然后會(huì)施加dropout操作來(lái)隨機(jī)丟棄一些元素。
此時(shí)得到的結(jié)果是注意力權(quán)重。
第3步:拼接
使用第二步產(chǎn)生的權(quán)重和V矩陣進(jìn)行相乘以獲得自注意力機(jī)制的最終輸出,因?yàn)槭嵌囝^注意力的結(jié)果,所以需要把這些頭的輸出進(jìn)行拼接并且通過(guò)線性層來(lái)融合。
4.2 FFN層
在多個(gè)自注意力頭捕獲輸入token之間的不同關(guān)系后,拼接的輸出將通過(guò)FFN(feed-forward network)層進(jìn)行處理,以增強(qiáng)模型的表示能力。下圖展示了如何使用 FFN層將自注意力表示投影到更高的維度,以增強(qiáng)模型的表示能力。

FFN層由兩個(gè)線性變換組成,線性變換 中間有一個(gè)激活函數(shù)。第一個(gè)線性變換將輸入的維度從512 增加到四倍2048。第二個(gè)線性變換將維度降回到 的原始大小512,以確保后續(xù)層接收到維度一致的輸入。
與自注意力機(jī)制在序列中彼此交流不同,F(xiàn)FN對(duì)序列中每個(gè)元素都獨(dú)立計(jì)算,因此不會(huì)進(jìn)行元素間的信息交換(元素間的互動(dòng)完全靠自注意力)。這樣有助于在注意力層進(jìn)行元素間的信息交換之后,讓每個(gè)元素消化整合自己的信息,為下一層再次通過(guò)自注意力交換信息做好準(zhǔn)備。
4.3 輔助架構(gòu)
除了上述主要模塊之外,Transformer模型中還應(yīng)用了LayerNorm(層歸一化)和ResNet(殘差連接)等設(shè)計(jì)方法。雖然在上面源碼中的構(gòu)造函數(shù)中沒(méi)有提及,但這些模塊對(duì)提高模型的整體表示能力非常重要。
LayerNorm
LayerNorm有助于穩(wěn)定訓(xùn)練過(guò)程并提高收斂性。它的工作原理是對(duì)輸入的各個(gè)特征進(jìn)行歸一化,確保激活的均值和方差一致。普遍認(rèn)為這種歸一化有助于緩解與內(nèi)部協(xié)變量偏移相關(guān)的問(wèn)題,使模型能夠更有效地學(xué)習(xí)并降低對(duì)初始權(quán)重的敏感性。從架構(gòu)圖上看,LayerNorm在每個(gè)Transformer 塊中應(yīng)用兩次,一次在自注意力機(jī)制之后,一次在FFN層之后,但是在實(shí)際工作中不一定如此。
Dropout
Dropout 是一種正則化技術(shù),用于通過(guò)在訓(xùn)練期間隨機(jī)將一部分模型權(quán)重設(shè)置為零來(lái)防止過(guò)擬合。這鼓勵(lì)模型學(xué)習(xí)更強(qiáng)大的特征并減少對(duì)特定神經(jīng)元的依賴,幫助網(wǎng)絡(luò)更好地泛化新的、未見(jiàn)過(guò)的數(shù)據(jù)。
殘差連接
殘差連接(Residual Connection)于 2015 年首次由何凱明大神在ResNet論文中引入。殘差連接就是把網(wǎng)絡(luò)的輸入和輸出相加,得到網(wǎng)絡(luò)的新輸出為F(x)+x。其本質(zhì)思想是允許網(wǎng)絡(luò)中的信息和梯度直接跨過(guò)一個(gè)或多個(gè)層進(jìn)行傳播,這樣能夠保留原始的一些信息。這種架構(gòu)創(chuàng)新可以有助于緩解梯度消失問(wèn)題,從而訓(xùn)練更深的神經(jīng)網(wǎng)絡(luò),徹底改變了深度學(xué)習(xí)Transformer論文中,殘差連接在每個(gè) Transformer 塊內(nèi)使用兩次:一次在FFN之前,一次在 FFN之后。
0x05 概率輸出(Output Probabilities)
經(jīng)過(guò)一系列Transformer模塊的精心處理,輸入數(shù)據(jù)最終來(lái)到了它的歸宿——最后的輸出層。輸出模塊包括兩部分:線性層和softmax層。哈佛代碼用Generator類對(duì)這兩部分進(jìn)行了封裝,將模型輸出的 embeding 轉(zhuǎn)換為對(duì)下一個(gè)詞的預(yù)測(cè)(在整體詞表上的概率分布)。
5.1 解碼器結(jié)果
輸入經(jīng)過(guò)所有解碼塊處理后,最終輸出依然是若干token對(duì)應(yīng)的向量,其代表在Transformer視角下的,用高維概率向量編織起來(lái)事物之間的各種復(fù)雜關(guān)系。這些關(guān)系在本質(zhì)上就是范疇論概念下事物的米田嵌入(米田嵌入采用對(duì)象的所有關(guān)系來(lái)表征該對(duì)象)。Transformer 學(xué)習(xí)的過(guò)程,是核函數(shù)選擇與參數(shù)化的過(guò)程,也是尋找米田嵌入的過(guò)程:提取對(duì)象的所有關(guān)系,形成其關(guān)系圖 -- 即概率化的內(nèi)部世界模型。
我們首先看看哈佛代碼。在推理時(shí),generator使用的并不是編碼器的所有輸出,而是最后一個(gè)token對(duì)應(yīng)的向量out[:, -1],即只使用輸出序列中最后一個(gè)單詞的猜測(cè)結(jié)果。訓(xùn)練時(shí),generator則使用編碼器的全部輸出。下面是推理代碼示例。
def inference_test():
test_model = make_model(11, 11, 2)
test_model.eval()
src = torch.LongTensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
src_mask = torch.ones(1, 1, 10)
memory = test_model.encode(src, src_mask)
ys = torch.zeros(1, 1).type_as(src)
for i in range(9):
out = test_model.decode(
memory, src_mask, ys, subsequent_mask(ys.size(1)).type_as(src.data)
)
prob = test_model.generator(out[:, -1])
_, next_word = torch.max(prob, dim=1)
next_word = next_word.data[0]
ys = torch.cat(
[ys, torch.empty(1, 1).type_as(src.data).fill_(next_word)], dim=1
)
下面是訓(xùn)練代碼示例。
class SimpleLossCompute:
"A simple loss compute and train function."
def __init__(self, generator, criterion):
self.generator = generator
self.criterion = criterion
def __call__(self, x, y, norm):
x = self.generator(x)
sloss = (
self.criterion(
x.contiguous().view(-1, x.size(-1)), y.contiguous().view(-1)
)
/ norm
)
return sloss.data * norm, sloss
5.2 轉(zhuǎn)換
Transformer的輸出是最有可能放在輸入序列末尾的單詞。但輸出的最后一個(gè)token對(duì)應(yīng)的向量是512維的向量,無(wú)法直接用來(lái)推理。另外,詞表中每個(gè)單詞都有可能成為下一個(gè)單詞, 所以模型需要對(duì)所有它知道的單詞均按可能性打分,最終選出其中最合適的單詞推薦給用戶。因此我們最終需要得到詞表中所有單詞作為下一個(gè)單詞的概率。這需要經(jīng)歷幾個(gè)階段才能完成從512維向量得到10000個(gè)單詞概率的轉(zhuǎn)換。
-
在 "Embedding"部分,我們已經(jīng)學(xué)習(xí)了一種映射,它可以將給定的(one-hot)單詞轉(zhuǎn)換為 512 向量,然后才能被Transformer處理。現(xiàn)在編碼器-解碼器已經(jīng)處理結(jié)束,所以需要反轉(zhuǎn)這個(gè)映射(求逆),將輸出的 512 向量轉(zhuǎn)換回詞表對(duì)應(yīng)的10000 維度空間中。可以理解為,對(duì)于最后一個(gè)token向量來(lái)說(shuō)有一個(gè)分類任務(wù),需要把該向量分類到詞表中的正確token,即下一個(gè)token的分類。Transformer通過(guò)一個(gè)線性層達(dá)到了這個(gè)目的,從向量維度投影到詞表長(zhǎng)度([1,embed_size]->[1,vocab_size])。其中詞匯表中的每個(gè)token都有一個(gè)對(duì)應(yīng)的值,稱為
logit。該過(guò)程類似CNN中,卷積層之后再接一個(gè)線性層做分類。 -
因?yàn)槭且A(yù)測(cè),所以需要根據(jù)模型的輸出 logits 為詞匯表中的每個(gè)token分配一個(gè)概率。這些概率決定了每個(gè)token成為序列中下一個(gè)單詞的可能性。具體操作是應(yīng)用 softmax 函數(shù)將 logits 轉(zhuǎn)換為總和為 1 的概率分布。
下圖中的Output Probabilities就是線性層后經(jīng)過(guò)Softmax的概率分布,紅圈對(duì)應(yīng)就是Generator類。后續(xù)會(huì)根據(jù)這些標(biāo)記成為下一個(gè)單詞的可能性對(duì)其進(jìn)行采樣。比如我們可以簡(jiǎn)單地根據(jù)對(duì)它們進(jìn)行排名。從中得到最大的值對(duì)應(yīng)的index,然后再去字典中查詢,就知道預(yù)測(cè)的下一個(gè)詞是什么了,即得到了下一個(gè)詞在詞典中的編號(hào)。
簡(jiǎn)而言之,這最后的線性層和softmax函數(shù)共同作用,為模型預(yù)測(cè)下一個(gè)詞提供了數(shù)學(xué)基礎(chǔ)和概率指導(dǎo)。

在后續(xù)的文章中,我們會(huì)逐步深入Transformer的各個(gè)組成模塊。
0x06 解釋
對(duì)于Transformer,迄今為止,我們所了解的更多是實(shí)踐的成果和經(jīng)驗(yàn)性的積累,而對(duì)于其理論和理解非常缺乏甚至是空白。雖然有些東西我們直觀上操作沒(méi)問(wèn)題,但是我們有必要看看研究人員如何從理論(機(jī)器學(xué)習(xí)、生物學(xué)和數(shù)學(xué))角度進(jìn)行的探索。這些探索試圖從本質(zhì)上理解神經(jīng)網(wǎng)絡(luò)和Transformer內(nèi)部運(yùn)作的機(jī)理,看看其為何是一個(gè)好的結(jié)構(gòu),從而從這個(gè)理解角度出發(fā)來(lái)幫助分析失敗案例,探索設(shè)計(jì)出更好的網(wǎng)絡(luò)結(jié)構(gòu)和有效的訓(xùn)練方法,減少模型的偏見(jiàn)、幻覺(jué)等。也可以使Transformer能夠更好的應(yīng)對(duì)提示的長(zhǎng)度和復(fù)雜性,可以在更有限的計(jì)算資源下完成復(fù)雜任務(wù),進(jìn)而為 NLP 領(lǐng)域的發(fā)展提供新的思路和方法。
注:以下分類并非是正交的,可能會(huì)有彼此交叉。因?yàn)閿?shù)學(xué)的具象化為物理,而物理的盡頭則為數(shù)學(xué),數(shù)學(xué)與物理相輔相成,成為理解神經(jīng)網(wǎng)絡(luò)乃至智能本質(zhì)不可或缺的手段。
6.1 機(jī)械可解釋性
近年來(lái),機(jī)械可解釋性(Mechanistic Interpretability)成為AI可解釋性研究的一個(gè)重要方向,該可解釋性研究旨在以逆向工程方式剖析AI模型(尤其是黑盒子的神經(jīng)網(wǎng)絡(luò)模型),希望理解LLM內(nèi)部的運(yùn)行機(jī)制,以及定位參數(shù)的存儲(chǔ)位置。機(jī)械可解釋性的幾個(gè)主要流派如下:
- causal tracing。主要目標(biāo)是理解LLM的信息流機(jī)制。基本思想是當(dāng)改變模型的某個(gè)位置的參數(shù)/向量時(shí),查看最終預(yù)測(cè)的變化情況,通過(guò)變化程度定位到對(duì)最終輸出最重要的位置。
- circuit analysis。主要目標(biāo)是以注意力頭和FFN作為基本單元,構(gòu)建輸入到輸出的circuit。它的潛在假設(shè)是:對(duì)于特定的輸入/輸出,只有一小部分參數(shù)很重要。比如該研究中有一部分是探索不同注意力頭的功能,另一部分專注于構(gòu)建整個(gè)circuit。
- logit lens & neuron analysis。更強(qiáng)調(diào)從單個(gè)神經(jīng)元角度進(jìn)行分析。logit lens把LM head提前加在每個(gè)中間layer上,以此觀察latent embeddings的特性。也有其它工作把神經(jīng)元投影到unembedding space中來(lái)獲取可解釋性。
- SAE(sparse autoencoder)。這是Anthropic的工作,目的是使用SAE來(lái)增加神經(jīng)元的可解釋性。
我們以causal tracing和circuit analysis為例來(lái)看看有關(guān)研究思路。
causal tracing
理解語(yǔ)言模型的內(nèi)部運(yùn)作意味著定位前向傳播中的哪些元素(輸入元素、表示和模型組件)負(fù)責(zé)特定的預(yù)測(cè)。我們接下來(lái)介紹幾種定位模型行為的不同方法。
稀疏探測(cè)
論文"Finding Neurons in a Haystack: Case Studies with Sparse" 提出了稀疏探測(cè),這是一種旨在識(shí)別與特定特征相關(guān)的 LLM 神經(jīng)元的技術(shù)或概念,并有助于理解高級(jí)人類可解釋的特征如何在此類模型的神經(jīng)元激活中表示。
該團(tuán)隊(duì)使用自回歸LLM,針對(duì) k 個(gè)神經(jīng)元來(lái)施加探針來(lái)看它們的分類性能。他們將主要發(fā)現(xiàn)總結(jié)如下:
-
LLM 的神經(jīng)元內(nèi)有大量可解釋的結(jié)構(gòu),稀疏探測(cè)是定位此類神經(jīng)元(即使處于疊加狀態(tài))的有效方法,但需要仔細(xì)使用和后續(xù)分析才能得出嚴(yán)格的結(jié)論。
-
許多早期層神經(jīng)元處于疊加狀態(tài),其中特征表示為多語(yǔ)義神經(jīng)元的稀疏線性組合,每個(gè)神經(jīng)元都會(huì)激活大量不相關(guān)的 n-gram 和局部模式。此外,根據(jù)權(quán)重統(tǒng)計(jì)和玩具模型的見(jiàn)解,論文得出結(jié)論,前 25% 的全連接層比其余層使用更多的疊加。
-
更高層次的上下文和語(yǔ)言特征(例如,is_python_code)似乎是由單語(yǔ)義神經(jīng)元編碼的,而且主要發(fā)生在中間層。
-
表示稀疏性隨著模型規(guī)模的增加而增加,但不同的特征服從不同的動(dòng)態(tài):一些具有專用神經(jīng)元的特征隨著規(guī)模增加而出現(xiàn);有的特征分裂成具有規(guī)模的更細(xì)粒度的特征;許多特征保持不變或隨機(jī)出現(xiàn)。
輸入歸因
輸入歸因方法通常用于通過(guò)估計(jì)輸入元素(在LM的情況下為token)在模型預(yù)測(cè)中的貢獻(xiàn)來(lái)定位模型行為。
下圖給出了在注意力頭間計(jì)算令牌間貢獻(xiàn)的三種方法。僅依賴注意力權(quán)重會(huì)忽略它們所操作的向量的大小。這種限制可以通過(guò)考慮值加權(quán)或輸出值加權(quán)向量(\(x′_j\))的范數(shù)來(lái)解決,即第二種方法。最后,基于距離的分析根據(jù)加權(quán)向量與注意力輸出的接近程度來(lái)估計(jì)加權(quán)向量的貢獻(xiàn)。

模型組件歸因
直接邏輯歸因(DLA,Direct Logit Attributions)是一種解釋詞匯空間中模型組件輸出激活的技術(shù)。DLA應(yīng)用未嵌入矩陣來(lái)模擬內(nèi)部激活,有效地跳過(guò)了下游組件的進(jìn)一步計(jì)算。下圖給出了在輸出token w上應(yīng)用DLA 的案例。 分別是(a)注意頭的DLA;(b)通過(guò)注意頭的中間表示的DLA;(c)FFN塊的DLA和(d)單個(gè)神經(jīng)元的DLA。

circuit analysis
論文"Chain of Thought Empowers Transformers to Solve Inherently Serial Problems“ 將Transformer看作一定深度的復(fù)雜電路,分析其可以解決問(wèn)題的復(fù)雜度。電路復(fù)雜度分析用 \(TC^0\) 表示可以通過(guò)一個(gè)固定深度的電路解決的計(jì)算問(wèn)題,而足夠長(zhǎng)的思維鏈,能將Transformer的表達(dá)能力擴(kuò)展到\(TC^0\)之外。
論文指出,從概念上講,CoT賦予模型執(zhí)行本質(zhì)上串行計(jì)算的能力,這是Transformer所缺乏的,尤其是在深度較低的情況下。并行處理可以增加填充信息,在寬度上有機(jī)會(huì)影響采樣的概率分布,進(jìn)而影響最后的推理效果,但是簡(jiǎn)單的并行推理會(huì)導(dǎo)致模型無(wú)法提供深度信息。串行處理則通過(guò)引入中間信息,加深LLM在范疇對(duì)象和態(tài)射中遍歷的深度,逐步調(diào)整采樣概率分布,實(shí)現(xiàn)更精確的推理。CoT 則提高了低深度Transformer在內(nèi)在串行問(wèn)題上的表達(dá)能力,讓Transformer避免簡(jiǎn)單并行推理,通過(guò)串行的方式去一步步推理。
論文進(jìn)一步論證,通過(guò)T步CoT,使用固定位精度和O(logn) 嵌入大小的固定深度Transformer可以解決任何可由大小為T的布爾電路解決的問(wèn)題。

上圖是不同嵌入大小d(n)和CoT長(zhǎng)度T(n)的共復(fù)雜度類之間的關(guān)系圖。
6.2 機(jī)器學(xué)習(xí)角度
前向傳播角度
有些方法著重研究前向傳播的隱狀態(tài)和權(quán)重的映射上,試圖通過(guò)可視化權(quán)重和隱狀態(tài)來(lái)解讀語(yǔ)言模型的內(nèi)部運(yùn)作。此處我們主要介紹 logit lens。logit lens的作用是通過(guò)將 LLM 的隱狀態(tài)轉(zhuǎn)換為詞匯概率來(lái)展示模型在生成過(guò)程中的表現(xiàn),這種投影有助于理解 LLM 在生成過(guò)程中逐漸構(gòu)建輸出的模式。
Logit Lens的思路和原理是:
- 語(yǔ)言模型在逐層為輸入分配特征。那么我們可不可以觀察特征是怎么逐層變化的?
- 既然解碼新token的過(guò)程是把最終的hidden states用線性層變換一次,然后經(jīng)過(guò)softmax轉(zhuǎn)換為詞典的概率分布。那么把LM head提前加在每個(gè)中間層上,通過(guò)將激活值先經(jīng)過(guò)transformer的最終歸一化層,然后與輸出嵌入矩陣相乘,就可以將激活值轉(zhuǎn)換為詞匯表中每個(gè)詞的logit。
反向傳播角度
論文"Backward Lens: Projecting Language Model Gradients into the Vocabulary Space"從反向傳播矩陣來(lái)理解Transformer的運(yùn)作機(jī)制。
動(dòng)機(jī)
反向傳播是將鏈?zhǔn)椒▌t應(yīng)用于計(jì)算導(dǎo)數(shù)并更新深度學(xué)習(xí)網(wǎng)絡(luò)模型權(quán)重的過(guò)程。該過(guò)程始于模型執(zhí)行前向傳播,生成預(yù)測(cè)\(\hat y\) 后與期望目標(biāo)比較,通過(guò)損失函數(shù)進(jìn)行量化差異。在此之后,模型開(kāi)始反向傳播,逐層計(jì)算梯度。反向傳播算法通過(guò)計(jì)算每一層的梯度來(lái)更新模型中的權(quán)重。這一機(jī)制不僅使模型能夠?qū)W習(xí)新的信息,也為研究人員提供了解釋模型行為的機(jī)會(huì)。目前,關(guān)于反向傳播的梯度如何影響模型學(xué)習(xí)和知識(shí)存儲(chǔ)的探討仍然較為稀缺。
該研究的動(dòng)機(jī)在于擴(kuò)展現(xiàn)有的可解釋性方法,尤其是將其應(yīng)用于 LM 的反向傳播過(guò)程,比如如何將梯度信息有效地應(yīng)用于模型的知識(shí)更新與編輯中。通過(guò)分析反向傳播中的梯度矩陣,研究者能夠更全面地理解信息在模型中的流動(dòng)。
此外,該論文還提出了一種新的思路:通過(guò)將梯度矩陣映射到詞匯空間,揭示 LM 在學(xué)習(xí)新知識(shí)時(shí)的內(nèi)在機(jī)制。通過(guò)這一方法,研究者希望能夠明確地理解模型如何在多層次上進(jìn)行信息存儲(chǔ)和記憶。
方案
將Logit Lens應(yīng)用于梯度矩陣
在分析中,研究者專注于MLP層,這是識(shí)別和編輯存儲(chǔ)知識(shí)的重要領(lǐng)域。MLP模塊由兩個(gè)緊密連接的矩陣(\(FF_1\)和 \(FF_2\))構(gòu)成。
具體來(lái)說(shuō),\(FF_1\)將輸入從 \(R^d\)映射到\(R^{d_m}\) ,而 \(FF_2\)則將其映射回 \(R^d\)。由于梯度矩陣的維度高且難以全面分析,因此研究者將每個(gè)梯度矩陣的外積形式轉(zhuǎn)換為一組較小的向量。每個(gè)由 \(x_i^\top \cdot \delta_i\) 形成的矩陣可以同時(shí)從兩個(gè)視角進(jìn)行解釋:一方面作為 \(x_i\) 的跨度(線性組合),另一方面作為 \(\delta_i\) 的跨度。研究者利用這種雙重性,通過(guò)聚焦于 n 個(gè)向量的線性組合來(lái)分析梯度。此外,研究者也指出 \(FF_1\)的梯度使用 \(x_i\)作為其跨度集合, \(FF_2\)的梯度則使用\(\delta_i\) 作為其跨度集合。通過(guò)這種分析,研究者能夠更深入地理解 MLP 層中存儲(chǔ)信息的復(fù)雜機(jī)制,也可以通過(guò)構(gòu)建特定的跨度集合來(lái)提高對(duì)梯度矩陣的解釋能力。

上圖展示了通過(guò)\(x^?·δ\)的外積來(lái)計(jì)算梯度矩陣的過(guò)程。矩陣的每一行由相同的值組成。在圖的上方,我們將矩陣描述為δ的跨度(span),而在圖的下方,我們將其描述為x的跨度。矢量被轉(zhuǎn)置展示以強(qiáng)調(diào)跨度效果。

上圖展示了依據(jù)“萊昂內(nèi)爾·梅西效力”的prompt,給出”巴黎“這個(gè)回答時(shí),LM的一個(gè) MLP 層的前向與反向傳播過(guò)程,以及梯度對(duì)模型更新的影響。具體表現(xiàn)為梯度(以綠色表示)和權(quán)重(以藍(lán)色表示)之間的相互作用。MLP的第一個(gè)矩陣\(FF_1\)試圖將在前向傳播過(guò)程中遇到的信息合并在模型的權(quán)重(藍(lán)色)中。利用詞匯投影(vocabulary projection)方法,論文作者發(fā)現(xiàn)這些信息代表了token“團(tuán)隊(duì)”。第二個(gè)矩陣\(FF_2\)的梯度則旨在將\(FF_2\)編碼的信息向新目標(biāo)的embedding 方向移動(dòng)。
知識(shí)存儲(chǔ)與模型編輯的機(jī)制
我們接下來(lái)看看如何利用反向傳播中的梯度更新 MLP 層的權(quán)重。論文提出了一種稱為“印記與偏移”(imprint and shift)機(jī)制的雙階段過(guò)程。該機(jī)制通過(guò)結(jié)合前向傳播的輸入和目標(biāo)嵌入,利用梯度信息在 MLP 層中存儲(chǔ)信息。每個(gè) MLP 層的梯度可以表示為正向傳播的輸入向量和反向傳播的 VJP(向量雅可比乘積)的組合。具體地,梯度在更新過(guò)程中的表現(xiàn)可以表示為:
在這個(gè)表達(dá)式中, \(x_i\) 是前向傳播的輸入,而 \(\delta_i\) 是相應(yīng)的 VJP。當(dāng)使用反向傳播更新 LM 的 MLP 層時(shí),會(huì)發(fā)生以下兩個(gè)主要階段的變化:
印記階段:這個(gè)過(guò)程將給定輸入的“印記”附加到 MLP 層。輸入 \(x_i\) 被加入或減去到 \(FF_1\)的神經(jīng)元中,從而調(diào)整每個(gè)與輸入對(duì)應(yīng)的 \(FF_1\)神經(jīng)元的激活程度。
偏移階段:此階段涉及對(duì) \(FF_2\)的輸出進(jìn)行調(diào)整,具體表現(xiàn)為從 \(FF_2\) 的神經(jīng)元中減去 \(\delta_i\),以放大在啟用 VJP 值后對(duì)輸出的影響。這相當(dāng)于將之前概率較低的詞匯提升為預(yù)測(cè)可能性更高的目標(biāo)。

上圖展示了反向傳播的印記和偏移機(jī)制。“grad”表示梯度矩陣中的單個(gè)神經(jīng)元。\(FF_1\) 的grad的顏色與前向傳播輸入相同,而\(FF_2\)的梯度則與新的目標(biāo)嵌入相同,這表明它們彼此相似。
6.3 生物學(xué)角度
隨著神經(jīng)網(wǎng)絡(luò)的誕生及后續(xù)的輝煌發(fā)展,研究者們一直在為神經(jīng)網(wǎng)絡(luò)尋找生物學(xué)上的解釋,生物學(xué)上的進(jìn)展也在啟發(fā)AI研究人員開(kāi)發(fā)新模型。
星形膠質(zhì)細(xì)胞
論文"Building transformers from neurons and astrocytes"指出,由神經(jīng)元和其他稱為星形膠質(zhì)細(xì)胞(astrocyte )的腦細(xì)胞組成的生物網(wǎng)絡(luò)可以執(zhí)行與 Transformer 相同的核心計(jì)算。論文從計(jì)算角度探討了星形膠質(zhì)細(xì)胞在大腦中發(fā)揮的作用,并制作了一個(gè)數(shù)學(xué)模型,展示了如何將它們與神經(jīng)元一起構(gòu)建一個(gè)生物學(xué)上合理的 Transformer。
動(dòng)機(jī)
Transformer 會(huì)比較句子中的所有單詞以生成預(yù)測(cè),這個(gè)過(guò)程稱為自注意力。為了讓自注意力發(fā)揮作用,Transformer 必須以某種形式的記憶保存所有單詞,但由于神經(jīng)元的交流方式,這在生物學(xué)上似乎是不可能的。
然而,研究一種略有不同類型的機(jī)器學(xué)習(xí)模型(Dense Associated Memory)的科學(xué)家意識(shí)到,這種自注意機(jī)制可能發(fā)生在大腦中,但前提是至少三個(gè)神經(jīng)元之間存在通信。而星形膠質(zhì)細(xì)胞(不是神經(jīng)元)可以與神經(jīng)元形成三向連接,即所謂的三方突觸。星形膠質(zhì)細(xì)胞可以向神經(jīng)元發(fā)出信號(hào)。因?yàn)樾切文z質(zhì)細(xì)胞的運(yùn)作時(shí)間比神經(jīng)元長(zhǎng)得多——它們通過(guò)緩慢升高然后降低鈣反應(yīng)來(lái)產(chǎn)生信號(hào)——這些細(xì)胞可以保存并整合從神經(jīng)元傳遞給它們的信息。通過(guò)這種方式,星形膠質(zhì)細(xì)胞可以形成一種記憶緩沖區(qū)。
因此,論文作者假設(shè)星形膠質(zhì)細(xì)胞可以在 Transformer 的計(jì)算方式中發(fā)揮作用。
方案
論文作者從計(jì)算角度探討了星形膠質(zhì)細(xì)胞在大腦中發(fā)揮的作用,建立了神經(jīng)元-星形膠質(zhì)細(xì)胞網(wǎng)絡(luò)的數(shù)學(xué)模型,展示了如何將它們與神經(jīng)元一起,構(gòu)建一個(gè)生物學(xué)上合理的 Transformer,即該模型可以像 Transformer 一樣運(yùn)行。

上圖中,A部分給出了神經(jīng)元-星形膠質(zhì)細(xì)胞網(wǎng)絡(luò)的概述。Transformer塊由一個(gè)前饋網(wǎng)絡(luò)近似,該前饋網(wǎng)絡(luò)具有一個(gè)星形膠質(zhì)細(xì)胞單元,該單元覆蓋了隱藏層和最后一層之間的突觸(矩陣H)。B部分則展示了在寫入階段,可以使用Hebbian學(xué)習(xí)規(guī)則更新神經(jīng)元之間的權(quán)重,使用突觸前可塑性規(guī)則更新神經(jīng)元與星形膠質(zhì)細(xì)胞之間的權(quán)重。在讀取階段,星形膠質(zhì)細(xì)胞在數(shù)據(jù)流經(jīng)網(wǎng)絡(luò)時(shí)會(huì)調(diào)節(jié)突觸權(quán)重H。
通過(guò)分析,論文作者表明,他們的生物物理神經(jīng)元-星形膠質(zhì)細(xì)胞網(wǎng)絡(luò)理論上與 Transformer 相匹配。此外,他們通過(guò)將圖像和文本段落輸入 Transformer 模型和模擬神經(jīng)元星形膠質(zhì)細(xì)胞網(wǎng)絡(luò),發(fā)現(xiàn)兩者都以類似的方式回應(yīng)提示,這證實(shí)了論文作者的理論模型。
海馬體
論文”RELATING TRANSFORMERS TO MODELS AND NEURAL REPRESENTATIONS OF THE HIPPOCAMPAL FORMATION“則從負(fù)責(zé)記憶的海馬體(Hippocampal )角度做出了分析。
雖然Transformer模型是在完全沒(méi)有生物學(xué)知識(shí)輔助的情況下開(kāi)發(fā)出來(lái)的,但在數(shù)學(xué)上,Transformer的架構(gòu)卻和目前神經(jīng)科學(xué)中的海馬體模型極其相似,尤其是網(wǎng)格細(xì)胞(grid cell)和位置細(xì)胞(place cell)。所以基于transformer的大語(yǔ)言模型(比如GPT、Bard等)實(shí)際上在模仿海馬及內(nèi)嗅皮層處理信息的方式。采用遞歸位置編碼的Transformer可以精確復(fù)制海馬結(jié)構(gòu)。

上圖顯示了Transformer如何準(zhǔn)確地復(fù)制了在海馬體中觀察到的那些模式。
TEM(Tolman-Eichenbaum Machine)模型是一種神經(jīng)科學(xué)模型,這種序列學(xué)習(xí)器可以捕捉海馬體和內(nèi)嗅皮層(內(nèi)側(cè)/外側(cè);MEC/LEC)中的許多已知神經(jīng)現(xiàn)象。下圖給出了TEM模型的結(jié)構(gòu),以及它和Transformer的對(duì)比。

該論文的研究似乎也說(shuō)明了,我們的人腦中存在類似自然語(yǔ)言處理中常用的詞向量(包含了詞的語(yǔ)義信息)并且編碼了詞的位置,而且,大腦中似乎也存在一個(gè)類 transformer 模型。
6.4 數(shù)學(xué)角度
ODE視角
以微分方程的概念來(lái)審視和解釋神經(jīng)網(wǎng)絡(luò)是近年來(lái)興起的一個(gè)新的研究方向,深度神經(jīng)網(wǎng)絡(luò)(DNNs)有一個(gè)共同特征:輸入數(shù)據(jù)按照順序被逐層處理,形成一個(gè)時(shí)間離散的動(dòng)態(tài)系統(tǒng)。基于此,研究者們假設(shè)特定類型的神經(jīng)網(wǎng)絡(luò)可以看作是離散的微分方程,所以可以使用現(xiàn)成的微分方程求解器來(lái)進(jìn)行計(jì)算,希望可以得到效果更好且具有強(qiáng)解釋性的結(jié)果。
神經(jīng)常微分方程
論文"Neural Ordinary Differential Equations"提出了一種名為神經(jīng)常微分方程的模型,這是新一類的深度神經(jīng)網(wǎng)絡(luò)。神經(jīng)常微分方程不拘于對(duì)已有架構(gòu)的修修補(bǔ)補(bǔ),它完全從另外一個(gè)角度考慮如何以連續(xù)的方式借助神經(jīng)網(wǎng)絡(luò)對(duì)數(shù)據(jù)建模。
推導(dǎo)
目前較為常用的神經(jīng)網(wǎng)絡(luò),例如殘差網(wǎng)絡(luò)都是通過(guò)堆疊一系列的轉(zhuǎn)換塊(transformations)或殘差塊來(lái)形成一個(gè)隱層狀態(tài)以建立復(fù)雜的轉(zhuǎn)換。當(dāng)隨著網(wǎng)絡(luò)的層數(shù)不斷加深,網(wǎng)絡(luò)推理計(jì)算的每一步都足夠小時(shí),即接近極限時(shí),我們對(duì)網(wǎng)絡(luò)的隱藏層神經(jīng)元的連續(xù)動(dòng)態(tài)進(jìn)行參數(shù)化,就可以得到對(duì)應(yīng)的Neural ODE。具體推導(dǎo)如下圖所示。我們可以將輸出層 定義為在某時(shí)刻 上常微分方程(ODE)初值問(wèn)題的解,這個(gè)值可以通過(guò)一個(gè)常微分方程求解器進(jìn)行計(jì)算。

優(yōu)勢(shì)
其實(shí)無(wú)論是什么結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),本質(zhì)上都是在擬合一個(gè)復(fù)雜的非線性復(fù)合函數(shù),其中復(fù)合的次數(shù)其實(shí)等價(jià)于神經(jīng)網(wǎng)絡(luò)的層數(shù)。要對(duì)網(wǎng)絡(luò)進(jìn)行求解,首先需要找到網(wǎng)絡(luò)參數(shù)的梯度,這就涉及到鏈?zhǔn)椒▌t,其要求在網(wǎng)絡(luò)前向傳播的過(guò)程中保留所有層的激活值,并且在反向傳播的時(shí)候再利用這些激活值進(jìn)行計(jì)算,這對(duì)設(shè)備內(nèi)存或顯存的占用非常大,因此一般情況下無(wú)法訓(xùn)練很深層數(shù)的網(wǎng)絡(luò)。
而Neural ODE來(lái)可以直接通過(guò)方程求解器來(lái)計(jì)算網(wǎng)絡(luò)梯度,但是當(dāng)網(wǎng)絡(luò)的層數(shù)較深時(shí),計(jì)算的誤差會(huì)逐漸累加,因此引入了一個(gè)伴隨狀態(tài)方法(Adjoint State Method)來(lái)計(jì)算ODE的梯度。該方法將網(wǎng)絡(luò)梯度的計(jì)算轉(zhuǎn)化為解一個(gè)ODE,隨后可以將隱藏層狀態(tài)的導(dǎo)數(shù)作為一個(gè)參數(shù),這樣參數(shù)就不是原本的離散序列,而是一個(gè)連續(xù)的向量場(chǎng)(vector field),因此就不需要前向傳播去一一計(jì)算,也就不需要耗費(fèi)大量空間來(lái)保存中間結(jié)果了。
綜上所述,Neural ODE框架可以使用伴隨狀態(tài)方法在不存儲(chǔ)激活值 的情況下進(jìn)行網(wǎng)絡(luò)學(xué)習(xí),因此顯著減少了原本反向傳播時(shí)的大量?jī)?nèi)存使用空間,同時(shí)也提供了一個(gè)理論框架,從ODE的連續(xù)視角來(lái)研究深度學(xué)習(xí)模型。
示例
神經(jīng)常微分方程(Neural ODE)的核心操作是對(duì)網(wǎng)絡(luò)隱藏層狀態(tài)的導(dǎo)數(shù)進(jìn)行參數(shù)化,進(jìn)而建立起與隱藏層強(qiáng)相關(guān)的微分方程,如果可以使用某種手段直接將中間層的結(jié)果求解出來(lái)。比如,論文指出:殘差網(wǎng)絡(luò)與常微分方程(ODE)之間存在著密切的關(guān)系。具體來(lái)說(shuō),殘差網(wǎng)絡(luò)可以被看作是求解常微分方程的歐拉方法的離散化版本,即ResNets可以被視為一組特定Neural ODE的離散化。所以可以使用現(xiàn)成的微分方程求解器來(lái)進(jìn)行計(jì)算。

上圖對(duì)兩種網(wǎng)絡(luò)進(jìn)行對(duì)比,可以讓我們更直觀地理解Neural ODE。右側(cè)上方的殘差網(wǎng)絡(luò)定義了有限變換的離散序列。從0到1再到5的轉(zhuǎn)換代表了離散的網(wǎng)絡(luò)層,每一層都會(huì)通過(guò)一個(gè)激活函數(shù)進(jìn)行非線性轉(zhuǎn)換。我們可以將其中的黑色評(píng)估位置視為神經(jīng)元,它會(huì)對(duì)其輸入進(jìn)行轉(zhuǎn)換以調(diào)整傳遞的信息。而ODE網(wǎng)絡(luò)則定義了一個(gè)向量場(chǎng),隱藏狀態(tài)在其中進(jìn)行連續(xù)轉(zhuǎn)換,黑色的評(píng)估點(diǎn)會(huì)根據(jù)預(yù)設(shè)的誤差容忍度自動(dòng)調(diào)整其位置。
Do Residual Neural Networks discretize Neural Ordinary Differential Equations?
論文”Do Residual Neural Networks discretize Neural Ordinary Differential Equations?“對(duì)ResNets與Neural ODEs之間的聯(lián)系進(jìn)行進(jìn)一步的深入研究。
論文首先量化ResNets的隱藏層狀態(tài)軌跡與其對(duì)應(yīng)的Neural ODE的解之間的距離,隨后發(fā)現(xiàn)使用梯度下降算法優(yōu)化ResNets得到的平滑性,可以以一定的速率對(duì)Neural ODE進(jìn)行正則化,并且其能達(dá)到的深度以及所需的優(yōu)化時(shí)間與梯度下降算法一致。基于該發(fā)現(xiàn),論文提出可以使用無(wú)記憶(memory-free)的離散鄰接法(adjoint method)來(lái)訓(xùn)練ResNets,并表明如果殘差函數(shù)與輸入符合李普希茨(Lipschitz)條件,這種方法在理論上可以支持較深層ResNets的訓(xùn)練。最后,論文成功地用鄰接法在在殘差層中沒(méi)有內(nèi)存消耗的情況下對(duì)非常深的ResNets進(jìn)行微調(diào)。
多粒子動(dòng)態(tài)系統(tǒng)視角
論文"Understanding and Improving Transformer From a Multi-Particle Dynamic System Point of View"從多粒子動(dòng)態(tài)系統(tǒng)(MPDS/Multi-Particle Dynamic System)的角度提出了對(duì)Transformer架構(gòu)的新理解,將其在數(shù)學(xué)上解釋為一種數(shù)值常微分方程(ODE)求解器。其實(shí),這也是ODE的另一種視角。
多粒子的動(dòng)態(tài)系統(tǒng)是在物理中常見(jiàn)的一種動(dòng)態(tài)系統(tǒng),在流體力學(xué)中通常以動(dòng)態(tài)系統(tǒng)的常微分方程來(lái)模擬,這種動(dòng)態(tài)系統(tǒng)的常微分方程叫做對(duì)流擴(kuò)散方程(Convection-diffusion Equation)。比如粒子位置對(duì)時(shí)間的導(dǎo)數(shù)是兩個(gè)函數(shù)的和,第一個(gè)函數(shù)是 F,這是N個(gè)粒子共同作用的一個(gè)N元函數(shù)(通常被稱為Diffusion);第二個(gè)函數(shù)是G函數(shù),是對(duì)每個(gè)粒子單獨(dú)作用的闡述(通常被稱為Convection)。這與 Transformer 結(jié)構(gòu)中的 MHA 與 FFN 形成了一種很自然的契合。因?yàn)镸HA 考慮到句子中不同單詞的語(yǔ)義和依賴關(guān)系,從而用這些信息來(lái)捕獲句子的內(nèi)在結(jié)構(gòu)和表示。FFN則是獨(dú)立應(yīng)用于句子中每個(gè)位置的單詞,對(duì)每個(gè)單詞采用相同的線性變換,從而把每個(gè)位置的上下文編碼到更高維度的表示。FFN是Convection的過(guò)程,多頭自注意力機(jī)制就是是Diffusion的過(guò)程。因此我們可以用這種多粒子的對(duì)流擴(kuò)散方程來(lái)解釋 Transformer結(jié)構(gòu)的含義。我們接下來(lái)看看其推導(dǎo)思路。
-
在流體力學(xué)中,單個(gè)粒子的運(yùn)動(dòng)會(huì)用兩個(gè)部分模擬(此處對(duì)應(yīng)下圖標(biāo)號(hào)1):
- 一個(gè)是該粒子本身的運(yùn)動(dòng),通常被稱為Convection。
- 一個(gè)是是其他粒子對(duì)其作用,通常被稱為Diffusion。
-
對(duì)于一個(gè)多粒子動(dòng)態(tài)系統(tǒng)(Multi-Particle Dynamic System),在流體力學(xué)中通常以如下圖標(biāo)號(hào)2的方程進(jìn)行模擬。
-
用Lie-trotter法解上面的常微分方程,得到標(biāo)號(hào)3。
-
多頭自注意力機(jī)制可以用標(biāo)號(hào)4的公式來(lái)表示,該公式可以演變成標(biāo)號(hào)6,對(duì)應(yīng)上面多粒子動(dòng)態(tài)系統(tǒng)里的函數(shù)F。
-
FFN可以用標(biāo)號(hào)5的公式來(lái)表示,對(duì)應(yīng)多粒子動(dòng)態(tài)系統(tǒng)里的函數(shù)G。
-
綜合標(biāo)號(hào)5和6,得到Transformer的一層為標(biāo)號(hào)7。
因此,Transformer的處理流程可以看作是:tokens從一個(gè)初始位置經(jīng)過(guò)一段時(shí)間的處理之后,呈現(xiàn)在高維度空間中的另一位置。

論文作者也指出,Lie-Trotter splitting scheme 事實(shí)上是一種早已被淘汰掉的數(shù)值解法,是一階的近似方法。在實(shí)際中去解常微分方程的時(shí)候, 人們用的都是Strang splitting。相較而言,Strang splitting 是一種比較好的數(shù)值解,是一種二階的近似方法。因此,論文作者提出了把 Strang splitting 這種常微分方程的數(shù)值解法對(duì)應(yīng)一種神經(jīng)網(wǎng)絡(luò)的話,這個(gè)網(wǎng)絡(luò)叫做Macaron結(jié)構(gòu),具體如下圖所示。

上述方法是從純粹的數(shù)學(xué)角度出發(fā),將 Deep Neural Networks 看作一種 Ordinary Differential Equation 的 Numerical solver。論文通過(guò)找常微分方程更好的數(shù)值解的方法,將其對(duì)應(yīng)回一種更好的網(wǎng)絡(luò)結(jié)構(gòu)。這種新的 Transformer 結(jié)構(gòu)的性能較之傳統(tǒng)有了顯著提升。與業(yè)界公司通過(guò)實(shí)驗(yàn)來(lái)探索不同,Macaron結(jié)構(gòu)是在“人力”思考的基礎(chǔ)上,用數(shù)學(xué)的方法設(shè)計(jì)出了一個(gè)更好的網(wǎng)絡(luò)。
流映射視角
論文"A Mathematical Perspective On Transformer"嘗試提供一個(gè)從數(shù)學(xué)角度研究 Transformers 通用且易于理解的框架。DNN 可以看作是從一個(gè)\(\mathbb R^d\)到另一個(gè)\(\mathbb R^d\)的流映射(Flow Map),而Transformer可以被認(rèn)為是在\(\mathcal P (R^d)\)上的流映射,即在\(\mathbb R^d\) 上的概率測(cè)度空間(the space of probability measures)的映射。為了實(shí)現(xiàn)這種在度量空間進(jìn)行轉(zhuǎn)換的流映射,Transformers 建立了一個(gè)平均場(chǎng)相互作用的粒子系統(tǒng)(mean-field interacting particle system.)。
論文的模型只關(guān)注 Transformer 架構(gòu)的兩個(gè)關(guān)鍵組成部分:自注意力機(jī)制和layer normalization。.
- layer normalization有效地將粒子限制在時(shí)間變化為軸的單位球體\(\mathbb{S}^{d-1}\)的空間內(nèi)部。
- 自注意力機(jī)制是通過(guò)經(jīng)驗(yàn)度量實(shí)現(xiàn)粒子之間的非線性耦合(the particular nonlinear coupling of the particles done through the empirical measure)。或者說(shuō),自注意力機(jī)制是互相作用的粒子系統(tǒng)中的非線性耦合機(jī)制(nonlinear coupling mechanism)。
完整的Transformer被表示如下圖所示。

論文還為自注意機(jī)制引入了一個(gè)更簡(jiǎn)單好用的替代模型,一個(gè)能量函數(shù)的 Wasserstein 梯度流,而能量函數(shù)在球面上點(diǎn)的最優(yōu)配置已經(jīng)有成熟的研究方法。
差分角度
Transformer結(jié)構(gòu)容易往往會(huì)過(guò)度關(guān)注不相關(guān)的上下文,從而傾向于將attention權(quán)重分配給這些無(wú)關(guān)的上下文中。其原因是,隨著上下文變長(zhǎng),微小的不相關(guān)token的注意力之和可能超過(guò)對(duì)少數(shù)相關(guān)token的注意力,從而淹沒(méi)它們。隨著輸入長(zhǎng)度的增加,經(jīng)典Transformer可能越來(lái)越難以捕捉到關(guān)鍵信息。
論文"Differentical Transformer"的作者稱這些無(wú)關(guān)的上下文為注意力噪音(attention noise)。因此,論文作者為了解決注意力噪音問(wèn)題,提出了DIFF Transformer。具體來(lái)說(shuō),「差分注意力」(differential attention)將注意力分?jǐn)?shù)計(jì)算為兩個(gè)單獨(dú)的softmax 注意力圖之間的差異,從而通過(guò)減法消除了噪聲。這樣可以能放大對(duì)答案范圍的注意力并消除噪音,促使模型關(guān)注上下文中的關(guān)鍵信息,從而增強(qiáng)上下文建模的能力。
總體架構(gòu)
為了方便說(shuō)明,論文使用了僅解碼器(decoder-only)模型作為示例來(lái)描述該架構(gòu)。模型的整體架構(gòu)和傳統(tǒng)Transformer 布局一致,整個(gè)模型由L個(gè)DIFF Transformer層堆疊而成,每層由一個(gè)差分注意力模塊和前饋網(wǎng)絡(luò)模塊連接形成。給定一個(gè)輸入序列 x,模型將輸入嵌入打包成 \(X^0\),此后輸入會(huì)被進(jìn)一步逐層處理,最終獲得輸出$ X^L$。
相比于 Transformer,差分 Transformer 的主要差別在于使用差分注意力替換了傳統(tǒng)的 softmax 注意力,同時(shí)保持整體宏觀布局不變。此外,論文也參考 LLaMA 采用了 pre-RMSNorm 和 SwiGLU 這兩項(xiàng)改進(jìn)措施。其中 \(W^G\)、\(W_1\)、$W_2 $是可學(xué)習(xí)的矩陣。

Differential Attention(差分注意力)
「差分注意力」是指兩個(gè)softmax函數(shù)間的差異來(lái)消除注意力噪聲。這個(gè)想法類似于電氣工程中提出的差分放大器,將兩個(gè)信號(hào)之間的差來(lái)消除輸入的共模噪聲。此外,降噪耳機(jī)的設(shè)計(jì)也基于類似的想法。
差分注意力機(jī)制具體如下:
- 給定輸入 X,首先將它們投射成查詢、鍵和值 \(Q_1\)、\(Q_2\)、\(K_1\)、\(K_2\)、\(V\)。對(duì)應(yīng)下圖標(biāo)號(hào)1。
- 將query和key 向量分為兩組,并計(jì)算兩個(gè)單獨(dú)的softmax注意力,然后將這兩個(gè)softmax的差值作為最終注意力分?jǐn)?shù)。對(duì)應(yīng)下圖標(biāo)號(hào)2。

可以通過(guò) λ 的大小動(dòng)態(tài)的控制兩個(gè)注意圖之間的權(quán)衡程度,從而更好的適用不同的輸入和任務(wù)要求。
多頭
DIFF Transformer中也可以使用多頭注意力機(jī)制。令 h 表示注意力頭的數(shù)量。該方法對(duì)各個(gè)頭使用不同的投影矩陣 \(W^Q_i 、W^K_i 、W^V_i ,i ∈ [1, h]\)。標(biāo)量 λ 在同一層內(nèi)的頭之間共享。然后通過(guò)拼接各個(gè)頭的輸出并進(jìn)行投影獲得最終結(jié)果。
下圖給出了多頭差異注意力機(jī)制和代碼示例。其中使用了 GroupNorm (?) 來(lái)強(qiáng)調(diào) LN (?) 獨(dú)立應(yīng)用于每個(gè) head。由于差分注意力往往具有更稀疏的模式,因此頭之間的統(tǒng)計(jì)信息更加多樣化。為了改進(jìn)梯度的統(tǒng)計(jì)情況,LN (?) 算子會(huì)在連接操作之前對(duì)每個(gè)頭進(jìn)行歸一化。

下面給出了具體代碼。地址:https://github.com/microsoft/unilm/tree/master/Diff-Transformer
class MultiheadDiffAttn(nn.Module):
def __init__(
self,
args,
embed_dim,
depth,
num_heads,
):
super().__init__()
self.args = args
self.embed_dim = embed_dim
# arg num_heads set to half of Transformer's num_heads
self.num_heads = num_heads
# arg decoder_kv_attention_heads set to half of Transformer's num_kv_heads if use GQA
# set to same as num_heads if use normal MHA
self.num_kv_heads = args.decoder_kv_attention_heads if args.decoder_kv_attention_heads is not None else num_heads
self.n_rep = self.num_heads // self.num_kv_heads
self.head_dim = embed_dim // num_heads // 2
self.scaling = self.head_dim ** -0.5
self.q_proj = nn.Linear(embed_dim, embed_dim, bias=False)
self.k_proj = nn.Linear(embed_dim, embed_dim // self.n_rep, bias=False)
self.v_proj = nn.Linear(embed_dim, embed_dim // self.n_rep, bias=False)
self.out_proj = nn.Linear(embed_dim, embed_dim, bias=False)
self.lambda_init = lambda_init_fn(depth)
self.lambda_q1 = nn.Parameter(torch.zeros(self.head_dim, dtype=torch.float32).normal_(mean=0,std=0.1))
self.lambda_k1 = nn.Parameter(torch.zeros(self.head_dim, dtype=torch.float32).normal_(mean=0,std=0.1))
self.lambda_q2 = nn.Parameter(torch.zeros(self.head_dim, dtype=torch.float32).normal_(mean=0,std=0.1))
self.lambda_k2 = nn.Parameter(torch.zeros(self.head_dim, dtype=torch.float32).normal_(mean=0,std=0.1))
self.subln = RMSNorm(2 * self.head_dim, eps=1e-5, elementwise_affine=True)
def forward(
self,
x,
rel_pos,
attn_mask=None,
):
bsz, tgt_len, embed_dim = x.size()
src_len = tgt_len
q = self.q_proj(x)
k = self.k_proj(x)
v = self.v_proj(x)
q = q.view(bsz, tgt_len, 2 * self.num_heads, self.head_dim)
k = k.view(bsz, src_len, 2 * self.num_kv_heads, self.head_dim)
v = v.view(bsz, src_len, self.num_kv_heads, 2 * self.head_dim)
q = apply_rotary_emb(q, *rel_pos, interleaved=True)
k = apply_rotary_emb(k, *rel_pos, interleaved=True)
offset = src_len - tgt_len
q = q.transpose(1, 2)
k = repeat_kv(k.transpose(1, 2), self.n_rep)
v = repeat_kv(v.transpose(1, 2), self.n_rep)
q *= self.scaling
attn_weights = torch.matmul(q, k.transpose(-1, -2))
if attn_mask is None:
attn_mask = torch.triu(
torch.zeros([tgt_len, src_len])
.float()
.fill_(float("-inf"))
.type_as(attn_weights),
1 + offset,
)
attn_weights = torch.nan_to_num(attn_weights)
attn_weights += attn_mask
attn_weights = F.softmax(attn_weights, dim=-1, dtype=torch.float32).type_as(
attn_weights
)
lambda_1 = torch.exp(torch.sum(self.lambda_q1 * self.lambda_k1, dim=-1).float()).type_as(q)
lambda_2 = torch.exp(torch.sum(self.lambda_q2 * self.lambda_k2, dim=-1).float()).type_as(q)
lambda_full = lambda_1 - lambda_2 + self.lambda_init
attn_weights = attn_weights.view(bsz, self.num_heads, 2, tgt_len, src_len)
attn_weights = attn_weights[:, :, 0] - lambda_full * attn_weights[:, :, 1]
attn = torch.matmul(attn_weights, v)
attn = self.subln(attn)
attn = attn * (1 - self.lambda_init)
attn = attn.transpose(1, 2).reshape(bsz, tgt_len, self.num_heads * 2 * self.head_dim)
attn = self.out_proj(attn)
return attn
圖靈完備性質(zhì)
論文"ASK , AND IT SHALL BE GIVEN: TURING COMPLETE - NESS OF PROMPTING"首次從理論層面證明了大語(yǔ)言模型(LLM)中的prompt機(jī)制具有圖靈完備性。
圖靈完備性(Turing Completeness)是計(jì)算理論中的一個(gè)核心概念,用來(lái)描述某個(gè)計(jì)算系統(tǒng)的計(jì)算能力。如果一個(gè)系統(tǒng)具備條件分支、循環(huán)或遞歸能力,并具有理論上的無(wú)限存儲(chǔ),那么它可以被稱為圖靈完備。只要給它足夠的時(shí)間和資源,這種系統(tǒng)能夠模擬任意其他可計(jì)算的計(jì)算機(jī),執(zhí)行任何可編程的任務(wù)。具備這些特征的系統(tǒng)可以用來(lái)模擬任何其他圖靈完備的系統(tǒng)。因此,圖靈完備的系統(tǒng)之間是等價(jià)的,理論上可以用來(lái)模擬任何其他圖靈完備的系統(tǒng)。圖靈機(jī)被認(rèn)為是所有可計(jì)算過(guò)程的最終抽象,在傳統(tǒng)計(jì)算理論中,圖靈機(jī)用于衡量其他系統(tǒng)的計(jì)算能力。
當(dāng)我們說(shuō)LLM的提示是圖靈完備的,意味著我們可以將LLM視為一個(gè)通用計(jì)算器,只需通過(guò)精心設(shè)計(jì)的prompt,一個(gè)固定大小的Transformer模型理論上可以計(jì)算任何可計(jì)算函數(shù),能夠完成任何可以編程的任務(wù)。更重要的是,這個(gè)固定大小的模型在計(jì)算復(fù)雜度上幾乎可以達(dá)到所有不限大小的Transformer模型的理論上限。這為我們使用LLM解決復(fù)雜問(wèn)題提供了一個(gè)全新的視角,也為prompt工程提供了堅(jiān)實(shí)的理論基礎(chǔ)。
論文在理論和技術(shù)層面上的主要貢獻(xiàn)是:
- 表達(dá)能力:展示了提示的圖靈完備性。研究者證明,存在一個(gè)固定大小的Transformer Γ,對(duì)于任何可計(jì)算函數(shù) φ,存在一個(gè)相應(yīng)的有限提示\(π_φ\(chéng)),使得對(duì)于任意輸入 x,Transformer Γ 在提示\(π_φ\(chéng)) 的指導(dǎo)下能夠計(jì)算出 φ(x) 的結(jié)果。重要的是,構(gòu)造的 Transformer Γ 與具體的函數(shù) φ 無(wú)關(guān),提示\(π_φ\(chéng)) 與輸入 x 也無(wú)關(guān),且輸入 x 可以是任意長(zhǎng)度。
- 鏈?zhǔn)剿季S(CoT)復(fù)雜性:研究表明,構(gòu)造的 Transformer Γ 可以在 \(O(t(n))\) 步內(nèi)計(jì)算任何$ TIME_2(t(n)) $類函數(shù),并可以在 \(O(t(n) log t(n))\) 步內(nèi)計(jì)算任何$ TIME(t(n)) $類函數(shù),即使是對(duì)于長(zhǎng)度為 n 的輸入。值得注意的是,單個(gè) Transformer 也可以達(dá)到幾乎與所有 Transformer 類相同的 CoT 復(fù)雜性。
- 精度復(fù)雜性:研究還展示了構(gòu)造的 Transformer Γ 可以在$ O(log(n + t(n)))$ 位精度內(nèi)計(jì)算任何 \(TIME(t(n))\) 類函數(shù)。這意味著,即使是單個(gè) Transformer 也能夠達(dá)到與所有 Transformer 類相同的精度復(fù)雜性。
論文揭示了Prompt的真正潛力:通過(guò)合適的設(shè)計(jì),我們可以讓Transformer模型執(zhí)行任何復(fù)雜的計(jì)算任務(wù)。對(duì)于Prompt工程師來(lái)說(shuō),提示不再只是給定模型的一段簡(jiǎn)單文本,而可以將提示看作一種編程語(yǔ)言,通過(guò)合適的語(yǔ)法和結(jié)構(gòu)來(lái)表達(dá)復(fù)雜的邏輯和操作。這意味著在設(shè)計(jì)提示時(shí),我們不僅可以關(guān)注如何讓模型理解任務(wù),更可以從計(jì)算理論的角度出發(fā),去設(shè)計(jì)能夠高效完成計(jì)算的提示。只要提示設(shè)計(jì)得足夠巧妙,它就可以模擬任意計(jì)算過(guò)程,這讓Prompt工程具備了更深層次的科學(xué)基礎(chǔ)。
范疇論
Symbolica首席科學(xué)家Paul 在2024年六月份發(fā)表了一篇文章想要通過(guò)范疇論來(lái)統(tǒng)一描述和研究深度學(xué)習(xí)架構(gòu)。
范疇學(xué)是一種研究數(shù)學(xué)結(jié)構(gòu)和它們之間關(guān)系的數(shù)學(xué)分支。它關(guān)注于對(duì)象和態(tài)射之間的映射關(guān)系,以及這些映射關(guān)系之間的組合和復(fù)合規(guī)則。范疇學(xué)提供了一種統(tǒng)一的語(yǔ)言,可以描述和比較不同數(shù)學(xué)結(jié)構(gòu)之間的共性和相似性,從而使得數(shù)學(xué)家能夠在不同領(lǐng)域之間建立聯(lián)系和發(fā)現(xiàn)共性。在進(jìn)行類比時(shí),范疇學(xué)能夠幫助我們發(fā)現(xiàn)不同數(shù)學(xué)領(lǐng)域之間的類似性,找到它們之間的共同模式和結(jié)構(gòu)。通過(guò)將問(wèn)題抽象成范疇論的語(yǔ)言,我們可以將原本復(fù)雜的問(wèn)題簡(jiǎn)化為更一般性的形式,從而更容易進(jìn)行類比和推理。范疇學(xué)的一些基本概念,如對(duì)象、態(tài)射、同態(tài)和自然變換等,可以幫助我們?cè)诓煌瑪?shù)學(xué)領(lǐng)域之間建立橋梁。這種概念的應(yīng)用可以使得類比更加靈活和高效,從而促進(jìn)對(duì)問(wèn)題的深入理解和解決。因此,范疇學(xué)是數(shù)學(xué)中進(jìn)行類比的一個(gè)非常有效的工具,它使得數(shù)學(xué)家和研究者能夠在廣泛的數(shù)學(xué)領(lǐng)域中發(fā)現(xiàn)新的見(jiàn)解和聯(lián)系。同時(shí),范疇學(xué)也在其他領(lǐng)域,如計(jì)算機(jī)科學(xué)、物理學(xué)和哲學(xué)等方面得到了廣泛的應(yīng)用。
如果將深度學(xué)習(xí)模型視為范疇,則深度學(xué)習(xí)模型的層可以被視為范疇中的對(duì)象,層之間的數(shù)據(jù)流和變換可以被視為態(tài)射。在深度學(xué)習(xí)中,單子可以用來(lái)描述模型必須滿足的約束,例如對(duì)稱性或等變性,代數(shù)可以用來(lái)描述模型的參數(shù)和前向傳播。單子代數(shù)同態(tài)可以用來(lái)描述模型層之間的轉(zhuǎn)換,例如從一個(gè)層的輸出到另一個(gè)層的輸入。這樣使用范疇論來(lái)構(gòu)建和分析深度學(xué)習(xí)模型,可以幫助實(shí)現(xiàn)模型的可信性。比如:
- 范疇論提供了一種清晰的方式來(lái)描述模型的組件和它們之間的相互作用,這有助于理解模型的工作原理。
- 通過(guò)單子來(lái)定義模型必須滿足的約束,如等變性和對(duì)稱性,確保模型的行為符合預(yù)期。
- 可以對(duì)模型的屬性進(jìn)行形式化驗(yàn)證,確保它們滿足特定的數(shù)學(xué)和邏輯規(guī)則。
范疇視角下的transformer,就是“通過(guò)預(yù)訓(xùn)練找到每層組合分段線性函數(shù)”,并參數(shù)化。
大語(yǔ)言模型之所以能夠很好地回答問(wèn)題,部分原因在于其訓(xùn)練數(shù)據(jù)中包含了各種范疇的信息,并且通過(guò)學(xué)習(xí)這些范疇,模型可以在回答問(wèn)題時(shí)進(jìn)行類比和推理。在訓(xùn)練大語(yǔ)言模型時(shí),通常會(huì)使用大規(guī)模的語(yǔ)料庫(kù),其中包含了豐富的語(yǔ)言和知識(shí)。這些語(yǔ)料涵蓋了各種主題、領(lǐng)域和概念,使得模型能夠從中學(xué)習(xí)到大量的范疇和相關(guān)信息。當(dāng)模型接收到一個(gè)問(wèn)題時(shí),它可以嘗試從已經(jīng)學(xué)到的范疇中找到類似的類比,然后將問(wèn)題映射到類似的問(wèn)題上,進(jìn)而給出答案。這種類比和推理的過(guò)程是通過(guò)模型內(nèi)部的神經(jīng)網(wǎng)絡(luò)層次結(jié)構(gòu)和權(quán)重參數(shù)實(shí)現(xiàn)的。
6.4 物理學(xué)角度
獲得玻爾茲曼獎(jiǎng)的物理學(xué)家霍菲爾德也曾在一次訪談中提到,“如果你不能用數(shù)學(xué)的語(yǔ)言去描述大腦,那你將永遠(yuǎn)不知道大腦是怎么工作的”。而鑒于他自身的習(xí)慣,“如果一個(gè)問(wèn)題和我熟知的物理毫無(wú)聯(lián)系,那我將無(wú)法取得任何的進(jìn)展”。所以,在人工智能正在重塑人類社會(huì)方方面面的同時(shí),我們有必要去了解物理學(xué)的思想如何影響人們對(duì)神經(jīng)網(wǎng)絡(luò)乃至自我的認(rèn)知。
數(shù)據(jù)相當(dāng)于一種初始化,可以驅(qū)動(dòng)網(wǎng)絡(luò)連接權(quán)重的連續(xù)更新以獲得一個(gè)聰明的自適應(yīng)的物理模型,而這個(gè)更新過(guò)程是端對(duì)端地優(yōu)化一個(gè)目標(biāo)函數(shù),優(yōu)化的過(guò)程即執(zhí)行在高維空間的朗之萬(wàn)動(dòng)力學(xué)。神經(jīng)網(wǎng)絡(luò)的奧秘正是在于高維的權(quán)重空間,它本質(zhì)上服從正則系綜分布。半嚴(yán)格的物理分析給出了權(quán)重空間的分布和數(shù)據(jù)驅(qū)動(dòng)的權(quán)重的對(duì)稱性破缺。從物理直觀出發(fā),人們可以獲取非平衡神經(jīng)動(dòng)力學(xué)的穩(wěn)態(tài)全貌以及隱藏的動(dòng)力學(xué)相變;甚至,人們可以將大語(yǔ)言模型的示例泛化歸結(jié)為兩體自旋模型,依此可以洞察智能的本質(zhì)。
基本動(dòng)力學(xué)特性
論文"THE ASYMPTOTIC BEHAVIOR OF ATTENTION IN TRANSFORMERS"通過(guò)嚴(yán)格的數(shù)學(xué)分析,揭示了Transformer中注意力機(jī)制的基本動(dòng)力學(xué)特性。ASYMPTOTIC (漸近特性)研究的是當(dāng)某一系統(tǒng)或者函數(shù)趨于無(wú)窮大或某一特定值時(shí),系統(tǒng)或者函數(shù)的性質(zhì)如何變化。
論文的研究表明,在多種條件下,所有token都會(huì)漸近地趨于收斂,收斂行為可能導(dǎo)致模型崩潰,限制輸出的多樣性。這一發(fā)現(xiàn)不僅深化了我們對(duì)Transformer模型的理解,也為改進(jìn)模型設(shè)計(jì)提供了重要理論指導(dǎo)。未來(lái)的研究可以基于此來(lái)進(jìn)一步探索更復(fù)雜的模型動(dòng)力學(xué),并開(kāi)發(fā)更有效的注意力機(jī)制變體。
主要定理與證明
- 定理3.2:?jiǎn)晤^情況下,當(dāng)注意力矩陣為時(shí)不變、正定和對(duì)稱時(shí),系統(tǒng)動(dòng)力學(xué)表現(xiàn)為黎曼梯度向量場(chǎng)。
- 定理4.1:當(dāng)token的初始位置位于橢球某個(gè)半球的內(nèi)部時(shí),系統(tǒng)會(huì)收斂到共識(shí)平衡點(diǎn)。
- 定理5.1:在自回歸情況下,對(duì)于幾乎所有初始條件,系統(tǒng)都會(huì)收斂到由第一個(gè)token決定的共識(shí)狀態(tài)。
- 定理6.1:在符合一定假設(shè)條件下(比如U是對(duì)稱的),如果所有令牌都從其中一個(gè)半球開(kāi)始,則令牌將收斂到共識(shí)均衡點(diǎn)(此外,該均衡是漸近穩(wěn)定的)。
下圖給出了連續(xù)模型( continuous model )的幾個(gè)特定情況下的結(jié)果,其中Q(t)、K(t)和U(t)分別表示查詢矩陣、鍵矩陣和值矩陣。

下圖展示了定理3.2。在下圖左側(cè),我們可以看到10個(gè)token在由隨機(jī)生成的正定對(duì)稱矩陣定義的橢球體上的運(yùn)動(dòng)。正如預(yù)期的那樣,所有token都收斂到共識(shí)均衡。在這種情況下,動(dòng)力學(xué)是一個(gè)梯度向量場(chǎng)。圖右側(cè)則顯示了相應(yīng)電勢(shì)(corresponding potential)的時(shí)間演化。

下圖展示了定理4.1。在圖的左側(cè)展示了10個(gè)token在球體上的運(yùn)動(dòng)。我們可以看到所有token開(kāi)始都并保持在一個(gè)半球中,它們最終收斂到共識(shí)均衡。其時(shí)間演化如圖右側(cè)所示。

下圖展示了定理6.1。在圖的左側(cè),我們可以觀察到token收斂到共識(shí)平衡點(diǎn),而在右側(cè)給出了對(duì)應(yīng)的時(shí)間演化。

物理自旋系統(tǒng)的結(jié)構(gòu)
博客"Transformers Are Secretly Collectives of Spin Systems"認(rèn)為Transformer模塊的神經(jīng)網(wǎng)絡(luò)架構(gòu)藍(lán)圖可以從經(jīng)典統(tǒng)計(jì)力學(xué)中熟悉的物理自旋系統(tǒng)的結(jié)構(gòu)中導(dǎo)出。更具體地說(shuō),博客作者認(rèn)為Transformer模塊的正反向傳播可映射為矢量自旋模型中的計(jì)算磁化。進(jìn)而可以將Transformer想象成可微自旋系統(tǒng)的集合,其行為可以通過(guò)訓(xùn)練來(lái)塑造。
訓(xùn)練一個(gè)深度transformer模型,相當(dāng)于通過(guò)建立一個(gè)可微的關(guān)聯(lián)結(jié)構(gòu)來(lái)編排一堆transformer模塊,其中一個(gè)自旋系統(tǒng)的磁化驅(qū)動(dòng)下一個(gè)自旋系統(tǒng)。訓(xùn)練過(guò)程中的擺動(dòng)(數(shù)十億)參數(shù)會(huì)推動(dòng)自旋系統(tǒng)集合的級(jí)聯(lián)反應(yīng)行為,以更好地適應(yīng)由數(shù)據(jù)和損失函數(shù)指定的集合(元)任務(wù)。
受力角度
也有研究人員認(rèn)為,transformer機(jī)制本質(zhì)上是描述一個(gè)運(yùn)動(dòng)軌跡,attention是message passing, 其實(shí)就是計(jì)算受力,MLP可以看作是計(jì)算在受力作用下的按照運(yùn)動(dòng)方程的運(yùn)動(dòng)軌跡,transformer優(yōu)化的過(guò)程,就是通過(guò)數(shù)據(jù)訓(xùn)練來(lái)尋求作用力和運(yùn)動(dòng)方程從而達(dá)到構(gòu)造滿足要求的運(yùn)動(dòng)軌跡的過(guò)程。
0x07 總結(jié)
我們首先給出LLaMA的架構(gòu),這是Transformer應(yīng)用的經(jīng)典案例。在其推理過(guò)程中,每 step 內(nèi),輸入一個(gè) token序列,經(jīng)過(guò)Embedding層將輸入token序列變?yōu)橐粋€(gè)三維張量[b, s, h],經(jīng)過(guò)一系列計(jì)算,最后經(jīng)logits層將計(jì)算結(jié)果映射至詞表空間,輸出張量維度為[b, s, vocab_size]。

Transformer的處理流程就是token流轉(zhuǎn)的過(guò)程:token從從一個(gè)初始位置經(jīng)過(guò)一段時(shí)間在高維度空間中的另一位置,這是從一個(gè)語(yǔ)義空間遷移到了另一個(gè)語(yǔ)義空間的過(guò)程,或者說(shuō),token是常微分方程在不同時(shí)間、不同維度的表示。在這個(gè)過(guò)程中,Attention、FFN和esNet 缺一不可但卻各司其職,Attention做信息的提取和聚合,Resnet 提供信息帶寬,而真正學(xué)到的知識(shí)或者信息大多存儲(chǔ)在 FFN 中。其具體特點(diǎn)如下:
-
一個(gè)句子進(jìn)來(lái), 它首先被離散化成一個(gè)個(gè)單詞token的集合,然后 Q,K,V就像是指針一樣, 將這些單詞實(shí)體映射到背后的概念,實(shí)現(xiàn)實(shí)體的識(shí)別和概念的綁定
-
transformer中的encoder與RNN中的encoder作用一樣,都是做輸入序列各個(gè)時(shí)間步信息的特征抽取。
-
Y: <-- LayerNorm(Y + Masked-MultiHead(Y))相當(dāng)于RNN中各個(gè)時(shí)間步的 \(?_{t?1}\) 和$ y_t $。
m_Y=MultiHead(X, Y)相當(dāng)于RNN中關(guān)聯(lián)encoder與decoder的注意力context計(jì)算。
Y = LayerNorm(Y + m_Y)相當(dāng)于context與RNN單元各個(gè)時(shí)間步的 \(?_{t?1}\) 和$ y_t $的拼接。
-
-
而 \(Attention(Q,K,V) = softmax( \frac{QK^T}{\sqrt d_k} ) \times V\) 則通過(guò)累加和乘積的形式,實(shí)現(xiàn)概念和概念的一個(gè)全連接圖, 它代表了所有可能的命題結(jié)構(gòu)(主謂賓), 并最終得到新的一組可能的命題結(jié)構(gòu),
-
接下來(lái)通過(guò)后面的全連接層(類似一個(gè)命題結(jié)構(gòu)的詞典),得到新的命題(句子)。
-
通過(guò)層數(shù)的增加, transformer可以組合得到從簡(jiǎn)單到復(fù)雜邏輯的嵌套結(jié)構(gòu),也就是實(shí)現(xiàn)全文級(jí)別的推理。
7.1 效果
Transformer論文從三個(gè)維度比較了當(dāng)時(shí)特征提取的主流框架。這三個(gè)維度分別為:每一層的計(jì)算復(fù)雜度、串行操作的復(fù)雜度、最大路徑長(zhǎng)度。

我們可以從這三個(gè)指標(biāo)分別探討。
- 首先看序列操作的復(fù)雜度。這是自注意力機(jī)制的唯一弱點(diǎn)。當(dāng)序列長(zhǎng)度 n 比較大的時(shí)候,時(shí)間復(fù)雜度較高。而大模型時(shí)代對(duì)長(zhǎng)文本的訴求,使這個(gè)弱點(diǎn)愈發(fā)凸顯。目前也有很多方法來(lái)解決這個(gè)問(wèn)題。
- 其次看串行操作的復(fù)雜度。自注意力機(jī)制的復(fù)雜度是O(1),表示一步就可以完成,并行度最高。RNN 則為 n,因?yàn)槊恳粋€(gè)計(jì)算都依賴前面的結(jié)果,所以需要 n 步才能完成,也就是無(wú)法并行。循環(huán)層最大的問(wèn)題是不能并行訓(xùn)練,序列計(jì)算復(fù)雜度是O(n)。而自注意力層和卷積一樣可以完全并行。
- 最后看看最大路徑長(zhǎng)度,其表示數(shù)據(jù)從某個(gè)位置傳遞到另一個(gè)位置的最大長(zhǎng)度。注意力本來(lái)就是全局查詢操作,任意兩個(gè)位置之間都可以直接聯(lián)系,可以在O(1)的時(shí)間里完成所有元素間信息的傳遞。它的信息傳遞速度遠(yuǎn)勝卷積層和循環(huán)層;CNN 是 \(log_{k} n\);而 RNN 最壞情況下,開(kāi)始位置和結(jié)束位置的距離為 n.
7.2 優(yōu)劣
除了上面分析的優(yōu)點(diǎn)之外,Transformer還有其他優(yōu)點(diǎn),比如:
- 模型可解釋性比較高(不同單詞之間的相關(guān)性有多大)。Self-Attention模型更可解釋,Attention結(jié)果的分布表明了該模型學(xué)習(xí)到了一些語(yǔ)法和語(yǔ)義信息。RNN由于其內(nèi)部復(fù)雜的狀態(tài)更新,往往被認(rèn)為是一種“黑箱”模型,很難理解內(nèi)部的決策過(guò)程。與此相對(duì),Attention機(jī)制提供了一種直觀的方式來(lái)可視化和理解模型是如何關(guān)注序列中不同部分的。通過(guò)分析注意力權(quán)重,我們可以清楚地看到模型在做出預(yù)測(cè)時(shí),哪些輸入元素起到了關(guān)鍵作用。
- 高度適應(yīng)性:Transformer的架構(gòu)包含了堆疊的編解碼器,這種設(shè)計(jì)使其不僅在自然語(yǔ)言處理領(lǐng)域,在計(jì)算機(jī)視覺(jué)和語(yǔ)音識(shí)別等多個(gè)領(lǐng)域也能發(fā)揮出色的適應(yīng)性。
Transformer的缺點(diǎn)也同樣明顯,比如:
- 自注意力機(jī)制本身具有二次復(fù)雜度,這種復(fù)雜度使得該架構(gòu)在涉及長(zhǎng)輸入序列或資源受限情況下計(jì)算成本高昂且占用內(nèi)存巨大。
- 位置編碼本身就是一個(gè)妥協(xié)之舉。詞向量保存了詞語(yǔ)的語(yǔ)言學(xué)信息(詞性、語(yǔ)義)。然而,位置編碼在語(yǔ)義空間中并不具有這種可變換性,它相當(dāng)于人為設(shè)計(jì)的一種索引。那么,將這種位置編碼與詞向量相加,就是不合理的,所以不能很好地表征位置信息。
- 局部信息的獲取不如RNN和CNN強(qiáng)。
- 參數(shù)閾值的牢籠。大模型由于參數(shù)量大,往往存在大量的冗余參數(shù),這些參數(shù)在訓(xùn)練過(guò)程中可能并沒(méi)有學(xué)習(xí)到有效的信息,反而增加了模型的復(fù)雜性和訓(xùn)練的難度。大量的參數(shù)還會(huì)導(dǎo)致模型發(fā)生過(guò)擬合問(wèn)題。參數(shù)過(guò)多的另一個(gè)副作用就是模型無(wú)法學(xué)習(xí)到更高層級(jí)的有效特征:由于存在大量的冗余參數(shù),模型可能無(wú)法有效地學(xué)習(xí)到更高層級(jí)的特征。這可能會(huì)限制模型的性能,尤其是在處理復(fù)雜任務(wù)時(shí)。大型模型的巨量參數(shù)還會(huì)導(dǎo)致模型的優(yōu)化過(guò)程更為困難,梯度下降等優(yōu)化算法在大型模型上可能會(huì)遇到局部最優(yōu)、梯度消失或梯度爆炸等問(wèn)題。
正因?yàn)門ransformer存在的各種問(wèn)題,研究者們正在尋找各種方法來(lái)進(jìn)行優(yōu)化,并提高模型的泛化能力和解釋性。比如:
- 很多研究者正在探索知識(shí)蒸餾、模型剪枝、參數(shù)共享等技術(shù)來(lái)減少模型的參數(shù)量,以降低計(jì)算資源的消耗,提高訓(xùn)練效率。
- 很多研究者在對(duì)Transformer架構(gòu)進(jìn)行改進(jìn):注意力模塊稀疏化,在注意力中引入記憶信息,對(duì)外部記憶(kv對(duì))的注意力運(yùn)算,線性隨機(jī)注意力,在Transformer中引入遞歸,線性注意力(performer)。
- 很多非 Transformer 研究都循著“保留 RNN 優(yōu)勢(shì)的同時(shí),試圖達(dá)到 Transformer 性能”的方向去努力。
0xFF 參考
[interpreting GPT: the logit lens](https://www.lesswrong.com/posts/AcKRB8wDpdaN6v6ru/interpreting-gpt-the-logit-lens) nostalgebraist
A Mathematical Framework for Transformer Circuits (Anthropic blog 2021)
A Mathematical Perspective On Transformers
A PRIMER ON THE INNER WORKINGS OF TRANSFORMER-BASED LANGUAGE MODELS
Analyzing Transformers in Embedding Space
ASK, AND IT SHALL BE GIVEN: TURING COMPLETENESS OF PROMPTING
Backward Lens: Projecting Language Model Gradients into the Vocabulary Space
Chain of Thought Empowers Transformers to Solve Inherently Serial Problems
Differential Transformer
](https://arxiv.org/pdf/2410.05258)
DIFFERENTIAL TRANSFORMER
EMNLP 2024最佳論文:從反向傳播矩陣來(lái)理解Transformer的運(yùn)作機(jī)制 PaperWeekly
Finding Neurons in a Haystack: Case Studies with Sparse
Four types of emergence: a typology of complexity and its implications for a science of management
Full Stack Transformer Inference Optimization Season 2: Deploying Long-Context Models)Yao Fu | Website | Blog | Twitter / X
GPT4技術(shù)原理五:大模型的幻覺(jué),解鈴還須系鈴人 王慶法 清熙
Grothendieck Graph Neural Networks Framework: An Algebraic Platform for Crafting Topology-Aware GNNs
Jawahar, Ganesh, et al. “What Does BERT Learn about the Structure of Language?” ACL 2019
Let's Think Dot by Dot: Hidden Computation in Transformer Language Models
LLM CoT的工作原理 王慶法 清熙
LLM的Prompt竟然是圖靈完備的?LLM提示范式的第一個(gè)研究 | 重磅 AI修貓Prompt
MetaFormer is Actually What You Need for Vision
More About Attention 李新春
Neural Ordinary Differential Equations
nGPT: Normalized Transformer with Representation Learning on the Hypersphere
Reformer 模型 - 突破語(yǔ)言建模的極限 Hugging Face 博客
softmax is not enough
State-Free Inference of State-Space Models:The Transfer Function Approach
THE ASYMPTOTIC BEHAVIOR OF ATTENTION IN TRANSFORMERS
The Platonic Representation Hypothesis
TRANSFORMER EXPLAINER: Interactive Learning of Text-Generative Models
transformer 模型結(jié)構(gòu)詳解及實(shí)現(xiàn) zhang
Transformers Are Secretly Collectives of Spin Systems mcbal
Transformer在生物學(xué)上是否合理?MIT團(tuán)隊(duì)用神經(jīng)元和星形膠質(zhì)細(xì)胞來(lái)構(gòu)建 ScienceAI 藥物分子設(shè)計(jì)
Transformer模型?(上篇) OnlyInfo
Transformer模型?(下篇) OnlyInfo
Transformer的物理原理 Matthias Bal 清熙
Understanding and Improving Transformer From a Multi-Particle Dynamic System Point of View
Understanding how LLM inference works with llama.cpp omrimallis
Wavelets based physics informed neural networks to solve non-linear differential equations
【官方雙語(yǔ)】直觀解釋注意力機(jī)制,Transformer的核心 | 【深度學(xué)習(xí)第6章】 3Blue1Brown
萬(wàn)字長(zhǎng)文介紹為大語(yǔ)言模型建立的“語(yǔ)言、統(tǒng)計(jì)和范疇”數(shù)學(xué)框架 Tai-Danae Bradley 編譯:王慶法
大腦里也有個(gè)Transformer!和「海馬體」機(jī)制相同 人工智能與算法學(xué)習(xí)
大語(yǔ)言模型背后的神經(jīng)科學(xué)機(jī)制 雅牧
打開(kāi)黑匣子的神器來(lái)了!Transformer Explainer讓Transformer模型透明化 小智 智駐未來(lái)
探索AGI系列 | 番外01. (全新視角理解)Transformer和大腦新皮質(zhì)的一致性 MetaUniTech
智源論壇 | 王立威:從經(jīng)驗(yàn)性的積累到理論空白的彌補(bǔ) 北京智源人工智能研究院
淺談LLM mechanistic interpretability的幾個(gè)流派(一) 時(shí)間旅客
理解llama.cpp怎么完成大模型推理的 hugulas
神經(jīng)網(wǎng)絡(luò)理論研究的物理學(xué)思想 黃海平 [現(xiàn)代物理知識(shí)雜志]
范疇的相變與知識(shí)的形成
解讀小模型——SLM 半吊子全棧工匠 喔家ArchiSelf
論文閱讀:Differentical Transformer 差分Transformer Eddie
降低大模型幻覺(jué)的必由之路 清熙
https://poloclub.github.io/transformer-explainer
浙公網(wǎng)安備 33010602011771號(hào)