LLM 課程文件
🤗 Transformers 如何解決任務
並獲得增強的文件體驗
開始使用
🤗 Transformers 如何解決任務
在 Transformer 能做什麼? 一節中,您瞭解了自然語言處理(NLP)、語音和音訊、計算機視覺任務以及它們的一些重要應用。本頁將深入探討模型如何解決這些任務,並解釋其內部工作原理。解決特定任務的方法有很多,一些模型可能會實現某些技術,甚至從新的角度來處理任務,但對於 Transformer 模型,其基本思想是相同的。由於其靈活的架構,大多數模型都是編碼器、解碼器或編碼器-解碼器結構的變體。
在深入研究具體的架構變體之前,瞭解大多數任務都遵循一個相似的模式是很有幫助的:輸入資料透過模型處理,然後輸出被解釋用於特定任務。不同之處在於資料的準備方式、使用的模型架構變體以及輸出的處理方式。
為了解釋任務是如何解決的,我們將逐步介紹模型內部發生的事情,以輸出有用的預測。我們將涵蓋以下模型及其對應的任務:
- Wav2Vec2 用於音訊分類和自動語音識別(ASR)
- Vision Transformer (ViT) 和 ConvNeXT 用於影像分類
- DETR 用於目標檢測
- Mask2Former 用於影像分割
- GLPN 用於深度估計
- BERT 用於使用編碼器的 NLP 任務,如文字分類、詞元分類和問答
- GPT2 用於使用解碼器的 NLP 任務,如文字生成
- BART 用於使用編碼器-解碼器的 NLP 任務,如摘要和翻譯
在繼續之前,最好對原始的 Transformer 架構有一些基本的瞭解。瞭解編碼器、解碼器和注意力機制的工作原理將有助於您理解不同 Transformer 模型的工作方式。請務必檢視我們的上一節以獲取更多資訊!
用於語言的 Transformer 模型
語言模型是現代 NLP 的核心。它們透過學習文字中詞語或詞元之間的統計模式和關係,來理解和生成人類語言。
Transformer 最初是為機器翻譯設計的,此後,它已成為解決所有 AI 任務的預設架構。有些任務更適合 Transformer 的編碼器結構,而另一些任務則更適合解碼器。還有一些任務同時利用了 Transformer 的編碼器-解碼器結構。
語言模型的工作原理
語言模型透過訓練來預測給定上下文下某個詞語的機率。這使它們對語言有了基礎的理解,可以推廣到其他任務。
訓練 Transformer 模型主要有兩種方法:
掩碼語言建模(MLM):由像 BERT 這樣的編碼器模型使用,這種方法隨機掩蓋輸入中的一些詞元,並訓練模型根據周圍的上下文預測原始詞元。這使得模型能夠學習雙向上下文(同時關注被掩蓋詞語之前和之後的詞語)。
因果語言建模(CLM):由像 GPT 這樣的解碼器模型使用,這種方法根據序列中所有之前的詞元來預測下一個詞元。模型只能使用左側(之前的詞元)的上下文來預測下一個詞元。
語言模型的型別
在 Transformers 庫中,語言模型通常分為三種架構類別:
僅編碼器模型(如 BERT):這些模型使用雙向方法來理解來自兩個方向的上下文。它們最適合需要深入理解文字的任務,如分類、命名實體識別和問答。
僅解碼器模型(如 GPT、Llama):這些模型從左到右處理文字,特別擅長文字生成任務。它們可以根據提示完成句子、寫文章,甚至生成程式碼。
編碼器-解碼器模型(如 T5、BART):這些模型結合了兩種方法,使用編碼器理解輸入,使用解碼器生成輸出。它們在序列到序列任務中表現出色,如翻譯、摘要和問答。
正如我們在上一節中介紹的,語言模型通常在大量文字資料上以自監督的方式(無需人工標註)進行預訓練,然後在特定任務上進行微調。這種被稱為遷移學習的方法,使得這些模型能夠用相對少量的任務特定資料適應許多不同的 NLP 任務。
在接下來的部分中,我們將探討特定的模型架構以及它們如何應用於語音、視覺和文字領域的各種任務。
瞭解 Transformer 架構的哪個部分(編碼器、解碼器或兩者)最適合特定的 NLP 任務是選擇正確模型的關鍵。通常,需要雙向上下文的任務使用編碼器,生成文字的任務使用解碼器,而將一個序列轉換為另一個序列的任務則使用編碼器-解碼器。
文字生成
文字生成涉及根據提示或輸入建立連貫且與上下文相關的文字。
GPT-2 是一個在大量文字上預訓練的僅解碼器模型。它可以在給定提示的情況下生成令人信服(儘管不總是真實的!)的文字,並完成其他 NLP 任務,如問答,儘管沒有明確為此進行訓練。

GPT-2 使用位元組對編碼 (BPE) 來對詞語進行分詞並生成詞元嵌入。位置編碼被新增到詞元嵌入中,以指示序列中每個詞元的位置。輸入嵌入透過多個解碼器塊,輸出最終的隱藏狀態。在每個解碼器塊中,GPT-2 使用一個掩碼自注意力層,這意味著 GPT-2 不能關注未來的詞元。它只被允許關注左邊的詞元。這與 BERT 的 [
mask
] 詞元不同,因為在掩碼自注意力中,注意力掩碼用於將未來詞元的分數設定為0
。解碼器的輸出傳遞給一個語言建模頭,該頭進行線性變換,將隱藏狀態轉換為 logits。標籤是序列中的下一個詞元,這是透過將 logits 向右移動一位建立的。在移位的 logits 和標籤之間計算交叉熵損失,以輸出下一個最可能的詞元。
GPT-2 的預訓練目標完全基於因果語言建模,即預測序列中的下一個詞。這使得 GPT-2 特別擅長涉及生成文字的任務。
準備好嘗試文字生成了嗎?檢視我們完整的因果語言建模指南,學習如何微調 DistilGPT-2 並用它進行推理!
文字分類
文字分類涉及為文字文件分配預定義的類別,例如情感分析、主題分類或垃圾郵件檢測。
BERT 是一個僅編碼器模型,是第一個有效實現深度雙向性以透過關注兩側的詞語來學習更豐富的文字表示的模型。
BERT 使用 WordPiece 分詞法來生成文字的詞元嵌入。為了區分單個句子和句子對,會新增一個特殊的
[SEP]
詞元來區分它們。在每個文字序列的開頭都會新增一個特殊的[CLS]
詞元。帶有[CLS]
詞元的最終輸出被用作分類頭的輸入,用於分類任務。BERT 還添加了一個片段嵌入,以表示一個詞元屬於句子對中的第一個句子還是第二個句子。BERT 的預訓練有兩個目標:掩碼語言建模和下一句預測。在掩碼語言建模中,輸入詞元中一定比例的詞元被隨機掩蓋,模型需要預測這些詞元。這解決了雙向性的問題,即模型可能會作弊,看到所有的詞語然後“預測”下一個詞。預測的掩碼詞元的最終隱藏狀態被傳遞到一個前饋網路,該網路對詞彙表進行 softmax,以預測被掩蓋的詞語。
第二個預訓練目標是下一句預測。模型必須預測句子 B 是否跟隨句子 A。一半的時間,句子 B 是下一句,另一半的時間,句子 B 是一個隨機的句子。預測結果(是否是下一句)被傳遞到一個前饋網路,該網路對兩個類別(
IsNext
和NotNext
)進行 softmax。輸入嵌入透過多個編碼器層,輸出最終的隱藏狀態。
要將預訓練模型用於文字分類,需要在基礎 BERT 模型之上新增一個序列分類頭。序列分類頭是一個線性層,它接受最終的隱藏狀態並進行線性變換,將其轉換為 logits。在 logits 和目標之間計算交叉熵損失,以找到最可能的標籤。
準備好嘗試文字分類了嗎?檢視我們完整的文字分類指南,學習如何微調 DistilBERT 並用它進行推理!
詞元分類
詞元分類涉及為序列中的每個詞元分配一個標籤,例如在命名實體識別或詞性標註中。
要將 BERT 用於命名實體識別(NER)等詞元分類任務,需要在基礎 BERT 模型之上新增一個詞元分類頭。詞元分類頭是一個線性層,它接受最終的隱藏狀態並進行線性變換,將其轉換為 logits。在 logits 和每個詞元之間計算交叉熵損失,以找到最可能的標籤。
準備好嘗試詞元分類了嗎?檢視我們完整的詞元分類指南,學習如何微調 DistilBERT 並用它進行推理!
問答
問答涉及在給定的上下文或段落中找到問題的答案。
要將 BERT 用於問答,需要在基礎 BERT 模型之上新增一個跨度分類頭。這個線性層接受最終的隱藏狀態並進行線性變換,以計算對應於答案的跨度
開始和結束 logits。在 logits 和標籤位置之間計算交叉熵損失,以找到與答案相對應的最可能的文字跨度。
準備好嘗試問答任務了嗎?檢視我們完整的問答指南,學習如何微調 DistilBERT 並用它進行推理!
💡 注意到 BERT 在預訓練後,用於不同任務是多麼容易。您只需要在預訓練模型上新增一個特定的頭,就可以將隱藏狀態處理成您想要的輸出!
摘要
摘要涉及將較長的文字壓縮成較短的版本,同時保留其關鍵資訊和意義。
像 BART 和 T5 這樣的編碼器-解碼器模型是為摘要任務的序列到序列模式設計的。我們將在本節中解釋 BART 的工作原理,然後您可以在最後嘗試微調 T5。

BART 的編碼器架構與 BERT 非常相似,接受文字的詞元和位置嵌入。BART 的預訓練方式是破壞輸入,然後用解碼器重建它。與其他具有特定破壞策略的編碼器不同,BART 可以應用任何型別的破壞。其中,文字填充破壞策略效果最好。在文字填充中,多個文字跨度被替換為單個 [
mask
] 詞元。這很重要,因為模型必須預測被掩蓋的詞元,這也教會了模型預測缺失詞元的數量。輸入嵌入和被掩蓋的跨度透過編碼器輸出最終的隱藏狀態,但與 BERT 不同,BART 不在末尾新增最終的前饋網路來預測一個詞。編碼器的輸出被傳遞給解碼器,解碼器必須預測被掩蓋的詞元以及編碼器輸出中任何未被破壞的詞元。這為解碼器恢復原始文字提供了額外的上下文。解碼器的輸出被傳遞給一個語言建模頭,該頭進行線性變換,將隱藏狀態轉換為 logits。在 logits 和標籤(即向右移動一位的詞元)之間計算交叉熵損失。
準備好嘗試摘要任務了嗎?檢視我們完整的摘要指南,學習如何微調 T5 並用它進行推理!
有關文字生成的更多資訊,請檢視文字生成策略指南!
翻譯
翻譯涉及將文字從一種語言轉換為另一種語言,同時保留其含義。翻譯是序列到序列任務的另一個例子,這意味著您可以使用像 BART 或 T5 這樣的編碼器-解碼器模型來完成。我們將在本節中解釋 BART 的工作原理,然後您可以在最後嘗試微調 T5。
BART 透過新增一個獨立的隨機初始化的編碼器來適應翻譯任務,該編碼器將源語言對映為可以被解碼為目標語言的輸入。這個新編碼器的嵌入被傳遞給預訓練的編碼器,而不是原始的詞嵌入。源編碼器透過使用模型輸出的交叉熵損失來更新源編碼器、位置嵌入和輸入嵌入進行訓練。模型引數在第一步中被凍結,然後在第二步中所有模型引數一起進行訓練。BART 後來推出了一個多語言版本 mBART,專門用於翻譯,並在多種不同語言上進行了預訓練。
準備好嘗試翻譯任務了嗎?檢視我們完整的翻譯指南,學習如何微調 T5 並用它進行推理!
正如您在本指南中所看到的,許多模型儘管處理不同的任務,卻遵循相似的模式。理解這些共同的模式可以幫助您快速掌握新模型的工作原理,以及如何將現有模型調整以適應您的特定需求。
超越文字的模態
Transformer 不僅限於文字。它們也可以應用於其他模態,如語音和音訊、影像和影片。當然,在本課程中,我們將重點關注文字,但我們可以簡要介紹其他模態。
語音和音訊
讓我們首先探討 Transformer 模型如何處理語音和音訊資料,與文字或影像相比,這帶來了獨特的挑戰。
Whisper 是一個編碼器-解碼器(序列到序列)Transformer,在 68 萬小時的有標籤音訊資料上進行了預訓練。如此大量的預訓練資料使其能夠在英語和許多其他語言的音訊任務上實現零樣本效能。解碼器使 Whisper 能夠將其學習到的語音表示對映到有用的輸出,如文字,而無需額外的微調。Whisper 可以開箱即用。

圖表來自 Whisper 論文。
該模型有兩個主要組成部分:
一個編碼器處理輸入音訊。原始音訊首先被轉換為對數梅爾頻譜圖。然後,該頻譜圖透過一個 Transformer 編碼器網路。
一個解碼器接收編碼後的音訊表示,並自迴歸地預測相應的文字詞元。它是一個標準的 Transformer 解碼器,經過訓練,在給定先前的詞元和編碼器輸出的情況下,預測下一個文字詞元。在解碼器輸入的開頭使用特殊詞元,以引導模型執行特定任務,如轉錄、翻譯或語言識別。
Whisper 在一個龐大而多樣化的資料集上進行了預訓練,該資料集包含從網路上收集的 68 萬小時的有標籤音訊資料。這種大規模、弱監督的預訓練是其在多種語言和任務上實現強大零樣本效能的關鍵。
現在 Whisper 已經預訓練好了,您可以直接用它進行零樣本推理,或者在您的資料上進行微調,以在特定任務(如自動語音識別或語音翻譯)上獲得更好的效能!
Whisper 的關鍵創新在於其訓練資料規模空前,包含了來自網際網路的多樣化、弱監督的音訊資料。這使得它能夠非常好地泛化到不同的語言、口音和任務,而無需進行特定任務的微調。
自動語音識別
要將預訓練模型用於自動語音識別,您需要利用其完整的編碼器-解碼器結構。編碼器處理音訊輸入,解碼器自迴歸地逐個詞元生成轉錄文字。在微調時,模型通常使用標準的序列到序列損失(如交叉熵)進行訓練,以根據音訊輸入預測正確的文字詞元。
使用微調模型進行推理的最簡單方法是在 pipeline
中使用。
from transformers import pipeline
transcriber = pipeline(
task="automatic-speech-recognition", model="openai/whisper-base.en"
)
transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
# Output: {'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
準備好嘗試自動語音識別了嗎?檢視我們完整的自動語音識別指南,學習如何微調 Whisper 並用它進行推理!
計算機視覺
現在讓我們轉向計算機視覺任務,這些任務涉及理解和解釋來自影像或影片的視覺資訊。
處理計算機視覺任務有兩種方法:
- 將影像分割成一系列影像塊,並用 Transformer 並行處理它們。
- 使用現代的 CNN,如 ConvNeXT,它依賴於卷積層,但採用了現代的網路設計。
第三種方法是將 Transformer 與卷積結合起來(例如,卷積視覺 Transformer 或 LeViT)。我們不會討論這些,因為它們只是結合了我們在此研究的兩種方法。
ViT 和 ConvNeXT 通常用於影像分類,但對於其他視覺任務,如目標檢測、分割和深度估計,我們將分別研究 DETR、Mask2Former 和 GLPN;這些模型更適合這些任務。
影像分類
影像分類是計算機視覺的基礎任務之一。讓我們看看不同的模型架構如何解決這個問題。
ViT 和 ConvNeXT 都可以用於影像分類;主要區別在於 ViT 使用注意力機制,而 ConvNeXT 使用卷積。
ViT 完全用純 Transformer 架構取代了卷積。如果您熟悉原始的 Transformer,那麼您已經基本理解了 ViT。

ViT 引入的主要變化在於如何將影像輸入到 Transformer 中:
一張影像被分割成多個不重疊的方形影像塊,每個影像塊都變成一個向量或影像塊嵌入。影像塊嵌入由一個二維卷積層生成,該層建立了正確的輸入維度(對於基礎 Transformer 來說,每個影像塊嵌入有 768 個值)。如果您有一張 224x224 畫素的影像,您可以將其分割成 196 個 16x16 的影像塊。就像文字被分詞成詞語一樣,影像被“分詞”成一個影像塊序列。
一個可學習的嵌入——一個特殊的
[CLS]
詞元——被新增到影像塊嵌入的開頭,就像 BERT 一樣。[CLS]
詞元的最終隱藏狀態被用作附加的分類頭的輸入;其他輸出則被忽略。這個詞元幫助模型學習如何編碼影像的表示。最後要新增到影像塊和可學習嵌入中的是位置嵌入,因為模型不知道影像塊的排列順序。位置嵌入也是可學習的,並且與影像塊嵌入具有相同的大小。最後,所有嵌入都被傳遞給 Transformer 編碼器。
輸出,特別是僅包含
[CLS]
詞元的輸出,被傳遞給一個多層感知器頭(MLP)。ViT 的預訓練目標就是分類。與其他分類頭一樣,MLP 頭將輸出轉換為類別標籤上的 logits,並計算交叉熵損失以找到最可能的類別。
準備好嘗試影像分類了嗎?檢視我們完整的影像分類指南,學習如何微調 ViT 並用它進行推理!
注意 ViT 和 BERT 之間的相似之處:兩者都使用一個特殊的詞元([CLS]
)來捕捉整體表示,兩者都在其嵌入中添加了位置資訊,並且兩者都使用 Transformer 編碼器來處理詞元/影像塊序列。