深度解析從 RNN 到 Transformer:構(gòu)建 NLP 應用的架構(gòu)演進之路

# 深度解析從RNN到Transformer:構(gòu)建NLP應用的架構(gòu)演進之路 ??閱讀時長:50分鐘 ??發(fā)布時間:2025-01-20 深入探索架構(gòu),并利用從RNN到Transformer的NLP模型構(gòu)建現(xiàn)實世界中的應用程序。 >本文1w字,閱讀時長~~ 看速度 2025年01月10日 晴 零下3度 ![](https://upload-images.jianshu.io/upload_images/17294212-db71fb25cf4c0c1d.png) >[1. LLM大模型架構(gòu)專欄](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxMDcwMDExOQ==&action=getalbum&album_id=3803521454633697283#wechat_redirect) 歡迎關(guān)注公眾號 **柏企科技圈** 如果您有任何問題或建議,歡迎在評論區(qū)留言交流! ## 目錄 1. **引言** - 1.1 LLM是如何構(gòu)建和訓練的? - 1.2 背景:前Transformer時代 - 1.3 Transformers簡介 - 1.4 為什么說“注意力就是你所需要的一切”? 2. **Transformer架構(gòu)** - 2.1 嵌入 - 2.1.1 輸入嵌入 - 2.2 編碼器 - 2.2.1 多頭自注意力 - 2.2.2 歸一化和殘差連接 - 2.2.3 前饋神經(jīng)網(wǎng)絡 - 2.2.4 編碼器的輸出 - 2.3 解碼器 - 2.3.1 輸出嵌入 - 2.3.2 位置編碼 - 2.3.3 解碼器層堆棧 - 2.3.4 用于生成輸出概率的線性分類器和Softmax - 2.3.5 歸一化和殘差連接 - 2.3.6 解碼器的輸出 3. **LLM架構(gòu)** - 3.1 Seq-2-Seq模型(編碼器 - 解碼器) - 3.2 自動編碼模型(僅編碼器) - 3.3 自回歸模型(僅解碼器) - 3.4 專家混合(MoE) 4. **推理** - 4.1 推理技術(shù) - 4.1.1 貪心搜索 - 4.1.2 束搜索 5. **Transformer推理優(yōu)化** - 5.1 Transformer架構(gòu)和推理流程 - 5.2 Transformer推理的階段:預填充和解碼 6. **Transformer推理中的挑戰(zhàn)** 7. **用于加速推理的優(yōu)化技術(shù)** - 7.1 量化 - 7.2 鍵值(KV)緩存 - 7.3 推測解碼 - 7.4 批處理 - 7.5 硬件優(yōu)化:并行性 - 7.6 FlashAttention和內(nèi)存效率 8. **推理性能基準測試** - 8.1 Transformer推理的趨勢 - 8.1.1 使用分頁(Paging)和FlashAttention進行內(nèi)存優(yōu)化 - 8.1.2 多查詢和分組查詢注意力 - 8.1.3 并行性:張量和序列 - 8.1.4 實時應用的推測推理 9. **處理大型數(shù)據(jù)集** - 9.1 高效的數(shù)據(jù)加載和預處理 - 9.2 分布式訓練 - 9.3 混合精度訓練 - 9.4 梯度累積 - 9.5 檢查點和恢復 - 9.6 數(shù)據(jù)增強和采樣 10. **總結(jié)** ## 1. 引言 大型語言模型(LLM)是一種人工智能(AI)算法,它運用深度學習技術(shù)和海量數(shù)據(jù)集來實現(xiàn)通用語言的理解與生成。LLM會在大量數(shù)據(jù)上進行預訓練,這些數(shù)據(jù)通常涵蓋如Common Crawl和Wikipedia等來源。 LLM旨在依據(jù)從訓練中獲取的知識,識別、總結(jié)、翻譯、預測并生成文本及其他形式的內(nèi)容。 LLM的主要特點包括: - **Transformer模型架構(gòu)**:LLM基于Transformer模型,該模型由編碼器和解碼器構(gòu)成,能夠從文本序列中提取含義,并理解單詞之間的關(guān)系。 - **注意力機制**:這一機制使LLM能夠捕捉單詞之間的長距離依賴關(guān)系,從而理解上下文。 - **自回歸文本生成**:LLM根據(jù)先前生成的標記來生成文本,使其能夠以不同的風格和語言產(chǎn)出文本。 ![](https://upload-images.jianshu.io/upload_images/17294212-3ffe2038b62f16d0.png) ![](https://upload-images.jianshu.io/upload_images/17294212-3b2b420c8a6ad858.png) 一些廣為人知的LLM實例包括OpenAI的GPT - 3和GPT - 4、Meta的LLaMA 2以及Google的Gemini。這些模型有潛力顛覆眾多行業(yè),如搜索引擎、自然語言處理、醫(yī)療保健、機器人技術(shù)和代碼生成等領域。 ### 1.1 LLMs是如何構(gòu)建和訓練的? 構(gòu)建和訓練大型語言模型(LLMs)是一個復雜的過程,涉及多個步驟。最初,需要從書籍、網(wǎng)站和社交媒體帖子等各種來源收集大量文本數(shù)據(jù)。接著,對這些數(shù)據(jù)進行清理和處理,使其轉(zhuǎn)化為AI能夠?qū)W習的格式。 LLMs的架構(gòu)采用具有數(shù)十億參數(shù)的深度神經(jīng)網(wǎng)絡進行設計。會使用諸如編碼器 - 解碼器、因果解碼器和前綴解碼器等不同的Transformer架構(gòu),模型的設計對其能力有著重大影響。 ![](https://upload-images.jianshu.io/upload_images/17294212-7ecf194c2e87deed.png) 然后,利用計算能力和優(yōu)化算法對LLMs進行訓練。這種訓練通過統(tǒng)計方式調(diào)整參數(shù)以預測文本,訓練得越多,模型的能力就越強。 最后,通過擴大數(shù)據(jù)規(guī)模、增加參數(shù)數(shù)量和提升計算能力,企業(yè)得以生產(chǎn)出能力接近人類語言運用水平的LLMs。 - **數(shù)據(jù)收集**:LLMs需要大量的文本數(shù)據(jù)集進行訓練,這些數(shù)據(jù)可包括書籍、網(wǎng)站、社交媒體帖子等。數(shù)據(jù)經(jīng)過清理和處理,轉(zhuǎn)換為AI能夠?qū)W習的格式。 - **模型架構(gòu)**:LLMs具有包含數(shù)十億參數(shù)的深度神經(jīng)網(wǎng)絡架構(gòu),會使用Transformer或GPT等不同架構(gòu),模型設計會影響其能力。 - **訓練**:LLMs利用計算能力和優(yōu)化算法進行訓練,訓練通過調(diào)整參數(shù)以統(tǒng)計方式預測文本,更多的訓練會使模型能力更強。 - **擴展**:通過擴大數(shù)據(jù)、參數(shù)和計算能力的規(guī)模,企業(yè)已經(jīng)生產(chǎn)出能力接近人類語言使用水平的LLMs。 大型語言模型操作(LLMOps)專注于在生產(chǎn)環(huán)境中有效部署、監(jiān)控和維護LLMs,它涵蓋模型版本控制、擴展和性能提升等方面。 ### 1.2 背景:前Transformer時代 Transformers是為了解決序列轉(zhuǎn)換(即神經(jīng)機器翻譯)問題而開發(fā)的。這意味著任何將輸入序列轉(zhuǎn)換為輸出序列的任務,包括語音識別、文本轉(zhuǎn)語音等。 ![](https://upload-images.jianshu.io/upload_images/17294212-acc5708cbed384fa.png) 對于序列轉(zhuǎn)換模型來說,記憶至關(guān)重要。例如,在翻譯句子 “The Transformers are a Japanese hardcore punk band. The band was formed in 1968 during the height of Japanese music history” 時,短語 “the band” 指代的是 “The Transformers”。識別這些聯(lián)系對于準確翻譯至關(guān)重要。傳統(tǒng)上,循環(huán)神經(jīng)網(wǎng)絡(RNNs)和卷積神經(jīng)網(wǎng)絡(CNNs)等模型被用于處理這些依賴關(guān)系,但它們都存在局限性。讓我們快速探究一下這些架構(gòu)及其缺點。 #### 1.2.1 多層感知機(MLPs) 讓我們從多層感知機(MLPs)開始介紹,它是經(jīng)典的神經(jīng)網(wǎng)絡方法之一。MLPs本身的能力并不強大,但你會發(fā)現(xiàn)它幾乎集成在任何其他架構(gòu)中(令人驚訝的是,甚至在Transformer中也有)。MLPs本質(zhì)上是一系列線性層或全連接層。 ![](https://upload-images.jianshu.io/upload_images/17294212-62cd677d2febc1ab.png) #### 多層感知機(MLPs) 在人工智能領域找到適用于各種模態(tài)的最佳架構(gòu)之前,MLPs長期以來一直被用于對不同類型的數(shù)據(jù)進行建模。但可以肯定的是,它們不適合用于序列建模。由于其前饋設計,MLPs無法保留序列中信息的順序。當數(shù)據(jù)的順序丟失時,序列數(shù)據(jù)就失去了意義。因此,MLPs無法保留信息順序的這一特性使其不適合用于序列建模。此外,MLPs需要大量參數(shù),這是神經(jīng)網(wǎng)絡不希望具備的另一個特性。 #### 1.2.2 循環(huán)神經(jīng)網(wǎng)絡(RNNs) 循環(huán)神經(jīng)網(wǎng)絡(RNNs)中存在循環(huán)結(jié)構(gòu),這使得信息能夠持續(xù)存在。 ![](https://upload-images.jianshu.io/upload_images/17294212-70f578e92a8dc977.png) 在上圖中,神經(jīng)網(wǎng)絡的一部分A接收輸入$x_t$并輸出值$h_t$。循環(huán)結(jié)構(gòu)允許信息從網(wǎng)絡的一個步驟傳遞到下一個步驟。循環(huán)神經(jīng)網(wǎng)絡可以被看作是同一個網(wǎng)絡的多個副本,每個副本都向后續(xù)副本傳遞一條消息。考慮一下如果我們展開這個循環(huán)會發(fā)生什么: ![](https://upload-images.jianshu.io/upload_images/17294212-3709cb8781214832.png) 這種鏈式結(jié)構(gòu)表明循環(huán)神經(jīng)網(wǎng)絡與序列和列表密切相關(guān)。它們是處理這類數(shù)據(jù)的自然神經(jīng)網(wǎng)絡架構(gòu)。而且它們確實被廣泛應用!在過去幾年里,RNNs在應用于各種問題(如語音識別、語言建模、翻譯、圖像字幕生成等)上取得了巨大成功。 ![](https://upload-images.jianshu.io/upload_images/17294212-55e55d2da2cfb502.png) **長期依賴問題** 假設有一個語言模型試圖根據(jù)前面的單詞預測下一個單詞。如果我們要預測句子 “the clouds in the ….” 的下一個單詞,我們不需要更多的上下文信息,很明顯下一個單詞是 “sky”。 在這種相關(guān)信息與所需信息之間的差距較小的情況下,RNNs可以學習使用過去的信息,并推斷出這個句子的下一個單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-bc5533ffc9f4fb00.png) 但在某些情況下,我們需要更多的上下文信息。例如,假設你試圖預測文本 “I grew up in France… I speak fluent …” 的最后一個單詞。最近的信息表明下一個單詞可能是一種語言,但如果我們想確定是哪種語言,我們需要文本中更前面提到的法國這一上下文信息。 ![](https://upload-images.jianshu.io/upload_images/17294212-04d068d5d9b23122.png) 當相關(guān)信息與需要該信息的點之間的差距變得非常大時,RNNs就會變得非常低效。這是因為信息在每個步驟中傳遞,鏈條越長,信息在傳遞過程中丟失的可能性就越大。 那么,RNNs的主要問題是什么呢?它們在自然語言處理(NLP)任務中效率不高,主要有兩個原因: 1. 它們按順序依次處理輸入數(shù)據(jù)。這種循環(huán)過程沒有利用為并行計算設計的現(xiàn)代圖形處理單元(GPUs),因此使得此類模型的訓練速度相當緩慢。 2. 當元素之間距離較遠時,它們會變得非常低效。這是由于信息在每個步驟中傳遞,鏈條越長,信息在傳遞過程中丟失的可能性就越大。 #### 1.2.3 長短期記憶網(wǎng)絡(LSTM) 當安排一天的日歷時,我們會優(yōu)先考慮約會。如果有重要的事情,我們可以取消一些會議來安排重要的事項。 RNNs不會這樣做。每當它添加新信息時,它會通過應用一個函數(shù)完全轉(zhuǎn)換現(xiàn)有信息。整個信息都被修改,而不會考慮哪些重要哪些不重要。 LSTM通過乘法和加法對信息進行小的修改。通過LSTM,信息通過一種稱為細胞狀態(tài)的機制流動。通過這種方式,LSTM可以有選擇地記住或忘記重要和不太重要的事情。 在內(nèi)部,一個LSTM的結(jié)構(gòu)如下: ![](https://upload-images.jianshu.io/upload_images/17294212-2be2fee62940b2df.png) 每個細胞接收$x_t$(在句子到句子翻譯的情況下是一個單詞)、前一個細胞狀態(tài)和前一個細胞的輸出作為輸入。它對這些輸入進行處理,并基于它們生成一個新的細胞狀態(tài)和一個輸出。我不會詳細介紹每個細胞的工作機制。 通過細胞狀態(tài),在翻譯時,句子中對翻譯某個單詞重要的信息可以從一個單詞傳遞到另一個單詞。 **LSTM的問題** 與RNNs通常遇到的問題一樣,當句子太長時,LSTM的表現(xiàn)也不太好。這是因為保持與當前正在處理的單詞距離較遠的單詞的上下文的概率會隨著距離的增加而呈指數(shù)下降。 這意味著當句子很長時,模型常常會忘記序列中較遠位置的內(nèi)容。RNNs和LSTMs的另一個問題是,處理句子的工作很難并行化,因為必須逐個單詞地處理。不僅如此,它們也沒有對長距離和短距離依賴關(guān)系進行建模。 總之,LSTMs和RNNs存在3個問題: 1. 順序計算抑制了并行化 2. 沒有對長距離和短距離依賴關(guān)系進行顯式建模 3. 位置之間的“距離”是線性的 #### 1.2.4 注意力機制 為了解決其中一些問題,研究人員創(chuàng)造了一種關(guān)注特定單詞的技術(shù)。 當翻譯一個句子時,我會特別注意我正在翻譯的單詞。當我轉(zhuǎn)錄音頻記錄時,我會仔細聽我正在記錄的片段。如果你讓我描述我所在的房間,我會在描述過程中掃視我所描述的物體。 神經(jīng)網(wǎng)絡可以使用注意力機制實現(xiàn)相同的行為,即專注于所給信息的一部分。例如,一個RNN可以關(guān)注另一個RNN的輸出。在每個時間步,它關(guān)注另一個RNN中的不同位置。 為了解決這些問題,注意力機制被應用于神經(jīng)網(wǎng)絡中。對于RNNs,不是僅將整個句子編碼在一個隱藏狀態(tài)中,而是每個單詞都有一個相應的隱藏狀態(tài),該狀態(tài)一直傳遞到解碼階段。然后,在RNN的每個步驟中使用這些隱藏狀態(tài)進行解碼。 ![](https://upload-images.jianshu.io/upload_images/17294212-83b8a4e6d8a36c68.png) 綠色步驟稱為編碼階段,紫色步驟稱為解碼階段。 其背后的想法是,句子中的每個單詞都可能包含相關(guān)信息。因此,為了使解碼準確,需要使用注意力機制考慮輸入的每個單詞。 為了在序列轉(zhuǎn)換中為RNNs引入注意力機制,我們將編碼和解碼分為兩個主要步驟。一個步驟用綠色表示,另一個用紫色表示。綠色步驟稱為編碼階段,紫色步驟稱為解碼階段。 ![](https://upload-images.jianshu.io/upload_images/17294212-973dc95b54e4b0c0.png) 綠色步驟負責從輸入創(chuàng)建隱藏狀態(tài)。與之前使用注意力機制不同,我們不是僅將一個隱藏狀態(tài)傳遞給解碼器,而是將句子中每個“單詞”生成的所有隱藏狀態(tài)都傳遞到解碼階段。每個隱藏狀態(tài)在解碼階段用于確定網(wǎng)絡應該關(guān)注的位置。 例如,將句子 “Je suis étudiant” 翻譯成英語時,解碼步驟需要在翻譯時關(guān)注不同的單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-392fde2fa346828b.png) 這個圖展示了將句子 “Je suis étudiant” 翻譯成英語時,每個隱藏狀態(tài)被賦予的權(quán)重。顏色越深,與每個單詞相關(guān)的權(quán)重越大。 但是,我們討論的一些問題,使用注意力機制的RNNs仍然無法解決。例如,無法并行處理輸入(單詞)。對于大量文本,這會增加翻譯文本所需的時間。 **注意力機制的缺點** 1. **順序訓練**:傳統(tǒng)的基于LSTM的編碼器 - 解碼器架構(gòu)一次處理一個單詞,使得訓練本質(zhì)上是順序的。這限制了訓練過程中的并行性,導致訓練時間更長。由于其順序性,擴展到大型數(shù)據(jù)集變得低效,使得遷移學習不切實際。 2. 因此,模型無法有效地進行微調(diào),每個任務都需要從頭開始訓練。這導致計算成本更高、訓練時間更長和數(shù)據(jù)需求增加,顯著提高了每個訓練周期的成本。 ### 1.2.5 卷積神經(jīng)網(wǎng)絡(CNNs) 卷積神經(jīng)網(wǎng)絡(CNNs)在處理序列轉(zhuǎn)換任務時具有顯著優(yōu)勢: - **并行性**:CNNs在層的層面很容易實現(xiàn)并行化,這意味著可以同時處理輸入的多個部分。與像RNNs這樣的順序模型相比,計算速度更快。 - **局部依賴利用**:CNNs擅長通過卷積濾波器捕捉附近元素(比如句子中的單詞)之間的局部模式和關(guān)系。這些濾波器專注于輸入數(shù)據(jù)的較小區(qū)域。 - **對數(shù)距離**:在CNNs中,任何輸入和輸出元素之間的 “距離” 與層數(shù)呈對數(shù)關(guān)系(log(N))。這意味著與RNNs相比,連接遠距離元素所需的操作數(shù)量顯著減少。在RNNs中,元素之間的距離會隨著序列長度(N)線性增長。 一些廣為人知的序列轉(zhuǎn)換模型,如WaveNet和ByteNet,都是基于CNN架構(gòu)構(gòu)建的。在像WaveNet這樣的模型中,每個輸入(單詞或標記)都獨立于前一個輸入進行處理,實現(xiàn)了并行處理。這意味著CNNs避免了RNNs的順序瓶頸,在RNNs中每個單詞都依賴于前一個單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-adf33a65b050ba6d.png) 此外,在CNNs中,輸出與任何輸入之間的 “距離” 大致與網(wǎng)絡的深度成正比,約為log(N)。這比RNNs高效得多,在RNNs中距離是線性增長的(N),這使得CNNs在處理序列時速度更快。 然而,CNNs在處理長距離依賴關(guān)系方面存在局限性。它們難以有效地對序列中距離較遠的單詞之間的關(guān)系進行建模,尤其是當相距較遠的標記所提供的上下文至關(guān)重要時。這就是引入Transformers的原因 —— 它們將CNNs的并行性與自注意力機制相結(jié)合,能夠有效地捕捉局部和全局依賴關(guān)系。 ### 1.3 Transformers簡介 如原文所述,Transformers的主要架構(gòu)是左側(cè)有一個編碼器,右側(cè)有一個解碼器。 ![](https://upload-images.jianshu.io/upload_images/17294212-645e26b6e0b50455.png) *Transformers的主要架構(gòu),左邊是編碼器,右邊是解碼器。 為了解決并行化問題,Transformers嘗試通過將編碼器、解碼器與注意力模型結(jié)合使用來解決該問題。注意力機制提高了模型從一個序列轉(zhuǎn)換到另一個序列的速度。 讓我們來看看Transformer是如何工作的。Transformer是一種利用注意力機制來提升速度的模型,更具體地說,它使用的是自注意力機制。 ![Transformer架構(gòu)](https://upload-images.jianshu.io/upload_images/17294212-456943428e0cd04f.png) 在內(nèi)部,Transformer具有與上述先前模型類似的架構(gòu)。但Transformer由六個編碼器和六個解碼器組成。 有三篇具有開創(chuàng)性的論文為Transformer模型奠定了基礎: 1. 《Sequence to Sequence Learning with Neural Networks》 2. 《Neural Machine Translation by Jointly Learning to Align and Translate》 3. 《Attention is All You Need》 ### 1.4 為什么“注意力就是你所需要的一切”? 1. **用自注意力取代LSTM**:自注意力機制的引入取代了基于LSTM的架構(gòu),實現(xiàn)了并行化訓練,顯著加快了訓練過程。 2. **穩(wěn)定的架構(gòu)**:Transformer架構(gòu)通過組合幾個較小的組件(如位置編碼和多頭注意力),變得十分強大,從而產(chǎn)生了一種可擴展且可靠的模型設計。 3. **穩(wěn)定的超參數(shù)**:事實證明,原始Transformer架構(gòu)中使用的超參數(shù)隨著時間的推移是穩(wěn)定且具有彈性的。值得注意的是,如今許多基于Transformer的模型仍然使用類似的超參數(shù)值,這表明了它們在各種任務和數(shù)據(jù)集上的穩(wěn)健性。 ![](https://upload-images.jianshu.io/upload_images/17294212-58270fb63cac4948.png) *注意力機制與其他循環(huán)網(wǎng)絡架構(gòu)的對比。Transformer幾乎具備神經(jīng)網(wǎng)絡的所有優(yōu)點。卷積神經(jīng)網(wǎng)絡(ConvNets)與Transformer接近,但它們需要很多層才能實現(xiàn)長距離依賴。* 與其他循環(huán)網(wǎng)絡架構(gòu)相比,Transformer幾乎具備神經(jīng)網(wǎng)絡的所有優(yōu)點。卷積神經(jīng)網(wǎng)絡(ConvNets)與Transformer較為接近,但它們需要很多層才能實現(xiàn)長距離依賴。 讓我們詳細了解一下Transformer架構(gòu)。 ### 2. Transformer架構(gòu) ![](https://upload-images.jianshu.io/upload_images/17294212-3fea59e5c455033b.png) 從根本上說,文本生成的Transformer模型基于預測下一個單詞的原理:給定用戶輸入的文本提示,在這個輸入之后最可能出現(xiàn)的下一個單詞是什么?Transformer的核心創(chuàng)新和強大之處在于其使用的自注意力機制,這使得它們能夠比以前的架構(gòu)更有效地處理整個序列并捕捉長距離依賴關(guān)系。 ![](https://upload-images.jianshu.io/upload_images/17294212-9131bf92bcc3d618.png) 最初,Transformer是為序列轉(zhuǎn)換或神經(jīng)機器翻譯而設計的,它在將輸入序列轉(zhuǎn)換為輸出序列方面表現(xiàn)出色。它是第一個完全依靠自注意力來計算輸入和輸出表示的轉(zhuǎn)換模型,而不使用與序列對齊的RNN或卷積。Transformer架構(gòu)的主要核心特征是它保留了編碼器 - 解碼器模型。 如果我們把用于語言翻譯的Transformer看作一個簡單的黑箱,它會接受一種語言(例如英語)的句子作為輸入,并輸出該句子的翻譯(比如英語翻譯成其他語言)。 ![](https://upload-images.jianshu.io/upload_images/17294212-f129bd38eb476758.png) *如果把Transformer當作黑箱,它會將一種語言的句子作為輸入,輸出其翻譯。* 如果我們深入探究一下,就會發(fā)現(xiàn)這個黑箱主要由兩部分組成: - 編碼器接收我們的輸入,并輸出該輸入的矩陣表示。例如,英語句子 “How are you?”。 - 解碼器接收編碼后的表示,并迭代地生成輸出。在我們的例子中,就是翻譯后的句子 “?Cómo estás?”。 ![](https://upload-images.jianshu.io/upload_images/17294212-49ec373426803885.png) 然而,實際上編碼器和解碼器都是由多個層堆疊而成的(兩者的層數(shù)相同)。所有編碼器都具有相同的結(jié)構(gòu),輸入進入每個編碼器,并傳遞到下一個編碼器。所有解碼器也具有相同的結(jié)構(gòu),它們從最后一個編碼器和前一個解碼器獲取輸入。 原始架構(gòu)由6個編碼器和6個解碼器組成,但我們可以根據(jù)需要復制任意數(shù)量的層。所以,假設編碼器和解碼器都有N層。 ![](https://upload-images.jianshu.io/upload_images/17294212-3297f85bed51750a.png) 既然我們對Transformer的整體架構(gòu)有了一個大致的了解,那么讓我們把重點放在編碼器和解碼器上,以便更好地理解它們的工作流程: #### 2.1 嵌入 編碼器是Transformer架構(gòu)的基本組件。編碼器的主要功能是將輸入的標記轉(zhuǎn)換為上下文相關(guān)的表示。與早期獨立處理標記的模型不同,Transformer編碼器會捕捉每個標記相對于整個序列的上下文信息。 它的結(jié)構(gòu)組成如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8c169ae276b13fc0.png) 文本輸入被分割成稱為標記(tokens)的較小單元,這些標記可以是單詞或子單詞。這些標記被轉(zhuǎn)換為稱為嵌入(embeddings)的數(shù)值向量,嵌入向量能夠捕捉單詞的語義含義。 #### 2.1.1 輸入嵌入 ![](https://upload-images.jianshu.io/upload_images/17294212-43df3792582a013d.png) 假設你想使用Transformer模型生成文本。你輸入這樣一個提示:“Data visualization empowers users to”。這個輸入需要轉(zhuǎn)換為模型能夠理解和處理的格式。這就是嵌入的作用:它將文本轉(zhuǎn)換為模型能夠處理的數(shù)值表示。為了將提示轉(zhuǎn)換為嵌入,我們需要: 1. 對輸入進行分詞; 2. 獲取標記嵌入; 3. 添加位置信息; 4. 最后將標記和位置編碼相加,得到最終的嵌入。 讓我們看看這些步驟是如何完成的。 ![](https://upload-images.jianshu.io/upload_images/17294212-441cfdd815fad7cb.png) 那么,讓我們將其工作流程分解為最基本的步驟: - **步驟1:分詞** 分詞是將輸入文本分解為更小、更易于管理的部分(稱為標記)的過程。這些標記可以是一個單詞或一個子單詞。例如,“Data” 和 “visualization” 分別對應不同的標記,而 “empowers” 這個單詞可能會被拆分成兩個標記。在訓練模型之前,就確定了完整的標記詞匯表:GPT-2的詞匯表有50,257個獨特的標記?,F(xiàn)在我們將輸入文本分割成具有不同ID的標記,這樣就可以從嵌入中獲取它們的向量表示。 ![](https://upload-images.jianshu.io/upload_images/17294212-d2535d6d03f6aa49.png) - **步驟2:標記嵌入** 嵌入操作只在最底層的編碼器中進行。編碼器首先使用嵌入層將輸入的標記(單詞或子單詞)轉(zhuǎn)換為向量。這些嵌入捕捉了標記的語義含義,并將它們轉(zhuǎn)換為數(shù)值向量。 所有編碼器都接收一個向量列表,每個向量的大小為512(固定大?。?。在底層編碼器中,這些向量是單詞嵌入,但在其他編碼器中,它們是其直接下方編碼器的輸出。 ![](https://upload-images.jianshu.io/upload_images/17294212-10b498376f02466f.png) ![](https://upload-images.jianshu.io/upload_images/17294212-d62ad8389a3d36f0.png) - **步驟3:位置編碼** ![](https://upload-images.jianshu.io/upload_images/17294212-1c9287a613ffb004.png) ![](https://upload-images.jianshu.io/upload_images/17294212-8dcfa0d7919a929c.png) ![](https://upload-images.jianshu.io/upload_images/17294212-4b88b9620f7101b1.png) 自注意力機制的最大優(yōu)點之一是它能夠根據(jù)特定單詞的使用上下文生成動態(tài)的上下文嵌入。此外,自注意力的一個主要優(yōu)勢是它允許并行計算所有上下文嵌入,從而能夠快速處理大型文檔。然而,這種并行處理也帶來了一個顯著的缺點:自注意力模塊無法捕捉句子中單詞的順序。例如,考慮以下兩個句子: - Ravi killed the lion. - The lion killed Ravi. 如果你將這兩個句子都通過一個自注意力模塊,它將無法區(qū)分它們,因為它沒有捕捉到單詞的順序。 這種局限性可能會導致對句子含義的誤解,因為該模塊會將單詞相同但順序不同的句子視為相同。在Transformer架構(gòu)中引入位置編碼就是為了解決這個問題。位置編碼提供了句子中單詞順序的信息,確保模型理解序列并保持正確的上下文。 解決位置編碼問題可以逐步進行。最初,在處理像 “Ravi killed the lion” 這樣的句子時,自注意力機制本身并不理解單詞的順序。一個基本的解決方案是給單詞分配位置編號(例如,“Ravi” = 1,“killed” = 2),并將這些編號嵌入到單詞嵌入中。然而,這會引入幾個問題: 1. **數(shù)字的無界增長**:較大的位置編號(例如書中的100,000)會使神經(jīng)網(wǎng)絡訓練不穩(wěn)定,導致梯度消失或梯度爆炸等問題。即使對這些數(shù)字進行歸一化處理,也會在不同長度的句子之間產(chǎn)生不一致性。 2. **離散數(shù)字**:神經(jīng)網(wǎng)絡難以處理離散數(shù)字,因為它們更適合處理平滑、連續(xù)的值。離散值在訓練過程中可能會導致數(shù)值不穩(wěn)定。 3. **無法捕捉相對位置**:這種方法只捕捉了絕對位置,卻無法理解單詞之間的相對距離,而這在自然語言處理任務中至關(guān)重要。 為了解決這些問題,需要一個有界、連續(xù)且周期性的函數(shù),使模型能夠有效地捕捉絕對位置和相對位置。這就引出了位置編碼的概念。 為此,研究人員建議使用各種正弦和余弦函數(shù)的組合來創(chuàng)建位置向量,這樣就可以將這種位置編碼器用于任何長度的句子。 在這種方法中,每個維度由波的獨特頻率和偏移表示,值的范圍從 -1到1,有效地表示每個位置。 - **步驟4:最終嵌入** 最后,我們將標記編碼和位置編碼相加,得到最終的嵌入表示。這種組合表示既捕捉了標記的語義含義,又捕捉了它們在輸入序列中的位置信息。 ![](https://upload-images.jianshu.io/upload_images/17294212-cc8d1b9e5e6d984f.png) ### 2.2 編碼器 #### 編碼器層堆棧 Transformer編碼器由一堆相同的層組成(在原始的Transformer模型中有6層)。這個層數(shù)是通過實驗確定的,在各種任務中都能給出最佳結(jié)果。 ![](https://upload-images.jianshu.io/upload_images/17294212-2b464484a39dbe8b.png) 編碼器層的作用是將所有輸入序列轉(zhuǎn)換為連續(xù)的抽象表示,這種表示封裝了從整個序列中學到的信息。該層包含兩個子模塊: ![](https://upload-images.jianshu.io/upload_images/17294212-c896e008a6eeef61.png) - 多頭注意力機制 - 全連接網(wǎng)絡 但這些模塊是如何協(xié)同工作的呢?編碼器模塊的實際架構(gòu)還包括額外的組件,如加法與歸一化層以及殘差連接。這些組件確保信息在通過每個模塊時能保持流暢傳遞。 輸入數(shù)據(jù)(通常是一批句子)進入第一個編碼器模塊,經(jīng)過處理后,輸出會傳遞到下一個編碼器模塊。這個過程會在所有六個編碼器模塊中依次進行,最終輸出被傳遞到解碼器。每個模塊對數(shù)據(jù)的處理方式相似,這使得整個架構(gòu)高效且結(jié)構(gòu)有序。 ![](https://upload-images.jianshu.io/upload_images/17294212-91207e767f4568dd.png) 簡而言之,它在每個子層周圍都采用了殘差連接,然后進行層歸一化。 #### 2.2.1 多頭自注意力 ![](https://upload-images.jianshu.io/upload_images/17294212-322807d8f38834c1.png) 自注意力機制使模型能夠聚焦于輸入序列的相關(guān)部分,從而捕捉數(shù)據(jù)中的復雜關(guān)系和依賴。下面讓我們逐步了解這種自注意力是如何計算的。 1. **查詢、鍵和值矩陣**:每個詞元的嵌入向量會被轉(zhuǎn)換為三個向量:查詢(Query,Q)、鍵(Key,K)和值(Value,V)。這些向量是通過將輸入嵌入矩陣與為Q、K和V學習到的權(quán)重矩陣相乘得到的。這里有一個網(wǎng)絡搜索的類比,可以幫助我們理解這些矩陣背后的含義: - 查詢(Q)是你在搜索引擎欄中輸入的搜索文本,也就是你想要 “查找更多相關(guān)信息” 的詞元。 - 鍵(K)是搜索結(jié)果窗口中每個網(wǎng)頁的標題,它代表了查詢可以關(guān)注的可能詞元。 - 值(V)是顯示的網(wǎng)頁實際內(nèi)容。一旦我們將合適的搜索詞(查詢)與相關(guān)結(jié)果(鍵)匹配,我們就希望獲取最相關(guān)網(wǎng)頁的內(nèi)容(值)。 通過使用這些QKV值,模型可以計算注意力分數(shù),這些分數(shù)決定了在生成預測時每個詞元應受到的關(guān)注程度。 ![](https://upload-images.jianshu.io/upload_images/17294212-adb2778640f33a76.png) 第一個自注意力模塊使模型能夠從整個序列中捕捉上下文信息。它不是執(zhí)行單一的注意力函數(shù),而是將查詢、鍵和值進行h次線性投影。在這些投影后的查詢、鍵和值上并行執(zhí)行注意力機制,從而產(chǎn)生h維的輸出值。詳細的架構(gòu)如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8ddab39f2fbbeef4.png) 2. **矩陣乘法(MatMul)——查詢與鍵的點積**:一旦查詢、鍵和值向量通過線性層,就會在查詢和鍵之間進行點積矩陣乘法,從而創(chuàng)建一個分數(shù)矩陣。 分數(shù)矩陣確定了每個詞對其他詞應給予的關(guān)注程度。因此,在同一時間步內(nèi),每個詞都會被賦予一個與其他詞相關(guān)的分數(shù),分數(shù)越高表示關(guān)注程度越高。這個過程有效地將查詢映射到它們相應的鍵。 ![](https://upload-images.jianshu.io/upload_images/17294212-36c071313c6f314b.png) 3. **降低注意力分數(shù)的幅度**:然后,分數(shù)會除以查詢和鍵向量維度的平方根來進行縮放。這一步是為了確保梯度更穩(wěn)定,因為值的乘法可能會導致過大的影響。 ![](https://upload-images.jianshu.io/upload_images/17294212-24853efcac375bf9.png) 4. **對調(diào)整后的分數(shù)應用Softmax函數(shù)**:隨后,對調(diào)整后的分數(shù)應用Softmax函數(shù)以獲得注意力權(quán)重,結(jié)果是得到0到1之間的概率值。Softmax函數(shù)會突出較高的分數(shù),同時抑制較低的分數(shù),從而增強模型有效確定哪些詞應受到更多關(guān)注的能力。 ![](https://upload-images.jianshu.io/upload_images/17294212-54fc8abe110c4343.png) 5. **將Softmax結(jié)果與值向量相結(jié)合**:注意力機制的下一步是將Softmax函數(shù)得到的權(quán)重與值向量相乘,得到一個輸出向量。在這個過程中,只有Softmax分數(shù)高的詞會被保留。最后,這個輸出向量會被輸入到一個線性層進行進一步處理,這樣我們最終就得到了注意力機制的輸出! 你可能會好奇,為什么它被稱為多頭注意力呢?還記得在所有過程開始之前,我們將查詢、鍵和值分解了h次吧。這個被稱為自注意力的過程,會在這些較小的階段或 “頭” 中分別進行。每個頭獨立發(fā)揮作用,生成一個輸出向量。這些輸出向量會通過一個最終的線性層,就像一個過濾器,對它們的綜合性能進行微調(diào)。這里的美妙之處在于每個頭的學習具有多樣性,豐富了編碼器模型,使其擁有強大且多方面的理解能力。 #### 2.2.2 歸一化和殘差連接 ![](https://upload-images.jianshu.io/upload_images/17294212-ff87da6091e0ccd2.png) 編碼器層中的每個子層之后都會進行歸一化步驟。此外,每個子層的輸出會與其輸入相加(殘差連接),這有助于緩解梯度消失問題,使得模型可以構(gòu)建得更深。在經(jīng)過前饋神經(jīng)網(wǎng)絡之后,也會重復這個過程。 #### 2.2.3 前饋神經(jīng)網(wǎng)絡 ![](https://upload-images.jianshu.io/upload_images/17294212-78f59be4c8a85e24.png) 歸一化后的殘差輸出會繼續(xù)通過逐點前饋網(wǎng)絡,這是進一步優(yōu)化的關(guān)鍵階段??梢詫⑦@個網(wǎng)絡想象成由兩個線性層組成,中間嵌入一個ReLU激活函數(shù),就像一座橋梁。處理后的輸出會回到起點,與逐點前饋網(wǎng)絡的輸入合并。合并之后會進行另一輪歸一化,確保一切都調(diào)整到位,為后續(xù)步驟做好準備。 #### 2.2.4 編碼器的輸出 最終編碼器層的輸出是一組向量,每個向量都代表了對輸入序列有著豐富上下文理解的結(jié)果。這個輸出隨后會作為Transformer模型中解碼器的輸入。這種精心的編碼為解碼器鋪平了道路,引導它在解碼時關(guān)注輸入中正確的詞??梢园阉胂蟪山ㄔ煲蛔?,你可以堆疊N個編碼器層。這個堆疊中的每一層都有機會探索和學習注意力的不同方面,就像知識的不同層次。這不僅使理解更加多樣化,還能顯著增強Transformer網(wǎng)絡的預測能力。 ### 2.3 解碼器 解碼器的主要作用是生成文本序列。與編碼器類似,解碼器也配備了一組相似的子層。它有兩個多頭注意力層、一個逐點前饋層,并且在每個子層之后都采用了殘差連接和層歸一化。這些組件的功能與編碼器的層類似,但有一個關(guān)鍵的不同點:解碼器中的每個多頭注意力層都有其獨特的任務。 ![](https://upload-images.jianshu.io/upload_images/17294212-f49914b15d4c3346.png) 解碼器的最后一個步驟包括一個作為分類器的線性層,頂部還有一個Softmax函數(shù),用于計算不同單詞的概率。Transformer解碼器具有專門設計的結(jié)構(gòu),通過逐步解碼編碼信息來生成輸出。 需要注意的是,解碼器是以自回歸的方式工作的,它會以一個起始詞元開始。它巧妙地將之前生成的輸出列表作為輸入,同時結(jié)合編碼器輸出中包含的來自初始輸入的豐富注意力信息。這種解碼的順序過程會一直持續(xù),直到解碼器生成一個表示輸出創(chuàng)建結(jié)束的詞元。 #### 2.3.1 輸出嵌入 在解碼器的起始階段,這個過程與編碼器類似。在這里,輸入首先會通過一個嵌入層。 #### 2.3.2 位置編碼 與編碼器類似,在嵌入之后,輸入會經(jīng)過位置編碼層,這個序列旨在生成位置嵌入。然后,這些位置嵌入會被輸送到解碼器的第一個多頭注意力層,在那里會精心計算特定于解碼器輸入的注意力分數(shù)。 #### 2.3.3 解碼器層堆棧 解碼器由一堆相同的層組成(在原始Transformer模型中有6層)。每層有三個主要子組件: ![](https://upload-images.jianshu.io/upload_images/17294212-59f8446570116e47.png) 1. **掩碼自注意力機制**:這與編碼器中的自注意力機制類似,但有一個關(guān)鍵區(qū)別:它防止當前位置關(guān)注后續(xù)位置,這意味著序列中的每個詞不會受到未來詞元的影響。例如,在計算單詞 “are” 的注意力分數(shù)時,“are” 不能 “看到” 序列中后續(xù)的單詞 “you”。這種掩碼確保了對特定位置的預測只能依賴于該位置之前的已知輸出。 2. **編碼器 - 解碼器多頭注意力或交叉注意力**: ![](https://upload-images.jianshu.io/upload_images/17294212-2e7386e94a39e248.png) 在解碼器的第二個多頭注意力層中,我們可以看到編碼器和解碼器組件之間獨特的相互作用。在這里,編碼器的輸出同時充當查詢和鍵,而解碼器第一個多頭注意力層的輸出則作為值。這種設置有效地將編碼器的輸入與解碼器的輸入對齊,使解碼器能夠識別并突出編碼器輸入中最相關(guān)的部分。之后,這個第二層多頭注意力的輸出會通過一個逐點前饋層進行優(yōu)化,進一步提升處理效果。在這個子層中,查詢來自前一個解碼器層,鍵和值來自編碼器的輸出。這使得解碼器中的每個位置都能關(guān)注輸入序列中的所有位置,有效地將編碼器中的信息與解碼器中的信息整合在一起。 3. **前饋神經(jīng)網(wǎng)絡**:與編碼器類似,每個解碼器層都包括一個全連接的前饋網(wǎng)絡,該網(wǎng)絡分別且相同地應用于每個位置。 #### 2.3.4 用于生成輸出概率的線性分類器和Softmax 數(shù)據(jù)在Transformer模型中的處理過程,最終會通過一個作為分類器的最終線性層。這個分類器的大小與涉及的類別總數(shù)(詞匯表中包含的單詞數(shù)量)相對應。例如,在一個有1000個不同類別代表1000個不同單詞的場景中,分類器的輸出將是一個包含1000個元素的數(shù)組。然后,這個輸出會被輸入到一個Softmax層,該層將其轉(zhuǎn)換為一系列概率分數(shù),每個分數(shù)都在0到1之間。這些概率分數(shù)中最高的那個至關(guān)重要,其對應的索引直接指向模型預測的序列中的下一個單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-e025bd37a15e3b9d.png) #### 2.3.5 歸一化和殘差連接 每個子層(掩碼自注意力、編碼器 - 解碼器注意力、前饋網(wǎng)絡)之后都會進行歸一化步驟,并且每個子層都包含一個圍繞它的殘差連接。 ![](https://upload-images.jianshu.io/upload_images/17294212-3ce20f00331907c8.png) #### 2.3.6 解碼器的輸出 最后一層的輸出會被轉(zhuǎn)換為預測序列,通常是通過一個線性層,然后接一個Softmax函數(shù),以生成詞匯表上的概率。在操作流程中,解碼器會將新生成的輸出合并到其不斷增長的輸入列表中,然后繼續(xù)進行解碼過程。這個循環(huán)會一直重復,直到模型預測出一個特定的詞元,表示完成。概率最高的預測詞元被指定為最終類別,通常由結(jié)束詞元表示。 請再次記住,解碼器并不局限于單層。它可以由N層構(gòu)成,每一層都基于從編碼器和前序?qū)咏邮盏降妮斎脒M行構(gòu)建。這種分層架構(gòu)使模型能夠分散其關(guān)注點,并在其注意力頭之間提取不同的注意力模式。這樣的多層方法可以顯著提高模型的預測能力,因為它對不同的注意力組合有了更細致的理解。最終的架構(gòu)與原文中的類似: ![](https://upload-images.jianshu.io/upload_images/17294212-8a8870205c5b0697.png) ### 3. LLM架構(gòu) 機器學習(ML)中的架構(gòu)指的是模型中神經(jīng)元和層的排列方式。它就像一個藍圖,勾勒出模型將如何從數(shù)據(jù)中學習。不同的架構(gòu)捕捉數(shù)據(jù)中的不同關(guān)系,并在訓練過程中突出特定的組件。因此,架構(gòu)會影響模型擅長的任務以及它生成的輸出質(zhì)量。 #### 3.1 Seq-2-Seq模型(編碼器 - 解碼器) ![](https://upload-images.jianshu.io/upload_images/17294212-794f4f8dbecd6cab.png) 編碼器 - 解碼器由兩個組件組成: - **編碼器**:接受輸入數(shù)據(jù),并將其轉(zhuǎn)換為抽象的連續(xù)表示,捕捉輸入的主要特征。 - **解碼器**:將連續(xù)表示轉(zhuǎn)換為可理解的輸出,同時吸收其先前的輸出。 編碼和解碼過程使模型能夠通過更高效的數(shù)據(jù)表示來處理復雜的語言任務,這有助于模型連貫地做出響應。這種雙過程架構(gòu)在生成任務中表現(xiàn)出色,如機器翻譯(將同一句話從一種語言轉(zhuǎn)換為另一種語言)和文本摘要(總結(jié)文本中的相同關(guān)鍵點),在這些任務中,在生成輸出之前理解整個輸入至關(guān)重要。然而,由于需要先處理整體輸入,它在推理時可能會較慢。 - **LLM示例**:谷歌的T5、Flan-UL2和Flan-T5;Meta的BART。 #### 3.2 自動編碼模型(僅限編碼器) ![](https://upload-images.jianshu.io/upload_images/17294212-2cc9abdc462093a6.png) 像廣為人知的BERT(《Pre-training of Deep Bidirectional Transformers for Language Understanding》,2018年)和RoBERTa(《A Robustly Optimized BERT Pretraining Approach》,2018年)這樣的模型,使用僅限編碼器的架構(gòu),將輸入轉(zhuǎn)換為豐富的上下文相關(guān)表示,而不直接生成新的序列。例如,BERT通過兩種創(chuàng)新方法在大量文本語料庫上進行預訓練:掩碼語言建模(MLM)和下一句預測。MLM的工作方式是在句子中隱藏隨機詞元,并訓練模型根據(jù)上下文預測這些詞元。通過這種方式,模型理解了詞在左右上下文中的關(guān)系。這種 “雙向” 理解對于需要強大語言理解能力的任務至關(guān)重要,如句子分類(例如情感分析)或填空。 但是,與能夠解釋和生成文本的編碼器 - 解碼器模型不同,它們本身并不生成長文本序列,而是更專注于解釋輸入。 - **LLM示例**:谷歌的BERT和ALBERT;Meta的RoBERTa;微軟的DeBERTa。 #### 3.3 自回歸模型(僅解碼器) ![](https://upload-images.jianshu.io/upload_images/17294212-b06b5d3160e63809.png) 僅解碼器架構(gòu)根據(jù)先前的上下文生成輸入序列的下一部分。與基于編碼器的模型不同,它們無法理解整個輸入,但在生成下一個可能的單詞方面表現(xiàn)出色。因此,僅解碼器模型在輸出上更具 “創(chuàng)造性” 和 “開放性”。這種逐個詞元的輸出生成方式對于文本生成任務非常有效,如創(chuàng)意寫作、對話生成和故事完成。 - **LLM示例**:OpenAI的GPT-4和GPT-3系列;谷歌的PaLM和Bard;Meta的LLaMA和OPT。 #### 3.4 專家混合(MoE) 像Mistral 8x7B等采用的MoE,與傳統(tǒng)Transformer模型不同,它基于這樣的觀察:一個單一的整體語言模型可以分解為更小的、專門的子模型。一個門控網(wǎng)絡在這些子模型之間分配任務(例如切換輸入詞元),協(xié)調(diào)這些專注于輸入數(shù)據(jù)不同方面的子模型。 這種方法實現(xiàn)了擴展(高效計算和資源分配)和多樣化的技能,這使得MoE在處理具有不同要求的復雜任務方面表現(xiàn)出色。這種架構(gòu)的目的是在不相應增加計算成本的情況下,增加LLM的參數(shù)數(shù)量。那么,Mistral 8x7B被認為是LLM嗎?盡管它在架構(gòu)上與Transformer模型不同,但由于幾個原因,它仍然符合LLM的標準: - **模型大小**:它巨大的規(guī)模和參數(shù)數(shù)量 —— 1870億個參數(shù),使其在復雜性和容量上與其他LLM相當。 - **預訓練**:與其他LLM一樣,Mistral 8x7B通過無監(jiān)督學習技術(shù)在綜合數(shù)據(jù)集上進行預訓練,使其能夠理解和模仿類似人類的語言模式。 - **多功能性**:它在各種任務中表現(xiàn)出色,展示了LLM廣泛的能力范圍。 - **適應性**:與其他LLM一樣,Mistral 8x7B也可以針對特定任務進行微調(diào),提高性能。 ### 4. 推理 現(xiàn)在我們已經(jīng)介紹了Transformer的架構(gòu),并詳細了解了其組件,是時候討論推理實際上是如何執(zhí)行的了。我們已經(jīng)訓練了Transformer模型,現(xiàn)在在預測階段,其架構(gòu)的行為與訓練期間略有不同。 ![](https://upload-images.jianshu.io/upload_images/17294212-795ab0ebe06573d8.png) ![](https://upload-images.jianshu.io/upload_images/17294212-45d23f1381fa845f.png) ![](https://upload-images.jianshu.io/upload_images/17294212-a2ac2a1030dc4d4e.png) ![](https://upload-images.jianshu.io/upload_images/17294212-246d99ce0b45c556.png) #### 訓練和推理的主要區(qū)別 - **訓練**:訓練Transformer模型是為了學習輸入數(shù)據(jù)中的模式和關(guān)系(例如語言建模、翻譯等)。 - **推理**:使用訓練好的Transformer模型進行預測,如生成文本、翻譯語言或?qū)ξ谋具M行分類。 在推理過程中,主要的區(qū)別出現(xiàn)在解碼器中。與訓練不同,在訓練時我們已經(jīng)知道整個輸出句子,可以一次性將所有詞元傳遞給解碼器,使其以非自回歸的方式運行;而在推理時,我們事先不知道完整的輸出句子。因此,解碼器必須以自回歸的方式一次生成一個翻譯單詞。它使用每個先前預測的單詞來幫助預測序列中的下一個單詞,這個過程會一直持續(xù),直到模型生成整個翻譯后的句子。 #### 推理過程中的數(shù)據(jù)流向 1. 輸入序列被轉(zhuǎn)換為嵌入(帶有位置編碼)并輸入到編碼器中。 2. 編碼器堆棧對其進行處理,并生成輸入序列的編碼表示。 3. 我們不使用目標序列,而是使用一個僅包含句子起始詞元的空序列。將其轉(zhuǎn)換為嵌入(帶有位置編碼)并輸入到解碼器中。 4. 解碼器堆棧結(jié)合編碼器堆棧的編碼表示對其進行處理,以生成目標序列的編碼表示。 5. 輸出層將其轉(zhuǎn)換為單詞概率并生成輸出序列。 6. 我們?nèi)≥敵鲂蛄械淖詈笠粋€單詞作為預測單詞。這個單詞現(xiàn)在被填充到解碼器輸入序列的第二個位置,此時解碼器輸入序列包含一個句子起始詞元和第一個單詞。 7. 回到步驟3。像之前一樣,將新的解碼器序列輸入到模型中。然后取輸出的第二個單詞并將其附加到解碼器序列中。重復這個過程,直到它預測出一個句子結(jié)束詞元。請注意,由于編碼器序列在每次迭代中都不會改變,我們不必每次都重復步驟1和步驟2。 ![](https://upload-images.jianshu.io/upload_images/17294212-4d70594516ed47bc.png) #### 4.1 推理技術(shù) Transformer可以通過一次輸入一個詞元序列來進行推理。編碼器用于處理輸入序列并生成嵌入序列。解碼器用于一次生成一個詞元的輸出序列。解碼器使用編碼器的輸出和先前生成的詞元來生成下一個詞元。Transformer可以使用不同的推理策略,如貪婪搜索和束搜索。 #### 4.1.1 貪婪搜索 貪婪搜索是一種簡單的推理策略。在每個時間步,解碼器根據(jù)其模型生成概率最高的詞元。這個過程會一直重復,直到解碼器生成一個序列結(jié)束詞元。貪婪搜索速度快,但可能會陷入局部最優(yōu)解。 ![](https://upload-images.jianshu.io/upload_images/17294212-79fa010314f8a326.png) #### 4.1.2 束搜索 束搜索是一種更復雜的推理策略。在每個時間步,解碼器生成一組詞元,束的大小是一個超參數(shù)。然后解碼器從這組詞元中選擇前k個詞元,并繼續(xù)從這些詞元中生成詞元。這個過程會一直重復,直到解碼器生成一個序列結(jié)束詞元。束搜索比貪婪搜索慢,但可以生成更多樣化和準確的輸出 ![](https://upload-images.jianshu.io/upload_images/17294212-1676b4e96ebac535.png) ### 5. Transformer推理優(yōu)化 Transformer模型以其自注意力機制而聞名,在自然語言處理和計算機視覺等任務中至關(guān)重要。推理,即這些模型對未見過的數(shù)據(jù)生成預測的階段,需要大量的計算資源。 影響Transformer推理的一個關(guān)鍵因素是浮點運算次數(shù)(FLOPs)。每一層都涉及矩陣乘法,對于像GPT-3這樣的大型模型,每個令牌可能需要數(shù)萬億次的FLOPs。為了減少計算開銷,人們使用鍵值(KV)緩存技術(shù),使模型能夠重用先前計算的注意力向量,加快自回歸解碼速度。 內(nèi)存使用是另一個限制因素,像GPT-3這樣的模型需要超過200GB的內(nèi)存。量化和并行計算等技術(shù)有助于更有效地管理這些資源,但Transformer推理通常仍然受限于內(nèi)存,即內(nèi)存帶寬限制了計算速度。 #### 5.1 Transformer架構(gòu)和推理流程 Transformer的核心架構(gòu)基于自注意力機制和一系列堆疊層,每一層都包含注意力和前饋網(wǎng)絡。在推理過程中,Transformer應用預訓練的參數(shù)進行預測,在像GPT這樣的自回歸模型中通常是逐個令牌進行預測。 推理涉及多個矩陣運算,特別是每個注意力層中的矩陣 - 向量乘法。對于每個新令牌,模型通過將輸入嵌入與學習到的權(quán)重矩陣相乘來計算查詢(Q)、鍵(K)和值(V)向量。 注意力機制通過將查詢與轉(zhuǎn)置的鍵矩陣相乘、將結(jié)果除以維度大小的平方根并應用softmax函數(shù)來計算相關(guān)性分數(shù)。這個過程使模型能夠權(quán)衡序列中每個令牌的重要性。雖然非常有效,但這些矩陣乘法在計算上成本高昂,特別是在像GPT-3或LLaMA這樣的大型模型中,每個注意力頭每個令牌都要執(zhí)行數(shù)十億次的FLOPs。 #### 5.2 Transformer推理的階段:預填充和解碼 Transformer推理分為兩個關(guān)鍵階段:預填充和解碼。這些階段決定了模型如何處理輸入令牌和生成輸出令牌,每個階段對性能的影響各不相同。 1. **預填充階段**:在預填充階段,模型并行處理整個輸入序列,將令牌轉(zhuǎn)換為鍵值對。這個階段計算量很大,但具有高度的并行性,能夠有效利用GPU。操作主要涉及矩陣 - 矩陣乘法,使GPU能夠同時處理多個令牌。預填充在批處理中表現(xiàn)出色,可以一起處理大量數(shù)據(jù),最大限度地減少延遲。 2. **解碼階段**:解碼階段更多地受限于內(nèi)存且是順序進行的,一次生成一個令牌。每個新令牌都依賴于先前生成的令牌,需要進行矩陣 - 向量乘法,與預填充階段的并行性質(zhì)相比,這對GPU的利用率較低。順序過程會引入延遲瓶頸,使得這個階段明顯較慢,特別是在像GPT-3這樣的大型模型中。 ![](https://upload-images.jianshu.io/upload_images/17294212-178c427c22d106e9.png) 鍵值(KV)緩存是解碼階段的一項關(guān)鍵優(yōu)化。通過存儲先前計算的鍵值矩陣,模型避免了重新計算,將復雜度從二次降低到線性。 ![](https://upload-images.jianshu.io/upload_images/17294212-f3afebbfa99723d9.png) ### 6. Transformer推理中的挑戰(zhàn) 大型Transformer模型,特別是像GPT-3這樣的大型語言模型(LLMs),由于其規(guī)模和計算需求,在推理過程中帶來了一些挑戰(zhàn)。這些挑戰(zhàn)圍繞著內(nèi)存限制、延遲以及內(nèi)存受限和計算受限操作之間的平衡。 1. **內(nèi)存和計算需求**:在推理過程中存儲模型權(quán)重和鍵值(KV)緩存需要大量內(nèi)存。像GPT-3這樣擁有1750億參數(shù)的大型模型,通常需要超過200GB的內(nèi)存。此外,KV緩存的大小會隨著序列長度和批量大小線性增長,進一步增加了內(nèi)存負擔。例如,一個有70億參數(shù)且序列長度為4096的LLaMA模型,僅KV緩存就可能消耗約2GB的內(nèi)存。 2. **順序令牌生成中的延遲**:延遲是一個關(guān)鍵問題,特別是在解碼階段,令牌是逐個生成的。每個新令牌都依賴于前一個令牌,這導致了順序操作,無法充分利用GPU的計算能力。即使是經(jīng)過高度優(yōu)化的模型也會受到內(nèi)存帶寬瓶頸的影響,隨著序列長度的增加,這種影響會更加明顯。 3. **批量大小和性能的平衡**:較大的批量大小可以提高GPU的利用率,特別是在預填充階段,但會受到內(nèi)存容量的限制。增加批量大小有助于最大化吞吐量,但當系統(tǒng)受限于內(nèi)存時,就會達到極限。超過這個極限,系統(tǒng)可能會出現(xiàn)收益遞減的情況,因為內(nèi)存帶寬開始限制進一步的性能提升。 4. **內(nèi)存受限與計算受限操作的權(quán)衡**:Transformer推理在內(nèi)存受限和計算受限操作之間交替進行。在解碼階段,矩陣 - 向量乘法通常受限于內(nèi)存,而預填充階段的矩陣 - 矩陣操作往往受限于計算。有效優(yōu)化批量大小、KV緩存管理和精度(例如FP16、INT8)對于減少延遲和確保GPU的高效使用至關(guān)重要。 ### 7. 用于更快推理的優(yōu)化技術(shù) 隨著像GPT-3、LLaMA和其他大型語言模型(LLMs)等Transformer模型的不斷擴展,優(yōu)化技術(shù)對于管理推理過程中增加的內(nèi)存、計算負載和延遲變得至關(guān)重要。通過應用量化、鍵值(KV)緩存、推測解碼、批處理和并行計算等技術(shù),開發(fā)人員可以顯著提高推理性能。 #### 7.1 量化 ![](https://upload-images.jianshu.io/upload_images/17294212-e4fb60e35f7a59b3.png) 量化降低了模型權(quán)重和激活值的精度,從而實現(xiàn)更快的計算和更低的內(nèi)存使用。模型可以使用8位(INT8)甚至更低的精度,而不是依賴32位或16位浮點精度,這減少了內(nèi)存帶寬,使模型能夠更有效地處理更大的批量或更長的序列。 ![](https://upload-images.jianshu.io/upload_images/17294212-f40238d7b582d501.png) 內(nèi)存帶寬利用率(MBU)公式顯示了內(nèi)存帶寬如何限制性能,參數(shù)數(shù)量、每個參數(shù)的字節(jié)數(shù)和每秒令牌數(shù)都會影響推理速度。 例如,對GPT-3應用INT8量化可以使內(nèi)存需求降低多達50%,直接導致推理期間的延遲更低和吞吐量更高。量化對于受內(nèi)存帶寬限制的模型特別有用。 ![](https://upload-images.jianshu.io/upload_images/17294212-9e6c3a79d18f7a6b.png) #### 7.2 鍵值(KV)緩存 在自回歸模型中,每個新令牌的生成都需要訪問所有先前的令牌。隨著序列長度的增長,這會導致計算量呈二次方增加。KV緩存通過存儲先前令牌的鍵和值張量來緩解這個問題,使模型能夠重用它們而無需重新計算。 KV緩存的大小會隨著令牌數(shù)量、層數(shù)和注意力頭數(shù)線性增長。例如,在LLaMA 7B模型中,4096個令牌的序列長度將需要大約2GB的內(nèi)存用于KV緩存。這種優(yōu)化顯著減少了解碼階段的計算負載,提高了速度和內(nèi)存效率。 #### 7.3 推測解碼 推測解碼是一種先進的優(yōu)化技術(shù),通過并行化令牌生成來減少延遲。它不是等待每個令牌按順序處理,而是使用一個較小的草稿模型提前預測幾個令牌,然后用主模型驗證這些預測。如果預測準確,就接受它們;如果不準確,就丟棄。 這種方法允許并行執(zhí)行,在保持準確性的同時減少了生成令牌所需的總時間。它對于實時應用(如聊天機器人)特別有用,因為快速的響應時間至關(guān)重要。 #### 7.4 批處理 批處理是一種簡單而強大的優(yōu)化Transformer推理的技術(shù)。通過同時處理多個輸入,批處理提高了GPU的利用率,因為模型權(quán)重的內(nèi)存成本可以在多個請求之間共享。然而,批處理受限于可用內(nèi)存,特別是在處理長序列的模型中。 傳統(tǒng)批處理的一個挑戰(zhàn)是,批處理中的不同請求可能會生成不同數(shù)量的輸出令牌。這可能會導致效率低下,因為所有請求都必須等待最長的請求完成。為了解決這個問題,動態(tài)批處理允許系統(tǒng)立即從批處理中移除已完成的請求,為新請求釋放資源。 #### 7.5 硬件優(yōu)化:并行性 ![](https://upload-images.jianshu.io/upload_images/17294212-3ac6eb765344cb93.png) 硬件優(yōu)化,特別是張量并行和流水線并行,對于擴展大型模型至關(guān)重要。這些方法將計算負載分布到多個GPU上,使系統(tǒng)能夠處理超出單個GPU內(nèi)存容量的模型。 - **張量并行**:這種技術(shù)將模型的參數(shù)分割到多個GPU上,使它們能夠并行處理相同輸入的不同部分。張量并行在注意力層特別有效,不同的注意力頭可以獨立計算。 - **流水線并行**:這種方法將模型劃分為順序的塊,每個塊由不同的GPU處理。流水線并行減少了每個GPU的內(nèi)存占用,使更大的模型能夠高效運行。然而,它會在GPU之間引入一些空閑時間,因為需要等待前一階段的數(shù)據(jù)。 這兩種并行方式對于管理像GPT-3和LLaMA這樣的大型模型至關(guān)重要,因為它們的內(nèi)存和計算需求通常超出了單個GPU的能力。 #### 7.6 FlashAttention和內(nèi)存效率 另一項關(guān)鍵進展是FlashAttention,它通過減少數(shù)據(jù)在內(nèi)存中加載和存儲的次數(shù)來優(yōu)化內(nèi)存訪問模式。FlashAttention利用GPU內(nèi)存層次結(jié)構(gòu)更高效地執(zhí)行計算,融合操作并最小化數(shù)據(jù)移動。這種技術(shù)可以顯著提高速度,特別是在具有長序列長度的模型中,通過減少內(nèi)存浪費并支持更大的批量大小來實現(xiàn)。 ### 8. 對推理性能進行基準測試 對GPT-3和LLaMA的基準測試說明了這些優(yōu)化的影響。對于GPT-3,與未優(yōu)化的模型相比,KV緩存和量化的組合已被證明可以將推理時間減少多達60%,吞吐量達到每秒數(shù)百個令牌。在LLaMA中,并行技術(shù)的使用確保即使是最大的模型,如LLaMA 65B,也能在控制延遲的同時保持高吞吐量。 這些優(yōu)化使這兩種模型都能有效地擴展,確保它們能夠處理從長上下文生成到實時響應的實際應用,同時顯著降低計算和內(nèi)存需求。 #### 8.1 Transformer推理的趨勢 隨著Transformer模型在規(guī)模和復雜性上不斷增長,優(yōu)化推理對于滿足實際應用的需求至關(guān)重要。下一波創(chuàng)新集中在高效擴展Transformer模型、改進內(nèi)存管理以及利用先進的硬件能力上。以下是一些最具影響力的趨勢,它們正在塑造Transformer推理的未來。 #### 8.1.1 使用分頁(Paging)和FlashAttention進行內(nèi)存優(yōu)化 一個關(guān)鍵趨勢是通過PagedAttention和FlashAttention等技術(shù)優(yōu)化內(nèi)存使用。在當前的推理過程中,模型通常會過度分配內(nèi)存以處理可能的最大序列長度,這導致了效率低下。PagedAttention通過按需分配內(nèi)存來解決這個問題,將鍵值(KV)緩存分解為按需獲取的較小塊。 FlashAttention通過優(yōu)化計算順序和減少內(nèi)存與計算單元之間的數(shù)據(jù)移動,進一步提高了內(nèi)存效率。通過融合操作并利用GPU內(nèi)存層次結(jié)構(gòu),F(xiàn)lashAttention可以顯著減少內(nèi)存浪費,并支持更大的批量大小和更快的處理速度。這些進展對于擴展大型模型同時保持高性能至關(guān)重要。 #### 8.1.2 多查詢和分組查詢注意力 優(yōu)化注意力機制本身是另一個重要趨勢。多查詢注意力(MQA)和分組查詢注意力(GQA)是兩種變體,它們在保持模型性能的同時減少了內(nèi)存占用。在MQA中,所有頭共享相同的鍵值對,這減少了KV緩存的大小,同時保持了準確性。 分組查詢注意力(GQA)在MQA和傳統(tǒng)多頭注意力之間取得平衡,為分組的頭使用共享的鍵值對。這種方法進一步減少了內(nèi)存使用,同時保持了高性能,使其對于像LLaMA 2 70B這樣的長上下文模型特別有用。 #### 8.1.3 并行性:張量和序列 并行性仍然是擴展大型模型的核心策略。張量并行將模型層劃分為可以在多個GPU上處理的獨立塊,減少了單個設備上的內(nèi)存負擔。這種方法在注意力頭和前饋層中效果很好,并行處理可以顯著提高效率。 序列并行通過在序列維度上分割像LayerNorm和Dropout這樣的操作,進一步提高了內(nèi)存效率。這減少了內(nèi)存開銷,特別是對于長序列任務,并使模型能夠更有效地擴展。 #### 8.1.4 實時應用程序的推測推理 對于實時應用,推測推理提供了一種創(chuàng)新的方法來減少延遲。通過使用較小的草稿模型提前預測多個令牌,推測推理允許并行執(zhí)行。然后,主模型驗證這些草稿令牌,決定接受或丟棄它們。 ### 9. 處理大型數(shù)據(jù)集 在大型數(shù)據(jù)集上訓練Transformer帶來了獨特的挑戰(zhàn),需要謹慎的策略: #### 9.1 高效的數(shù)據(jù)加載和預處理 - **并行數(shù)據(jù)加載**:利用像TensorFlow的tf.data或PyTorch的DataLoader這樣的框架,并結(jié)合多線程,可以加快數(shù)據(jù)預處理速度。 - **打亂和批處理**:適當?shù)拇騺y可以防止模型過度擬合特定的數(shù)據(jù)順序,批處理則確保GPU的高效利用。 #### 9.2 分布式訓練 - **數(shù)據(jù)并行**:將模型復制到多個GPU上,每個GPU處理不同的小批量數(shù)據(jù),并聚合梯度。 - **模型并行**:將模型本身分割到多個GPU上,這對于無法裝入單個設備內(nèi)存的非常大的模型很有用。 #### 9.3 混合精度訓練 利用16位(半精度)浮點運算而不是32位,可以顯著減少內(nèi)存使用并加快計算速度,同時對準確性的影響較小。 #### 9.4 梯度累積 在GPU內(nèi)存限制批量大小的情況下很有用。在執(zhí)行優(yōu)化器步驟之前,在多個較小的批量上累積梯度。 #### 9.5 檢查點和恢復 在訓練期間定期保存模型狀態(tài)有助于在出現(xiàn)故障時從上一個檢查點恢復,也可用于提前停止訓練和微調(diào)。 #### 9.6 數(shù)據(jù)增強和采樣 - **數(shù)據(jù)增強技術(shù)**:增加數(shù)據(jù)的可變性,有助于模型泛化。 - **智能采樣策略**:確保模型不會過度擬合常見模式,同時不會忽略罕見但重要的模式。 ### 10. 總結(jié) 本文深入探討了大型語言模型(LLMs)的開發(fā)和優(yōu)化,首先概述了它們的構(gòu)建和訓練方法。它追溯了從Transformer之前的模型到Transformer的變革性引入的演變,強調(diào)了關(guān)鍵的 “注意力就是你所需要的一切” 這一概念。 文章的核心剖析了Transformer架構(gòu),詳細介紹了其組件,如嵌入層、編碼器 - 解碼器交互和自注意力機制。它探索了各種LLM架構(gòu),包括Seq-2-Seq、自動編碼和自回歸模型,揭示了它們的獨特功能。 對于實際部署,文章研究了推理策略、優(yōu)化技術(shù),如量化、KV緩存、推測解碼和硬件并行性,并以GPT-3和LLaMA等實際例子進行說明。性能基準測試、內(nèi)存優(yōu)化和并行技術(shù)突出了高效Transformer推理的趨勢。 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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