Sobes.tech
Middle — Senior
35

Как файнтюнить BERT под задачу классификации? Что брать из выхода?

Компании, где спрашивали
ПАО Газпром нефть

Ответ от нейросети

sobes.tech AI

Для файнтюнинга BERT под задачу классификации обычно берут выход из специального токена [CLS], который используется моделью для агрегации информации о всей последовательности.

Основные шаги:

  1. Добавить классификационный слой поверх BERT — обычно это полносвязный слой (linear layer), который принимает вектор из выходного слоя BERT, соответствующий токену [CLS].

  2. Входные данные подаются в BERT с токеном [CLS] в начале.

  3. Извлечь эмбеддинг [CLS] из последнего скрытого слоя BERT. Этот вектор размерности, например, 768 (для базовой модели), содержит свёрнутую информацию о всей последовательности.

  4. Передать этот вектор в классификатор (например, linear + softmax для многоклассовой классификации).

  5. Обучать всю модель (BERT + классификатор) совместно на целевой задаче, используя подходящий лосс (например, CrossEntropyLoss).

Пример на 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, :]  # [CLS] токен
        logits = self.classifier(cls_output)
        return logits

Таким образом, для классификации берут именно выход [CLS]-токена из последнего слоя BERT.