Maksim Sekretov udostępnił miniaturowy transformer napisany w czystym JavaScript, który działa na Node.js i pokazuje każdy skalar, wagę oraz gradient podczas trenowania. Repozytorium tiny-language-model-neuro-js pozwala każdemu zacząć od losowego modelu, podać mu prompt typu „can human read ?”, obserwować jego błędy, a następnie uruchomić proces trenowania jedną komendą i zobaczyć, jak odpowiedź staje się poprawna.

Dlaczego większość demonstracji LLM ukrywa matematykę

Typowe poradniki dotyczące modeli językowych opierają się na TensorFlow lub PyTorch. Te frameworki automatycznie budują grafy obliczeniowe i obliczają gradienty „pod maską”, przez co uczniowie widzą jedynie kod wysokiego poziomu i krzywe straty (loss curves). Podstawowe operacje — to, jak każdy token staje się osadzeniem (embedding), jak obliczane są wyniki uwagi (attention scores) i jak gradienty przepływają wstecz przez każdą macierz — pozostają niewidoczne.

Co odróżnia ten model JavaScriptowy

Implementacja Sekretova sprowadza wszystko do pojedynczego skryptu Node.js, który nie posiada żadnych zależności. Potok szkoleniowy (training pipeline) przebiega według prostego ciągu:

  • Tokenizacja
  • Osadzenia (Embeddings)
  • Bloki przyczynowego transformera (Causal transformer blocks)
  • Mechanizm wielogłowowej uwagi własnej (Multi-head self-attention)
  • Sieci typu feed-forward (FFN)
  • Głowa modelu językowego i funkcja softmax
  • Strata entropii krzyżowej (Cross-entropy loss)
  • Propagacja wsteczna (Backpropagation)

Uruchomienie node src/train.js --generalize --adaptive-teach inicjuje pełną pętlę trenowania. Ponieważ kod to czysty JavaScript, każdy tensor jest zwykłą tablicą, każde mnożenie macierzy to jawna pętla, a każdy gradient znajduje się bezpośrednio obok swojej wagi źródłowej.

Od losowych zgadywań do poprawnych odpowiedzi

Na początku działania modelu wszystkie parametry są losowe. Zadanie pytania „can human read ?” skutkuje bełkotem. Po krótkiej fazie wstępnego trenowania (pre-training) i rundzie nadzorowanego dostrajania (SFT), ten sam prompt zwraca sensowną odpowiedź. Sygnał nauczyciela — poprawne sekwencje tokenów przepuszczone przez funkcję straty — propaguje się wstecz przez osadzenia, głowice uwagi i warstwy FFN, aktualizując kolejno każdy skalar.

Walka z katastrofalnym zapominaniem

Wczesne próby wykazały klasyczny problem: nauka nowego faktu wymazywała te wcześniej przyswojone. Sekretov rozwiązał to za pomocą metody powtórek (rehearsal) — ponownego prezentowania starych przykładów podczas wprowadzania nowych danych. Trenowanie kończy się dopiero wtedy, gdy każdy docelowy token osiągnie co najmniej 95% prawdopodobieństwa i przejdzie dziesięć kolejnych weryfikacji. Ta prosta pętla demonstruje kluczowe wyzwanie badawcze bez użycia jakichkolwiek zewnętrznych bibliotek.

Kto odniesie korzyści, a kto może zostać pominięty

Projekt nie konkuruje z komercyjnymi modelami LLM, które opierają się na miliardach parametrów i klastrach GPU. Ta przepaść wydajnościowa sprawia, że nie nadaje się on do zastosowań produkcyjnych, ale czyni model przejrzystym narzędziem dydaktycznym. Studenci, hobbyści i badacze, którzy mają trudności z zajrzeniem do wnętrza rozwiązań typu „black-box”, zyskali teraz piaskownicę, w której matematyka jest dosłownym kodem.

Czego brakuje i dokąd może zmierzać projekt

Ponieważ implementacja jest celowo minimalistyczna, kod pozostaje czytelny, ale ogranicza to skalowalność.

Co warto śledzić dalej

Repozytorium jest już publiczne na GitHubie.

Podsumowanie: Poprzez sprowadzenie transformera do czystego JavaScriptu, Sekretov przekształcił niegdyś niezwykle nieprzejrzystą technologię w czytelny, edytowalny skrypt. Ceną jest szybkość, ale zyskiem jest wgląd — każdy może teraz obserwować, jak model językowy uczy się, zapomina i uczy się na nowo, skalar po skalarze.