Katastrofal glömska
Kunna mäta hur finjustering skadar tidigare förmågor och tillämpa motmedel.
Förkunskaper
Intuition
Du finjusterar en modell på svenska supportsvar. Den blir utmärkt på det — och börjar svara sämre på allt annat: kod, engelska, matematik, instruktionsföljande.
Det kallas katastrofal glömska: när vikterna flyttas mot den nya uppgiften förloras det som kodades i samma vikter.
Det lömska är att man inte märker det, eftersom man bara mäter på den nya uppgiften. Din eval visar 0,91 och allt ser bra ut — tills en användare ställer en fråga utanför domänen.
Regeln: mät alltid två saker efter finjustering — målupgiften och en generell hållbarhetssvit.
Formellt
Motmedel, i effektordning:
| Åtgärd | Mekanism | Kostnad |
|---|---|---|
| PEFT (LoRA) med låg rank | basvikterna rörs aldrig | ingen |
| Låg inlärningstakt (1e-5 till 5e-5) | små steg bort från utgångspunkten | långsammare konvergens |
| Färre epoker (1–3) | mindre drift | kan underanpassa |
| Blandad data (replay) | 5–20 % generell instruktionsdata i träningsmixen | behöver sådan data |
| KL-straff mot referensmodellen | begränsar hur långt policyn får gå | extra beräkning |
| Modellsammanslagning (task arithmetic) | interpolera mellan bas och finjusterad | kräver utvärdering av viktningen |
Mätning: definiera en hållbarhetssvit på 100–200 fall från förmågor du vill behålla (instruktionsföljande, ett annat språk, enkel matematik, kodsnuttar). Kör den före och efter. En försämring på mer än några procentenheter är ett medvetet beslut som ska motiveras — inte en överraskning.
Kod
# Blandad data (replay): behåll generell förmåga under finjustering
import random
def bygg_traningsmix(domandata, generell_data, andel_generell=0.10, seed=0):
rng = random.Random(seed)
n_gen = int(len(domandata) * andel_generell / (1 - andel_generell))
mix = list(domandata) + rng.sample(generell_data, min(n_gen, len(generell_data)))
rng.shuffle(mix)
return mix
# Mät före/efter på BÅDA sviterna
def rapport(modell_fore, modell_efter, mal_eval, hallbarhet_eval):
r = {}
for namn, sv in (("mål", mal_eval), ("hållbarhet", hallbarhet_eval)):
f, e = sv(modell_fore), sv(modell_efter)
r[namn] = {"fore": round(f, 3), "efter": round(e, 3), "delta": round(e - f, 3)}
return r
# {'mål': {'fore': 0.62, 'efter': 0.91, 'delta': 0.29},
# 'hållbarhet': {'fore': 0.78, 'efter': 0.59, 'delta': -0.19}} ← detta är glömska
Tabellen ovan är exakt den rapport som ska följa med varje finjusterad modell. Utan raden «hållbarhet» vet ingen vad anpassningen kostade.
Behärskning innebär
- Mäter hur finjustering skadar tidigare förmågor
- Tillämpar motmedel: blandad data, låg lr, PEFT
- Väljer utvärdering som fångar glömskan
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — An Empirical Study of Catastrophic Forgetting in Large Language Models — arXiv (öppen åtkomst; licens per artikel)
- arXiv — QLoRA: Efficient Finetuning of Quantized LLMs — arXiv (öppen åtkomst; licens per artikel)