Come affinare BERT per un compito di classificazione? Cosa prendere dall'output?
sobes.tech AI
Risposta dell'AI
Per il fine-tuning di BERT per compiti di classificazione, si prende generalmente l'output del token speciale [CLS], che viene utilizzato dal modello per aggregare le informazioni di tutta la sequenza.
Passaggi principali:
-
Aggiungere uno strato di classificazione sopra BERT — di solito uno strato lineare che riceve il vettore dall'ultimo strato di BERT corrispondente al token [CLS].
-
I dati di input vengono forniti a BERT con il token [CLS] all'inizio.
-
Estrarre l'embedding [CLS] dall'ultimo strato nascosto di BERT. Questo vettore, ad esempio, di dimensione 768 (per il modello base), contiene l'informazione condensata di tutta la sequenza.
-
Passare questo vettore al classificatore (ad esempio, linear + softmax per classificazione multiclasse).
-
Addestrare l'intero modello (BERT + classificatore) congiuntamente sulla task target, usando una funzione di perdita appropriata (ad esempio, CrossEntropyLoss).
Esempio in PyTorch:
from transformers import BertModel, BertTokenizer
import torch.nn as nn
class BertClassifier(nn.Module):
def __init__(self, bert_model_name, num_classes):
super().__init__()
self.bert = BertModel.from_pretrained(bert_model_name)
self.classifier = nn.Linear(self.bert.config.hidden_size, num_classes)
def forward(self, input_ids, attention_mask):
outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
cls_output = outputs.last_hidden_state[:, 0, :] # token [CLS]
logits = self.classifier(cls_output)
return logits
Quindi, per la classificazione, si prende specificamente l'output del token [CLS] dall'ultimo strato di BERT.