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 и оптимизатор
- Обычно: 1e-5 до 5e-5 для полного fine-tuning, 1e-4 до 5e-4 для LoRA.
- Оптимизатор: AdamW с cosine scheduler и warmup (10% шагов).
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 GB | 3–5 часов | ≈ полного |
| QLoRA (4-bit) | ~3 GB | 3–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 Инструменты
- Hugging Face Transformers, PEFT, bitsandbytes (для QLoRA).
- AutoModelForCausalLM с
load_in_4bit=True. - LoraConfig (rank=16, alpha=32, target_modules=["q_proj", "v_proj"]).
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.
Шаги:
- Создать синтетический датасет из 300 простых инструкций и 200 сложных с CoT (например, «Сначала назови столицу Франции, а затем переведи слово Paris на испанский»).
- Подготовить формат
<|user|>...<|assistant|>.... - Загрузить предобученную модель (например, TinyLlama-1.1B).
- Настроить LoRA (rank=8, target_modules=["q_proj", "v_proj"]).
- Обучить 3 эпохи с learning_rate=3e-4, batch_size=2 (с аккумуляцией).
- Оценить на 20 новых сложных инструкциях (вручную или через BERTScore).
Ожидаемый результат: Модель будет демонстрировать улучшение в выполнении многошаговых инструкций (например, сначала отвечать на первый подвопрос, затем на второй), хотя из-за малого размера возможны ошибки.
10. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 26 | Как fine-tune модель под конкретную задачу (NLP)? |
| 27 | Что такое LoRA и как он применяется в fine-tuning? |
| 28 | Как подобрать гиперпараметры для fine-tuning? |
| 30 | Как оценивать качество fine-tuned модели? |
| 31 | Как избегать переобучения при fine-tuning? |
| 33 | Как fine-tune модель на малом объёме данных? |
11. Навигация
- Предыдущий: 28
- Следующий: 30
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 28
- Следующий: 30
- Индекс: 00. Индекс разборов