Hoppa till innehållet
AI-grafen
E· Universitetmodelltraning-finjustering· ca 60 min· utvecklande· verifierad 2026-09-20

Instruktionsfinjustering (SFT)

Kunna finjustera en liten modell på instruktionsdata och mäta förbättring.

Förkunskaper

Intuition

SFT (supervised fine-tuning) lär modellen att svara i stället för att fortsätta text. Data är (instruktion, svar)-par, och receptet är enkelt — men tre detaljer avgör resultatet:

  1. Maskera prompten. Loss ska bara räknas på svarstokens. Annars lär sig modellen att generera frågor lika gärna som svar.
  2. Använd rätt chat-mall — samma vid träning och inferens. Fel mall kostar mätbart utan att synas som fel.
  3. Få epoker. 1–3. Mer ger memorering, och på 1 000 exempel märks det redan vid epok 4.

Kvalitet slår kvantitet: 1 000 noggrant granskade par slår 50 000 slarviga.

Kod

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

namn = "Qwen/Qwen2.5-0.5B-Instruct"
tok = AutoTokenizer.from_pretrained(namn)
m = AutoModelForCausalLM.from_pretrained(namn, torch_dtype=torch.bfloat16, device_map="auto")

def koda(instruktion: str, svar: str, max_len=1024):
    prompt = tok.apply_chat_template([{"role": "user", "content": instruktion}],
                                     tokenize=False, add_generation_prompt=True)
    p_ids = tok(prompt, add_special_tokens=False)["input_ids"]
    s_ids = tok(svar + tok.eos_token, add_special_tokens=False)["input_ids"]
    ids = (p_ids + s_ids)[:max_len]
    labels = ids.copy()
    labels[:len(p_ids)] = [-100] * min(len(p_ids), len(labels))   # maskera prompten
    return torch.tensor(ids), torch.tensor(labels)

opt = torch.optim.AdamW(m.parameters(), lr=1e-5)
for epok in range(2):
    for instr, svar in data:
        ids, labels = koda(instr, svar)
        loss = m(input_ids=ids[None].cuda(), labels=labels[None].cuda()).loss
        loss.backward()
        torch.nn.utils.clip_grad_norm_(m.parameters(), 1.0)
        opt.step(); opt.zero_grad()

Utvärdering — tre sviter, alltid:

SvitVad den svarar på
Måleval (≥ 50 fall)blev modellen bättre på uppgiften?
Baslinje few-shotbehövdes finjusteringen alls?
Hållbarhet (≥ 50 fall)tappade den något annat?

Den mittersta glöms nästan alltid — och är den som ibland visar att en bra prompt hade räckt.

Behärskning innebär

  • Finjusterar en modell på instruktionsdata
  • Maskerar prompten i förlusten
  • Mäter förbättring mot baslinje och hållbarhet

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser