В нашем предыдущем обсуждении мы рассмотрели оценку встроенных моделей и потенциальные преимущества размещения этих моделей для достижения лучших результатов.



E5-large-v2, тонкая универсальная модель с открытым исходным кодом, разработанная исследователями Microsoft, была лидером в таблице лидеров MTEB, когда я писал этот пост. Однако всего через 7 дней его обогнала модель GTE-large, еще меньшая модель, которая вдвое меньше E5-large-v2 и превосходит ее по производительности. GTE-база, которая составляет всего 1/6 размера E5-large-v2, также обогнала его.

Беглый взгляд на размеры моделей и показатели производительности показывает, что более крупные модели не обязательно работают лучше. На самом деле, успех моделей E5 и GTE говорит о том, что модели меньшего размера по-прежнему имеют большой потенциал. Например, модель text-embedding-ada-002 уступила модели gte-small, имеющей всего 70 миллионов параметров. Это выдающееся достижение, и оно демонстрирует потенциал меньших моделей.

Эта новая разработка имеет первостепенное значение. Это не только представляет собой значительный технический прорыв, но и открывает новые возможности для корпоративных приложений. И корпоративные приложения в моих интересах.

В будущем предприятия, вероятно, будут использовать разнообразный набор больших и малых языковых моделей для удовлетворения широкого круга потребностей. Некоторые модели будут обучены выполнять общие задачи, такие как безопасность и обнаружение персональных данных. Другие будут обучены решению более специфических задач, таких как корпоративный поиск, анализ журналов и выполнение конкретных проектных задач. Кроме того, меньшие модели могут быть объединены вместе, чтобы сформировать экспертную комиссию, которая может предоставить более полную и детальную информацию.

Все это требует, чтобы модели были небольшими и эффективными, и мы также должны иметь возможность настраивать модели под свои нужды. В этой статье я расскажу, как настроить модель встраивания, и продемонстрирую, как настроить модель E5.

Проблема тонкой настройки языковой модели

Для типичной модели компьютерного зрения структура обычно представляет собой набор полностью связанных слоев, слоев свертки, слоев объединения и слоев активации. Тонкая настройка довольно проста: заморозьте все остальные слои и переобучите только один или два верхних слоя.

По сравнению с моделью компьютерного зрения структура языковой модели сильно отличается. Типичная языковая модель представляет собой стек Transformers. Выходы каждого уровня Transformer усложняются тремя векторами внедрения: внедрение токена, внедрение сегмента и внедрение положения. Каждый из векторов вложения имеет следующий размер:

(длина ввода, размер встраивания)

Если мы последуем старой мудрости и настроим только последний слой, то обнаружим, что это все еще очень затратный процесс. Требуется большой объем обучающих данных, мощная машина и долгий час обучения. И самое ужасное, что после тонкой настройки модель забудет знания, полученные на предобучении. Это называется катастрофическим забыванием. Это произошло потому, что знания хранились на каждом уровне встраивания. При изменении слоя встраивания во время тонкой настройки знания терялись.

Второй способ тонкой настройки языковой модели заключается в добавлении дополнительного слоя сверху. Это может предотвратить катастрофическое забывание; однако, поскольку языковая модель должна обрабатывать информацию слой за слоем, дополнительный уровень замедлит время отклика модели. Тем не менее, доработка модели стоит дорого.

LoRA и PEFT

И третий способ тонкой настройки языковой модели — создать набор матриц того же размера, что и исходные вложения, затем заморозить исходные вложения, но сохранить все веса, полученные во время тонкой настройки, в новых матрицах. Следующий умный ход — разложить каждую из матриц на две матрицы более низкого ранга. На этапе оценки матрицы с низким рангом будут использоваться для восстановления точно настроенной матрицы весов, а затем добавлены к исходному весу модели для получения окончательного веса.

Эта технология была известна как низкоранговая адаптация большой языковой модели или сокращенно LoRA.

Принятие LoRA имеет три основных преимущества: во-первых, декомпозиция уменьшает количество обучаемых параметров. Для исходной матрицы (1024, 1024) существует 1 миллион обучаемых параметров. Если мы разложим одну и ту же матрицу на две матрицы ранга 8, обучаемые параметры будут:
2 * 8 * 1024 = 16384, или 1/64 от исходного размера.

Второе преимущество заключается в том, что, поскольку предварительно обученные веса замораживаются, а дополнительные весовые матрицы разлагаются на более низкие ранги, вероятность катастрофического забывания снижается.

И, наконец, поскольку вес LoRA намного меньше, можно разместить одну базовую модель с несколькими специально настроенными весами LoRA для различных целей.

Помимо LoRA, есть еще одна технология, позволяющая снизить стоимость обучения моделей. Исследователи заметили, что веса глубокого обучения представлены в формате 32-битного числа с плавающей запятой, что в большинстве случаев не требуется. Они представили концепцию Pпараметра-Eэффективного Fine-Tuning (PEFT) для приведения вниз типы данных из 32-битных плавают в типы данных с более низкой точностью. Приведение типов данных вниз для ускорения обучения модели — не новая идея.

Однако он не был так популярен, потому что типы данных с более низкой точностью могут не соответствовать всем весам, а понижающее приведение приводит к значительному снижению производительности модели. Пока исследователи PEFT не обнаружили, что при вычислении матричного умножения выбросы были более важными, чем не выбросы, выбросы можно было хранить в FP16, в то время как не выбросы хранились в безумном 4-битном формате, известном как FP4. Затем выбросы и не выбросы снова складываются, чтобы получить полный результат в FP16.

Дизайн эксперимента

В эксперименте я собираюсь продолжить использовать E5-small-v2 в качестве базовой модели. Несмотря на помощь LoRA и PEFT, обучение все же лучше проводить на GPU, поэтому я установил инстанс GCP Compute Engine G2 с NVIDIA L4, 40 ГБ дискового пространства, 4 виртуальных ЦП и 16 ГБ памяти.

Я надеюсь, что тонкая настройка может быть ближе к реальным бизнес-сценариям, поэтому я выбрал дублированный набор открытых данных Quora в качестве обучающих данных [1]. Набор данных содержит более 400 тысяч пар вопросов и пометку о том, дублируются ли вопросы или нет.

Этот дублированный набор данных вопросов больше соответствует потребностям реального проекта. Представьте, что мы обнаружили проблему с точностью модели. Один из интуитивно понятных способов организации обучающих данных — предоставить как положительные, так и отрицательные примеры, чтобы мы могли научить модель правильно понимать запрос. Такой тип организации обучающих данных называется контрастным обучением. Разновидностью контрастного тренинга является тройной тренинг, который имеет как положительные, так и отрицательные ссылки в одной строке.

Однако 400 КБ данных — это больше, чем мне нужно. Поэтому я выбрал только вопросы с количеством символов от 60 до 268 (просто случайная настройка), чтобы составить меньший набор данных из 91 тыс. строк. Затем я случайным образом выделил 20% данных в качестве тестового набора, а остальные — в качестве обучающего набора.

Тренировочный процесс был:

  • генерировать вложения для question1 и question2;

  • ссылаясь на метку, чтобы генерировать потери при обучении. Тренировочная функция заключается в следующем:

Другими словами, он подталкивает результат либо к 1 для положительных пар вопросов, либо к 0 для отрицательных пар вопросов.

Репозиторий Git можно найти в [2]

Выполнение эксперимента

Когда экземпляр Compute Engine будет готов, нам нужно войти на сервер через ssh, а затем запустить install.sh, чтобы подготовить машину. После этого проверьте репозиторий и установите зависимости Python, перечисленные в script/requirements.txt.

Теперь код готов к работе. Перейдите в каталог script/ и выполните следующую команду:

~/.local/bin/accelerate launch  \
--mixed_precision="fp16"  \
peft_lora_embedding_semantic_search.py   \
--dataset_name="../data/quora_dq_train.csv"   \
--max_length=70   \
--model_name_or_path="intfloat/e5-small-v2"   \
--per_device_train_batch_size=64   \
--per_device_eval_batch_size=128   \
--learning_rate=5e-4   \
--weight_decay=0.0   \
--num_train_epochs 3   \
--gradient_accumulation_steps=1   \
--output_dir="../model/peft_lora_e5"   \
--seed=42   \
--with_tracking   \
--report_to="wandb"   \
--use_peft \
--checkpointing_steps "epoch"

Если все в порядке, запуск кода завершится менее чем через 10 минут. Обратите внимание на следующие строки в журнале:

LoRA уменьшила обучаемые параметры до менее чем 0,5 процента! Без этой фантастической технологии мы не смогли бы провести этот эксперимент.

Вот график тренировочных потерь:

Потеря оценки выглядит следующим образом:

Перед тонкой настройкой исходный E5-small-v2 набрал 0,852 на тестовом наборе. После тонкой настройки с использованием 73 000 обучающих данных производительность составляет 0,955. Довольно обнадеживающее улучшение.

Заключение

Этот эксперимент продемонстрировал, что точная настройка высокопроизводительного LLM является важным вариантом при разработке реальных проектов. Немного потрудившись, мы можем сделать модель более подходящей для конкретных требований, что невозможно для многих коммерческих моделей.

Тем не менее, 73 КБ обучающих данных по-прежнему выглядят не очень хорошо. Это слишком много для проектных разработчиков. Когда мы предоставляем контрастные примеры для модели, мы просто используем их, чтобы сообщить модели, что положительные пары становятся ближе, а отрицательные пары удаляются. На самом деле мы не можем гарантировать, что модель будет перемещать только тренировочную цель к эталонам, а не ссылку к тренировочной цели.

Это не является серьезной проблемой при предварительном обучении LLM, поскольку для предварительного обучения LLM требуется огромное количество данных низкого качества. Но это важно на этапах тонкой настройки, потому что мы ценим более точный контроль над результатом тренировки. Кроме того, мы можем вручную обрабатывать небольшие объемы высококачественных данных.

Я изучу варианты точной тонкой настройки в будущем.

Справочник