44% op ARC-AGI-1 voor 67 cent
Discussie op Twitter, code op GitHub. Performance op ARC-1 publieke evaluatie. Ik vergelijk mijn resultaten alleen met modellen die soortgelijke test time training gebruiken.
Dit is het derde blog in een serie over ARC-AGI. (Vorige delen: Blog 2, Blog 1). Veel mensen dachten dat het vorige resultaat onmogelijk was. Het trok aandacht van toponderzoekers en ging viraal op X, met discussies door onder anderen Lucas Beyer, Jeremy Howard en Rohan Anil.
Waarom hieraan werken?
Ik geloof dat steekproefefficiëntie (sample efficiency) het belangrijkste probleem in AI van vandaag is en ik wil dit oplossen. De intentie achter dit werk is om:
- De limieten van steekproefefficiëntie te vinden wanneer men beperkt is tot transformers en de huidige deep learning-methoden.
- De kosten te verlagen, zodat iteratie veel sneller en goedkoper is.
ARC is een uitstekende benchmark om dit te testen:
- Zeer weinig samples (slechts 1000 puzzels) in een hoogdimensionale ruimte.
- Het is een meta-learning benchmark, dus elke puzzel gebruikt een andere regel, met enkele gemeenschappelijke concepten.
- Er zijn zeer weinig priors nodig: elk concept dat nodig is in de evaluatieset is aanwezig in de trainingsset.
- Het is ongelooflijk eenvoudig voor mensen om op te lossen en toegankelijk voor AI-onderzoekers met beperkte middelen.
- De benchmark is nog niet verzadigd (voor data-efficiëntie; negeer LLM's en benaderingen die enorme hoeveelheden synthetische data of menselijke inductieve biases gebruiken).
Mijn volgende stap is het uitwerken van nieuwe onderzoeksideeën om deze limieten te doorbreken. Ik zal proberen de kosten laag te houden, zodat iedereen ter wereld hieraan kan werken.
Technische details
Hoe werkt het?
De algemene aanpak is vergelijkbaar met de vorige keer, maar ik heb een aantal upgrades toegevoegd. Hier is een korte samenvatting:
- Elk input-output paar wordt omgezet in een reeks tokens. Deze sequenties worden autoregressief getraind door een kleine transformer. Dit gebeurt vanaf nul tijdens de testfase, voor zowel de trainingsset als de evaluatieset puzzels (waarbij de testlabels verborgen blijven).
- Om cross-task learning mogelijk te maken, krijgt elke puzzel een aparte additieve embedding (geleerd). Aangezien elke sequentie twee 2D-grids bevat, worden positionele embeddings geleerd met behulp van 3D RoPE-embeddings.
- De sequenties worden uitgebreid met kleur- en dihedrale permutaties (augmentations). Tijdens de inferentie worden de test-inputs uitgebreid en wordt de inverse augmentatie toegepast op de geproduceerde outputs. De twee meest voorkomende outputs worden ingediend (AAIVR).
Wijzigingen sinds de vorige versie
Het hoofddoel was om verbeteringen in de architectuur of het algoritme te vinden die de steekproefefficiëntie van het model verhogen.
De grootste stijgingen in scores waren te danken aan:
- Moderne architectuur (SwiGLU in plaats van GELU, RMSnorm in plaats van layernorm, etc.).
- Meer datadiversiteit en betere shuffling van de data.
- Opschalen: 8 lagen in plaats van 4.
De grootste dalingen in kosten waren te danken aan:
- Veel minder augmentaties (efficiënter qua samples!).
- AdamW $\to$ NorMuon.
- Flash attention met varlen training + flex attention kernels voor inferentie.
Een belangrijke wijziging is dat ik niet langer train op input-tokens. Dit betekent dat de loss-functie alleen output-tokens bevat (waardoor de aanpak supervised wordt). Dit presteert iets beter (40% $\to$ 44%), maar ik begrijp niet precies waarom. Mogelijk heeft dit te maken met de beperkte capaciteit van het model.
Ik heb ook de trainingsdata vergroot door de niet-overlappende taken uit ARC-2 toe te voegen. Ik heb dit zeer zorgvuldig gedaan om datalekken te voorkomen. Als je deze extra data verwijdert, scoort het model nog steeds ongeveer 40%, maar is er ongeveer dubbel zoveel rekenkracht nodig.
Context: ARC-2 bevat 773 ARC-1 puzzels en 347 nieuwe puzzels. De meeste evaluatiepuzzels van ARC-1 komen terug, dus als je naïef op ARC-2 traint, is er sprake van een datalek en scoor je 100%. Ik voorkom dit door de 773 herhaalde puzzels zorgvuldig te filteren.
Er zijn veel andere wijzigingen die incrementele verbeteringen in prestaties of snelheid opleverden.
Interessant gedrag
Omdat ik niet langer op inputs train, is deze aanpak nu supervised. Het vreemde is dat de test-loss nu slechter is, maar de score toch hoger! Bovendien is het stabieler en is er minder variantie in de scores. Veel mensen werken tegenwoordig aan steekproefefficiëntie door te streven naar de laagste val loss op een kleine dataset. Hoewel dat een goede aanpak is, wijst dit resultaat op een potentiële fout in die methode. Ik vermoed dat unsupervised training in sommige scenario's beter zal zijn en ik ben dit aan het evalueren.
Voordat ik NorMuon gebruikte, probeerde ik vanilla Muon. Dit trainde overduidelijk veel sneller dan AdamW, maar de loss (en scores) bleven aan het einde steken in plaats van te convergeren. Ik merkte dat het drastisch verlagen van de momentum en/of de learning rate (LR) op dat punt hielp, maar ik wilde geen handmatige wijzigingen maken. Toen ik overstapte op NorMuon, verdween dit probleem.
Ablaties
De grootste bijdrage aan de prestaties lijkt te komen van goede representaties (3D RoPE + per-task embedding). Het verwijderen van 3D RoPE of de per-task embedding leidt tot een sterke daling; beide ablaties verzadigen op 25%.
- Training op inputs presteert iets slechter $\to \sim 39\%$.
- Beperken van de trainingsset tot ARC-1 + ConceptARC presteert ongeveer hetzelfde: $\sim 40\%$.
- Overschakelen van 3D RoPE naar 1D verlaagt de score naar $\sim 24\%$.
- Verwijderen van de per-task embeddings verlaagt de score naar $\sim 24\%$.
- Het model draaien in CompressARC-stijl (vanaf nul trainen op elke taak afzonderlijk, en unsupervised) verlaagt de prestaties naar $\sim 18\%$.
- CompressARC maar dan supervised haalt $\sim 15\%$.
Hoe kunnen anderen bijdragen?
De code is open source. Voel je vrij om deze aan te passen om de score te verbeteren of de kosten te verlagen. (Gelieve de trainingsdata niet te vergroten).
Probeer de 65% te bereiken – je zult daar niet veel aanpassingen voor nodig hebben. Bewijs: ik nam de unie van alle opgeloste taken uit meerdere runs en behaalde 55%. Ook een aantal andere taken zijn "bijna" opgelost. Enkele ideeën:
- RoPE mengt positionele en inhoudelijke informatie, wat de prestaties waarschijnlijk verslechtert. PoPE zou gelijkwaardig of beter moeten presteren, of wellicht is er een nieuwe pos-embedding nodig.
- De architectuur kan zeker verder worden gemoderniseerd.
- De kosten kunnen waarschijnlijk met een factor 10 worden verlaagd met handgeschreven GPU-code. Architecturale wijzigingen kunnen dit ook.
- Ten slotte: zoek uit hoe de data-augmentaties verwijderd kunnen worden. De uitdaging is om de trainingskosten laag te houden.
Diversen
Eerlijk gezegd had ik niet verwacht met alleen een transformer 45% te halen; ik dacht dat er nieuwe ideeën voor nodig zouden zijn. Ik had zeker niet verwacht dit te bereiken tegen zulke lage kosten/flops. De ablaties tonen aan dat een verrassende hoeveelheid prestatie behouden blijft, zelfs zonder augmentaties of synthetische data. Ik ben er nu vrij zeker van dat 65% bereikt kan worden binnen het transformer-framework.
Ik begrijp niet waarom anderen dit niet hebben ontdekt. Het is gewoon een transformer met de meest voor de hand liggende representatie. Deze benchmark is al 6 jaar open, is high-profile en had een prijs van een miljoen dollar! Misschien onderschatten onderzoekers deep learning? Misschien waren de kosten van experimenten zo hoog dat ze geen goede ablaties konden uitvoeren? Of zijn ze geblindeerd door LLM's?
---
Appendix
Vorige kritiek en validatie op mijn aanpak
Mijn vorige resultaat ging viraal op X en veel ervaren onderzoekers debatteerden erover. Hieronder staan de kritiekpunten met mijn antwoorden.
"Trainen op de evaluatiepuzzels is valsspelen / 'training on test'" Nee, dat is onjuist. "Training on test" betekent specifiek trainen op de labels van testdata. De labels zijn niet gebruikt voor training. Bovendien is ARC een meta-learning benchmark, dus je wordt geacht te leren van de evaluatiepuzzels. Terminologie: ARC heeft een set trainingspuzzels en een set evaluatiepuzzels. Elke puzzel heeft voorbeeldparen en testparen. Een paar bestaat uit een input-grid + output-grid. In ARC is het label alleen het output-grid van het testpaar in een evaluatiepuzzel. Deze labels waren niet getraind; ze zijn verborgen.
"Trainen op de inputs van evaluatiepuzzels lekt informatie" Nee, dit is onjuist. Zo'n aanpak wordt transductive reasoning genoemd en wordt bestudeerd sinds de tijd van Vapnik. Bovendien is het dogma om evaluatie-inputs te negeren onlogisch in een wereld die probeert continual learning op te lossen. In het nieuwe resultaat van 44% is het trainen op inputs overigens verwijderd, omdat dit slechter scoorde.
"Zelfs als trainen op evaluatie-inputs is toegestaan, zou de specifieke test-input verboden moeten zijn" Nee, dit is onjuist. Hetzelfde argument over "transductie" is hier van toepassing. Een meta-learning benchmark kan op twee manieren transductief zijn:
- van trainingspuzzel $\to$ evaluatiepuzzels.
- binnen de evaluatiepuzzel, van voorbeeldpaar $\to$ testpaar.
Deze kritiek wordt beantwoord door dat laatste.
"Dit is in strijd met het testbeleid" Nee, dit is onjuist. Het beleid stelt dat "de testdeelnemer niet mag weten wat de test zal zijn". Mensen interpreteerden dit als een verbod op TTT (test time training), maar het verwijst eigenlijk naar de mens die het AI-systeem ontwerpt, niet naar het systeem zelf (bijv. om te voorkomen dat inductieve biases worden ontworpen op basis van de evaluatieset). In de ARC-community is dit altijd duidelijk geweest; TTT is toegestaan en wordt aangemoedigd.
"Je houdt geen rekening met de trainingskosten" Nee, dit is onjuist. Ik toon de volledige lifetime compute. Dit is de kostprijs van het trainen van het model vanaf de initialisatie + de totale kosten voor inferentie op alle taken. Dit komt in totaal op 67 cent uit. (Controleer de prijzen van een 5090 voor 2 uur op vast.ai).
"Test time training wordt traditioneel per taak gedaan. Trainen op alle testtaken tegelijk is onrealistisch" Deze kritiek is begrijpelijk, maar genuanceerd. Ik ben het ermee eens dat het zeldzaam is om in het echte leven alle problemen tegelijk gepresenteerd te krijgen. Maar het feit dat mensen dit niet kunnen, betekent niet dat het ongeldig is om een AI-model met die capaciteit te bouwen. Anders zouden we kunnen zeggen dat LLM's onrealistisch zijn omdat mensen niet op het hele internet kunnen trainen. Bovendien is het onduidelijk of mensen beperkt zijn tot één taak; men zou kunnen trainen op verschillende data uit meerdere zintuigen tegelijk.
"Het bieden van kosten per taak amortiseert de trainingskosten omdat alle testtaken tegelijk worden getraind, waardoor het vergelijken met andere modellen oneerlijk is" Dat is een eerlijk punt. Ter verdediging: zo vergelijken de organisatoren elk model, inclusief TRM (die ook op alle testtaken tegelijk traint). Ik was bovendien royaler door trainings- en inferentiekosten mee te tellen, terwijl LLM's en andere modellen pre-training/offline trainingskosten uitsluiten. Daarom ben ik overgestapt naar: (a) Het tonen van lifetime compute kosten in plaats van per taak. (b) Alleen vergelijken met TRM, HRM en CompressARC. (c) Het toevoegen van ablaties met vergelijkbare trainingsstijlen.
Antwoorden op kritiek over ARC-AGI zelf
Er is veel debat geweest over ARC-AGI. Veel vragen zijn al door Chollet beantwoord:
- Wat test ARC precies? (Fluïde intelligentie).
- Waarom zouden we om ARC geven? (Fluïde intelligentie is nog niet volledig opgelost).
- Zal het oplossen van ARC-AGI leiden tot AGI? (Dat heeft niemand beweerd).
- Verschuift ARC constant de doelpalen / is het adversarieel geconstrueerd voor LLM's? (Beide zijn onjuist).
De benchmark is bedoeld om fluïde intelligentie te testen, wat noodzakelijk maar niet voldoende is voor AGI. Het oplossen van ARC-1 / 2 impliceert een niet-nul fluïde intelligentie, maar is geen bovengrens. De benchmarks signaleren niet dat AGI is bereikt, maar wijzen op de juiste onderzoeksvragen.
Ik focus op ARC omdat het gebruikt kan worden om steekproefefficiëntie te testen. Bovendien is het een goed geconstrueerde meta-learning benchmark die toegankelijk is voor mensen met weinig GPU-capaciteit.
Enkele valide kritiekpunten volgens mij:
- Synthetische data voor ARC-1/2 zou verboden moeten worden. Het is tegen de geest van de benchmark, maar de meeste topscores leunen er nu op. Synthetische data verlaagt de lat voor de benodigde fluïde intelligentie.
- Ban offline training/pretraining. Modellen moeten vanaf nul trainen na indiening. Mijn model bewijst dat dit mogelijk is. Dit garandeert dat er geen synthetische data wordt gebruikt en maakt de vergelijking tussen modellen eerlijk.
- Een enkele grafiek die verschillende typen modellen vergelijkt is onlogisch (oplossing: aparte grafieken).
- De x-as is kosten/taak, maar telt alleen online compute. LLM's hebben enorme offline pretraining-fasen die niet worden meegeteld.
- Kosten delen door het aantal taken is onlogisch voor modellen die op alle taken tegelijk trainen.
- LLM's vergelijken op de publieke evaluatieset is zinloos omdat de antwoorden op internet staan.
- De organisatoren trokken voortijdige conclusies uit TRM en HRM door succes toe te schrijven aan recursieve loops + deep supervision. Ik denk dat deze bias voortkomt uit de aanname dat pure deep learning ARC niet kan oplossen.
Fouten die andere benaderingen maken
- Aannemen dat recursie het volgende grote ding is (bijv. HRM, TRM): Ik zie de aantrekkingskracht, maar er zijn onvoldoende ablaties om dit te bewijzen. Mijn model laat zien dat je dezelfde prestaties behaalt zonder recursie.
- Misleidende marketing door HRM/TRM: TRM adverteerde zichzelf als een 7M-model terwijl er $O(100M+)$ embedding weights worden getraind. Dit is misleidend en maakt het meer een lookup-table.
- LLM-gebaseerde benaderingen op ARC tonen geen nieuwe capaciteiten meer: Stijgingen in LLM-scores worden nu vooral gedreven door post-training en waarschijnlijk door de hoeveelheid synthetische data. Ze leren ARC-taken op te lossen, niet algemeen abstract redeneren. Alleen private scores zouden moeten tellen.
- Harnesses bovenop LLM's gebruiken: Dit heeft weinig zin. De magie gebeurt in de frontier labs. Het is onwaarschijnlijk dat continual learning wordt opgelost door een harness.
- Anti-bitter lesson cheats: Synthetische data, augmentaties en het ontwerpen van inductieve biases in het model zijn "cheats". Het feit dat we deze benchmark niet kunnen schalen zonder dit soort trucs, laat zien dat er nog doorbraken nodig zijn.
Lessen van LLM's op ARC-AGI
LLM's hebben v1 en v2 van deze benchmark verzadigd. Mijn conclusies:
- ARC-AGI gaat vooraf aan LLM's. Ze presteerden aanvankelijk slecht, wat aantoont dat pretraining geen algemene redeneercapaciteiten geeft.
- OpenAI's O1 die 75% haalt, suggereert dat LLM's elke taak kunnen leren tijdens post-training, mits er genoeg data is.
- Toen ARC-2 uitkwam, werd de voortgang van alle LLM's (inclusief de "denkende" modellen) gereset. Dit suggereert dat zelfs post-training geen algemene redeneercapaciteiten geeft; anders zou een model dat goed is in ARC-1 automatisch goed zijn in ARC-2.
- De modellen leren hoe ze ARC-puzzels oplossen, niet algemeen abstract redeneren. Scores op ARC-2 worden gedreven door post-training (waarschijnlijk synthetische data) en "benchmaxxing" door labs. LLM's zijn op geen enkele manier steekproefefficiënt.
Volledige lijst van wijzigingen
Wijzigingen in trainingsdynamiek
- Optimizer gewijzigd van alleen AdamW naar NorMuon + hulp-AdamW.
- LR-schema gewijzigd van warmup+cosine naar WSD-schema (warmup %, hold, lineaire afname naar floor).
- LayerNorm vervangen door RMSNorm.
- FFN gewijzigd van Linear $\to$ GELU $\to$ Linear naar SwiGLU-stijl gated FFN (chunk + SiLU gate).
- Weight decay gewijzigd van "alleen lineaire non-attention" naar expliciete groepswijze decay (attention weights, token embeddings, en task/dihedral embeddings hebben eigen WD-knoppen).
- Trainingsdoel gewijzigd van
outputs["loss"](unsupervised stijl input+output LM loss) naar enkeloutputs["output_loss"](supervised stijl). - Training batching gewijzigd van slimme bucketing op basis van lengte naar echte random batching (bucketing behouden voor inferentie).
- Onvolledige batches worden nu gedropt in training (
drop_last=True). - Datasetconstructie ondersteunt nu bredere bronnen (ARC-1, ARC-2, ConceptARC, optionele gefilterde cross-dataset taken).
- Kleur-augmentatie gewijzigd van één globale epoch-level permutatie naar per-voorbeeld augmentatie-tuples (kleur + dihedraal).
- Domein van kleurpermutatie gewijzigd om output-only kleuren uit te sluiten.
- Augmentatie-generatie dedupliceert nu getransformeerde inputs via hashing over een taak.
- Augmentatie-selectie is nu epoch-cycled met shuffled candidate order.
- Hyperparameters aangepast: optimizer, epochs, augment cap/type, diepte (n_layers), en dataset pad.
- Een nieuwe
dihedral_embeddingis toegevoegd en wordt opgeteld in token conditioning.
Snelheidsverbeteringen (zonder wijziging in trainingsdynamiek)
- Training batches gewijzigd van padded
[B,S]naar packed token stream metcu_seqlens(geen pad tokens in train path). - Attention path gewijzigd van padded SDPA masking naar packed varlen flash-attention support (
cu_seqlens), plus flex-attention decode kernels. - Dihedrale augmentatie verplaatst van offline dataset-uitbreiding naar online augmentatie-selectie tijdens collate-tijd.
- Build-time training split gewijzigd van
("train","test")naar("train",).
Diversen
- Resume-gedrag gewijzigd: detectie van optimizer-switch/hparam-change kan nu de schedule resetten/rewarmen.
- Scheduler stepping gewijzigd naar fractionele epoch-progressie tijdens training, in plaats van pure per-stap cosine progressie.
Groetjes,