模型
在本節中,我們將更詳細地瞭解如何創建和使用模型。我們將使用 AutoModel類,當您希望從檢查點實例化任何模型時,這非常方便。
這個AutoModel類及其所有相關項實際上是對庫中各種可用模型的簡單包裝。它是一個聰明的包裝器,因為它可以自動猜測檢查點的適當模型體系結構,然後用該體系結構實例化模型。
但是,如果您知道要使用的模型類型,則可以使用直接定義其體系結構的類。讓我們看看這是如何與BERT模型一起工作的。
創建轉換器
初始化BERT模型需要做的第一件事是加載配置對象:
from transformers import BertConfig, BertModel
# Building the config
config = BertConfig()
# Building the model from the config
model = BertModel(config)
配置包含許多用於構建模型的屬性:
print(config)
BertConfig {
[...]
"hidden_size": 768,
"intermediate_size": 3072,
"max_position_embeddings": 512,
"num_attention_heads": 12,
"num_hidden_layers": 12,
[...]
}
雖然您還沒有看到所有這些屬性都做了什麼,但您應該認識到其中的一些屬性:hiddensize屬性定義了hidden狀態向量的大小,num_hidden_layers定義了Transformer模型的層數。
不同的加載方式
從默認配置創建模型會使用隨機值對其進行初始化:
from transformers import BertConfig, BertModel
config = BertConfig()
model = BertModel(config)
# Model is randomly initialized!
該模型可以在這種狀態下使用,但會輸出胡言亂語;首先需要對其進行訓練。我們可以根據手頭的任務從頭開始訓練模型,但正如您在 Chapter 1 ,這將需要很長的時間和大量的數據,並將產生不可忽視的環境影響。為了避免不必要的重複工作,必須能夠共享和重用已經訓練過的模型。
加載已經訓練過的Transformers模型很簡單-我們可以使用from_pretrained() 方法:
from transformers import BertModel
model = BertModel.from_pretrained("bert-base-cased")
正如您之前看到的,我們可以用等效的AutoModel類替換Bert模型。從現在開始,我們將這樣做,因為這會產生檢查點不可知的代碼;如果您的代碼適用於一個檢查點,那麼它應該與另一個檢查點無縫地工作。即使體系結構不同,這也適用,只要檢查點是針對類似任務(例如,情緒分析任務)訓練的。
在上面的代碼示例中,我們沒有使用BertConfig
,而是通過Bert base cased標識符加載了一個預訓練模型。這是一個模型檢查點,由BERT的作者自己訓練;您可以在 model card中找到更多細節.
該模型現在使用檢查點的所有權重進行初始化。它可以直接用於對訓練過的任務進行推理,也可以對新任務進行微調。通過預先訓練重量而不是從頭開始的訓練,我們可以很快取得好的效果。
權重已下載並緩存在緩存文件夾中(因此將來對from_pretrained()方法的調用將不會重新下載它們)默認為 ~/.cache/huggingface/transformers . 您可以通過設置 HF_HOME 環境變量來自定義緩存文件夾。
用於加載模型的標識符可以是模型中心Hub上任何模型的標識符,只要它與BERT體系結構兼容。可以找到可用的BERT檢查點的完整列表 here .
保存模型
保存模型和加載模型一樣簡單—我們使用 save_pretrained() 方法,類似於 from_pretrained() 方法:
model.save_pretrained("directory_on_my_computer")
這會將兩個文件保存到磁盤:
ls directory_on_my_computer
config.json pytorch_model.bin
如果你看一下 config.json 文件,您將識別構建模型體系結構所需的屬性。該文件還包含一些元數據,例如檢查點的來源以及上次保存檢查點時使用的🤗 Transformers版本。
這個 pytorch_model.bin 文件就是眾所周知的state dictionary; 它包含模型的所有權重。這兩個文件齊頭並進;配置是瞭解模型體系結構所必需的,而模型權重是模型的參數。
使用Transformers模型進行推理
既然您知道了如何加載和保存模型,那麼讓我們嘗試使用它進行一些預測。Transformer模型只能處理數字——分詞器生成的數字。但在我們討論標記化器之前,讓我們先探討模型接受哪些輸入。
標記化器可以將輸入轉換為適當的框架張量,但為了幫助您瞭解發生了什麼,我們將快速瞭解在將輸入發送到模型之前必須做什麼。
假設我們有幾個序列:
sequences = ["Hello!", "Cool.", "Nice!"]
分詞器將這些轉換為詞彙表索引,通常稱為 input IDs . 每個序列現在都是一個數字列表!結果是:
encoded_sequences = [
[101, 7592, 999, 102],
[101, 4658, 1012, 102],
[101, 3835, 999, 102],
]
這是一個編碼序列列表:一個列表列表。張量只接受矩形(想想矩陣)。此“數組”已為矩形,因此將其轉換為張量很容易:
import torch
model_inputs = torch.tensor(encoded_sequences)
使用張量作為模型的輸入
在模型中使用張量非常簡單-我們只需將輸入稱為模型:
output = model(model_inputs)
雖然模型接受許多不同的參數,但只需要 input IDs。我們稍後將解釋其他參數的作用以及何時需要它們,但首先我們需要更仔細地瞭解 Transformer模型可以理解的輸入的標記