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.
Alacsony hőmérséklet
- Meredek eloszlás, szinte mindig a legvalószínűbb karakter nyer
- Biztonságos, kiszámítható szöveg
- Gyakran unalmas, ismétlődő ciklusokba futhat
Magas hőmérséklet
- Lapos eloszlás, a ritkább karakterek is eséllyel indulnak
- Kreatívabb, meglepőbb folytatások
- Néha kevésbé koherens eredmény
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.
- Forrásmondat beolvasásaA kódoló RNN tokenenként végigmegy a bemeneti mondaton.
- ÁllapotvektorA teljes mondat jelentése egyetlen kódolt vektorba sűrűsödik.
- DekódolásEgy másik RNN ebből a vektorból indulva szóról szóra kibontja a fordítást.
- Csere a kiindulópontonHa a kezdő vektor egy CNN-ből érkezik, ugyanez a lánc képaláírást generál.
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.
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 →