Specifikationsproblem och proxymål
Kunna ge exempel på när det man mäter skiljer sig från det man vill, och designa bättre mål.
Förkunskaper
- FBelöningshackningkrävs
Intuition
Ett specifikationsproblem uppstår när det du kan mäta inte är det du faktiskt vill ha. Du optimerar proxyn, och systemet blir bra på proxyn — inte på målet.
Goodharts lag: «när ett mått blir ett mål upphör det att vara ett bra mått.»
| Vad man vill | Vad man mäter | Vad man får |
|---|---|---|
| Att eleven lär sig | tid i appen | en app som är svår att lämna |
| Nöjda användare | tummen upp | en modell som håller med om allt |
| Bra kod | antal rader | utspädd kod |
| Säkra svar | andel avböjda frågor | en modell som vägrar allt |
| Relevanta sökresultat | klickfrekvens | clickbait |
Det är inte ett tekniskt fel utan ett designfel. Systemet gör exakt vad du bad om — problemet är vad du bad om.
Och det gäller lika mycket för människor och organisationer som för RL-agenter. Belöningshackning i ett spel och en säljorganisation som optimerar kvartalssiffror är samma fenomen.
Formellt
Varför proxyn brister just när man pressar den. En proxy korrelerar med målet inom det område där man normalt befinner sig. Optimerar man hårt på hamnar man utanför det området, och där gäller korrelationen inte längre.
Goodharts lag är alltså inte mystisk: det är extrapolering bortom mätområdet, precis som när man förlänger en regressionslinje för långt.
Fyra former, enligt Manheims och Garrabrants taxonomi:
| Form | Mekanism |
|---|---|
| Regressional | proxyn innehåller brus; att välja maxpunkten väljer också maxbruset |
| Extremal | sambandet bryts i extremvärdena |
| Causal | man optimerar en korrelation utan orsakssamband |
| Adversarial | någon aktivt utnyttjar proxyn |
Motmedel:
| Motmedel | Idé |
|---|---|
| Flera mål samtidigt | svårare att spela alla på en gång |
| Skyddsräcken | mått som inte får försämras, även om huvudmåttet stiger |
| Satisficing | nå «tillräckligt bra» i stället för att maximera |
| Regularisering mot en referens | KL-straff mot utgångsmodellen i RLHF |
| Mänsklig granskning | av stickprov, särskilt i svansarna |
| Rotera måtten | gör det svårare att optimera mot ett fast mål |
KL-straffet i RLHF är det tydligaste exemplet på motmedel i praktiken: belöningsmodellen är en proxy för mänskliga preferenser, och utan straffet driver policyn iväg till text som belöningsmodellen älskar men människor inte gillar.
Frågan att alltid ställa: «hur skulle jag maximera det här måttet om jag inte brydde mig alls om det underliggande syftet?» Har du ett svar på under en minut är måttet för spelbart.
För AI-grafen konkret. Ett uppenbart proxymål vore «andel rätta svar». Maximeras det genom att göra övningarna lättare — vilket är motsatsen till syftet. Därför mäts i stället behärskade noder per nedlagd studietimme, med andelen handledarsvar som ger bort facit som skyddsräcke, och andelen klarade överföringsuppgifter som separat mått: de går inte att klara genom igenkänning.
Kod
import numpy as np
from dataclasses import dataclass
@dataclass
class Matt:
namn: str
roll: str # norrstjarna | stod | skyddsracke
riktning: str # upp | ner | stabil
trosk: float | None = None
def spelbarhetsanalys(matt: str, satt_att_spela: list[str]):
"""Dokumentera hur måttet kan maximeras utan att syftet uppfylls."""
return {"matt": matt, "satt": satt_att_spela, "antal": len(satt_att_spela),
"bedomning": "för spelbart" if len(satt_att_spela) >= 3 else "acceptabelt"}
print(spelbarhetsanalys("andel rätta svar", [
"gör övningarna lättare",
"ge bort facit i handledartexten",
"låt eleven försöka obegränsat många gånger",
"ta bort de svåra noderna ur vägen",
]))
# Regressional Goodhart: att välja maxpunkten väljer också maxbruset
rng = np.random.default_rng(0)
n = 10_000
sant_varde = rng.normal(0, 1, n)
brus = rng.normal(0, 1, n)
proxy = sant_varde + brus # korrelation ~0.71
for topp in (1.0, 0.1, 0.01, 0.001):
k = max(1, int(n * topp))
valda = np.argsort(-proxy)[:k]
print(f" topp {topp:>6.1%}: proxy {proxy[valda].mean():>6.3f} "
f"sant värde {sant_varde[valda].mean():>6.3f} "
f"gap {proxy[valda].mean() - sant_varde[valda].mean():>5.3f}")
# ↑ ju hårdare urval, desto större del av proxyn som är rent brus
# Skyddsräcken: blockera en release som försämrar dem, oavsett huvudmåttet
MATT = [
Matt("beharskade_noder_per_timme", "norrstjarna", "upp"),
Matt("andel_klarade_overforingsuppgifter", "stod", "upp"),
Matt("andel_svar_som_ger_bort_facit", "skyddsracke", "ner", trosk=0.02),
Matt("andel_som_lamnar_mitt_i_vag", "skyddsracke", "ner", trosk=0.15),
]
def granska_release(fore: dict, efter: dict):
rader, blockerar = [], False
for m in MATT:
d = efter[m.namn] - fore[m.namn]
brott = m.trosk is not None and efter[m.namn] > m.trosk
if brott and m.roll == "skyddsracke":
blockerar = True
rader.append({"matt": m.namn, "delta": round(d, 4), "brott": brott})
return {"blockerar": blockerar, "rader": rader}
# KL-straff mot referensmodellen — motmedlet i RLHF
def belonning_med_kl(belonning, log_p_policy, log_p_referens, beta=0.05):
return belonning - beta * (log_p_policy - log_p_referens)
# Utan KL-termen driver policyn mot text som belöningsmodellen älskar
# men människor inte gillar — extremal Goodhart i renodlad form.
Tabellen i mitten är Goodharts lag i siffror: vid topp 0,1 % är gapet mellan proxyn och det sanna värdet nästan lika stort som hela det sanna värdet.
Behärskning innebär
- Känner igen proxymål och deras svagheter
- Förutser hur ett mål kan spelas
- Designar mål med skyddsräcken
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — Categorizing Variants of Goodhart's Law — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Concrete Problems in AI Safety — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Defining and Characterizing Reward Hacking — arXiv (öppen åtkomst; licens per artikel)