我們在使用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的輸出都有哪些'
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的加權平均值。
參考:https://blog.csdn.net/sunyueqinghit/article/details/105157609