Egy háló, sokféle feladat
A korábbi leckében megismert rekurrens neurális hálók (RNN) és kapuzott változataik, mint az LSTM vagy a GRU, arra épülnek, hogy minden lépésben egy rejtett állapotot adnak tovább a következő lépésnek. Eddig ezt az állapotot arra használtuk, hogy a sorozat végén egyetlen kimenetet készítsünk belőle, például egy osztályozási döntést. De ha minden lépésben kimenetet is generálunk, nem csak rejtett állapotot, akkor a háló egész sorozatokat tud előállítani, méghozzá tetszőleges hosszban.
Ez négyféle architektúrát tesz lehetővé attól függően, hogy hány bemenet áll szemben hány kimenettel.
- Egy a egyhez. A hagyományos neurális háló, egy bemenet és egy kimenet, rekurrencia nélkül.
- Egy a sokhoz. Egyetlen bemenetből egy teljes kimeneti sorozat készül. Ilyen például a képaláírás generálás, ahol egy kép egy konvolúciós hálón (CNN) keresztül rejtett állapottá alakul, majd egy rekurrens lánc szóról szóra megírja hozzá a leírást.
- Sok az egyhez. Ez az eddig megismert eset, amikor egy teljes bemeneti sorozatból (mondat, szöveg) egyetlen kimenet készül, például egy osztály.
- Sok a sokhoz, más néven szekvencia a szekvenciához. Ide tartozik a gépi fordítás, ahol az első RNN összegyűjti a bemeneti mondat teljes jelentését egy állapotvektorba, egy másik RNN pedig ebből az állapotból bontja ki a lefordított mondatot.
Karakter szintű szöveggenerálás
Az egyszerűség kedvéért ebben a leckében karakter szintű tokenizálást használunk, vagyis a hálót nem szavakra, hanem egyes betűkre tanítjuk. A tanítás lépése a következő. A háló kap egy adott hosszúságú karaktersorozatot, mondjuk nchars karaktert, és minden egyes bemeneti karakterhez meg kell tanulnia megjósolni a rá következő karaktert. Gyakorlatilag tehát a háló mindig egy karakterrel eltolva próbálja kitalálni a szöveg folytatását.
A generálás, vagyis a következtetés fázisában ez fordítva zajlik. Egy kezdő szöveggel, úgynevezett prompttal indítunk, amit végigfuttatunk az RNN cellákon, hogy megkapjuk a köztes állapotot. Innentől a háló egyszerre egy karaktert generál, majd az újonnan kapott állapotot és a generált karaktert visszaadja a következő lépésnek bemenetként. Ez a ciklus addig ismétlődik, amíg elég hosszú szöveg nem keletkezik. Ugyanez az elv szó szintű generálásra is alkalmazható, csak akkor a háló egész szavakat, nem karaktereket jósol lépésenként.
Lágy generálás és a hőmérséklet szerepe
Minden lépésben az RNN kimenete valójában egy valószínűségi eloszlás a lehetséges következő karakterek felett. A legegyszerűbb megoldás az volna, hogy mindig a legvalószínűbb karaktert választjuk. Ez azonban gyakran hibás eredményhez vezet, mert a szöveg könnyen ismétlődő ciklusba kerül, és ugyanazokat a szórészleteket pörgeti körbe.
A probléma gyökere, hogy a legmagasabb valószínűségű karakter és a második, harmadik legvalószínűbb között gyakran alig van különbség. Ha például a háló a "play" szó után dolgozik, majdnem egyforma eséllyel következhet szóköz vagy egy "e" betű, hiszen mindkettő értelmes folytatáshoz vezet (gondoljunk a "player" szóra). Emiatt nem érdemes mindig a legvalószínűbb választást erőltetni, hanem célszerűbb a teljes eloszlásból mintát venni, vagyis véletlenszerűen, de a valószínűségekkel arányosan választani a következő karaktert.
Ezt a mintavételi folyamatot finomhangolhatjuk egy úgynevezett hőmérséklet paraméterrel.
- Magasabb hőmérséklet ellaposítja az eloszlást, így nagyobb az esély a ritkább, meglepőbb karakterekre. Ez kreatívabb, de kockázatosabb, néha kevésbé koherens szöveget eredményez.
- Alacsonyabb hőmérséklet meredekebbé teszi az eloszlást, így a háló szinte mindig a legvalószínűbb karaktereket választja. Ez biztonságosabb, de gyakran unalmasabb, ismétlődő szöveget ad.
A megfelelő hőmérséklet beállítása gyakorlati kérdés, jellemzően kísérletezéssel találjuk meg az adott feladathoz legjobban illő értéket.
Mire jó mindez a gyakorlatban
Bár az önmagában generált szöveg is látványos, a rekurrens generatív hálók igazi értéke abban rejlik, hogy tetszőleges kezdeti jellemzővektorból tudnak szöveget építeni. Ez a mechanizmus áll a gépi fordítás mögött is, ahol a forrásmondat kódolt állapotvektorát egy másik RNN dekódolja lefordított szöveggé. Ugyanez a logika működik a képaláírás generálásnál is, csak ott a kezdeti vektor nem egy másik RNN-ből, hanem egy konvolúciós hálóból (CNN) érkezik.
Érdemes észben tartani, hogy a ma használt nagy nyelvi modellek, mint a GPT család tagjai, nem RNN architektúrára épülnek, hanem transzformerekre. A rekurrens generatív hálók mégis fontos alapot adnak a megértéshez, hiszen ugyanaz az alapgondolat, a szekvenciális, lépésenkénti generálás és a mintavételezés hőmérséklettel, a mai modellekben is központi szerepet játszik.
Aki szeretné saját kezűleg is kipróbálni a karakter szintű szöveggenerálást, a Microsoft eredeti jegyzetfüzetében talál gyakorlati kódot PyTorch használatával. Megnyitás a GitHubon.
Forrás
Ez a lecke a Microsoft nyílt forráskódú, MIT licenc alatt elérhető "AI For Beginners" tananyagának magyar adaptációja. Eredeti angol lecke. GitHub. Felhasznált magyar gépi fordítás. GitHub.
Workshop
AI Transformation Day
Egésznapos, vezetőknek szóló program. Feltérképezzük, hol tart a szervezet, mi az első reális lépés, és milyen belső feltételek szükségesek a sikerhez. A nap végén konkrét, prioritizált cselekvési lista.
Érdekel a program →