Перейти к основному содержимому

Дообучение моделей на конкретные задачи NLP

Разработчику Инженеру

Предобучение трансформера на терабайтах текста — дорогое и редкое занятие для большинства команд. Практический NLP — дообучение (fine-tuning) готового чекпоинта под задачу: классификация тикетов, NER по договорам, тональность отзывов, доменный перевод.

Общая теория transfer learning и fine-tuning — статья про обучение на базе готовой модели. Здесь — специфика трансформеров и NLP.


Два этапа жизненного цикла

ЭтапДанныеЦельРезультат
Pre-trainingНеразмеченный корпусLanguage modeling (MLM / CLM)Базовые языковые представления
Fine-tuningРазмеченные примеры задачиМинимизировать loss задачиМодель под продукт

Иногда между ними — intermediate tuning (domain-adaptive pre-training на текстах отрасли без меток).


Типы «голов» под задачу

ЗадачаАрхитектураВыход
Классификация текста[CLS] или mean pooling + linearОдин label на документ
Token classification (NER)Linear на каждый tokenBIO-метки
Seq2seqEncoder-decoder (T5, BART)Генерация target
Extractive QASpan start/end logitsДва индекса в контексте
Multiple choiceScore для каждого вариантаargmax

Hugging Face AutoModelForSequenceClassification, AutoModelForTokenClassification, AutoModelForSeq2SeqLM подставляют нужную голову автоматически.


Стратегии обновления весов

Full fine-tuning

Обновляются все параметры модели. Нужны GPU с достаточной VRAM, малый learning rate ($10^-5$ … $10^-4$), часто warmup и weight decay.

Feature extraction (freeze backbone)

Замораживают transformer, обучают только classifier head. Быстро, мало данных — но потолок качества ниже.

Partial unfreezing

Сначала head, затем последние $k$ слоёв, затем весь стек с разными learning rate (discriminative fine-tuning).

Parameter-efficient fine-tuning (PEFT)

МетодИдеяКогда
LoRAНизкоранговые матрицы в attentionLLM, мало VRAM
QLoRALoRA + 4-bit базовые весаFine-tune 7B+ на одной GPU
AdaptersМаленькие bottleneck-слои между блокамиМультизадачность
Prefix / Prompt tuningОбучаемые виртуальные токеныОчень мало данных

Подробнее про LoRA в контексте LLM — Работа с ИИ-моделями.


Пример — классификация на Hugging Face Trainer

from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer
from datasets import load_dataset

model_name = "cointegrated/rubert-tiny2"
num_labels = 2

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)

ds = load_dataset("blinoff/rusentiment", split="train[:2000]")
ds = ds.rename_column("text", "sentence")

def tokenize(batch):
return tokenizer(batch["sentence"], truncation=True, padding="max_length", max_length=128)

ds = ds.map(tokenize, batched=True)
ds = ds.rename_column("label", "labels")
ds.set_format("torch")

args = TrainingArguments(
output_dir="./out",
per_device_train_batch_size=16,
num_train_epochs=3,
learning_rate=2e-5,
evaluation_strategy="no",
)

trainer = Trainer(model=model, args=args, train_dataset=ds)
trainer.train()

На inference тот же tokenizer + model(**inputs)logits → softmax → класс.


Гиперпараметры и типичные ошибки

ПараметрРекомендация
Learning rate$2×10^-5$ … $5×10^-5$ для BERT-scale; меньше для больших LLM
Batch sizeКак можно больше при gradient accumulation
Epochs2–5; следить за переобучением на val
Max lengthУсечение под задачу; длинные документы — sliding window
Class imbalanceWeighted loss, oversampling, focal loss

Типичные ошибки

  • другой tokenizer на train и prod;
  • утечка test в подбор гиперпараметров;
  • fine-tune на 10 примерах с full fine-tuning 12-layer BERT — переобучение;
  • забытый model.eval() и torch.no_grad() на inference.

Операционный контур данных и eval — MLOps, слои 1–3.


Instruction tuning и RLHF (контекст)

Чат-модели после pre-training проходят instruction fine-tuning на парах «запрос — эталонный ответ» и иногда RLHF для предпочтений человека. Это тот же fine-tuning по смыслу, но другой масштаб данных и инфраструктуры — см. LLM.


Дальше


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").