Sobes.tech
Middle — Senior

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:

  1. 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].

  2. I dati di input vengono forniti a BERT con il token [CLS] all'inizio.

  3. 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.

  4. Passare questo vettore al classificatore (ad esempio, linear + softmax per classificazione multiclasse).

  5. 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.