關於bert預訓練模型的輸出是什麼
阿新 • • 發佈:2022-04-15
我們在使用Bert進行微調的時候,通常都會使用bert的隱含層的輸出,然後再接自己的任務頭,那麼,我們必須先知道bert的輸出都是什麼,本文接下來就具體記錄下bert的輸出相關的知識。
由於我們微調bert的時候一般選用的是中文版的模型,因此,接下來我們載入的就是中文預訓練模型bert。直接看程式碼:
import torch from transformers import BertTokenizer, BertModel bertModel = BertModel.from_pretrained('bert-base-chinese', output_hidden_states=True, output_attentions=True) tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') text = '讓我們來看一下bert的輸出都有哪些' # encode和encode_plus的區別 # encode僅返回input_ids # encode_ids返回所有的編碼資訊,具體如下: # input_ids:單詞在詞典的編碼; # token_type_ids:區分兩個句子的編碼(上句全為0,下句全為1); # attention_mask:指定對哪些詞進行self-attention操作。 input_ids = torch.tensor([tokenizer.encode(text)]).long() outputs = bertModel(input_ids) print(len(outputs)) print(outputs.keys()) print(outputs['last_hidden_state'].shape) print(outputs['pooler_output'].shape) print(len(outputs['hidden_states'])) print(len(outputs['attentions']))
程式碼輸出結果:
4
odict_keys(['last_hidden_state', 'pooler_output', 'hidden_states', 'attentions'])
torch.Size([1, 18, 768])
torch.Size([1, 768])
13
12
可以看出,bert的輸出是由四部分組成:
last_hidden_state:shape是(batch_size, sequence_length, hidden_size),hidden_size=768,它是模型最後一層輸出的隱藏狀態。(通常用於命名實體識別)
pooler_output:shape是(batch_size, hidden_size),這是序列的第一個token(classification token)的最後一層的隱藏狀態,它是由線性層和Tanh啟用函式進一步處理的。(通常用於句子分類,至於是使用這個表示,還是使用整個輸入序列的隱藏狀態序列的平均化或池化,視情況而定)
hidden_states:這是輸出的一個可選項,如果輸出,需要指定config.output_hidden_states=True,它也是一個元組,它的第一個元素是embedding,其餘元素是各層的輸出,每個元素的形狀是(batch_size, sequence_length, hidden_size)
attentions:這也是輸出的一個可選項,如果輸出,需要指定config.output_attentions=True,它也是一個元組,它的元素是每一層的注意力權重,用於計算self-attention heads的加權平均值。