LoRa - Недорогое дообучение моделей.



Идея состоит в том, чтобы заменить в модели некоторые из больших матриц меньшими для вычисления градиента. Назовем W0 весами предварительно обученной модели для конкретной матрицы слоев. После обновления градиента ΔW веса будут



W = W0 + ΔW



и, если x является входом для этого слоя, выход этого слоя будет



В . х = W0. х + ΔW. Икс



Если мы используем LLama2 с параметрами 70B, нам нужно обновлять все параметры для каждого обратного прохода: очень затратно в вычислительном отношении! Вместо этого с LoRA мы вставляем рядом с каждой матрицей слоев предварительно обученной модели 2 матрицы A и B, так что обновление аппроксимируется разложением более низкого ранга:

ΔВ ~ В . А



Хитрость заключается в том, что если ΔW имеет размеры (R, C), мы можем создать B с размерами (R, r) и A с размерами (r, C), так что r << R, C. Например, если R = 10K, C = 20K и r = 4, тогда



ΔW имеет R x C = 10K x 20K = 200M элементов

B имеет R x r = 10K x 4 = 40K элементов

и A имеет r x C = 20K x 4 = 80K элементов



Следовательно, A и B вместе содержат 120 тыс. элементов, что в 1666 раз меньше элементов, чем ΔW. При точной настройке мы обновляем веса только тех вновь вставленных матриц. Матрицы градиента намного меньше и поэтому требуют гораздо меньше памяти графического процессора. Поскольку предварительно обученные веса заморожены, нам не нужно вычислять градиенты для подавляющего большинства параметров.