- 安裝Huggingface的transformers庫,安裝該庫之前要確保下載了pytorch或者tensorflow2.0的框架。
pip install transformers
- transformers庫安裝好之后我們就可以使用其提供的預訓練模型進行使用了。使用之前先介紹一些相關的內容:一個完整的transformer模型主要包含三個部分,分別是Config,Tokenizer和Model。
其中Config是配置類,控制模型的名稱,最終輸出的樣式,隱藏層的寬度和深度,激活函數的類別等。Tokenizer是一個將純文本轉換為編碼的過程,其並不涉及將詞轉化為詞向量的過程,僅僅是將純文本分詞並添加一些標記,比如MASK,CLS,SEP等。Model也就是各種各樣的模型。 - 使用模型之前一般需要下載該模型對應的一些文件,可以直接采用from_pretrained方法內指定模型的名稱,然后運行之后就會自動進行下載,不過一般這種方法在國內並不可行,因為需要到對方的服務器上下載對應的文件,下載速度也是很慢。一般情況下我們直接去官網下載對應模型的相關文件保存到本地,然后使用即可,主要保存文件的時候不要將其名稱改變。
- 下面主要介紹一點有關BERT模型的使用方法。
首先就是Tokenizer的使用方法,使用tokenizer = BertTokenizer.from_pretrained('./bert-base-uncased')該方式創建一個tokenizer。該工具主要是用於將文本進行分詞並轉換為對應的索引值,以便於方便輸入BERT模型,該工具提供了很多方法,比如tokenize,encode和encode_plus等,在這里就不再贅述,主要介紹一些__call__方法的使用,因為官方也推薦使用該方法。 - 對於BERT模型的輸入,一般需要對於句子加一些特殊符號標記,比如[CLS]用於句子的開頭,[SEP]用於句子的結尾,當我們直接使用tokenizer(text)方法的時候,它默認會為其添加這兩種標記,如果不需要的話,可以利用參數add_special_tokens=False來控制。
- 我們可以將句子形式處理為[text1,text2,....textn]的形式,這可以表示為一個batch的句子,調用上面的方法之后就會返回其分詞后的結果,返回的結果是一個字典,主要包括input_ids,token_type_ids,attention_mask,其中input_ids表示的就是分詞后其對應的索引id,token_type_ids用來表示屬於哪個句子,因為BERT允許輸入句子對的形式,值為0表示為一個句子,值為1表示為另一個句子,attention_mask表示是否需要被mask掉,因為該方法可以添加padding參數,用來進行pad補齊。
- 上面說到BERT可以接受句子對的輸入形式,則我們可以將句子處理為[[句子1,句子2],[句子1,句子2],....[句子1,句子2]]的形式,經過該方法之后,他會將兩個句子對合在一起,中間用一個[SEP]標記進行分割;該方法還有很多參數可以使用,比如return_tensors表示返回tensor類型,默認為普通類型,'pt'表示返回pytorch中的tensor等。一般需要跟着padding參數一起使用。
- 分完詞之后就可以將其結果輸入模型中了,模型的輸出結果一般有last_hidden_state,pooler_output,hidden_states,attentions四類,默認情況下只有前兩個,后兩個需要手動設置參數。具體使用代碼如下所示:
model_out = bert_model(**token_out,output_hidden_states=True,output_attentions=True)
其中last_hidden_state表示BERT模型最后一層的輸出,包括[CLS]和[SEP],可以將其用作命名實體識別之類的任務。大小為[batch,seq_len,hidden_state]
pooler_output表示的是將[CLS]這個標記的編碼經過處理后的結果,可以用來處理分類任務。大小為[batch,hidden_state]
hidden_states是一個元組,它的第一個元素表示embedding,其余的元素表示各個層的輸出結果,大小為[batch,seq_len_state]。
attentions表示每一層的注意力權重,大小為[batch_size, num_heads, sequence_length, sequence_length]