LLM 課程文件

Transformers 是如何工作的?

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Transformers 是如何工作的?

Ask a Question

在本節中,我們將瞭解 Transformer 模型的架構,並深入探討注意力機制、編碼器-解碼器架構等概念。

🚀 我們正在這裡提升難度。本節內容詳細且技術性強,所以如果你不能立刻理解所有內容,也不必擔心。我們將在課程的後續部分重新回顧這些概念。

Transformer 簡史

以下是 Transformer 模型(短暫)歷史中的一些參考點

A brief chronology of Transformers models.

Transformer 架構於 2017 年 6 月推出。最初的研究重點是翻譯任務。隨後,幾款有影響力的模型相繼問世,包括

  • 2018 年 6 月GPT,首個預訓練的 Transformer 模型,用於在各種 NLP 任務上進行微調,並取得了最先進的成果。

  • 2018 年 10 月BERT,另一個大型預訓練模型,旨在生成更好的句子摘要(下一章將詳細介紹!)。

  • 2019 年 2 月GPT-2,GPT 的一個改進(且更大)版本,由於倫理問題未立即公開發布。

  • 2019 年 10 月T5,一個專注於多工的序列到序列 Transformer 架構實現。

  • 2020 年 5 月GPT-3,一個比 GPT-2 更大的版本,能夠在各種任務上表現出色,而無需進行微調(稱為*零樣本學習*)。

  • 2022 年 1 月InstructGPT,一個經過訓練以更好地遵循指令的 GPT-3 版本。這份清單遠非詳盡,僅旨在突出幾種不同型別的 Transformer 模型。廣義上,它們可以分為三類

  • 2023 年 1 月Llama,一個能夠生成多種語言文字的大型語言模型。

  • 2023 年 3 月Mistral,一個擁有 70 億引數的語言模型,在所有評估基準上均優於 Llama 2 13B,它利用分組查詢注意力(grouped-query attention)來加快推理速度,並使用滑動視窗注意力(sliding window attention)來處理任意長度的序列。

  • 2024 年 5 月Gemma 2,一系列輕量級、最先進的開放模型,引數範圍從 20 億到 270 億不等,融合了交錯的區域性-全域性注意力(interleaved local-global attentions)和分組查詢注意力(group-query attention),其中較小的模型使用知識蒸餾進行訓練,以提供與大 2-3 倍的模型相媲美的效能。

  • 2024 年 11 月SmolLM2,一款最先進的小型語言模型(引數範圍從 1.35 億到 17 億),儘管其體積小巧,卻實現了令人印象深刻的效能,為移動和邊緣裝置開啟了新的可能性。

  • GPT-like(也稱為*自迴歸* Transformer 模型)

  • BERT-like(也稱為*自編碼* Transformer 模型)

  • T5-like(也稱為*序列到序列* Transformer 模型)

我們稍後將更深入地探討這些系列。

Transformers 是語言模型

所有上述提到的 Transformer 模型(GPT、BERT、T5等)都是作為*語言模型*進行訓練的。這意味著它們是在大量的原始文字上以自監督的方式進行訓練的。

自監督學習是一種訓練方式,其目標是從模型的輸入中自動計算出來的。這意味著不需要人類來標註資料!

這類模型對其訓練所用的語言形成了一種統計學上的理解,但對於特定的實際任務來說,這種模型的用處不大。因此,通用的預訓練模型會經過一個稱為*遷移學習*或*微調*的過程。在這個過程中,模型會在給定任務上以有監督的方式進行微調——也就是說,使用人工標註的標籤。

任務的一個例子是,在閱讀了前面的 *n* 個詞後,預測句子中的下一個詞。這被稱為*因果語言建模*,因為輸出取決於過去和現在的輸入,而不是未來的輸入。

Example of causal language modeling in which the next word from a sentence is predicted.

另一個例子是*掩碼語言建模*,模型在這種任務中預測句子中被掩蓋的詞。

Example of masked language modeling in which a masked word from a sentence is predicted.

Transformers 是大型模型

除了少數例外(如DistilBERT),實現更好效能的通用策略是增加模型的尺寸以及它們預訓練時使用的資料量。

Number of parameters of recent Transformers models

不幸的是,訓練一個模型,特別是大型模型,需要大量的資料。這在時間和計算資源上都非常昂貴。它甚至會轉化為環境影響,如下面的圖表所示。

The carbon footprint of a large language model.

這展示了一個團隊主導的(非常大的)模型專案,該團隊有意識地嘗試減少預訓練對環境的影響。為了獲得最佳超引數而進行大量試驗的碳足跡會更高。

想象一下,如果每次研究團隊、學生組織或公司想要訓練一個模型時,都從頭開始。這將導致巨大的、不必要的全球成本!

這就是為什麼共享語言模型至關重要:共享訓練好的權重並在已訓練的權重之上進行構建,可以減少整個社群的計算成本和碳足跡。

順便說一下,您可以透過多種工具來評估模型訓練的碳足跡。例如 ML CO2 ImpactCode Carbon,後者已整合在 🤗 Transformers 中。要了解更多資訊,您可以閱讀這篇部落格文章,它將向您展示如何生成一個包含訓練碳足跡估算的 emissions.csv 檔案,以及 🤗 Transformers 中關於此主題的文件

遷移學習

預訓練是從零開始訓練模型的行為:權重是隨機初始化的,訓練開始時沒有任何先驗知識。

The pretraining of a language model is costly in both time and money.

這種預訓練通常在非常大量的資料上進行。因此,它需要一個非常大的資料語料庫,並且訓練可能需要長達數週的時間。

另一方面,微調是在模型預訓練之後進行的訓練。要進行微調,您首先獲取一個預訓練的語言模型,然後使用特定於您的任務的資料集進行額外的訓練。等等——為什麼不從一開始就為您的最終用例訓練模型(從零開始)?有幾個原因

  • 預訓練模型已經在與微調資料集有某些相似性的資料集上進行了訓練。因此,微調過程能夠利用初始模型在預訓練期間獲得的知識(例如,對於NLP問題,預訓練模型將對您任務中使用的語言有某種統計學上的理解)。
  • 由於預訓練模型已經在大量資料上進行了訓練,微調只需要很少的資料就能獲得不錯的結果。
  • 出於同樣的原因,獲得良好結果所需的時間和資源要少得多。

例如,人們可以利用一個在英語上訓練的預訓練模型,然後在一個 arXiv 語料庫上進行微調,從而得到一個基於科學/研究的模型。微調只需要有限的資料:預訓練模型獲得的知識被“遷移”了,因此得名*遷移學習*。

The fine-tuning of a language model is cheaper than pretraining in both time and money.

因此,微調模型的時間、資料、財務和環境成本都較低。迭代不同的微調方案也更快、更容易,因為訓練的限制比完整的預訓練要少。

這個過程也會比從頭開始訓練取得更好的結果(除非你有大量資料),這就是為什麼你應該總是嘗試利用一個預訓練模型——一個儘可能接近你手頭任務的模型——並對其進行微調。

通用 Transformer 架構

在本節中,我們將介紹 Transformer 模型的一般架構。如果您不理解某些概念,請不要擔心;後面會有詳細的章節涵蓋每個元件。

該模型主要由兩個模組組成

  • 編碼器 (左側):編碼器接收一個輸入並構建其表示(其特徵)。這意味著模型被最佳化以從輸入中獲取理解。
  • 解碼器 (右側):解碼器使用編碼器的表示(特徵)以及其他輸入來生成目標序列。這意味著模型被最佳化用於生成輸出。
Architecture of a Transformers models

根據任務的不同,這些部分中的每一部分都可以獨立使用

  • 僅編碼器模型:適用於需要理解輸入的任務,例如句子分類和命名實體識別。
  • 僅解碼器模型:適用於生成性任務,如文字生成。
  • 編碼器-解碼器模型序列到序列模型:適用於需要輸入的生成任務,例如翻譯或摘要。

我們將在後面的章節中獨立深入探討這些架構。

注意力層

Transformer 模型的一個關鍵特徵是它們由稱為*注意力層*的特殊層構成。實際上,介紹 Transformer 架構的論文標題就是《注意力就是你所需要的一切》(Attention Is All You Need)!我們將在課程的後面部分探討注意力層的細節;現在,你只需要知道,當處理每個詞的表示時,這一層會告訴模型特別關注你傳遞給它的句子中的某些詞(或多或少地忽略其他詞)。

為了將其置於上下文中,考慮將文字從英語翻譯成法語的任務。給定輸入“You like this course”,翻譯模型需要同時關注相鄰的詞“You”,以便為“like”這個詞獲得正確的翻譯,因為在法語中動詞“like”的變位會根據主語而變化。然而,句子的其餘部分對於這個詞的翻譯是無用的。同樣,在翻譯“this”時,模型還需要注意“course”這個詞,因為“this”的翻譯會根據相關名詞是陽性還是陰性而有所不同。同樣,句子中的其他詞對於“course”的翻譯也不重要。對於更復雜的句子(以及更復雜的語法規則),模型需要特別注意可能出現在句子中較遠位置的詞,以便正確翻譯每個詞。

同樣的概念適用於任何與自然語言相關的任務:一個詞本身有其意義,但這個意義深受上下文的影響,而上下文可以是正在研究的詞之前或之後的任何其他詞(或多個詞)。

現在你對注意力層有了大致的瞭解,讓我們更仔細地看看 Transformer 架構。

原始架構

Transformer 架構最初是為翻譯而設計的。在訓練期間,編碼器接收某種語言的輸入(句子),而解碼器接收相同句子在目標語言中的翻譯。在編碼器中,注意力層可以使用句子中的所有詞(因為,正如我們剛才所見,一個給定詞的翻譯可能依賴於它在句子中之前和之後的內容)。然而,解碼器是按順序工作的,只能關注它已經翻譯過的句子中的詞(因此,只能是當前正在生成的詞之前的詞)。例如,當我們預測了翻譯目標的前三個詞時,我們將它們提供給解碼器,然後解碼器使用編碼器的所有輸入來嘗試預測第四個詞。

為了在訓練期間加快速度(當模型可以訪問目標句子時),解碼器被饋送整個目標,但不允許使用未來的詞(如果在嘗試預測位置2的詞時能夠訪問位置2的詞,問題就不會那麼難了!)。例如,在嘗試預測第四個詞時,注意力層將只能訪問位置1到3的詞。

原始的 Transformer 架構是這樣的,編碼器在左邊,解碼器在右邊

Architecture of a Transformers models

請注意,解碼器塊中的第一個注意力層關注解碼器的所有(過去的)輸入,但第二個注意力層使用編碼器的輸出。因此,它可以訪問整個輸入句子,以便最好地預測當前詞。這非常有用,因為不同語言的語法規則可能會導致詞序不同,或者句子後面提供的某些上下文可能有助於確定給定詞的最佳翻譯。

注意力掩碼也可以在編碼器/解碼器中使用,以防止模型關注某些特殊的詞——例如,用於在批次處理句子時使所有輸入長度相同的特殊填充詞。

架構與檢查點

當我們在本課程中深入探討 Transformer 模型時,您會看到提及*架構*、*檢查點*以及*模型*。這些術語的含義略有不同

  • 架構:這是模型的骨架——模型中每一層和每個操作的定義。
  • 檢查點:這些是將載入到特定架構中的權重。
  • 模型:這是一個總稱,不如“架構”或“檢查點”精確:它可以指兩者。本課程在必要時會明確指出是*架構*還是*檢查點*,以減少歧義。

例如,BERT 是一種架構,而 `bert-base-cased` 是一個檢查點,這是谷歌團隊為 BERT 的首次釋出而訓練的一組權重。然而,人們可以說“BERT 模型”和“`bert-base-cased` 模型”。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.