Имеет ли значение потеря оценки при обучении чат-ботов (с QLoRA)?
tldr; QLoRA — это метод тонкой настройки LLM в домашних условиях. Также дома вы сталкиваетесь с рядом тренировочных гиперпараметров, влияющих на качество вашей модели. О качестве модели чат-ботов судить непросто, часто используемая потеря оценки метрики начинает увеличиваться на ранних этапах обучения. Означает ли это, что ваш чат-бот становится хуже, если вы продолжаете тренироваться? Кажется, что ответ «Нет».
QLoRA — это метод тонкой настройки больших языковых моделей (LLM) на потребительском оборудовании. Вскоре после публикации люди заметили особенности в метриках обучения.
Увеличение потери оценки
Входные данные, используемые для обучения, разбиваются на обучающий и оценочный наборы. Во время обучения, как бы в режиме реального времени, тренер сообщает, насколько хорошо работает текущая контрольная точка с точки зрения прогнозирования набора оценок = потери оценки.
В идеале потери оценки уменьшаются при обучении, и в момент переобучения модель подходит к тренировочному набору, она достигает точки, в которой она перестала изучать общую проблему и начала изучать обучающие данные. Когда люди пытались воспроизвести Guanaco, модель, опубликованную вместе с QLoRA, были отмечены возрастающие потери оценок (раз, два и сам на данных подкаста).
Как долго мы должны тренироваться?
Официальный ответ авторов QLoRA по этому поводу следующий:
Вы наблюдаете расходящиеся потери и колебания MMLU по следующим причинам.
1. В НЛП потеря оценки не всегда напрямую связана с последующей производительностью (например, точность задачи, измеренная с помощью оценки GPT-4).
2. Набор разработчиков MMLU невелик, что объясняет колебания точности MMLU при тонкой настройке. Эти значения являются ориентировочными, и вам необходимо вычислить производительность набора тестов, чтобы получить более стабильный результат. Для этого используем последнюю контрольную точку.
3. Как показано в нашей статье, точная настройка набора данных OpenAssistant значительно повышает производительность чат-бота, согласно оценке Vicuna GPT-4. Однако это мало помогает на MMLU (производительность снижается или остается неизменной по сравнению с отсутствием тонкой настройки OA).
В конечном счете, мы показали, что при тонкой настройке набора данных вам следует оценивать свою последующую задачу. И вам следует очень тщательно подумать о том, какой целевой тест вы оптимизируете, так как это не всегда указывает на желаемую производительность. Результаты MMLU dev использовались для настройки гиперпараметров в нашей статье, но Vicuna eval гораздо больше подходил для оценки чат-ботов.
Итак, мы не можем наблюдать за качеством модели во время обучения, мы должны оценивать следующую задачу. Я не нашел ничего о производительности и потере оценки в документе QLoRA, и я не видел, чтобы кто-то еще делал это, поэтому я сделал это, и вот результат.
На что я смотрю и что это значит?
- В ходе тонкой настройки потери вычислений уменьшаются в течение двух эпох, а затем начинают увеличиваться с каждой следующей эпохой.
- Производительность чат-бота, судя по GPT-4, увеличивается (несмотря на увеличение оценочных потерь) примерно на 4,5 эпохи, а затем стабилизируется.
- Это означает, что мы можем игнорировать потерю оценки, продолжать обучение в течение некоторого времени, и модель все равно улучшится.
- Когда прекращать обучение, пока неясно, но 4–5 эпох кажутся безопасными и не вредят модели. По крайней мере, со стандартными гиперпараметрами.
- С какой стати я оценивал после эпох 0,9, 1,8, ..? Стандартные гиперпараметры предлагают установить для save_steps значение 500, а 500 шагов соответствуют не 1 эпохе, а 0,9 эпохе.
Читайте дальше, чтобы узнать, как именно были получены приведенные выше данные.
Подожди, я чего-то не понимаю!
- Я тоже.
- Почему потери резко возрастают именно после каждой эпохи? Если это происходит из-за переобучения, потери при оценке должны плавно увеличиваться. Верно? Может быть, я что-то упускаю здесь. Кроме того, такого резкого увеличения потерь не происходит с альпака-лора в моих самых ранних испытаниях (данные пока не показаны). Это может быть что-то конкретное для QLoRA.
- Как насчет размера пакета, шагов накопления градиента, скорости обучения, обучения на входе и (любого другого гиперпараметра) — как эти параметры влияют на производительность? Я пока не знаю, но я узнаю. Может быть. Вероятно. Если OpenAI увеличит мою квоту GPT-4 и позволит мне отправить им еще немного моих денег.
Тонкая настройка Llama2–7B с использованием QLoRA
Я использовал почти оригинальный файл finetune_guanaco_7b.sh из репозитория QLoRA. Я изменил следующие параметры: max_memory_MB (тренировался на 2x RTX4090 с 24 ГБ видеопамяти на runpod), увеличил per_device_eval_batch_size (скорость), удалил do_mmlu_eval ( скорость) и пользовательские пути модели. Я намеренно оставил per_device_train_batch_size одинаковым, так как это могло изменить качество моделей, хотя это было мучительно медленно.
python qlora.py \ --model_name_or_path "/workspace/models/llama2-7b-hf" \ --use_auth \ --output_dir /workspace/loras/llama2-guanaco-7b \ --logging_steps 10 \ --save_strategy steps \ --data_seed 42 \ --save_steps 500 \ --save_total_limit 100 \ --evaluation_strategy steps \ --eval_dataset_size 1024 \ --max_eval_samples 1000 \ --per_device_eval_batch_size 16 \ --max_new_tokens 32 \ --dataloader_num_workers 1 \ --group_by_length \ --logging_strategy steps \ --remove_unused_columns False \ --do_train \ --do_eval \ --lora_r 64 \ --lora_alpha 16 \ --lora_modules all \ --double_quant \ --quant_type nf4 \ --bf16 \ --bits 4 \ --warmup_ratio 0.03 \ --lr_scheduler_type constant \ --gradient_checkpointing \ --dataset oasst1 \ --source_max_len 16 \ --target_max_len 512 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 16 \ --max_steps 6000 \ --eval_steps 100 \ --learning_rate 0.0002 \ --adam_beta2 0.999 \ --max_grad_norm 0.3 \ --lora_dropout 0.1 \ --weight_decay 0.0 \ --seed 0 \ --report_to wandb \ --max_memory_MB 23000
Метрики обучения (Веса и смещения)
Оценка модели с использованием LMSYS MT-Bench
Оценка чат-бота сложна. Было тяжело — много чего произошло с тех пор, как я написал этот пост об автоматической оценке чат-ботов три месяца назад.
Оценка человека
Золотым стандартом производительности чат-бота является то, насколько хорошо человеку нравится с ним разговаривать (т. е. нижестоящая задача). LMSYS придумала арену чат-ботов, веб-сайт, похожий на ChatGPT, который показывает ответы двух моделей рядом, анонимно, личность моделей не указывается. Пользователь выбирает, какие ответы он предпочитает. Множество моделей на арене и тысячи попарных сравнений привели к единой оценке человека для каждой модели. Подробности смотрите в разделе Это.
Оценка на основе GPT-4: MT-Bench
Исследователи LMSYS из Беркли и других стран адаптировали свой первоначальный тест Vicuna, где каждой модели задавали 80 вопросов, а ответы передавали GPT-4, который оценивал каждый ответ от 1 до 10.
Преемником бенчмарка Vicuna является MT-Bench (код, бумага), оценивающий многооборотные разговоры.
MT-bench — это набор сложных многооборотных открытых вопросов для оценки чат-помощников. Чтобы автоматизировать процесс оценки, мы предлагаем сильным LLM, таким как GPT-4, выступать в качестве судей и оценивать качество ответов моделей.
Имея как данные оценки человека, так и новый автоматизированный эталонный тест, они обнаружили, что MT-bench работает очень хорошо, по-видимому, «достигая более 80% согласия, такого же уровня согласия между людьми».
Было приятным сюрпризом увидеть, насколько легко использовать их код.
Генерация модельных ответов
python3 gen_model_answer.py --model-path models/llama-2-7b-guanaco-checkpoint-500 --model-id llama-2-7b-guanaco-checkpoint-500
Оценка судьи GPT4
export OPENAI_API_KEY=not_a_real_OpenAI_kay # please ignore the weird model paths models="alpaca-13b \ gpt-4 \ llama-2-7b-guanaco-checkpoint-500 \ llama-2-7b-guanaco-checkpoint-1000 \ llama-2-7b-guanaco-checkpoint-1500 \ llama-2-7b-guanaco-checkpoint-2000 \ llama-2-7b-guanaco-checkpoint-2500 \ llama-2-7b-guanaco-checkpoint-3000 \ llama-2-7b-guanaco-checkpoint-3500" python3 gen_judgment.py --mode pairwise-baseline --model-list ${models} --parallel 4
В режиме pairwise-baseline ответ каждой модели сравнивается с базовой моделью. По умолчанию используется GPT-3.5. В качестве контроля я добавил ответы alpaca-13b (отрицательный) и GPT-4 (положительный).
Mode: pairwise-baseline Input file: data/mt_bench/model_judgment/gpt-4_pair.jsonl win loss tie win_rate loss_rate win_rate_adjusted model gpt-4 102 17 41 0.63750 0.10625 0.765625 llama-2-7b-guanaco-checkpoint-2500 24 98 38 0.15000 0.61250 0.268750 llama-2-7b-guanaco-checkpoint-3500 22 99 39 0.13750 0.61875 0.259375 llama-2-7b-guanaco-checkpoint-3000 21 100 39 0.13125 0.62500 0.253125 llama-2-7b-guanaco-checkpoint-2000 20 107 33 0.12500 0.66875 0.228125 llama-2-7b-guanaco-checkpoint-1500 12 109 39 0.07500 0.68125 0.196875 llama-2-7b-guanaco-checkpoint-1000 10 119 31 0.06250 0.74375 0.159375 llama-2-7b-guanaco-checkpoint-500 6 129 25 0.03750 0.80625 0.115625 alpaca-13b 6 134 20 0.03750 0.83750 0.100000 6 134 20 0.03750 0.83750 0.100000
Спасибо, что бодрствовали до этого момента, надеюсь, вам понравилось. Я продолжу тестировать методы обучения моделей дома и, возможно, сделаю из этого серию постов о том, как гиперпараметры влияют на производительность чат-бота.
Если у вас есть какие-либо мысли по поднятым вопросам, пожалуйста, оставьте комментарий ниже.