1. 程式人生 > 其它 >關於bert預訓練模型的輸出是什麼

關於bert預訓練模型的輸出是什麼

我們在使用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的加權平均值。

參考連結:
https://www.cnblogs.com/xiximayou/p/15016604.html