Вопрос или проблема
Я читал статью о LORA https://arxiv.org/pdf/2106.09685.pdf, и одна вещь, которую я не понимаю, это раздел 4.1, где обновления изменяются с помощью альфа, где альфа – это константа в r. Говорится, что альфа устанавливается на первую r, которые пробовали. Тогда, если я правильно понимаю, авторы утверждают, что это делает ненужным настраивание коэффициента обучения альфа. Я был бы очень признателен, если бы кто-то мог объяснить мне эту концепцию. Начнем с того, что я не понимаю, почему нужно масштабировать обновление веса с помощью константы. Я имею в виду, что все веса обновлений оптимизируются в процессе тонкой настройки.
Я также хотел понять, почему A инициализируется случайным образом, а B равен нулю. Будет ли это иметь значение, если будет наоборот (A равно нулю, B случайное?) Также что пойдет не так, если оба будут установлены в ноль?
У меня был такой же вопрос. Я все еще не получил убедительного ответа, но во время поиска я нашел то, что может быть полезно:
В этом блоге говорится:
Альфа масштабирует изученные веса. Существующая литература, включая оригинальную статью LoRA, обычно советует фиксировать Альфа – часто на 16 – а не рассматривать его как настраиваемый гиперпараметр.
В литературе говорится:
[…] и альфа LoRA является коэффициентом масштабирования для матриц весов. Матрица весов масштабируется по $\frac{lora\_alpha}{lora\_rank}$, и более высокое значение альфа придает больший вес активациям LoRA. Мы выбрали 16, так как это была общепринятая практика в обзоре скриптов для обучения и выбрали соотношение 1:1, чтобы не подавлять базовую модель.
Хотя эти два отрывка были ясны, я все еще не понимаю, почему следует масштабировать обновления весов. Кроме того, я не ожидал соотношения $\frac{lora\_alpha}{lora\_rank} > 1$, но в учебнике, который я следую для применения LoRA к Whisper (модель ASR), это соотношение равно $2$, с $lora\_alpha=64$ и $lora\_rank=32$.
Я также хотел понять, почему A инициализируется случайным образом, а B равен нулю. Будет ли это иметь значение, если будет наоборот (A равно нулю, B случайное?).
Я думаю, они просто хотят, чтобы начальный шаг тонкой настройки был таким, как если бы мы настраивали только с предобученным весом (никакие дополнительные веса не влияют на результат). Один из A или B должен быть равен нулю, так что (A равно нулю, B случайное?) тоже должно сработать.
Также, что пойдет не так, если оба будут установлены в ноль?
Инициализация их обоих в ноль может вызвать некоторые проблемы, я думаю, это та же причина, по которой мы не инициализируем модели глубокого обучения нулем. Градиентный сигнал, отправляемый от A к B, будет одинаковым (все нули), и каждый узел в A будет выглядеть одинаково для B.
Связанная ссылка
Инициализация весов перцептрона нулями
Я думаю, что lora_alpha/lora_rank – это способ регулировки того, насколько влиятельной вы хотите, чтобы была тонкая настройка. Ниже приведен фрагмент из статьи, который поможет лучше это объяснить:
h = W0x + ∆W x = W0x + BAx
Мы используем случайную гауссовскую инициализацию для A и ноль для B, так что ∆W = BA изначально равно нулю. Мы затем масштабируем ∆W x по α/r,
где α – это константа в r.
Обратите внимание на уравнение и на последнюю строку.
Итак, теперь, если для определенного lora_rank(r) мы выбираем высокое lora_alpha(α), то новое добавление от тонкой настройки будет более влиятельным по сравнению с предыдущими весами, так как наше скрытое представление на самом деле теперь
h = W0x + ∆W x = W0x + BAxα/r. Но если бы мы выбрали сравнительно низкую альфа, то мы были бы более согласованы с оригинальными предобученными весами.
При реализации LoRA я столкнулся с такой же проблемой, но после тщательного прочтения я понял, что цель альфа – сохранить значение альфа/rank постоянным. Это означает, что, когда я корректирую ранг, я могу настроить значение альфа, чтобы обеспечить фиксированную скорость изменения модели (т.е. alpha/rank) на исходном уровне.
Во время прямого прохода выход,
h, блока LoRA равен:
h=W0(x)+(α/r)BAx
где
W0 – это замороженная оригинальная матрица, r – ранг A и B, x – это вход в блок, а α/r – это коэффициент масштабирования, который контролирует степень, в которой
A и B влияют на выход.
Вышеуказанные данные взяты с этого сайта: https://www.determined.ai/blog/lora-parameters
.
Таким образом, мы можем понять, что в llm при выводе мы добавляем BA в W0, но вместо прямого сложения мы назначаем определенный вес для BA. Этот вес говорит о том, насколько сильное влияние обучения (т.е. умножение B и A) мы должны учитывать. В оригинальной статье мы установили это соотношение как 2, что указывает на то, что мы сильно полагаемся на новое обучение по сравнению с оригинальным W0. Во время тонкой настройки llama3.1 для обучения и тестирования я установил это соотношение α/r как 1, что дало мне лучший результат. Таким образом, это соотношение является одним из самых важных гиперпараметров!
Также с предоставленного веб-сайта мы видим, что мы получаем лучший результат для более высокого значения α, например α=512. Также с этого веб-сайта мы также видим, что нет значительного влияния r.
Поэтому, согласно моим знаниям, вывод заключается в том, что мы должны поддерживать более высокое значение α, например 256, 512 и более низкое значение r, например 8, 16.
Ответ или решение
Вопрос о настройке параметра альфа (α) в методе LoRA (Low-Rank Adaptation) становится все более актуальным в контексте развития глубокого обучения и тонкой настройки моделей. Давайте подробнее рассмотрим этот аспект, а также другие ключевые элементы, такие как инициализация матриц A и B.
1. Параметр α: назначение и влияние
Параметр α в контексте LoRA используется для масштабирования обновлений весов, и его роль как «константы» особенно важна. Основная идея заключается в том, что α позволяет регулировать вклад, который добавляет теневое обновление весов (ΔW = BA) в общую модель (h = W0x + ΔWx). С точки зрения формулы:
[ h = W_0x + \frac{\alpha}{r}BAx ]
где:
- ( W_0 ) — замороженная основная матрица.
- ( r ) — ранг матриц A и B.
- ( x ) — входные данные.
Почему масштабирование необходимо?
Масштабирование обновлений весов позволяет управлять интенсивностью новых весов, добавляемых в модель. Высокое значение α приведет к тому, что обновления будут иметь больший вес в выходе, тем самым влияя на обучение больше, чем изначальные веса модели. Это особенно полезно в случаях, когда важно, чтобы новые данные имели заметное влияние на целевую модель.
Повышение значения α обуславливает более сильное влияние обновлений, что в большинстве случаев является желательным. Например, если у нас есть α = 512 и ранг r = 32, мы получаем (\frac{\alpha}{r} = 16), что подтверждает, что обновление достаточно мощное и весомое.
2. Инициализация матриц A и B
Инициализация A случайно, а B — в ноль. Это решение объясняется тем, что при начале тренировки обновления должны быть изначально минимальными (ΔW = 0), чтобы избежать переобучения на старых данных. Если бы обе матрицы были нулевыми, то весь процесс обучения оказался бы в стагнации, так как градиенты также были бы нулевыми.
-
Если бы A было инициализировано нулем, а B случайно: это привело бы к тому, что выход модели основывался бы на случайных весах B, а обновления A были бы нулевыми, что не дало бы информации о том, как изменяется модель.
-
Если обе матрицы были бы нулевыми: модель не смогла бы учиться, так как не было бы градиентного сигнала для обновления весов.
3. Варианты настройки α и r
Как упоминалось, существует определенная практика выбора значений для α и r. Оптимальное значение α варьируется в зависимости от задачи и может доходить до 512, в то время как r может быть меньшим, например, 8 или 16. Это позволяет контролировать уровень влияния дополнений, сохраняя при этом вычислительную эффективность.
В заключение, настройка параметра α и инициализация матриц A и B представляют собой значимые аспекты, влияющие на успех применения LoRA в процессе тонкой настройки моделей. Понимание этих концепций является ключом к эффективному использованию методов адаптации и достижения лучших результатов в глубоких моделях обучения.