English translation is not available yet. Showing Russian content.

Как fine-tune модель для следования сложным инструкциям?

Краткий тезис

Fine-tune для следования сложным инструкциям — это instruction tuning на тщательно подготовленном наборе пар (инструкция, ответ). Ключевые элементы: разнообразие инструкций по сложности (включая многошаговые и с цепочкой рассуждений), правильный формат диалога (например, <|user|>...<|assistant|>), низкая температура обучения и оценка на held-out сложных примерах. Такой подход позволяет моделям вроде Mistral лучше понимать и выполнять запутанные запросы, включая те, что требуют логического вывода.

1. Термин: Fine-tuning для инструкций (Instruction Tuning)

Instruction tuning — это этап дообучения языковой модели на размеченных примерах, где каждый пример состоит из инструкции (запроса пользователя) и ожидаемого ответа модели. Цель — научить модель следовать различным командам, даже если они сформулированы непривычно или требуют сложных действий.

В отличие от предварительного обучения (pre-training) на неструктурированных текстах, instruction tuning явно учит модель выявлять намерение пользователя и генерировать релевантный ответ. Для сложных инструкций этого особенно важно: модель должна уметь разбивать задачу на подзадачи, рассуждать пошагово и проверять собственные выводы.

Термин «сложная инструкция» — это запрос, который содержит несколько шагов, требует внешних знаний, предполагает рассуждения (цепочка мыслей) или использует неоднозначную формулировку. Пример: «Объясни, как приготовить пасту карбонара, но сначала опиши историю возникновения блюда, а затем сравни его с пастой аматричана».

2. Датасет: структура и разнообразие

2.1 Формат хранения

Обычно используется формат диалога с чёткими маркерами ролей:

<|user|>
{инструкция}
<|assistant|>
{ответ}

Или аналогичный (например, [INST] {инструкция} [/INST]). Этот формат явно отделяет запрос от ответа и помогает модели понимать границы диалога.

2.2 Критерии отбора примеров

  • Разнообразие длины: короткие (1–2 предложения) и длинные (до нескольких абзацев) инструкции.
  • Сложность: одношаговые («Назови столицу Франции») и многошаговые («Сначала найди площадь круга радиусом 5, затем вычти из неё площадь квадрата со стороной 3, и объясни каждый шаг»).
  • Типы инструкций: фактические вопросы, творческие задания (написать стих), задачи на рассуждения (логические головоломки), кодогенерация, извлечение информации, исправление ошибок.
  • Баланс классов: чтобы модель не перекосило в сторону одного типа.

2.3 Источники датасетов

  • Открытые: OpenAssistant, Alpaca (сгенерированные через GPT), Dolly, ShareGPT (реальные диалоги).
  • Синтетические: генерация с помощью более мощной модели (GPT-4, Claude) с последующей фильтрацией.
  • Собственные: evaluation|ручная разметка экспертами для специфической области.

3. Цепочка рассуждений (Chain-of-Thought)

Chain-of-Thought (CoT) — это техника, при которой модель учится генерировать промежуточные шаги рассуждения перед финальным ответом. Для сложных инструкций CoT критически улучшает качество, так как заставляет модель явно прорабатывать логику.

Пример CoT в ответе:

  • Инструкция: «В магазине было 30 яблок. Сначала продали 12, потом привезли ещё 8. Сколько стало?»
  • Ответ с CoT: «Было 30. После продажи 12 осталось 18. Затем добавили 8 → 26. Ответ: 26 яблок.»

При fine-tuningе в датасет включают примеры как с CoT, так и без, чтобы модель могла адаптироваться к разным ситуациям. Доля CoT-примеров обычно 20–40% от всего датасета.

4. Гиперпараметры обучения

4.1 Температура при обучении

  • Низкая температура (0.1–0.3) в loss-функции (при генерации учительских токенов) не используется напрямую. Однако при fine-tuningе часто применяют teacher forcing с кросс-энтропией, где температура не играет роли. Важно: при инференсе температура может быть низкой для точности, но во время обучения её не настраивают. Вместо этого обращают внимание на learning rate, batch size, weight decay.

4.2 Learning rate и оптимизатор

4.3 Количество эпох

  • Небольшое: 2–5 эпох, с ранней остановкой по валидационному loss во избежание переобучения. Переобучение на инструкциях ведёт к потере обобщения.

5. Методы fine-tuning: полный vs. PEFT

5.1 Полный fine-tuning

  • Обновляются все веса модели.
  • Требует много GPU памяти (например, для Mistral-7B ~14GB на batch size 1).
  • Результат обычно самый качественный, но дорогой.

5.2 LoRA/QLoRA (Parameter-Efficient Fine-Tuning)

  • LoRA вставляет низкоранговые адаптеры в слои внимания. Обучаются только они.
  • QLoRA использует 4-битную квантизацию для ещё большего снижения памяти.
  • Преимущества: экономия памяти, быстрое переключение между разными задачами.
  • Для следования инструкциям LoRA даёт почти такую же производительность, как полный fine-tuning, при значительно меньших затратах.
МетодПамять (Mistral-7B)Время обученияКачество
Полный fine-tuning~14 GB (fp16)5–10 часовВысокое
LoRA (rank=16)~6 GB3–5 часов≈ полного
QLoRA (4-bit)~3 GB3–5 часов≈ полного

6. Loss-функция и мониторинг

Используется стандартная кросс-энтропия на токенах ответа (маскируя токены инструкции). В процессе обучения отслеживают:

  • Training loss (должен плавно снижаться)
  • Validation loss (на held-out датасете сложных инструкций) – основной показатель переобучения.
  • Accuracy на простых подзадачах – быстрое подтверждение, что модель не разучилась следовать базовым командам.

7. Оценка качества

7.1 Автоматические метрики

  • ROUGE-L, BLEU – для точного соответствия эталону (ограниченно применимы из-за вариативности ответов).
  • BERTScore – семантическое сходство.
  • LLM-as-a-judge – более мощная модель (GPT-4) оценивает корректность ответа по критериям: точность, полнота, логичность.

7.2 Ручная оценка

Набор из 50–100 сложных инструкций, не входивших в обучение. Эксперты оценивают:

  • Correctness (правильность фактов)
  • Completeness (выполнены ли все шаги)
  • Reasoning quality (логичность рассуждений, если требуется CoT)
  • Format adherence (соблюдение формата ответа)

7.3 Специфические тесты

  • Multi-turn: дать инструкцию, затем уточняющий вопрос, проверить, сохраняет ли модель контекст.
  • Adversarial: инструкции с противоречиями, шумом или неявными отсылками.

8. Пример: fine-tuning Mistral-7B на сложных инструкциях

8.1 Подготовка данных

  • Используем датасет OpenAssistant/oasst1 + 3000 синтетических CoT-примеров, сгенерированных через GPT-4.
  • Формат: <|user|>{instruction}<|assistant|>{response_with_cot}.

8.2 Инструменты

8.3 Код (фрагмент)

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", load_in_4bit=True)
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
tokenizer.pad_token = tokenizer.eos_token

lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)

training_args = TrainingArguments(
    output_dir="./mistral-instruction-finetuned",
    per_device_train_batch_size=1,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    num_train_epochs=3,
    logging_steps=10,
    save_strategy="epoch",
    evaluation_strategy="steps",
    eval_steps=50,
    fp16=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    tokenizer=tokenizer,
)

trainer.train()

8.4 Результат

  • Loss на валидации снизился с 2.1 до 0.8.
  • Ручная оценка на 50 сложных инструкциях: правильность 85%, полнота 78% (исходная Mistral: 55% и 50% соответственно).

9. Пет-проект для закрепления

Задача: Fine-tune небольшую модель (GPT-2 или TinyLlama) на датасете из 500 инструкций разной сложности, чтобы научить её выполнять двухшаговые команды.

Инструменты: Hugging Face Transformers, Datasets, PEFT.

Шаги:

  1. Создать синтетический датасет из 300 простых инструкций и 200 сложных с CoT (например, «Сначала назови столицу Франции, а затем переведи слово Paris на испанский»).
  2. Подготовить формат <|user|>...<|assistant|>....
  3. Загрузить предобученную модель (например, TinyLlama-1.1B).
  4. Настроить LoRA (rank=8, target_modules=["q_proj", "v_proj"]).
  5. Обучить 3 эпохи с learning_rate=3e-4, batch_size=2 (с аккумуляцией).
  6. Оценить на 20 новых сложных инструкциях (вручную или через BERTScore).

Ожидаемый результат: Модель будет демонстрировать улучшение в выполнении многошаговых инструкций (например, сначала отвечать на первый подвопрос, затем на второй), хотя из-за малого размера возможны ошибки.

10. Связь с другими вопросами

ВопросТема
26Как fine-tune модель под конкретную задачу (NLP)?
27Что такое LoRA и как он применяется в fine-tuning?
28Как подобрать гиперпараметры для fine-tuning?
30Как оценивать качество fine-tuned модели?
31Как избегать переобучения при fine-tuning?
33Как fine-tune модель на малом объёме данных?

11. Навигация


Навигация