На предыдущей странице: учимся по сравнению двух ответов.
Заморозим прежние веса и обучим меньшие таблицы, задающие добавку. Это возвращает идею ограниченного по рангу обновления из главы 02.
Каждый известный токен готовит прогноз следующего. Ошибка проходит назад по программе, оптимизатор меняет веса, а отдельные данные проверяют результат. Разметка диалога и предпочтений меняет objective.
Обучаем низкоранговую добавку, не копию всей матрицы
Для frozen base matrix W∈R^(d_out×d_in) LoRA задаёт update как произведение двух меньших matrices. Если rank r существенно меньше обеих размерностей, trainable scalar count равен r(d_in+d_out), а dense update имел бы d_in*d_out. F05.
h=Wx+rαBAx,A∈Rr×din,B∈Rdout×r.
При инициализации одной factor нулями начальный update равен нулю и поведение base model сохраняется. После обучения adapter можно хранить отдельно или merge в W; merge меняет deployment artefact и должен фиксироваться в manifest. Выбор target modules, rank, alpha, dropout и dtype входит в config.
Что показывает модель. В inspector отдельно видны frozen path Wx, adapter path BAx, scaling и сумма. Изменение rank меняет максимальный rank update и число обучаемых параметров, но не гарантирует нужное качество. Несколько adapters могут использовать одну base model, если совпадают architecture, tensor names и tokenizer contract.
Граница применимости. PEFT уменьшает trainable parameters и optimizer state, но forward всё ещё использует base weights. Adapter способен наследовать и усиливать ограничения base model. Нельзя смешивать несовместимые checkpoints по совпадающим shapes без provenance; shape compatibility не доказывает семантическую совместимость.
W_16f=[[1,0,0],[0,1,0]]; A_16f=[[1,2,0]]; B_16f=[[0.5],[-0.5]]; x_16f=[1,1,1]
rank_16f,alpha_16f=1,2
ax_16f=[sum(a*x for a,x in zip(A_16f[0],x_16f))]
delta_16f=[alpha_16f/rank_16f*row[0]*ax_16f[0] for row in B_16f]
base_16f=[sum(a*x for a,x in zip(row,x_16f)) for row in W_16f]
assert base_16f==[1,1] and delta_16f==[3.0,-3.0] and rank_16f*(3+2)==5
Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Trainable factors задают low-rank ΔW, не переписывая base W.
Как пользоваться им, не повторяя обучение при каждом запросе?