Что такое ЛоРА? Объяснение низкоранговой адаптации LLM
20 декабря 2023 г.Всякий раз, когда мы хотим пользовательскую модель для нашего приложения, мы начинаем с предварительно обученной языковой модели и настраивать ее в нашем наборе данных. Раньше это было хорошо, пока мы не достигли большого режима модели Лангаж и не начали работать с такими моделями, как GPT, Llama, Vicuna и т. Д.
Эти LLMS довольно громоздкие, так что настраивать модель для различных приложений, таких как суммирование или понимание прочитанного.
И размер этих моделей только увеличивается почти еженедельно или ежемесячно. Таким образом, развертывание этих громоздких LLMS становится все более сложным.
Одним из решений, предложенных для этой проблемы, являются адаптеры .
Адаптеры
Адаптеры — это обучаемые дополнительные модули, подключаемые к нейронной сети (чаще всего трансформаторы). Во время тонкой настройки параметры только этих модулей адаптеров обновляются, а предварительно обученная модель замораживается.
Поскольку адаптеры являются дополнительными параметрами, они вносят задержку во время вывода. Для фиксированного размера пакета 32 и длины последовательности 512 для модели с 0,5 миллиона параметров требуется 1449 миллисекунд для вывода. А вот с адаптерами эта цифра на 2–3 % выше.
Итак, как LoRA достигает этого подвига? Давайте углубимся.
Визуальное обучение
Кстати, если вы, как и я, хорошо ориентируетесь в визуальном обучении и хотели бы посмотреть видеоверсию этой статьи, вы можете найти ее на YouTube здесь
Лора
LoRA означает Адаптация низкого ранга. Итак, что это значит?
Для любой архитектуры нейронной сети давайте не будем забывать, что веса сети — это просто большие матрицы чисел. У всех матриц есть свойство, называемое ранг. Ранг матрицы — это количество линейно независимых строк или столбцов в матрице.
Чтобы понять это, возьмем простую матрицу 3 на 3.
Ранг простой матрицы 3 на 3 вверху равен 1. Почему? Потому что первый и второй столбцы избыточны, поскольку они кратны первому столбцу. Другими словами, два столбца линейно зависимы и не несут никакой значимой информации.
Теперь, если мы просто изменим одно из значений на 70, ранг станет 2, поскольку теперь у нас есть два линейно независимых столбца.
Зная ранг матрицы, мы можем выполнить «разложение ранга» данной матрицы на две.
Возвращаясь к нашему примеру с матрицей 3 на 3, ее можно просто записать как произведение двух матриц; один размером 3 на 1, а другой размером 1 на 3.
Обратите внимание, что после разложения нам нужно сохранить только 6 чисел вместо 9 чисел в матрице 3 на 3. Это может показаться меньшим, но на самом деле эти веса имеют размерность 1024 на 1024, поэтому при использовании ранга 2 они сводятся к < > что значительно сокращает объем вычислений.
Итак, было бы неплохо, если бы эти веса имели низкий ранг, чтобы мы могли работать с разложением рангов вместо целых весов?
Оказывается, это действительно случай предварительно обученных моделей, как показано в этой более ранней работе. Они эмпирически показывают, что обычные предварительно обученные модели имеют очень низкую внутреннюю размерность; другими словами, существует перепараметризация малой размерности, которая столь же эффективна для точной настройки, как и полное пространство параметров.
Обучение
Предположим, мы начинаем с предварительно обученной модели с весами W_0. После точной настройки пусть веса будут обновлены до W_0 + delta W. Если предварительно обученная модель имеет веса низкого ранга, было бы справедливо предположить, что точно настроенные веса также имеют низкий ранг.
LoRA придерживается этого предположения. Поскольку дельта W является матрицей низкого ранга, теперь мы можем разложить ее на две матрицы низкого ранга, A и B, произведение BA которых приводит к дельта W.
Наконец, точная настройка заключается в использовании предварительно обученных весов W0 + BA вместо W_0 + delta W, поскольку это одно и то же.
С этой точки зрения, если мы начнем обучение модели с входными данными x,, входные данные проходят как через предварительно обученные веса, так и через A и B. Веса предварительно обученной модели остаются замороженными. Однако мы по-прежнему учитываем выходные данные замороженной модели во время обучения.
Выходные данные как замороженной модели, так и модели с низким рейтингом суммируются для получения выходного скрытого представления h.
Вывод
Теперь вы можете спросить, а как насчет задержки во время вывода? Если мы немного изменим приведенное выше уравнение, мы заметим, что можем объединить или добавить веса BA к предварительно обученным весам W_0. Таким образом, для вывода, используется именно этот объединенный вес, тем самым преодолевая узкое место задержки.
Одной из других проблем является развертывание LLM, поскольку они довольно громоздки, скажем, около 50 или 70 ГБ. Допустим, нам нужно настроиться на две задачи, а именно: обобщение и перевод. Нам не нужно развертывать всю модель каждый раз при точной настройке.
Мы можем просто настроить слои loRA специально для этой задачи. Например, обобщение и развертывание модели для обобщения. Аналогичным образом мы можем развернуть уровни LoRA, специфичные для перевода.
Таким образом, LoRA решает проблемы как с развертыванием, так и с задержкой, с которыми сталкиваются современные LLM.
LoRA для трансформеров
Что касается подачи заявок на трансформеры, мы все знаем, что у трансформеров есть два основных модуля: многоголовое самовнимание и многослойные перцептроны или MLP. Модули самообслуживания состоят из весов запроса, ключа, значения и выходных данных.
Таким образом, они ограничили свое исследование только адаптацией весов внимания для последующих задач и заморозкой модулей MLP (поэтому их не обучали последующим задачам). Это означает, что LoRA применяется только к модулю самообслуживания.
Мы говорили об использовании LoRA для адаптации. Одним из ключевых параметров LoRA является выбранный нами ранг r. Итак, каков оптимальный ранг для LoRA? К всеобщему удивлению, оказывается, что ранга всего лишь 1 достаточно для адаптации как запроса, так и значения.
Однако при адаптации отдельного запроса он должен иметь более высокий ранг — 4, 8 или даже 64.
Использование LoRA
Переходя к тому, как мы можем практически использовать LoRA, отметим, что существует официальная реализация от Microsoft, которая выпущена как loralib и доступна. по лицензии MIT.
Другой вариант использования LoRA — это репозиторий Huggingface под названием PEFT, который означает точную настройку с эффективным использованием параметров. PEFT доступен по лицензии Apache 2. У PEFT есть несколько других реализаций, таких как настройка префиксов и настройка приглашений, а LoRA — одна из первых реализованных в библиотеке.
Заключение
LoRA – это простой, но эффективный подход к тонкой настройке, который закладывает основу PEFT для программ LLM. Это позволяет как обучать, так и развертывать мощные модели на стандартном оборудовании, что в противном случае является непростой задачей.
Существует несколько его вариаций или улучшений, таких как QLoRA, о которых мы расскажем в моих следующих статьях.
Я надеюсь, что эта статья была полезна для понимания функционирования модели LoRA. Надеюсь увидеть вас в моем следующем. А пока берегите себя...
Оригинал