Target modules och rank i LoRA
Kunna välja vilka lager som får adaptrar och vilken rank, och mäta effekten.
Förkunskaper
Intuition
Två val avgör LoRA-resultatet: vilka matriser som får adaptrar och vilken rank.
Target modules. Originalpappret satte adaptrar bara på q_proj och v_proj. Senare arbete (QLoRA m.fl.) visar att alla linjära lager — inklusive MLP-delarna gate_proj, up_proj, down_proj — ger bättre resultat när budgeten räcker. MLP-lagren är ungefär två tredjedelar av parametrarna; att hoppa över dem är att lämna mycket outnyttjat.
Rank. r = 4–8 räcker för stil och format. r = 16–64 för svårare anpassning. Högre rank hjälper främst när uppgiften kräver ny kunskap, inte bara nytt beteende.
Alpha. Skalningen är α/r. Håll α ≈ 2r som utgångspunkt, så slipper du justera inlärningstakten när du ändrar r.
Kod
from peft import LoraConfig, get_peft_model
ALLA_LINJARA = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]
cfg = LoraConfig(
r=16, lora_alpha=32, lora_dropout=0.05,
target_modules=ALLA_LINJARA, # inte bara q och v
task_type="CAUSAL_LM",
)
m = get_peft_model(bas, cfg)
m.print_trainable_parameters()
# trainable params: 40,370,176 || all params: 7,281,... || trainable%: 0.55
# Parameterräkning för hand: r · (d_in + d_out) per matris
def lora_params(lager=32, d=4096, d_ffn=11008, r=16, moduler=ALLA_LINJARA):
per_lager = 0
for namn in moduler:
d_in, d_ut = (d, d) if namn in ("q_proj", "k_proj", "v_proj", "o_proj") else \
((d, d_ffn) if namn in ("gate_proj", "up_proj") else (d_ffn, d))
per_lager += r * (d_in + d_ut)
return per_lager * lager
for r in (4, 16, 64):
print(r, f"{lora_params(r=r):,}")
# 4 15,335,424
# 16 61,341,696
# 64 245,366,784
Så väljer du utan att gissa: kör ett litet svep — r ∈ {8, 16, 32} × {bara attention, alla linjära} — på en delmängd av datan, med tre frön, och mät på din egen eval. Det tar några timmar och är den enda metoden som ger ett svar för just din uppgift.
Diagnostik om du har tillgång till en full finjustering: gör SVD på ΔW och titta på singulärvärdesspektrumet. Faller det brant efter k värden är r ≈ k tillräckligt.
Behärskning innebär
- Väljer target modules medvetet
- Väljer rank och alpha med motivering
- Mäter effekten av valen i stället för att gissa
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — LoRA: Low-Rank Adaptation of Large Language Models — arXiv (öppen åtkomst; licens per artikel)
- arXiv — QLoRA: Efficient Finetuning of Quantized LLMs — arXiv (öppen åtkomst; licens per artikel)