Имеет ли значение потеря оценки при обучении чат-ботов (с 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

Спасибо, что бодрствовали до этого момента, надеюсь, вам понравилось. Я продолжу тестировать методы обучения моделей дома и, возможно, сделаю из этого серию постов о том, как гиперпараметры влияют на производительность чат-бота.

Если у вас есть какие-либо мысли по поднятым вопросам, пожалуйста, оставьте комментарий ниже.