Как файнтюнить BERT под задачу классификации? Что брать из выхода?
Ответ от нейросети
sobes.tech AI
Для файнтюнинга BERT под задачу классификации обычно берут выход из специального токена [CLS], который используется моделью для агрегации информации о всей последовательности.
Основные шаги:
-
Добавить классификационный слой поверх BERT — обычно это полносвязный слой (linear layer), который принимает вектор из выходного слоя BERT, соответствующий токену [CLS].
-
Входные данные подаются в BERT с токеном [CLS] в начале.
-
Извлечь эмбеддинг [CLS] из последнего скрытого слоя BERT. Этот вектор размерности, например, 768 (для базовой модели), содержит свёрнутую информацию о всей последовательности.
-
Передать этот вектор в классификатор (например, linear + softmax для многоклассовой классификации).
-
Обучать всю модель (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.