jancll.com

Lekce 09 · 18 min čtení

Celý transformer blok

Poskládáme attention, feed-forward, reziduální spojení a normalizaci do jednoho bloku, ze kterého se stohováním stane transformer.

Úvod

Máme všechny součástky. Tokeny, embeddingy, poziční kódování, multi-head attention. Teď z nich složíme jeden transformer blok, hotový stavební dílek. A pak ukážeme tu nejhezčí věc na celé architektuře: ten dílek se dá stohovat. Polož pár bloků na sebe a máš transformer. Polož jich devadesát a máš velký jazykový model.

Do bloku patří dva nové kousky, které jsme zatím neviděli, plus dvě lepidla, co to drží pohromadě i do hloubky. Pojďme na ně.

Voják skládá stejné bedny na sebe a důstojník kontroluje, jestli stojí rovně

Stejný dílek jde položit znovu a znovu. Hlavně ať se věž nerozjede.

Co v bloku ještě chybí

Attention umí jednu věc: zamíchat informaci mezi tokeny. Jenže potřebujeme i druhý pohyb: nechat každý token, ať si tu nasbíranou informaci v klidu zpracuje sám pro sebe. Od toho je feed-forward síť (zkratkou MLP).

Je to obyčejná malá síť z lekce 4, akorát se pustí na každý token zvlášť. Typicky rozšíří rozměr (třeba čtyřnásobně), prožene to nelinearitou a stáhne zpátky. Attention je „rozhlédni se kolem", feed-forward je „a teď si to promysli". Tyhle dva kroky se v bloku střídají.

Dvě lepidla: reziduum a normalizace

Když chceš stavět hluboko, narazíš na dva problémy. Bloky na sebe poskládáš a ono se to buď přestane učit, nebo se to celé rozhází. Transformer to řeší dvěma triky.

Reziduální spojení. Místo výstup = vrstva(x) počítáme výstup = x + vrstva(x). Vrstva tedy nepřepisuje vstup, jen k němu přidává opravu. Původní informace má vždycky volnou cestu skrz, a gradient z lekce 5 má kudy téct i do hlubokých vrstev. Bez tohohle triku hluboké sítě prakticky nešlo trénovat.

Normalizace (LayerNorm). Před každou podvrstvou srovná čísla na rozumné měřítko, kolem průměru nula. Drží to hodnoty v uzdě, takže se nic nerozhoupe do nekonečna a učení je stabilní. Ber to jako pojistku proti tomu, aby čísla utekla.

Jak to do sebe zapadá

Blok jsou dvě podvrstvy za sebou, každá zabalená do normalizace a rezidua. Nejdřív attention, pak feed-forward:

xx+Attention(LayerNorm(x))x \leftarrow x + \text{Attention}(\text{LayerNorm}(x)) xx+MLP(LayerNorm(x))x \leftarrow x + \text{MLP}(\text{LayerNorm}(x))

Klikni si na jednotlivé fáze a projdi si, co dělají a jaký mají tvar:

TransformerDiagram · jeden blok zblízka

Klikni na kteroukoliv fázi a koukni, co dělá. Šipky vpravo jsou reziduální spojení.

vstup (n × d)LayerNormMulti-head attention⊕ reziduumLayerNormFeed-forward (MLP)⊕ reziduumvýstup (n × d)

Multi-head attention

Každý token si přimíchá informaci z ostatních tokenů v kontextu. Srdce z lekcí 7 a 8.

tvar: n × d → n × d

Všimni si toho nejdůležitějšího: vstup i výstup bloku mají stejný tvar n × d. To není detail, to je celý vtip. Protože se tvar nemění, můžeš výstup jednoho bloku rovnou nacpat na vstup dalšího. A to je transformer: stejný blok, mnohokrát za sebou.

V kódu

Složíme celý blok v numpy. Je v tom všechno z posledních lekcí: normalizace, multi-head attention, reziduum, feed-forward. A na konci ho pustíme čtyřikrát za sebou, abys viděl to stohování naživo. Klikni Run.

python · pyodide

Pořád dokola stejný tvar (6, 12). To je ten důvod, proč jde brát výstup a strkat ho do dalšího bloku donekonečna. Reálné modely jen mají větší d, víc hlav a hlavně hodně bloků na sobě. GPT-2 jich má 12 až 48, ty největší modely přes sto. Ale jeden blok vypadá přesně takhle.

Cvičení

Cvičení · lekce9-cv1

Reziduální spojení počítá x + vrstva(x). Na vstupu je x = 5 a podvrstva vrátí 2. Co vyleze z rezidua?

Cvičení · lekce9-cv2

Na vstup bloku přijde tvar n × d = 6 × 12. Kolik sloupců (d) má výstup?

Cvičení · lekce9-cv3

Feed-forward typicky rozšíří rozměr . Z d = 12 na kolik ve své skryté vrstvě?

Cvičení · lekce9-cv4

V diagramu nahoře proklikej fáze bloku. Která fáze ti přijde nejdůležitější a proč? Napiš jednou větou.

Shrnutí

  • Transformer blok = attention podvrstva a feed-forward podvrstva za sebou, každá zabalená do normalizace a rezidua.
  • Feed-forward (MLP) nechá každý token zpracovat nasbíranou informaci sám pro sebe. Attention míchá mezi tokeny, MLP přemýšlí uvnitř tokenu.
  • Reziduální spojení (x + vrstva(x)) drží tok gradientu a umožní hloubku.
  • LayerNorm srovná čísla na rozumné měřítko a stabilizuje učení.
  • Vstup i výstup mají stejný tvar n × d, takže se bloky dají stohovat. Transformer je jen N stejných bloků nad sebou.

Co bude příště

Teď už máme úplně všechno. Tokenizaci, embeddingy, pozice, attention, bloky, trénink. Zbývá to slepit do jednoho funkčního celku a pustit na opravdový text.

V Lekci 10 (Mini-GPT) poskládáme finální projekt: malý, ale kompletní GPT v nějakých 150 řádcích. Natrénujeme ho na Švejkovi a necháme ho generovat text, který zní jako Hašek. Bude to vyvrcholení celého kurzu.