Transformers 文件
詞彙表
並獲得增強的文件體驗
開始使用
詞彙表
本詞彙表定義了通用的機器學習和 🤗 Transformers 術語,以幫助您更好地理解文件。
A
注意力掩碼
注意力掩碼是一個可選引數,用於批次處理序列。
此引數向模型指示哪些令牌應該被注意,哪些不應該。
例如,考慮以下兩個序列
>>> from transformers import BertTokenizer
>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")
>>> sequence_a = "This is a short sequence."
>>> sequence_b = "This is a rather long sequence. It is at least longer than the sequence A."
>>> encoded_sequence_a = tokenizer(sequence_a)["input_ids"]
>>> encoded_sequence_b = tokenizer(sequence_b)["input_ids"]
編碼後的長度不同
>>> len(encoded_sequence_a), len(encoded_sequence_b)
(8, 19)
因此,我們不能將它們原樣放入同一個張量中。第一個序列需要填充到第二個序列的長度,或者第二個序列需要截斷到第一個序列的長度。
在第一種情況下,ID列表將透過填充索引擴充套件。我們可以將一個列表傳遞給分詞器,並要求它像這樣填充
>>> padded_sequences = tokenizer([sequence_a, sequence_b], padding=True)
我們可以看到,第一個句子右側已經添加了0,使其與第二個句子長度相同
>>> padded_sequences["input_ids"]
[[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]]
然後可以將其轉換為PyTorch或TensorFlow中的張量。注意力掩碼是一個二進位制張量,指示填充索引的位置,以便模型不會關注它們。對於BertTokenizer,1
表示應該被關注的值,而0
表示填充值。此注意力掩碼在分詞器返回的字典中,鍵為“attention_mask”
>>> padded_sequences["attention_mask"]
[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
自編碼模型
自迴歸模型
B
骨幹網路
骨幹網路是輸出原始隱藏狀態或特徵的網路(嵌入和層)。它通常連線到頭部,頭部接收特徵作為輸入以進行預測。例如,ViTModel是一個沒有特定頭部的骨幹網路。其他模型也可以使用VitModel
作為骨幹網路,例如DPT。
C
因果語言建模
一種預訓練任務,模型按順序讀取文字並預測下一個單詞。通常透過讀取整個句子,但在模型內部使用掩碼隱藏特定時間步的未來令牌來實現。
通道
彩色影像由三個通道(紅色、綠色和藍色,即RGB)的值組合而成,灰度影像只有一個通道。在🤗 Transformers中,通道可以是影像張量的第一個或最後一個維度:[n_channels
, height
, width
] 或 [height
, width
, n_channels
]。
連線時序分類 (CTC)
一種演算法,允許模型在不知道輸入和輸出如何精確對齊的情況下進行學習;CTC 計算給定輸入的所有可能輸出的分佈,並從中選擇最可能的輸出。CTC 通常用於語音識別任務,因為語音由於說話者的不同語速等各種原因,並不總是能與文字記錄完美對齊。
卷積
神經網路中的一種層型別,其中輸入矩陣與較小的矩陣(核或濾波器)進行元素乘法,並將值求和到新矩陣中。這被稱為卷積運算,它在整個輸入矩陣上重複進行。每次運算都應用於輸入矩陣的不同部分。卷積神經網路(CNN)常用於計算機視覺。
D
資料並行 (DP)
在多 GPU 上訓練的並行化技術,其中相同的設定被複制多次,每個例項接收不同的資料切片。處理並行完成,所有設定在每個訓練步驟結束時同步。
在此處瞭解有關資料並行工作原理的更多資訊:DataParallel vs. DistributedDataParallel。
解碼器輸入 ID
此輸入特定於編碼器-解碼器模型,包含將饋送到解碼器的輸入 ID。這些輸入應用於序列到序列任務,例如翻譯或摘要,通常以特定於每個模型的方式構建。
大多數編碼器-解碼器模型(BART、T5)會根據其labels
自行建立decoder_input_ids
。在此類模型中,傳遞labels
是處理訓練的首選方式。
請檢視每個模型的文件,瞭解它們如何處理這些輸入 ID 以進行序列到序列訓練。
解碼器模型
也稱為自迴歸模型,解碼器模型涉及一個預訓練任務(稱為因果語言建模),其中模型按順序讀取文字並預測下一個單詞。通常透過讀取整個句子並使用掩碼隱藏特定時間步的未來令牌來實現。
深度學習 (DL)
使用多層神經網路的機器學習演算法。
E
編碼器模型
也稱為自編碼模型,編碼器模型接收輸入(例如文字或影像)並將其轉換為稱為嵌入的濃縮數字表示。通常,編碼器模型使用掩碼語言建模等技術進行預訓練,這些技術會掩蓋輸入序列的一部分,並強制模型建立更有意義的表示。
F
特徵提取
將原始資料選擇並轉換為一組對機器學習演算法更有資訊和更有用的特徵的過程。特徵提取的一些示例包括將原始文字轉換為詞嵌入以及從影像/影片資料中提取重要特徵(如邊緣或形狀)。
前向分塊
在 Transformer 中的每個殘差注意力塊中,自注意力層之後通常跟著兩個前向傳播層。前向傳播層的中間嵌入大小通常大於模型的隱藏大小(例如,對於google-bert/bert-base-uncased
)。
對於大小為[batch_size, sequence_length]
的輸入,儲存中間前向嵌入[batch_size, sequence_length, config.intermediate_size]
所需的記憶體可能佔據記憶體使用量的大部分。論文Reformer: The Efficient Transformer的作者注意到,由於計算獨立於sequence_length
維度,因此分別計算兩個前向傳播層的輸出嵌入[batch_size, config.hidden_size]_0, ..., [batch_size, config.hidden_size]_n
,然後將其拼接為[batch_size, sequence_length, config.hidden_size]
(其中n = sequence_length
)在數學上是等價的,這以增加計算時間為代價減少了記憶體使用,但產生了數學上等價的結果。
對於使用函式apply_chunking_to_forward()的模型,chunk_size
定義了平行計算的輸出嵌入數量,從而定義了記憶體和時間複雜性之間的權衡。如果chunk_size
設定為0,則不進行前向分塊。
微調模型
微調是一種遷移學習的形式,它涉及獲取一個預訓練模型,凍結其權重,並用新新增的模型頭替換輸出層。模型頭在您的目標資料集上進行訓練。
有關更多詳細資訊,請參見微調預訓練模型教程,並瞭解如何使用 🤗 Transformers 微調模型。
H
頭部
模型頭是指神經網路的最後一層,它接收原始隱藏狀態並將其投影到不同的維度。每個任務都有不同的模型頭。例如:
- GPT2ForSequenceClassification 是一個基於GPT2Model的序列分類頭——一個線性層。
- ViTForImageClassification 是一個基於ViTModel的影像分類頭——一個在
CLS
令牌最終隱藏狀態之上的線性層。 - Wav2Vec2ForCTC 是一個基於Wav2Vec2Model的語言建模頭,帶有CTC。
I
影像塊
基於視覺的 Transformer 模型將影像分割成更小的塊,這些塊被線性嵌入,然後作為序列傳遞給模型。您可以在模型配置中找到模型的 patch_size
(或解析度)。
推理
推理是在訓練完成後在新資料上評估模型的過程。請參閱推理管道教程,瞭解如何使用 🤗 Transformers 執行推理。
輸入 ID
輸入 ID 通常是模型所需的唯一引數。它們是令牌索引,是構成序列的令牌的數字表示,這些序列將用作模型的輸入。
每個分詞器的工作方式不同,但基本機制保持不變。這裡有一個使用 BERT 分詞器的示例,它是一個 WordPiece 分詞器
>>> from transformers import BertTokenizer
>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")
>>> sequence = "A Titan RTX has 24GB of VRAM"
分詞器負責將序列拆分為分詞器詞彙表中可用的令牌。
>>> tokenized_sequence = tokenizer.tokenize(sequence)
這些令牌可以是單詞或子詞。例如,這裡“VRAM”不在模型詞彙表中,因此它被拆分為“V”、“RA”和“M”。為了表示這些令牌不是單獨的單詞而是同一單詞的一部分,為“RA”和“M”添加了雙井號字首
>>> print(tokenized_sequence)
['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']
然後這些令牌可以轉換為模型可以理解的 ID。這可以透過直接將句子輸入分詞器來完成,分詞器利用🤗 Tokenizers的 Rust 實現以獲得最佳效能。
>>> inputs = tokenizer(sequence)
分詞器返回一個字典,其中包含其相應模型正常工作所需的所有引數。令牌索引位於鍵input_ids
下
>>> encoded_sequence = inputs["input_ids"]
>>> print(encoded_sequence)
[101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]
請注意,分詞器會自動新增“特殊令牌”(如果關聯的模型依賴它們),這些特殊令牌是模型有時使用的特殊 ID。
如果我們解碼之前的 ID 序列,
>>> decoded_sequence = tokenizer.decode(encoded_sequence)
我們將看到
>>> print(decoded_sequence)
[CLS] A Titan RTX has 24GB of VRAM [SEP]
因為這是 BertModel 期望其輸入的方式。
L
標籤
標籤是一個可選引數,可以傳遞給模型以使其自行計算損失。這些標籤應該是模型的預期預測:它將使用標準損失來計算其預測與期望值(標籤)之間的損失。
這些標籤根據模型頭部而有所不同,例如:
- 對於序列分類模型(BertForSequenceClassification),模型期望一個維度為
(batch_size)
的張量,其中批處理的每個值對應於整個序列的預期標籤。 - 對於令牌分類模型(BertForTokenClassification),模型期望一個維度為
(batch_size, seq_length)
的張量,其中每個值對應於每個獨立令牌的預期標籤。 - 對於掩碼語言建模(BertForMaskedLM),模型期望一個維度為
(batch_size, seq_length)
的張量,其中每個值對應於每個獨立令牌的預期標籤:標籤是掩碼令牌的令牌 ID,其餘部分的值將被忽略(通常為-100)。 - 對於序列到序列任務(BartForConditionalGeneration、MBartForConditionalGeneration),模型期望一個維度為
(batch_size, tgt_seq_length)
的張量,其中每個值對應於每個輸入序列關聯的目標序列。在訓練期間,BART 和 T5 都會在內部建立適當的decoder_input_ids
和解碼器注意力掩碼。它們通常不需要提供。這不適用於利用編碼器-解碼器框架的模型。 - 對於影像分類模型(ViTForImageClassification),模型期望一個維度為
(batch_size)
的張量,其中批處理的每個值對應於每個獨立影像的預期標籤。 - 對於語義分割模型(SegformerForSemanticSegmentation),模型期望一個維度為
(batch_size, height, width)
的張量,其中批處理的每個值對應於每個獨立畫素的預期標籤。 - 對於目標檢測模型(DetrForObjectDetection),模型期望一個字典列表,其中包含
class_labels
和boxes
鍵,其中批處理的每個值對應於每個獨立影像的預期標籤和邊界框數量。 - 對於自動語音識別模型(Wav2Vec2ForCTC),模型期望一個維度為
(batch_size, target_length)
的張量,其中每個值對應於每個獨立令牌的預期標籤。
每個模型的標籤可能不同,因此請務必查閱每個模型的文件以獲取有關其特定標籤的更多資訊!
基本模型(BertModel)不接受標籤,因為這些是基本轉換器模型,僅輸出特徵。
大型語言模型 (LLM)
一個通用術語,指在大量資料上訓練的 Transformer 語言模型(GPT-3、BLOOM、OPT)。這些模型通常也有大量的可學習引數(例如,GPT-3 有 1750 億個)。
M
掩碼語言建模 (MLM)
一種預訓練任務,模型會看到文字的損壞版本(通常透過隨機掩蓋一些令牌),並必須預測原始文字。
多模態
結合文字和其他型別輸入(例如影像)的任務。
N
自然語言生成 (NLG)
所有與生成文字相關的任務(例如,用 Transformers 寫作,翻譯)。
自然語言處理 (NLP)
“處理文字”的通用說法。
自然語言理解 (NLU)
所有與理解文字內容相關的任務(例如,對整個文字或單個單詞進行分類)。
P
管道
🤗 Transformers 中的管道是一個抽象,指一系列按特定順序執行的步驟,用於預處理和轉換資料,並從模型返回預測。管道中可能包含的資料預處理、特徵提取和歸一化等階段。
有關更多詳細資訊,請參閱推理管道。
管道並行 (PP)
一種並行化技術,其中模型在多個 GPU 上垂直(層級)分割,以便模型的一層或幾層僅放置在一個 GPU 上。每個 GPU 並行處理管道的不同階段,並在批處理的一小部分上工作。在此處瞭解有關管道並行工作原理的更多資訊:從樸素模型並行到管道並行。
畫素值
傳遞給模型的影像的數值表示張量。畫素值的形狀為 [batch_size
, num_channels
, height
, width
],並由影像處理器生成。
池化
一種將矩陣縮小為較小矩陣的操作,透過取池化維度(或多個維度)的最大值或平均值。池化層通常位於卷積層之間,用於下采樣特徵表示。
位置 ID
與 RNN 不同,Transformer 模型內部不嵌入每個令牌的位置,因此無法感知其位置。因此,位置 ID(position_ids
)由模型用於識別令牌列表中每個令牌的位置。
它們是可選引數。如果沒有將position_ids
傳遞給模型,則會自動建立絕對位置嵌入。
絕對位置嵌入的範圍是[0, config.max_position_embeddings - 1]
。一些模型使用其他型別的位置嵌入,例如正弦位置嵌入或相對位置嵌入。
預處理
將原始資料準備成機器學習模型易於使用的格式的任務。例如,文字通常透過分詞進行預處理。要更好地瞭解其他輸入型別的預處理方式,請檢視預處理教程。
預訓練模型
在某些資料(例如維基百科的全部內容)上進行預訓練的模型。預訓練方法涉及自監督目標,可以是閱讀文字並嘗試預測下一個單詞(參見因果語言建模),或者掩蓋一些單詞並嘗試預測它們(參見掩碼語言建模)。
語音和視覺模型有自己的預訓練目標。例如,Wav2Vec2 是一種語音模型,在對比任務上進行預訓練,該任務要求模型從一組“假”語音表示中識別“真”語音表示。另一方面,BEiT 是一種視覺模型,在掩碼影像建模任務上進行預訓練,該任務掩蓋一些影像塊並要求模型預測掩蓋的影像塊(類似於掩碼語言建模目標)。
R
迴圈神經網路 (RNN)
一種透過迴圈層來處理文字的模型。
表示學習
機器學習的一個子領域,專注於學習原始資料的有意義表示。表示學習技術的一些示例包括詞嵌入、自編碼器和生成對抗網路 (GAN)。
S
取樣率
每秒取樣的數量(音訊訊號)的赫茲測量值。取樣率是對語音等連續訊號進行離散化的結果。
自注意力
輸入中的每個元素都會找出它們應該關注輸入中的其他哪些元素。
自監督學習
機器學習技術的一個類別,其中模型從未標記資料中建立自己的學習目標。它與無監督學習和監督學習的不同之處在於,學習過程是受監督的,但不是使用者明確監督的。
自監督學習的一個例子是掩碼語言建模,其中模型接收部分詞元被移除的句子,並學習預測缺失的詞元。
半監督學習
一種廣泛的機器學習訓練技術,它利用少量帶標籤資料和大量無標籤資料來提高模型的準確性,這與監督學習和無監督學習不同。
半監督學習方法的一個例子是“自訓練”,其中模型在帶標籤資料上進行訓練,然後用於對無標籤資料進行預測。模型以最高置信度預測的無標籤資料部分會被新增到帶標籤資料集中,並用於重新訓練模型。
序列到序列 (seq2seq)
從輸入生成新序列的模型,例如翻譯模型或摘要模型(如 Bart 或 T5)。
分片式 DDP
作為各種其他 ZeRO 實現中使用的基礎 ZeRO 概念的另一個名稱。
步幅
在卷積或池化中,步幅指核心在矩陣上移動的距離。步幅為 1 意味著核心每次移動一個畫素,步幅為 2 意味著核心每次移動兩個畫素。
監督學習
一種模型訓練形式,它直接使用帶標籤資料來糾正和指導模型效能。資料被輸入到正在訓練的模型中,其預測結果與已知標籤進行比較。模型根據其預測的錯誤程度更新其權重,並重復此過程以最佳化模型效能。
T
張量並行 (TP)
一種用於在多個 GPU 上訓練的並行技術,其中每個張量被分割成多個塊,因此整個張量不再只存在於單個 GPU 上,而是每個張量分片存在於其指定的 GPU 上。分片在不同的 GPU 上單獨並行處理,處理步驟結束時同步結果。這有時被稱為水平並行,因為分割發生在水平層面。在此瞭解更多關於張量並行的資訊。
詞元
句子的一部分,通常是一個詞,但也可以是子詞(不常見的詞通常被分割成子詞)或標點符號。
詞元型別 ID
一些模型的目的是對句子對或問答進行分類。
這些需要將兩個不同的序列連線到一個“input_ids”條目中,這通常藉助特殊詞元(例如分類器 ([CLS]
) 和分隔符 ([SEP]
) 詞元)來完成。例如,BERT 模型構建其雙序列輸入如下:
>>> # [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP]
我們可以透過將兩個序列作為兩個引數(而不是像以前那樣作為列表)傳遞給 tokenizer
,如下所示,自動生成這樣的句子:
>>> from transformers import BertTokenizer
>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")
>>> sequence_a = "HuggingFace is based in NYC"
>>> sequence_b = "Where is HuggingFace based?"
>>> encoded_dict = tokenizer(sequence_a, sequence_b)
>>> decoded = tokenizer.decode(encoded_dict["input_ids"])
這將返回
>>> print(decoded)
[CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]
這對於某些模型來說,足以理解一個序列在哪裡結束,另一個序列在哪裡開始。然而,其他模型,例如 BERT,也使用詞元型別 ID(也稱為分段 ID)。它們表示為識別模型中兩種序列型別的二元掩碼。
分詞器將此掩碼作為“token_type_ids”條目返回
>>> encoded_dict["token_type_ids"]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
第一個序列,即用於問題的“上下文”,其所有詞元都由 0
表示,而第二個序列,對應於“問題”,其所有詞元都由 1
表示。
一些模型,例如 XLNetModel,使用一個由 2
表示的附加詞元。
遷移學習
一種涉及獲取預訓練模型並將其調整到特定於任務的資料集的技術。無需從頭開始訓練模型,您可以利用從現有模型中獲得的知識作為起點。這加快了學習過程並減少了所需的訓練資料量。
Transformer
基於自注意力的深度學習模型架構。
U
無監督學習
一種模型訓練形式,其中提供給模型的資料沒有標籤。無監督學習技術利用資料分佈的統計資訊來發現對當前任務有用的模式。
Z
零冗餘最佳化器 (ZeRO)
一種並行技術,它對張量進行分片,與張量並行有些相似,不同之處在於,整個張量會在前向或後向計算時被重新構建,因此無需修改模型。此方法還支援各種解除安裝技術,以彌補有限的 GPU 記憶體。在此瞭解更多關於 ZeRO 的資訊。
< > 在 GitHub 上更新