Túl az egyrétegű modellen
Az egyrétegű perceptron egy lineáris, kétosztályos osztályozó modell. Ez a lecke ezt a modellt terjeszti ki egy rugalmasabb keretrendszerré, amely három dologra képes, amire az eredeti perceptron nem. Egyrészt kettőnél több osztály közötti különbségtételre, vagyis többosztályos osztályozásra. Másrészt osztályozás helyett folytonos számérték előrejelzésére, vagyis regressziós problémák megoldására. Harmadrészt olyan osztályok elválasztására is, amelyek nem választhatók szét egyetlen egyenessel, vagyis nem lineárisan szeparálhatók.
Ehhez a lecke egy saját, moduláris keretrendszert is felépít Pythonban, amellyel különböző neurális hálózati architektúrák állíthatók össze. Ez a gyakorlat jól megmutatja, hogy a mai nagy keretrendszerek, mint a PyTorch vagy a TensorFlow, alapvetően ugyanezt az elvet valósítják meg, csak sokkal nagyobb léptékben és optimalizáltabb formában.
A gépi tanulás formalizálása
Induljunk ki a probléma pontos megfogalmazásából. Van egy tanító adathalmazunk a hozzá tartozó címkékkel, és olyan modellt szeretnénk építeni, amely a lehető legpontosabb előrejelzéseket adja. Az előrejelzés minőségét egy úgynevezett veszteségfüggvény méri. Regressziós feladatnál, amikor egy számot kell előre jeleznünk, gyakran használjuk az abszolút vagy a négyzetes hibát. Osztályozási feladatnál a legegyszerűbb mérőszám a nulla egy veszteség, amely lényegében megegyezik a modell pontosságával, de gyakran ennél finomabb, úgynevezett logisztikus veszteséget alkalmaznak.
Az egyszintű perceptronnál a modell egy egyszerű lineáris függvény volt, amely a bemenetet egy súlymátrixszal szorozta meg, és hozzáadott egy eltolási értéket. Osztályozásnál gyakran szeretnénk, hogy a kimenet valószínűségként legyen értelmezhető az egyes osztályokra, ehhez az úgynevezett softmax függvényt használjuk, amely normalizálja a nyers kimeneti értékeket. A modellt leíró súlyokat és eltolási értékeket összefoglalóan paramétereknek nevezzük, és a teljes adathalmazra vett hiba ezeknek a paramétereknek a függvénye.
A neurális háló tanításának célja tehát nem más, mint ennek a hibának a minimalizálása a paraméterek megfelelő beállításával.
Gradiens csökkentés és a sztochasztikus változat
A hiba minimalizálására a legelterjedtebb módszer a gradiens csökkentés. Az alapötlet, hogy kiszámítjuk a veszteségfüggvény deriváltját, többdimenziós esetben gradiensét, a paraméterekre nézve, majd a paramétereket úgy módosítjuk lépésről lépésre, hogy a hiba csökkenjen. A módosítás mértékét egy előre meghatározott tanulási ráta szabályozza.
Elméletben minden lépésnél a teljes adathalmazt figyelembe kellene venni, hiszen a veszteség az összes tanító minta összegeként adódik. A gyakorlatban azonban az adathalmaznak csak egy kis, véletlenszerűen kiválasztott részét, úgynevezett minibatchet használjuk fel egy adott lépéshez. Mivel ez a részhalmaz minden alkalommal más és más, ezt a módszert sztochasztikus gradiens csökkentésnek, röviden SGD nak nevezzük. Ez lényegesen gyorsabbá teszi a tanítást nagy adathalmazok esetén, és a gyakorlatban jól is működik.
Több réteg és a backpropagation
Az egyrétegű háló csak lineárisan szeparálható osztályokat tud kezelni. Ha gazdagabb modellt szeretnénk, több réteget kell egymásra építeni. Ez matematikailag azt jelenti, hogy a kimenetet több lépésben számítjuk ki, minden réteg a saját súlyaival és eltolási értékeivel, a rétegek között pedig egy nemlineáris aktivációs függvényt alkalmazunk. Ez a nemlinearitás az, ami lehetővé teszi, hogy a hálózat ne csak egyenessel elválasztható mintázatokat tudjon megtanulni, hanem sokkal bonyolultabb összefüggéseket is.
A gradiens csökkentés elve többrétegű hálónál is ugyanaz marad, csak a derivált kiszámítása lesz bonyolultabb, hiszen minden réteg hat a következőre. Ezt a láncszabály segítségével oldjuk meg, amellyel a veszteségfüggvény deriváltja a kimenettől visszafelé, rétegről rétegre számítható ki egészen a legelső rétegig. Mivel a számítás a kimenettől indul és visszafelé halad a hálón, ezt a módszert backpropagationnek, magyarul hibavisszaterjesztésnek nevezzük. A backpropagation ma is az egyik legfontosabb algoritmus a neurális hálók tanításában, gyakorlatilag minden modern mély tanulási rendszer erre épül.
Miért érdemes saját keretrendszert építeni
Bár a való életben szinte senki nem ír saját neurális háló keretrendszert nulláról, hiszen a PyTorch vagy a TensorFlow már mindent tartalmaz, ami ehhez szükséges, a saját implementáció megépítése rendkívül tanulságos gyakorlat. Amikor valaki saját kezűleg programozza le a rétegeket, az aktivációs függvényeket és a backpropagation lépéseit, sokkal mélyebben megérti, mi történik a modell belsejében, amikor egy nagy nyelvi modellt vagy egy képosztályozó hálót tanítunk. Ez a fajta megértés később abban is segít, hogy valaki üzleti döntéshozóként reálisan tudja megítélni, mire képes és mire nem képes egy adott AI megoldás.
Gyakorlati anyag
Ehhez a leckéhez tartozik egy Jupyter notebook, amelyben lépésről lépésre felépíthető egy saját, moduláris neurális háló keretrendszer, majd betanítható egy egyszerű kétdimenziós osztályozási feladatra.
Notebook megnyitása 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 →