Změř si scaling zákon

Natrénuj model v pěti velikostech a ověř předpověď, která selže.

Co se naučíš: Naměříš si mocninný zákon na vlastních modelech a uvidíš, proč extrapolace za změřený rozsah selže.

12 min čtení + cvičeníNavazuje na:🔧 Vylepši si model📈 Scaling zákony

Kapitola o scaling zákonech tvrdí, že kvalita modelu roste s velikostí podle mocninného zákona. Zní to jako mystika z papírů, kterou musíš vzít na slovo, protože kdo má trénovat modely v pěti velikostech.

Ty. Trvá to půl hodiny a vejde se to do jednoho grafu. A na konci uděláme to nejlepší, co se s naměřenou křivkou dá udělat: předpovíme z ní bod, který jsme neměřili, a pak ho změříme.


Nastavení experimentu

Beru nejlepší variantu z vylepši si model, tedy pre-norm s RMSNormem, feed-forward vrstvu a naučené pozice, a měním na ní jedinou věc: d_model. Všechno ostatní zůstává stejné.

Co se měníCo zůstává
d_model 12, 24, 48, 966 000 kroků, dávka 32, kontext 16
(FFN šířka je vždy 4 × d_model)lr 3e-3, AdamW, tři seedy na velikost

Dvě věci k metodice, obě se ukázaly jako podstatné:

Korpus je zmrazený. Model se trénuje na textu téhle učebnice, jenže učebnice se mění. Když jsem měření opakoval po několika úpravách kapitol, změnila se velikost slovníku a s ní i všechna čísla. Trénovací data jsou proto uložená v llm/_korpus.txt a všechna čísla níž jsou z tohohle jednoho snapshotu. Bez toho nejdou výsledky porovnávat ani sám se sebou.

Data i počet kroků držím pevně. Ptám se tedy na konkrétní otázku: „co udělá víc parametrů při stejném tréninkovém rozpočtu?“ To není totéž, co se měří v Chinchille, a za chvíli uvidíme, proč na tom rozdílu tak záleží.


Naměřeno

ModelParametryTrainVal± sd
d_model 124 9682,4442,511± 0,022
d_model 2413 3922,1622,256± 0,006
d_model 4840 6081,9732,094± 0,003
d_model 96136 5121,8462,012± 0,022

Model se sedmadvacetinásobkem parametrů má loss lepší o 0,50. Zajímavější je ale tvar té závislosti. Vynes si ji v logaritmickém měřítku na obou osách:

 val loss
   2.52 |...#
   2.44 |    .....
   2.36 |        .....
   2.28 |           #.....
   2.21 |                ......
   2.14 |                     #....
   2.07 |                         ..... #
   2.01 |                             .....
        +--------------------------------------------
          5k    13k        41k        137k
                     parametry

Body leží blízko přímky. A přímka v log-log měřítku znamená mocninný zákon:

loss ≈ 4,32 · N^(−0,0661)          R² = 0,94

Tohle je celý scaling zákon, naměřený u tebe na stole. Není v tom nic mystického: je to proložení přímky čtyřmi body v jiných souřadnicích. Všimni si zároveň, že poslední bod leží kousek nad přímkou, takže proložení není dokonalé. To bude za chvíli důležité.


Co ten exponent znamená prakticky

Exponent −0,066 je malé číslo a to je právě ta špatná zpráva. Převedeno do řeči:

Chceš lossPotřebuješ parametrůKolikrát víc než 136 512
2,00~113 0000,8×
1,95~165 0001,2×
1,90~245 0001,8×
1,80~555 0004,1×

Každé další zlepšení stojí násobky. Srazit loss z 1,9 na 1,8 znamená víc než dvojnásobný model. Odtud pramení dvě věci, které jsi možná bral jako fráze:

  • Proč se rozdíly mezi špičkovými modely měří v setinách. Nejsou to setiny proto, že by na nich nezáleželo, ale proto, že za každou setinou stojí obrovský výpočet.
  • Proč obor spálí miliardy na trénink. Zlepšení, které vypadá jako drobnost, je na křivce s exponentem 0,07 skok o řád v nákladech.

Test: předpovíme pátý bod

Tady se z proložené přímky stává skutečná předpověď. Fit ze čtyř bodů říká, že model s d_model 192, tedy s 494 208 parametry, má vyjít na:

loss = 4,32 · 494208^(−0,0661) = 1,81

Natrénoval jsem ho. Tři seedy, stejný recept, stejný rozpočet. Výsledek:

PředpověďSkutečnost
d_model 192 (494 208 parametrů)1,812,163 ± 0,022

Předpověď selhala, a to o hodně. Model není lepší než ten předchozí, je výrazně horší: d_model 96 dal 2,012, dvojnásobně velký model dal 2,163.

Než to prohlásíš za důkaz, že scaling zákony nefungují, podívej se na trénovací loss:

ModelTrainValMezera
d_model 961,8462,0120,166
d_model 1922,0382,1630,125

Velký model má horší loss i na trénovacích datech, tedy na datech, která přímo viděl. To vylučuje přetrénování: kdyby se přeučil, měl by train nízký a val vysoký. On se prostě nenaučil ani to, co měl přímo před sebou.


Diagnóza: chyba není v modelu, ale v receptu

Když se velký model nenaučí ani trénovací data, je podezřelý první na řadě learning rate. Držel jsem ho pevně na 3e-3 pro všechny velikosti, jenže optimální krok se s velikostí modelu posouvá. Tak to zkusíme, opět tři seedy na řádek:

d_model 192TrainVal± sd
lr 3e-3 (původní)2,0382,163± 0,022
lr 2e-31,9772,100± 0,006
lr 1e-31,8011,996± 0,001
lr 5e-41,8892,033± 0,006

Rozdíl mezi původním a doladěným krokem je 0,167, tedy jedenáctinásobek rozptylu. Tady není co rozporovat: learning rate byl skutečně příčinou.

A aby to nebyla náhoda, kontrolní běh na opačné straně:

Modellr 3e-3lr 1e-3
d_model 962,0122,153
d_model 1922,1631,996

Menší model chce vyšší learning rate, větší model nižší, a záměna je v obou směrech katastrofální. To není detail k doladění, to je hlavní proměnná. Odpovídá to i praxi: velké tréninky learning rate škálují s šířkou modelu, ne že by ho nechávaly konstantní.

Poučení, které si odnes: „zvětšit model“ neznamená změnit jedno číslo. Znamená to zvětšit model a znovu naladit recept. Kdo to neudělá, naměří si, že škálování nefunguje.

⚠️ Co z toho ale plyne a co ne. Velký model se s doladěným krokem dostal na 1,996, zatímco menší dal 2,012. Vypadá to, že ho konečně předehnal. Jenže rozdíl je 0,016 při sdruženém rozptylu 0,015, tedy přesně jeden rozptyl. To znamená, že se velký model dostal nanejvýš na úroveň toho menšího, ne nad ni. Tvrdit, že je lepší, by z těchhle dat nešlo. Píšu to sem schválně, protože v první verzi téhle kapitoly to tvrzení bylo, a padlo teprve při doměření na víc seedech.


A pořád to nesedí, protože chybí data

I s doladěným learning rate vyšel model na 1,996, zatímco předpověď byla 1,81. Zbývá tedy odchylka 0,18, kterou learning rate nevysvětlí. Kde je?

V datech a v počtu kroků, které jsem držel pevně. Model s půl milionem parametrů dostal přesně stejných 6 000 kroků nad stejnými 180 tisíci znaky jako model dvacetkrát menší. Zmrazený korpus má konečnou velikost a ten největší model už z něj vytáhl skoro všechno, co se z něj vytáhnout dá.

A přesně o tomhle je Chinchilla. Scaling zákon neříká „větší model je lepší“. Říká, jak rozdělit výpočetní rozpočet mezi velikost modelu a množství natrénovaných tokenů, aby z něj vypadla nejlepší loss. Když zvětšíš model a data necháš být, opouštíš křivku a čísla přestanou platit. Ostatně už proložení na čtyřech bodech mělo R² = 0,94 a poslední bod ležel nad přímkou, takže se křivka začínala ohýbat ještě dřív, než jsme narazili na pátý bod.


Co si z toho vzít

  1. Mocninný zákon je reálný a naměříš si ho za půl hodiny. Čtyři body, log-log měřítko, proložená přímka, R² = 0,94.
  2. Exponent −0,066 je nemilosrdný. Každá další desetina loss stojí násobky výpočtu. Odtud plyne cena tréninku dnešních modelů i to, proč se výsledky srovnávají v setinách.
  3. Extrapolace je nebezpečná. Předpověď pro pátý bod byla mimo o 0,35, a to i když byl zákon proložený slušně. Extrapolace za rozsah, ve kterém jsi měřil, je hypotéza.
  4. Selhání předpovědi bylo v receptu, ne v zákoně. Learning rate se musí škálovat s modelem, jinak si naměříš, že větší je horší.
  5. Zbytek odchylky je datová mez. Držet data pevně a zvětšovat model znamená opustit křivku. To je celý obsah Chinchilly, jen naměřený na kuchyňském stole.
  6. Bez zmrazených dat a víc seedů bys nic z toho nerozlišil. Korpus se mezi měřeními měnil a jedno tvrzení v první verzi kapitoly bylo mimo právě proto.

Cvičení

  1. Fit říká loss ≈ 4,32 · N^(−0,0661). Kolik parametrů by podle něj bylo potřeba na loss 1,0? Je to číslo důvěryhodné?
  2. Kdyby ti někdo ukázal jen tabulku „d_model 96 → 2,012; d_model 192 → 2,163“ a tvrdil, že škálování transformerů nefunguje, jak bys ten závěr vyvrátil dvěma měřeními?
  3. Model d_model 96 má mezeru mezi train a val 0,166, model 192 s lr 1e-3 má train 1,801 a val 1,996, tedy 0,195. Co bys čekal, že se s tou mezerou stane u d_model 384, a proč?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Vyšlo by asi 4 × 10⁹ parametrů, a to číslo je nesmysl. Z rovnice 1,0 = 4,32 · N^(−0,0661) plyne N = (4,32)^(1/0,0661), tedy zhruba čtyři miliardy. Nedůvěryhodné je to ze tří důvodů: extrapoluješ pět řádů za rozsah, ve kterém jsi měřil; korpus má 180 tisíc znaků, takže dřív narazíš na datovou mez; a mocninné zákony mají v praxi nenulovou spodní mez danou entropií samotného jazyka, ke které se loss blíží a pod kterou se nedostane. Fit platí uvnitř měřeného rozsahu, ne mimo něj.
  2. Zopakoval bych běh s několika learning rate a přidal kontrolu na menším modelu. První měření ukáže, že velký model s lr 1e-3 dá 1,996, tedy dorovná menší model. Druhé ukáže, že menší model se stejným lr 1e-3 se naopak zhorší na 2,153. Dohromady z toho plyne, že se neposunul zákon, ale optimální recept, a původní srovnání drželo pevně proměnnou, kterou držet nemělo.
  3. Čekal bych, že poroste, ale při správně naladěném receptu ne dramaticky. Mezera roste s kapacitou modelu, protože si víc parametrů dovolí zapamatovat víc konkrétností z trénovacích dat. Při konstantním množství dat je to nevyhnutelné a nakonec se to zvrhne v přetrénování, kdy train dál klesá a val začne růst. Kdy přesně, se ale nedá odhadnout z tabulky; musí se to změřit, protože do toho mluví i learning rate, počet kroků a regularizace.

Shrnutí

  • Mocninný zákon si naměříš na čtyřech modelech za půl hodiny: v log-log měřítku vyjde přímka.
  • Naměřeno loss ≈ 4,32 · N^(−0,0661) s R² = 0,94 na rozsahu 5 tisíc až 137 tisíc parametrů.
  • Předpověď pro pátý, dvakrát větší model selhala o 0,35, protože learning rate zůstal stejný.
  • Optimální learning rate klesá s velikostí modelu. Záměna je katastrofální v obou směrech a rozdíl je jedenáctinásobek rozptylu, tedy mimo jakoukoli pochybnost.
  • S doladěným krokem velký model menší dorovná, ale neporazí: rozdíl je v šumu.
  • Zbylá odchylka je datová mez: zvětšovat model při pevných datech znamená opustit křivku, což je přesně to, co říká Chinchilla.
Naměříš, že dvakrát větší model má horší loss než menší. Co zkontroluješ jako první?

Trénovací loss. Když je horší i ta, model se nepřeučil, ale vůbec se nenaučil, což ukazuje na chybu v receptu, ne v architektuře. Nejčastější příčina je learning rate držený konstantní přes všechny velikosti: větší modely potřebují menší krok. Teprve když je trénovací loss v pořádku a špatná je jen validační, jde o přetrénování.

Proč se scaling zákon nedá použít k extrapolaci daleko za změřený rozsah?

Protože je to proložení přímky naměřenými body, ne fyzikální zákon. Mimo měřený rozsah do hry vstupují meze, které se uvnitř neprojevily: konečné množství dat, nutnost přeladit trénovací recept a spodní mez daná entropií samotného jazyka, pod kterou se loss dostat nemůže. V experimentu v téhle kapitole selhala extrapolace hned u prvního bodu za rozsahem.

Co přesně říkají scaling zákony o vztahu velikosti modelu a množství dat?

Že se pro daný výpočetní rozpočet dá najít optimální rozdělení mezi velikost modelu a počet natrénovaných tokenů. Neříkají, že větší model je automaticky lepší: pokud zvětšíš model a data i počet kroků necháš beze změny, opouštíš křivku a naměříš horší výsledek, než zákon předpovídá. Přesně to se v téhle kapitole stalo.