但是假如我們將兩個句子分開傳遞給模型和一起傳入模型做批次處理,會發現有一個地方不太一樣。
import torch
from transformers import BertForSequenceClassification
ids_1 = torch.tensor([[101, 1422, 6601, 1110, 1579, 1177, 1363, 102]])
ids_2 = torch.tensor([[101, 10817, 1158, 1106, 1139, 5095, 1390, 2228, 1143, 1631, 1177, 2816, 102]])
all_ids = torch.tensor(
[[101, 1422, 6601, 1110, 1579, 1177, 1363, 102, 0, 0, 0, 0, 0],
[101, 10817, 1158, 1106, 1139, 5095, 1390, 2228, 1143, 1631, 1177, 2816, 102]]
)
model = BertForSequenceClassification.from_pretrained('bert-base-cased')
print(model(ids_1).logits)
print(model(ids_2).logits)
print(model(all_ids).logits)
我們來看看結果
ids_1 -> tensor([[0.2902, 0.8102]], grad_fn=<AddmmBackward0>)
ids_2 -> tensor([[0.2497, 0.7787]], grad_fn=<AddmmBackward0>)
all_ids -> tensor([[0.2761, 0.7023],
[0.2497, 0.7787]], grad_fn=<AddmmBackward0>)>)
注意力遮罩用於控制模型在處理序列數據時的關注範圍。當模型進行注意力計算時,它會參考注意力遮罩,以確定哪些位置的信息應該被納入計算,哪些位置的信息應該被忽略。
1表示應注意相應的標記,0表示不應注意相應的標記
attention_mask = torch.tensor([
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
])
output = model(all_ids, attention_mask=attention_mask)
print(output.logits)
tensor([[0.2902, 0.8102],
[0.2497, 0.7787]], grad_fn=<AddmmBackward0>)
這個問題 Hugging Face 有提供兩個解決方法
(我目前沒研究過)
。max_sequence_length
參數來實現,這將保留序列的前部分,並將其縮減為模型可以處理的最大長度。
sequence = sequence[:max_sequence_length]