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

# 深度解析從RNN到Transformer:構建NLP應用的架構演進之路 ??閱讀時長:50分鐘 ??發布時間:2025-01-20 深入探索架構,并利用從RNN到Transformer的NLP模型構建現實世界中的應用程序。 >本文1w字,閱讀時長~~ 看速度 2025年01月10日 晴 零下3度 ![](https://upload-images.jianshu.io/upload_images/17294212-db71fb25cf4c0c1d.png) >[1. LLM大模型架構專欄](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxMDcwMDExOQ==&action=getalbum&album_id=3803521454633697283#wechat_redirect) 歡迎關注公眾號 **柏企科技圈** 如果您有任何問題或建議,歡迎在評論區留言交流! ## 目錄 1. **引言** - 1.1 LLM是如何構建和訓練的? - 1.2 背景:前Transformer時代 - 1.3 Transformers簡介 - 1.4 為什么說“注意力就是你所需要的一切”? 2. **Transformer架構** - 2.1 嵌入 - 2.1.1 輸入嵌入 - 2.2 編碼器 - 2.2.1 多頭自注意力 - 2.2.2 歸一化和殘差連接 - 2.2.3 前饋神經網絡 - 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架構** - 3.1 Seq-2-Seq模型(編碼器 - 解碼器) - 3.2 自動編碼模型(僅編碼器) - 3.3 自回歸模型(僅解碼器) - 3.4 專家混合(MoE) 4. **推理** - 4.1 推理技術 - 4.1.1 貪心搜索 - 4.1.2 束搜索 5. **Transformer推理優化** - 5.1 Transformer架構和推理流程 - 5.2 Transformer推理的階段:預填充和解碼 6. **Transformer推理中的挑戰** 7. **用于加速推理的優化技術** - 7.1 量化 - 7.2 鍵值(KV)緩存 - 7.3 推測解碼 - 7.4 批處理 - 7.5 硬件優化:并行性 - 7.6 FlashAttention和內存效率 8. **推理性能基準測試** - 8.1 Transformer推理的趨勢 - 8.1.1 使用分頁(Paging)和FlashAttention進行內存優化 - 8.1.2 多查詢和分組查詢注意力 - 8.1.3 并行性:張量和序列 - 8.1.4 實時應用的推測推理 9. **處理大型數據集** - 9.1 高效的數據加載和預處理 - 9.2 分布式訓練 - 9.3 混合精度訓練 - 9.4 梯度累積 - 9.5 檢查點和恢復 - 9.6 數據增強和采樣 10. **總結** ## 1. 引言 大型語言模型(LLM)是一種人工智能(AI)算法,它運用深度學習技術和海量數據集來實現通用語言的理解與生成。LLM會在大量數據上進行預訓練,這些數據通常涵蓋如Common Crawl和Wikipedia等來源。 LLM旨在依據從訓練中獲取的知識,識別、總結、翻譯、預測并生成文本及其他形式的內容。 LLM的主要特點包括: - **Transformer模型架構**:LLM基于Transformer模型,該模型由編碼器和解碼器構成,能夠從文本序列中提取含義,并理解單詞之間的關系。 - **注意力機制**:這一機制使LLM能夠捕捉單詞之間的長距離依賴關系,從而理解上下文。 - **自回歸文本生成**:LLM根據先前生成的標記來生成文本,使其能夠以不同的風格和語言產出文本。 ![](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。這些模型有潛力顛覆眾多行業,如搜索引擎、自然語言處理、醫療保健、機器人技術和代碼生成等領域。 ### 1.1 LLMs是如何構建和訓練的? 構建和訓練大型語言模型(LLMs)是一個復雜的過程,涉及多個步驟。最初,需要從書籍、網站和社交媒體帖子等各種來源收集大量文本數據。接著,對這些數據進行清理和處理,使其轉化為AI能夠學習的格式。 LLMs的架構采用具有數十億參數的深度神經網絡進行設計。會使用諸如編碼器 - 解碼器、因果解碼器和前綴解碼器等不同的Transformer架構,模型的設計對其能力有著重大影響。 ![](https://upload-images.jianshu.io/upload_images/17294212-7ecf194c2e87deed.png) 然后,利用計算能力和優化算法對LLMs進行訓練。這種訓練通過統計方式調整參數以預測文本,訓練得越多,模型的能力就越強。 最后,通過擴大數據規模、增加參數數量和提升計算能力,企業得以生產出能力接近人類語言運用水平的LLMs。 - **數據收集**:LLMs需要大量的文本數據集進行訓練,這些數據可包括書籍、網站、社交媒體帖子等。數據經過清理和處理,轉換為AI能夠學習的格式。 - **模型架構**:LLMs具有包含數十億參數的深度神經網絡架構,會使用Transformer或GPT等不同架構,模型設計會影響其能力。 - **訓練**:LLMs利用計算能力和優化算法進行訓練,訓練通過調整參數以統計方式預測文本,更多的訓練會使模型能力更強。 - **擴展**:通過擴大數據、參數和計算能力的規模,企業已經生產出能力接近人類語言使用水平的LLMs。 大型語言模型操作(LLMOps)專注于在生產環境中有效部署、監控和維護LLMs,它涵蓋模型版本控制、擴展和性能提升等方面。 ### 1.2 背景:前Transformer時代 Transformers是為了解決序列轉換(即神經機器翻譯)問題而開發的。這意味著任何將輸入序列轉換為輸出序列的任務,包括語音識別、文本轉語音等。 ![](https://upload-images.jianshu.io/upload_images/17294212-acc5708cbed384fa.png) 對于序列轉換模型來說,記憶至關重要。例如,在翻譯句子 “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”。識別這些聯系對于準確翻譯至關重要。傳統上,循環神經網絡(RNNs)和卷積神經網絡(CNNs)等模型被用于處理這些依賴關系,但它們都存在局限性。讓我們快速探究一下這些架構及其缺點。 #### 1.2.1 多層感知機(MLPs) 讓我們從多層感知機(MLPs)開始介紹,它是經典的神經網絡方法之一。MLPs本身的能力并不強大,但你會發現它幾乎集成在任何其他架構中(令人驚訝的是,甚至在Transformer中也有)。MLPs本質上是一系列線性層或全連接層。 ![](https://upload-images.jianshu.io/upload_images/17294212-62cd677d2febc1ab.png) #### 多層感知機(MLPs) 在人工智能領域找到適用于各種模態的最佳架構之前,MLPs長期以來一直被用于對不同類型的數據進行建模。但可以肯定的是,它們不適合用于序列建模。由于其前饋設計,MLPs無法保留序列中信息的順序。當數據的順序丟失時,序列數據就失去了意義。因此,MLPs無法保留信息順序的這一特性使其不適合用于序列建模。此外,MLPs需要大量參數,這是神經網絡不希望具備的另一個特性。 #### 1.2.2 循環神經網絡(RNNs) 循環神經網絡(RNNs)中存在循環結構,這使得信息能夠持續存在。 ![](https://upload-images.jianshu.io/upload_images/17294212-70f578e92a8dc977.png) 在上圖中,神經網絡的一部分A接收輸入$x_t$并輸出值$h_t$。循環結構允許信息從網絡的一個步驟傳遞到下一個步驟。循環神經網絡可以被看作是同一個網絡的多個副本,每個副本都向后續副本傳遞一條消息??紤]一下如果我們展開這個循環會發生什么: ![](https://upload-images.jianshu.io/upload_images/17294212-3709cb8781214832.png) 這種鏈式結構表明循環神經網絡與序列和列表密切相關。它們是處理這類數據的自然神經網絡架構。而且它們確實被廣泛應用!在過去幾年里,RNNs在應用于各種問題(如語音識別、語言建模、翻譯、圖像字幕生成等)上取得了巨大成功。 ![](https://upload-images.jianshu.io/upload_images/17294212-55e55d2da2cfb502.png) **長期依賴問題** 假設有一個語言模型試圖根據前面的單詞預測下一個單詞。如果我們要預測句子 “the clouds in the ….” 的下一個單詞,我們不需要更多的上下文信息,很明顯下一個單詞是 “sky”。 在這種相關信息與所需信息之間的差距較小的情況下,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) 當相關信息與需要該信息的點之間的差距變得非常大時,RNNs就會變得非常低效。這是因為信息在每個步驟中傳遞,鏈條越長,信息在傳遞過程中丟失的可能性就越大。 那么,RNNs的主要問題是什么呢?它們在自然語言處理(NLP)任務中效率不高,主要有兩個原因: 1. 它們按順序依次處理輸入數據。這種循環過程沒有利用為并行計算設計的現代圖形處理單元(GPUs),因此使得此類模型的訓練速度相當緩慢。 2. 當元素之間距離較遠時,它們會變得非常低效。這是由于信息在每個步驟中傳遞,鏈條越長,信息在傳遞過程中丟失的可能性就越大。 #### 1.2.3 長短期記憶網絡(LSTM) 當安排一天的日歷時,我們會優先考慮約會。如果有重要的事情,我們可以取消一些會議來安排重要的事項。 RNNs不會這樣做。每當它添加新信息時,它會通過應用一個函數完全轉換現有信息。整個信息都被修改,而不會考慮哪些重要哪些不重要。 LSTM通過乘法和加法對信息進行小的修改。通過LSTM,信息通過一種稱為細胞狀態的機制流動。通過這種方式,LSTM可以有選擇地記住或忘記重要和不太重要的事情。 在內部,一個LSTM的結構如下: ![](https://upload-images.jianshu.io/upload_images/17294212-2be2fee62940b2df.png) 每個細胞接收$x_t$(在句子到句子翻譯的情況下是一個單詞)、前一個細胞狀態和前一個細胞的輸出作為輸入。它對這些輸入進行處理,并基于它們生成一個新的細胞狀態和一個輸出。我不會詳細介紹每個細胞的工作機制。 通過細胞狀態,在翻譯時,句子中對翻譯某個單詞重要的信息可以從一個單詞傳遞到另一個單詞。 **LSTM的問題** 與RNNs通常遇到的問題一樣,當句子太長時,LSTM的表現也不太好。這是因為保持與當前正在處理的單詞距離較遠的單詞的上下文的概率會隨著距離的增加而呈指數下降。 這意味著當句子很長時,模型常常會忘記序列中較遠位置的內容。RNNs和LSTMs的另一個問題是,處理句子的工作很難并行化,因為必須逐個單詞地處理。不僅如此,它們也沒有對長距離和短距離依賴關系進行建模。 總之,LSTMs和RNNs存在3個問題: 1. 順序計算抑制了并行化 2. 沒有對長距離和短距離依賴關系進行顯式建模 3. 位置之間的“距離”是線性的 #### 1.2.4 注意力機制 為了解決其中一些問題,研究人員創造了一種關注特定單詞的技術。 當翻譯一個句子時,我會特別注意我正在翻譯的單詞。當我轉錄音頻記錄時,我會仔細聽我正在記錄的片段。如果你讓我描述我所在的房間,我會在描述過程中掃視我所描述的物體。 神經網絡可以使用注意力機制實現相同的行為,即專注于所給信息的一部分。例如,一個RNN可以關注另一個RNN的輸出。在每個時間步,它關注另一個RNN中的不同位置。 為了解決這些問題,注意力機制被應用于神經網絡中。對于RNNs,不是僅將整個句子編碼在一個隱藏狀態中,而是每個單詞都有一個相應的隱藏狀態,該狀態一直傳遞到解碼階段。然后,在RNN的每個步驟中使用這些隱藏狀態進行解碼。 ![](https://upload-images.jianshu.io/upload_images/17294212-83b8a4e6d8a36c68.png) 綠色步驟稱為編碼階段,紫色步驟稱為解碼階段。 其背后的想法是,句子中的每個單詞都可能包含相關信息。因此,為了使解碼準確,需要使用注意力機制考慮輸入的每個單詞。 為了在序列轉換中為RNNs引入注意力機制,我們將編碼和解碼分為兩個主要步驟。一個步驟用綠色表示,另一個用紫色表示。綠色步驟稱為編碼階段,紫色步驟稱為解碼階段。 ![](https://upload-images.jianshu.io/upload_images/17294212-973dc95b54e4b0c0.png) 綠色步驟負責從輸入創建隱藏狀態。與之前使用注意力機制不同,我們不是僅將一個隱藏狀態傳遞給解碼器,而是將句子中每個“單詞”生成的所有隱藏狀態都傳遞到解碼階段。每個隱藏狀態在解碼階段用于確定網絡應該關注的位置。 例如,將句子 “Je suis étudiant” 翻譯成英語時,解碼步驟需要在翻譯時關注不同的單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-392fde2fa346828b.png) 這個圖展示了將句子 “Je suis étudiant” 翻譯成英語時,每個隱藏狀態被賦予的權重。顏色越深,與每個單詞相關的權重越大。 但是,我們討論的一些問題,使用注意力機制的RNNs仍然無法解決。例如,無法并行處理輸入(單詞)。對于大量文本,這會增加翻譯文本所需的時間。 **注意力機制的缺點** 1. **順序訓練**:傳統的基于LSTM的編碼器 - 解碼器架構一次處理一個單詞,使得訓練本質上是順序的。這限制了訓練過程中的并行性,導致訓練時間更長。由于其順序性,擴展到大型數據集變得低效,使得遷移學習不切實際。 2. 因此,模型無法有效地進行微調,每個任務都需要從頭開始訓練。這導致計算成本更高、訓練時間更長和數據需求增加,顯著提高了每個訓練周期的成本。 ### 1.2.5 卷積神經網絡(CNNs) 卷積神經網絡(CNNs)在處理序列轉換任務時具有顯著優勢: - **并行性**:CNNs在層的層面很容易實現并行化,這意味著可以同時處理輸入的多個部分。與像RNNs這樣的順序模型相比,計算速度更快。 - **局部依賴利用**:CNNs擅長通過卷積濾波器捕捉附近元素(比如句子中的單詞)之間的局部模式和關系。這些濾波器專注于輸入數據的較小區域。 - **對數距離**:在CNNs中,任何輸入和輸出元素之間的 “距離” 與層數呈對數關系(log(N))。這意味著與RNNs相比,連接遠距離元素所需的操作數量顯著減少。在RNNs中,元素之間的距離會隨著序列長度(N)線性增長。 一些廣為人知的序列轉換模型,如WaveNet和ByteNet,都是基于CNN架構構建的。在像WaveNet這樣的模型中,每個輸入(單詞或標記)都獨立于前一個輸入進行處理,實現了并行處理。這意味著CNNs避免了RNNs的順序瓶頸,在RNNs中每個單詞都依賴于前一個單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-adf33a65b050ba6d.png) 此外,在CNNs中,輸出與任何輸入之間的 “距離” 大致與網絡的深度成正比,約為log(N)。這比RNNs高效得多,在RNNs中距離是線性增長的(N),這使得CNNs在處理序列時速度更快。 然而,CNNs在處理長距離依賴關系方面存在局限性。它們難以有效地對序列中距離較遠的單詞之間的關系進行建模,尤其是當相距較遠的標記所提供的上下文至關重要時。這就是引入Transformers的原因 —— 它們將CNNs的并行性與自注意力機制相結合,能夠有效地捕捉局部和全局依賴關系。 ### 1.3 Transformers簡介 如原文所述,Transformers的主要架構是左側有一個編碼器,右側有一個解碼器。 ![](https://upload-images.jianshu.io/upload_images/17294212-645e26b6e0b50455.png) *Transformers的主要架構,左邊是編碼器,右邊是解碼器。 為了解決并行化問題,Transformers嘗試通過將編碼器、解碼器與注意力模型結合使用來解決該問題。注意力機制提高了模型從一個序列轉換到另一個序列的速度。 讓我們來看看Transformer是如何工作的。Transformer是一種利用注意力機制來提升速度的模型,更具體地說,它使用的是自注意力機制。 ![Transformer架構](https://upload-images.jianshu.io/upload_images/17294212-456943428e0cd04f.png) 在內部,Transformer具有與上述先前模型類似的架構。但Transformer由六個編碼器和六個解碼器組成。 有三篇具有開創性的論文為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的架構,實現了并行化訓練,顯著加快了訓練過程。 2. **穩定的架構**:Transformer架構通過組合幾個較小的組件(如位置編碼和多頭注意力),變得十分強大,從而產生了一種可擴展且可靠的模型設計。 3. **穩定的超參數**:事實證明,原始Transformer架構中使用的超參數隨著時間的推移是穩定且具有彈性的。值得注意的是,如今許多基于Transformer的模型仍然使用類似的超參數值,這表明了它們在各種任務和數據集上的穩健性。 ![](https://upload-images.jianshu.io/upload_images/17294212-58270fb63cac4948.png) *注意力機制與其他循環網絡架構的對比。Transformer幾乎具備神經網絡的所有優點。卷積神經網絡(ConvNets)與Transformer接近,但它們需要很多層才能實現長距離依賴。* 與其他循環網絡架構相比,Transformer幾乎具備神經網絡的所有優點。卷積神經網絡(ConvNets)與Transformer較為接近,但它們需要很多層才能實現長距離依賴。 讓我們詳細了解一下Transformer架構。 ### 2. Transformer架構 ![](https://upload-images.jianshu.io/upload_images/17294212-3fea59e5c455033b.png) 從根本上說,文本生成的Transformer模型基于預測下一個單詞的原理:給定用戶輸入的文本提示,在這個輸入之后最可能出現的下一個單詞是什么?Transformer的核心創新和強大之處在于其使用的自注意力機制,這使得它們能夠比以前的架構更有效地處理整個序列并捕捉長距離依賴關系。 ![](https://upload-images.jianshu.io/upload_images/17294212-9131bf92bcc3d618.png) 最初,Transformer是為序列轉換或神經機器翻譯而設計的,它在將輸入序列轉換為輸出序列方面表現出色。它是第一個完全依靠自注意力來計算輸入和輸出表示的轉換模型,而不使用與序列對齊的RNN或卷積。Transformer架構的主要核心特征是它保留了編碼器 - 解碼器模型。 如果我們把用于語言翻譯的Transformer看作一個簡單的黑箱,它會接受一種語言(例如英語)的句子作為輸入,并輸出該句子的翻譯(比如英語翻譯成其他語言)。 ![](https://upload-images.jianshu.io/upload_images/17294212-f129bd38eb476758.png) *如果把Transformer當作黑箱,它會將一種語言的句子作為輸入,輸出其翻譯。* 如果我們深入探究一下,就會發現這個黑箱主要由兩部分組成: - 編碼器接收我們的輸入,并輸出該輸入的矩陣表示。例如,英語句子 “How are you?”。 - 解碼器接收編碼后的表示,并迭代地生成輸出。在我們的例子中,就是翻譯后的句子 “?Cómo estás?”。 ![](https://upload-images.jianshu.io/upload_images/17294212-49ec373426803885.png) 然而,實際上編碼器和解碼器都是由多個層堆疊而成的(兩者的層數相同)。所有編碼器都具有相同的結構,輸入進入每個編碼器,并傳遞到下一個編碼器。所有解碼器也具有相同的結構,它們從最后一個編碼器和前一個解碼器獲取輸入。 原始架構由6個編碼器和6個解碼器組成,但我們可以根據需要復制任意數量的層。所以,假設編碼器和解碼器都有N層。 ![](https://upload-images.jianshu.io/upload_images/17294212-3297f85bed51750a.png) 既然我們對Transformer的整體架構有了一個大致的了解,那么讓我們把重點放在編碼器和解碼器上,以便更好地理解它們的工作流程: #### 2.1 嵌入 編碼器是Transformer架構的基本組件。編碼器的主要功能是將輸入的標記轉換為上下文相關的表示。與早期獨立處理標記的模型不同,Transformer編碼器會捕捉每個標記相對于整個序列的上下文信息。 它的結構組成如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8c169ae276b13fc0.png) 文本輸入被分割成稱為標記(tokens)的較小單元,這些標記可以是單詞或子單詞。這些標記被轉換為稱為嵌入(embeddings)的數值向量,嵌入向量能夠捕捉單詞的語義含義。 #### 2.1.1 輸入嵌入 ![](https://upload-images.jianshu.io/upload_images/17294212-43df3792582a013d.png) 假設你想使用Transformer模型生成文本。你輸入這樣一個提示:“Data visualization empowers users to”。這個輸入需要轉換為模型能夠理解和處理的格式。這就是嵌入的作用:它將文本轉換為模型能夠處理的數值表示。為了將提示轉換為嵌入,我們需要: 1. 對輸入進行分詞; 2. 獲取標記嵌入; 3. 添加位置信息; 4. 最后將標記和位置編碼相加,得到最終的嵌入。 讓我們看看這些步驟是如何完成的。 ![](https://upload-images.jianshu.io/upload_images/17294212-441cfdd815fad7cb.png) 那么,讓我們將其工作流程分解為最基本的步驟: - **步驟1:分詞** 分詞是將輸入文本分解為更小、更易于管理的部分(稱為標記)的過程。這些標記可以是一個單詞或一個子單詞。例如,“Data” 和 “visualization” 分別對應不同的標記,而 “empowers” 這個單詞可能會被拆分成兩個標記。在訓練模型之前,就確定了完整的標記詞匯表:GPT-2的詞匯表有50,257個獨特的標記?,F在我們將輸入文本分割成具有不同ID的標記,這樣就可以從嵌入中獲取它們的向量表示。 ![](https://upload-images.jianshu.io/upload_images/17294212-d2535d6d03f6aa49.png) - **步驟2:標記嵌入** 嵌入操作只在最底層的編碼器中進行。編碼器首先使用嵌入層將輸入的標記(單詞或子單詞)轉換為向量。這些嵌入捕捉了標記的語義含義,并將它們轉換為數值向量。 所有編碼器都接收一個向量列表,每個向量的大小為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) 自注意力機制的最大優點之一是它能夠根據特定單詞的使用上下文生成動態的上下文嵌入。此外,自注意力的一個主要優勢是它允許并行計算所有上下文嵌入,從而能夠快速處理大型文檔。然而,這種并行處理也帶來了一個顯著的缺點:自注意力模塊無法捕捉句子中單詞的順序。例如,考慮以下兩個句子: - Ravi killed the lion. - The lion killed Ravi. 如果你將這兩個句子都通過一個自注意力模塊,它將無法區分它們,因為它沒有捕捉到單詞的順序。 這種局限性可能會導致對句子含義的誤解,因為該模塊會將單詞相同但順序不同的句子視為相同。在Transformer架構中引入位置編碼就是為了解決這個問題。位置編碼提供了句子中單詞順序的信息,確保模型理解序列并保持正確的上下文。 解決位置編碼問題可以逐步進行。最初,在處理像 “Ravi killed the lion” 這樣的句子時,自注意力機制本身并不理解單詞的順序。一個基本的解決方案是給單詞分配位置編號(例如,“Ravi” = 1,“killed” = 2),并將這些編號嵌入到單詞嵌入中。然而,這會引入幾個問題: 1. **數字的無界增長**:較大的位置編號(例如書中的100,000)會使神經網絡訓練不穩定,導致梯度消失或梯度爆炸等問題。即使對這些數字進行歸一化處理,也會在不同長度的句子之間產生不一致性。 2. **離散數字**:神經網絡難以處理離散數字,因為它們更適合處理平滑、連續的值。離散值在訓練過程中可能會導致數值不穩定。 3. **無法捕捉相對位置**:這種方法只捕捉了絕對位置,卻無法理解單詞之間的相對距離,而這在自然語言處理任務中至關重要。 為了解決這些問題,需要一個有界、連續且周期性的函數,使模型能夠有效地捕捉絕對位置和相對位置。這就引出了位置編碼的概念。 為此,研究人員建議使用各種正弦和余弦函數的組合來創建位置向量,這樣就可以將這種位置編碼器用于任何長度的句子。 在這種方法中,每個維度由波的獨特頻率和偏移表示,值的范圍從 -1到1,有效地表示每個位置。 - **步驟4:最終嵌入** 最后,我們將標記編碼和位置編碼相加,得到最終的嵌入表示。這種組合表示既捕捉了標記的語義含義,又捕捉了它們在輸入序列中的位置信息。 ![](https://upload-images.jianshu.io/upload_images/17294212-cc8d1b9e5e6d984f.png) ### 2.2 編碼器 #### 編碼器層堆棧 Transformer編碼器由一堆相同的層組成(在原始的Transformer模型中有6層)。這個層數是通過實驗確定的,在各種任務中都能給出最佳結果。 ![](https://upload-images.jianshu.io/upload_images/17294212-2b464484a39dbe8b.png) 編碼器層的作用是將所有輸入序列轉換為連續的抽象表示,這種表示封裝了從整個序列中學到的信息。該層包含兩個子模塊: ![](https://upload-images.jianshu.io/upload_images/17294212-c896e008a6eeef61.png) - 多頭注意力機制 - 全連接網絡 但這些模塊是如何協同工作的呢?編碼器模塊的實際架構還包括額外的組件,如加法與歸一化層以及殘差連接。這些組件確保信息在通過每個模塊時能保持流暢傳遞。 輸入數據(通常是一批句子)進入第一個編碼器模塊,經過處理后,輸出會傳遞到下一個編碼器模塊。這個過程會在所有六個編碼器模塊中依次進行,最終輸出被傳遞到解碼器。每個模塊對數據的處理方式相似,這使得整個架構高效且結構有序。 ![](https://upload-images.jianshu.io/upload_images/17294212-91207e767f4568dd.png) 簡而言之,它在每個子層周圍都采用了殘差連接,然后進行層歸一化。 #### 2.2.1 多頭自注意力 ![](https://upload-images.jianshu.io/upload_images/17294212-322807d8f38834c1.png) 自注意力機制使模型能夠聚焦于輸入序列的相關部分,從而捕捉數據中的復雜關系和依賴。下面讓我們逐步了解這種自注意力是如何計算的。 1. **查詢、鍵和值矩陣**:每個詞元的嵌入向量會被轉換為三個向量:查詢(Query,Q)、鍵(Key,K)和值(Value,V)。這些向量是通過將輸入嵌入矩陣與為Q、K和V學習到的權重矩陣相乘得到的。這里有一個網絡搜索的類比,可以幫助我們理解這些矩陣背后的含義: - 查詢(Q)是你在搜索引擎欄中輸入的搜索文本,也就是你想要 “查找更多相關信息” 的詞元。 - 鍵(K)是搜索結果窗口中每個網頁的標題,它代表了查詢可以關注的可能詞元。 - 值(V)是顯示的網頁實際內容。一旦我們將合適的搜索詞(查詢)與相關結果(鍵)匹配,我們就希望獲取最相關網頁的內容(值)。 通過使用這些QKV值,模型可以計算注意力分數,這些分數決定了在生成預測時每個詞元應受到的關注程度。 ![](https://upload-images.jianshu.io/upload_images/17294212-adb2778640f33a76.png) 第一個自注意力模塊使模型能夠從整個序列中捕捉上下文信息。它不是執行單一的注意力函數,而是將查詢、鍵和值進行h次線性投影。在這些投影后的查詢、鍵和值上并行執行注意力機制,從而產生h維的輸出值。詳細的架構如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8ddab39f2fbbeef4.png) 2. **矩陣乘法(MatMul)——查詢與鍵的點積**:一旦查詢、鍵和值向量通過線性層,就會在查詢和鍵之間進行點積矩陣乘法,從而創建一個分數矩陣。 分數矩陣確定了每個詞對其他詞應給予的關注程度。因此,在同一時間步內,每個詞都會被賦予一個與其他詞相關的分數,分數越高表示關注程度越高。這個過程有效地將查詢映射到它們相應的鍵。 ![](https://upload-images.jianshu.io/upload_images/17294212-36c071313c6f314b.png) 3. **降低注意力分數的幅度**:然后,分數會除以查詢和鍵向量維度的平方根來進行縮放。這一步是為了確保梯度更穩定,因為值的乘法可能會導致過大的影響。 ![](https://upload-images.jianshu.io/upload_images/17294212-24853efcac375bf9.png) 4. **對調整后的分數應用Softmax函數**:隨后,對調整后的分數應用Softmax函數以獲得注意力權重,結果是得到0到1之間的概率值。Softmax函數會突出較高的分數,同時抑制較低的分數,從而增強模型有效確定哪些詞應受到更多關注的能力。 ![](https://upload-images.jianshu.io/upload_images/17294212-54fc8abe110c4343.png) 5. **將Softmax結果與值向量相結合**:注意力機制的下一步是將Softmax函數得到的權重與值向量相乘,得到一個輸出向量。在這個過程中,只有Softmax分數高的詞會被保留。最后,這個輸出向量會被輸入到一個線性層進行進一步處理,這樣我們最終就得到了注意力機制的輸出! 你可能會好奇,為什么它被稱為多頭注意力呢?還記得在所有過程開始之前,我們將查詢、鍵和值分解了h次吧。這個被稱為自注意力的過程,會在這些較小的階段或 “頭” 中分別進行。每個頭獨立發揮作用,生成一個輸出向量。這些輸出向量會通過一個最終的線性層,就像一個過濾器,對它們的綜合性能進行微調。這里的美妙之處在于每個頭的學習具有多樣性,豐富了編碼器模型,使其擁有強大且多方面的理解能力。 #### 2.2.2 歸一化和殘差連接 ![](https://upload-images.jianshu.io/upload_images/17294212-ff87da6091e0ccd2.png) 編碼器層中的每個子層之后都會進行歸一化步驟。此外,每個子層的輸出會與其輸入相加(殘差連接),這有助于緩解梯度消失問題,使得模型可以構建得更深。在經過前饋神經網絡之后,也會重復這個過程。 #### 2.2.3 前饋神經網絡 ![](https://upload-images.jianshu.io/upload_images/17294212-78f59be4c8a85e24.png) 歸一化后的殘差輸出會繼續通過逐點前饋網絡,這是進一步優化的關鍵階段。可以將這個網絡想象成由兩個線性層組成,中間嵌入一個ReLU激活函數,就像一座橋梁。處理后的輸出會回到起點,與逐點前饋網絡的輸入合并。合并之后會進行另一輪歸一化,確保一切都調整到位,為后續步驟做好準備。 #### 2.2.4 編碼器的輸出 最終編碼器層的輸出是一組向量,每個向量都代表了對輸入序列有著豐富上下文理解的結果。這個輸出隨后會作為Transformer模型中解碼器的輸入。這種精心的編碼為解碼器鋪平了道路,引導它在解碼時關注輸入中正確的詞??梢园阉胂蟪山ㄔ煲蛔?,你可以堆疊N個編碼器層。這個堆疊中的每一層都有機會探索和學習注意力的不同方面,就像知識的不同層次。這不僅使理解更加多樣化,還能顯著增強Transformer網絡的預測能力。 ### 2.3 解碼器 解碼器的主要作用是生成文本序列。與編碼器類似,解碼器也配備了一組相似的子層。它有兩個多頭注意力層、一個逐點前饋層,并且在每個子層之后都采用了殘差連接和層歸一化。這些組件的功能與編碼器的層類似,但有一個關鍵的不同點:解碼器中的每個多頭注意力層都有其獨特的任務。 ![](https://upload-images.jianshu.io/upload_images/17294212-f49914b15d4c3346.png) 解碼器的最后一個步驟包括一個作為分類器的線性層,頂部還有一個Softmax函數,用于計算不同單詞的概率。Transformer解碼器具有專門設計的結構,通過逐步解碼編碼信息來生成輸出。 需要注意的是,解碼器是以自回歸的方式工作的,它會以一個起始詞元開始。它巧妙地將之前生成的輸出列表作為輸入,同時結合編碼器輸出中包含的來自初始輸入的豐富注意力信息。這種解碼的順序過程會一直持續,直到解碼器生成一個表示輸出創建結束的詞元。 #### 2.3.1 輸出嵌入 在解碼器的起始階段,這個過程與編碼器類似。在這里,輸入首先會通過一個嵌入層。 #### 2.3.2 位置編碼 與編碼器類似,在嵌入之后,輸入會經過位置編碼層,這個序列旨在生成位置嵌入。然后,這些位置嵌入會被輸送到解碼器的第一個多頭注意力層,在那里會精心計算特定于解碼器輸入的注意力分數。 #### 2.3.3 解碼器層堆棧 解碼器由一堆相同的層組成(在原始Transformer模型中有6層)。每層有三個主要子組件: ![](https://upload-images.jianshu.io/upload_images/17294212-59f8446570116e47.png) 1. **掩碼自注意力機制**:這與編碼器中的自注意力機制類似,但有一個關鍵區別:它防止當前位置關注后續位置,這意味著序列中的每個詞不會受到未來詞元的影響。例如,在計算單詞 “are” 的注意力分數時,“are” 不能 “看到” 序列中后續的單詞 “you”。這種掩碼確保了對特定位置的預測只能依賴于該位置之前的已知輸出。 2. **編碼器 - 解碼器多頭注意力或交叉注意力**: ![](https://upload-images.jianshu.io/upload_images/17294212-2e7386e94a39e248.png) 在解碼器的第二個多頭注意力層中,我們可以看到編碼器和解碼器組件之間獨特的相互作用。在這里,編碼器的輸出同時充當查詢和鍵,而解碼器第一個多頭注意力層的輸出則作為值。這種設置有效地將編碼器的輸入與解碼器的輸入對齊,使解碼器能夠識別并突出編碼器輸入中最相關的部分。之后,這個第二層多頭注意力的輸出會通過一個逐點前饋層進行優化,進一步提升處理效果。在這個子層中,查詢來自前一個解碼器層,鍵和值來自編碼器的輸出。這使得解碼器中的每個位置都能關注輸入序列中的所有位置,有效地將編碼器中的信息與解碼器中的信息整合在一起。 3. **前饋神經網絡**:與編碼器類似,每個解碼器層都包括一個全連接的前饋網絡,該網絡分別且相同地應用于每個位置。 #### 2.3.4 用于生成輸出概率的線性分類器和Softmax 數據在Transformer模型中的處理過程,最終會通過一個作為分類器的最終線性層。這個分類器的大小與涉及的類別總數(詞匯表中包含的單詞數量)相對應。例如,在一個有1000個不同類別代表1000個不同單詞的場景中,分類器的輸出將是一個包含1000個元素的數組。然后,這個輸出會被輸入到一個Softmax層,該層將其轉換為一系列概率分數,每個分數都在0到1之間。這些概率分數中最高的那個至關重要,其對應的索引直接指向模型預測的序列中的下一個單詞。 ![](https://upload-images.jianshu.io/upload_images/17294212-e025bd37a15e3b9d.png) #### 2.3.5 歸一化和殘差連接 每個子層(掩碼自注意力、編碼器 - 解碼器注意力、前饋網絡)之后都會進行歸一化步驟,并且每個子層都包含一個圍繞它的殘差連接。 ![](https://upload-images.jianshu.io/upload_images/17294212-3ce20f00331907c8.png) #### 2.3.6 解碼器的輸出 最后一層的輸出會被轉換為預測序列,通常是通過一個線性層,然后接一個Softmax函數,以生成詞匯表上的概率。在操作流程中,解碼器會將新生成的輸出合并到其不斷增長的輸入列表中,然后繼續進行解碼過程。這個循環會一直重復,直到模型預測出一個特定的詞元,表示完成。概率最高的預測詞元被指定為最終類別,通常由結束詞元表示。 請再次記住,解碼器并不局限于單層。它可以由N層構成,每一層都基于從編碼器和前序層接收到的輸入進行構建。這種分層架構使模型能夠分散其關注點,并在其注意力頭之間提取不同的注意力模式。這樣的多層方法可以顯著提高模型的預測能力,因為它對不同的注意力組合有了更細致的理解。最終的架構與原文中的類似: ![](https://upload-images.jianshu.io/upload_images/17294212-8a8870205c5b0697.png) ### 3. LLM架構 機器學習(ML)中的架構指的是模型中神經元和層的排列方式。它就像一個藍圖,勾勒出模型將如何從數據中學習。不同的架構捕捉數據中的不同關系,并在訓練過程中突出特定的組件。因此,架構會影響模型擅長的任務以及它生成的輸出質量。 #### 3.1 Seq-2-Seq模型(編碼器 - 解碼器) ![](https://upload-images.jianshu.io/upload_images/17294212-794f4f8dbecd6cab.png) 編碼器 - 解碼器由兩個組件組成: - **編碼器**:接受輸入數據,并將其轉換為抽象的連續表示,捕捉輸入的主要特征。 - **解碼器**:將連續表示轉換為可理解的輸出,同時吸收其先前的輸出。 編碼和解碼過程使模型能夠通過更高效的數據表示來處理復雜的語言任務,這有助于模型連貫地做出響應。這種雙過程架構在生成任務中表現出色,如機器翻譯(將同一句話從一種語言轉換為另一種語言)和文本摘要(總結文本中的相同關鍵點),在這些任務中,在生成輸出之前理解整個輸入至關重要。然而,由于需要先處理整體輸入,它在推理時可能會較慢。 - **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年)這樣的模型,使用僅限編碼器的架構,將輸入轉換為豐富的上下文相關表示,而不直接生成新的序列。例如,BERT通過兩種創新方法在大量文本語料庫上進行預訓練:掩碼語言建模(MLM)和下一句預測。MLM的工作方式是在句子中隱藏隨機詞元,并訓練模型根據上下文預測這些詞元。通過這種方式,模型理解了詞在左右上下文中的關系。這種 “雙向” 理解對于需要強大語言理解能力的任務至關重要,如句子分類(例如情感分析)或填空。 但是,與能夠解釋和生成文本的編碼器 - 解碼器模型不同,它們本身并不生成長文本序列,而是更專注于解釋輸入。 - **LLM示例**:谷歌的BERT和ALBERT;Meta的RoBERTa;微軟的DeBERTa。 #### 3.3 自回歸模型(僅解碼器) ![](https://upload-images.jianshu.io/upload_images/17294212-b06b5d3160e63809.png) 僅解碼器架構根據先前的上下文生成輸入序列的下一部分。與基于編碼器的模型不同,它們無法理解整個輸入,但在生成下一個可能的單詞方面表現出色。因此,僅解碼器模型在輸出上更具 “創造性” 和 “開放性”。這種逐個詞元的輸出生成方式對于文本生成任務非常有效,如創意寫作、對話生成和故事完成。 - **LLM示例**:OpenAI的GPT-4和GPT-3系列;谷歌的PaLM和Bard;Meta的LLaMA和OPT。 #### 3.4 專家混合(MoE) 像Mistral 8x7B等采用的MoE,與傳統Transformer模型不同,它基于這樣的觀察:一個單一的整體語言模型可以分解為更小的、專門的子模型。一個門控網絡在這些子模型之間分配任務(例如切換輸入詞元),協調這些專注于輸入數據不同方面的子模型。 這種方法實現了擴展(高效計算和資源分配)和多樣化的技能,這使得MoE在處理具有不同要求的復雜任務方面表現出色。這種架構的目的是在不相應增加計算成本的情況下,增加LLM的參數數量。那么,Mistral 8x7B被認為是LLM嗎?盡管它在架構上與Transformer模型不同,但由于幾個原因,它仍然符合LLM的標準: - **模型大小**:它巨大的規模和參數數量 —— 1870億個參數,使其在復雜性和容量上與其他LLM相當。 - **預訓練**:與其他LLM一樣,Mistral 8x7B通過無監督學習技術在綜合數據集上進行預訓練,使其能夠理解和模仿類似人類的語言模式。 - **多功能性**:它在各種任務中表現出色,展示了LLM廣泛的能力范圍。 - **適應性**:與其他LLM一樣,Mistral 8x7B也可以針對特定任務進行微調,提高性能。 ### 4. 推理 現在我們已經介紹了Transformer的架構,并詳細了解了其組件,是時候討論推理實際上是如何執行的了。我們已經訓練了Transformer模型,現在在預測階段,其架構的行為與訓練期間略有不同。 ![](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) #### 訓練和推理的主要區別 - **訓練**:訓練Transformer模型是為了學習輸入數據中的模式和關系(例如語言建模、翻譯等)。 - **推理**:使用訓練好的Transformer模型進行預測,如生成文本、翻譯語言或對文本進行分類。 在推理過程中,主要的區別出現在解碼器中。與訓練不同,在訓練時我們已經知道整個輸出句子,可以一次性將所有詞元傳遞給解碼器,使其以非自回歸的方式運行;而在推理時,我們事先不知道完整的輸出句子。因此,解碼器必須以自回歸的方式一次生成一個翻譯單詞。它使用每個先前預測的單詞來幫助預測序列中的下一個單詞,這個過程會一直持續,直到模型生成整個翻譯后的句子。 #### 推理過程中的數據流向 1. 輸入序列被轉換為嵌入(帶有位置編碼)并輸入到編碼器中。 2. 編碼器堆棧對其進行處理,并生成輸入序列的編碼表示。 3. 我們不使用目標序列,而是使用一個僅包含句子起始詞元的空序列。將其轉換為嵌入(帶有位置編碼)并輸入到解碼器中。 4. 解碼器堆棧結合編碼器堆棧的編碼表示對其進行處理,以生成目標序列的編碼表示。 5. 輸出層將其轉換為單詞概率并生成輸出序列。 6. 我們取輸出序列的最后一個單詞作為預測單詞。這個單詞現在被填充到解碼器輸入序列的第二個位置,此時解碼器輸入序列包含一個句子起始詞元和第一個單詞。 7. 回到步驟3。像之前一樣,將新的解碼器序列輸入到模型中。然后取輸出的第二個單詞并將其附加到解碼器序列中。重復這個過程,直到它預測出一個句子結束詞元。請注意,由于編碼器序列在每次迭代中都不會改變,我們不必每次都重復步驟1和步驟2。 ![](https://upload-images.jianshu.io/upload_images/17294212-4d70594516ed47bc.png) #### 4.1 推理技術 Transformer可以通過一次輸入一個詞元序列來進行推理。編碼器用于處理輸入序列并生成嵌入序列。解碼器用于一次生成一個詞元的輸出序列。解碼器使用編碼器的輸出和先前生成的詞元來生成下一個詞元。Transformer可以使用不同的推理策略,如貪婪搜索和束搜索。 #### 4.1.1 貪婪搜索 貪婪搜索是一種簡單的推理策略。在每個時間步,解碼器根據其模型生成概率最高的詞元。這個過程會一直重復,直到解碼器生成一個序列結束詞元。貪婪搜索速度快,但可能會陷入局部最優解。 ![](https://upload-images.jianshu.io/upload_images/17294212-79fa010314f8a326.png) #### 4.1.2 束搜索 束搜索是一種更復雜的推理策略。在每個時間步,解碼器生成一組詞元,束的大小是一個超參數。然后解碼器從這組詞元中選擇前k個詞元,并繼續從這些詞元中生成詞元。這個過程會一直重復,直到解碼器生成一個序列結束詞元。束搜索比貪婪搜索慢,但可以生成更多樣化和準確的輸出 ![](https://upload-images.jianshu.io/upload_images/17294212-1676b4e96ebac535.png) ### 5. Transformer推理優化 Transformer模型以其自注意力機制而聞名,在自然語言處理和計算機視覺等任務中至關重要。推理,即這些模型對未見過的數據生成預測的階段,需要大量的計算資源。 影響Transformer推理的一個關鍵因素是浮點運算次數(FLOPs)。每一層都涉及矩陣乘法,對于像GPT-3這樣的大型模型,每個令牌可能需要數萬億次的FLOPs。為了減少計算開銷,人們使用鍵值(KV)緩存技術,使模型能夠重用先前計算的注意力向量,加快自回歸解碼速度。 內存使用是另一個限制因素,像GPT-3這樣的模型需要超過200GB的內存。量化和并行計算等技術有助于更有效地管理這些資源,但Transformer推理通常仍然受限于內存,即內存帶寬限制了計算速度。 #### 5.1 Transformer架構和推理流程 Transformer的核心架構基于自注意力機制和一系列堆疊層,每一層都包含注意力和前饋網絡。在推理過程中,Transformer應用預訓練的參數進行預測,在像GPT這樣的自回歸模型中通常是逐個令牌進行預測。 推理涉及多個矩陣運算,特別是每個注意力層中的矩陣 - 向量乘法。對于每個新令牌,模型通過將輸入嵌入與學習到的權重矩陣相乘來計算查詢(Q)、鍵(K)和值(V)向量。 注意力機制通過將查詢與轉置的鍵矩陣相乘、將結果除以維度大小的平方根并應用softmax函數來計算相關性分數。這個過程使模型能夠權衡序列中每個令牌的重要性。雖然非常有效,但這些矩陣乘法在計算上成本高昂,特別是在像GPT-3或LLaMA這樣的大型模型中,每個注意力頭每個令牌都要執行數十億次的FLOPs。 #### 5.2 Transformer推理的階段:預填充和解碼 Transformer推理分為兩個關鍵階段:預填充和解碼。這些階段決定了模型如何處理輸入令牌和生成輸出令牌,每個階段對性能的影響各不相同。 1. **預填充階段**:在預填充階段,模型并行處理整個輸入序列,將令牌轉換為鍵值對。這個階段計算量很大,但具有高度的并行性,能夠有效利用GPU。操作主要涉及矩陣 - 矩陣乘法,使GPU能夠同時處理多個令牌。預填充在批處理中表現出色,可以一起處理大量數據,最大限度地減少延遲。 2. **解碼階段**:解碼階段更多地受限于內存且是順序進行的,一次生成一個令牌。每個新令牌都依賴于先前生成的令牌,需要進行矩陣 - 向量乘法,與預填充階段的并行性質相比,這對GPU的利用率較低。順序過程會引入延遲瓶頸,使得這個階段明顯較慢,特別是在像GPT-3這樣的大型模型中。 ![](https://upload-images.jianshu.io/upload_images/17294212-178c427c22d106e9.png) 鍵值(KV)緩存是解碼階段的一項關鍵優化。通過存儲先前計算的鍵值矩陣,模型避免了重新計算,將復雜度從二次降低到線性。 ![](https://upload-images.jianshu.io/upload_images/17294212-f3afebbfa99723d9.png) ### 6. Transformer推理中的挑戰 大型Transformer模型,特別是像GPT-3這樣的大型語言模型(LLMs),由于其規模和計算需求,在推理過程中帶來了一些挑戰。這些挑戰圍繞著內存限制、延遲以及內存受限和計算受限操作之間的平衡。 1. **內存和計算需求**:在推理過程中存儲模型權重和鍵值(KV)緩存需要大量內存。像GPT-3這樣擁有1750億參數的大型模型,通常需要超過200GB的內存。此外,KV緩存的大小會隨著序列長度和批量大小線性增長,進一步增加了內存負擔。例如,一個有70億參數且序列長度為4096的LLaMA模型,僅KV緩存就可能消耗約2GB的內存。 2. **順序令牌生成中的延遲**:延遲是一個關鍵問題,特別是在解碼階段,令牌是逐個生成的。每個新令牌都依賴于前一個令牌,這導致了順序操作,無法充分利用GPU的計算能力。即使是經過高度優化的模型也會受到內存帶寬瓶頸的影響,隨著序列長度的增加,這種影響會更加明顯。 3. **批量大小和性能的平衡**:較大的批量大小可以提高GPU的利用率,特別是在預填充階段,但會受到內存容量的限制。增加批量大小有助于最大化吞吐量,但當系統受限于內存時,就會達到極限。超過這個極限,系統可能會出現收益遞減的情況,因為內存帶寬開始限制進一步的性能提升。 4. **內存受限與計算受限操作的權衡**:Transformer推理在內存受限和計算受限操作之間交替進行。在解碼階段,矩陣 - 向量乘法通常受限于內存,而預填充階段的矩陣 - 矩陣操作往往受限于計算。有效優化批量大小、KV緩存管理和精度(例如FP16、INT8)對于減少延遲和確保GPU的高效使用至關重要。 ### 7. 用于更快推理的優化技術 隨著像GPT-3、LLaMA和其他大型語言模型(LLMs)等Transformer模型的不斷擴展,優化技術對于管理推理過程中增加的內存、計算負載和延遲變得至關重要。通過應用量化、鍵值(KV)緩存、推測解碼、批處理和并行計算等技術,開發人員可以顯著提高推理性能。 #### 7.1 量化 ![](https://upload-images.jianshu.io/upload_images/17294212-e4fb60e35f7a59b3.png) 量化降低了模型權重和激活值的精度,從而實現更快的計算和更低的內存使用。模型可以使用8位(INT8)甚至更低的精度,而不是依賴32位或16位浮點精度,這減少了內存帶寬,使模型能夠更有效地處理更大的批量或更長的序列。 ![](https://upload-images.jianshu.io/upload_images/17294212-f40238d7b582d501.png) 內存帶寬利用率(MBU)公式顯示了內存帶寬如何限制性能,參數數量、每個參數的字節數和每秒令牌數都會影響推理速度。 例如,對GPT-3應用INT8量化可以使內存需求降低多達50%,直接導致推理期間的延遲更低和吞吐量更高。量化對于受內存帶寬限制的模型特別有用。 ![](https://upload-images.jianshu.io/upload_images/17294212-9e6c3a79d18f7a6b.png) #### 7.2 鍵值(KV)緩存 在自回歸模型中,每個新令牌的生成都需要訪問所有先前的令牌。隨著序列長度的增長,這會導致計算量呈二次方增加。KV緩存通過存儲先前令牌的鍵和值張量來緩解這個問題,使模型能夠重用它們而無需重新計算。 KV緩存的大小會隨著令牌數量、層數和注意力頭數線性增長。例如,在LLaMA 7B模型中,4096個令牌的序列長度將需要大約2GB的內存用于KV緩存。這種優化顯著減少了解碼階段的計算負載,提高了速度和內存效率。 #### 7.3 推測解碼 推測解碼是一種先進的優化技術,通過并行化令牌生成來減少延遲。它不是等待每個令牌按順序處理,而是使用一個較小的草稿模型提前預測幾個令牌,然后用主模型驗證這些預測。如果預測準確,就接受它們;如果不準確,就丟棄。 這種方法允許并行執行,在保持準確性的同時減少了生成令牌所需的總時間。它對于實時應用(如聊天機器人)特別有用,因為快速的響應時間至關重要。 #### 7.4 批處理 批處理是一種簡單而強大的優化Transformer推理的技術。通過同時處理多個輸入,批處理提高了GPU的利用率,因為模型權重的內存成本可以在多個請求之間共享。然而,批處理受限于可用內存,特別是在處理長序列的模型中。 傳統批處理的一個挑戰是,批處理中的不同請求可能會生成不同數量的輸出令牌。這可能會導致效率低下,因為所有請求都必須等待最長的請求完成。為了解決這個問題,動態批處理允許系統立即從批處理中移除已完成的請求,為新請求釋放資源。 #### 7.5 硬件優化:并行性 ![](https://upload-images.jianshu.io/upload_images/17294212-3ac6eb765344cb93.png) 硬件優化,特別是張量并行和流水線并行,對于擴展大型模型至關重要。這些方法將計算負載分布到多個GPU上,使系統能夠處理超出單個GPU內存容量的模型。 - **張量并行**:這種技術將模型的參數分割到多個GPU上,使它們能夠并行處理相同輸入的不同部分。張量并行在注意力層特別有效,不同的注意力頭可以獨立計算。 - **流水線并行**:這種方法將模型劃分為順序的塊,每個塊由不同的GPU處理。流水線并行減少了每個GPU的內存占用,使更大的模型能夠高效運行。然而,它會在GPU之間引入一些空閑時間,因為需要等待前一階段的數據。 這兩種并行方式對于管理像GPT-3和LLaMA這樣的大型模型至關重要,因為它們的內存和計算需求通常超出了單個GPU的能力。 #### 7.6 FlashAttention和內存效率 另一項關鍵進展是FlashAttention,它通過減少數據在內存中加載和存儲的次數來優化內存訪問模式。FlashAttention利用GPU內存層次結構更高效地執行計算,融合操作并最小化數據移動。這種技術可以顯著提高速度,特別是在具有長序列長度的模型中,通過減少內存浪費并支持更大的批量大小來實現。 ### 8. 對推理性能進行基準測試 對GPT-3和LLaMA的基準測試說明了這些優化的影響。對于GPT-3,與未優化的模型相比,KV緩存和量化的組合已被證明可以將推理時間減少多達60%,吞吐量達到每秒數百個令牌。在LLaMA中,并行技術的使用確保即使是最大的模型,如LLaMA 65B,也能在控制延遲的同時保持高吞吐量。 這些優化使這兩種模型都能有效地擴展,確保它們能夠處理從長上下文生成到實時響應的實際應用,同時顯著降低計算和內存需求。 #### 8.1 Transformer推理的趨勢 隨著Transformer模型在規模和復雜性上不斷增長,優化推理對于滿足實際應用的需求至關重要。下一波創新集中在高效擴展Transformer模型、改進內存管理以及利用先進的硬件能力上。以下是一些最具影響力的趨勢,它們正在塑造Transformer推理的未來。 #### 8.1.1 使用分頁(Paging)和FlashAttention進行內存優化 一個關鍵趨勢是通過PagedAttention和FlashAttention等技術優化內存使用。在當前的推理過程中,模型通常會過度分配內存以處理可能的最大序列長度,這導致了效率低下。PagedAttention通過按需分配內存來解決這個問題,將鍵值(KV)緩存分解為按需獲取的較小塊。 FlashAttention通過優化計算順序和減少內存與計算單元之間的數據移動,進一步提高了內存效率。通過融合操作并利用GPU內存層次結構,FlashAttention可以顯著減少內存浪費,并支持更大的批量大小和更快的處理速度。這些進展對于擴展大型模型同時保持高性能至關重要。 #### 8.1.2 多查詢和分組查詢注意力 優化注意力機制本身是另一個重要趨勢。多查詢注意力(MQA)和分組查詢注意力(GQA)是兩種變體,它們在保持模型性能的同時減少了內存占用。在MQA中,所有頭共享相同的鍵值對,這減少了KV緩存的大小,同時保持了準確性。 分組查詢注意力(GQA)在MQA和傳統多頭注意力之間取得平衡,為分組的頭使用共享的鍵值對。這種方法進一步減少了內存使用,同時保持了高性能,使其對于像LLaMA 2 70B這樣的長上下文模型特別有用。 #### 8.1.3 并行性:張量和序列 并行性仍然是擴展大型模型的核心策略。張量并行將模型層劃分為可以在多個GPU上處理的獨立塊,減少了單個設備上的內存負擔。這種方法在注意力頭和前饋層中效果很好,并行處理可以顯著提高效率。 序列并行通過在序列維度上分割像LayerNorm和Dropout這樣的操作,進一步提高了內存效率。這減少了內存開銷,特別是對于長序列任務,并使模型能夠更有效地擴展。 #### 8.1.4 實時應用程序的推測推理 對于實時應用,推測推理提供了一種創新的方法來減少延遲。通過使用較小的草稿模型提前預測多個令牌,推測推理允許并行執行。然后,主模型驗證這些草稿令牌,決定接受或丟棄它們。 ### 9. 處理大型數據集 在大型數據集上訓練Transformer帶來了獨特的挑戰,需要謹慎的策略: #### 9.1 高效的數據加載和預處理 - **并行數據加載**:利用像TensorFlow的tf.data或PyTorch的DataLoader這樣的框架,并結合多線程,可以加快數據預處理速度。 - **打亂和批處理**:適當的打亂可以防止模型過度擬合特定的數據順序,批處理則確保GPU的高效利用。 #### 9.2 分布式訓練 - **數據并行**:將模型復制到多個GPU上,每個GPU處理不同的小批量數據,并聚合梯度。 - **模型并行**:將模型本身分割到多個GPU上,這對于無法裝入單個設備內存的非常大的模型很有用。 #### 9.3 混合精度訓練 利用16位(半精度)浮點運算而不是32位,可以顯著減少內存使用并加快計算速度,同時對準確性的影響較小。 #### 9.4 梯度累積 在GPU內存限制批量大小的情況下很有用。在執行優化器步驟之前,在多個較小的批量上累積梯度。 #### 9.5 檢查點和恢復 在訓練期間定期保存模型狀態有助于在出現故障時從上一個檢查點恢復,也可用于提前停止訓練和微調。 #### 9.6 數據增強和采樣 - **數據增強技術**:增加數據的可變性,有助于模型泛化。 - **智能采樣策略**:確保模型不會過度擬合常見模式,同時不會忽略罕見但重要的模式。 ### 10. 總結 本文深入探討了大型語言模型(LLMs)的開發和優化,首先概述了它們的構建和訓練方法。它追溯了從Transformer之前的模型到Transformer的變革性引入的演變,強調了關鍵的 “注意力就是你所需要的一切” 這一概念。 文章的核心剖析了Transformer架構,詳細介紹了其組件,如嵌入層、編碼器 - 解碼器交互和自注意力機制。它探索了各種LLM架構,包括Seq-2-Seq、自動編碼和自回歸模型,揭示了它們的獨特功能。 對于實際部署,文章研究了推理策略、優化技術,如量化、KV緩存、推測解碼和硬件并行性,并以GPT-3和LLaMA等實際例子進行說明。性能基準測試、內存優化和并行技術突出了高效Transformer推理的趨勢。 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發布
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容