AI kezdőknek · Bevezetés a neurális hálókba · Lecke 05

Keretrendszerek és a túlillesztés

Ez a lecke a Microsoft nyílt forráskódú "AI For Beginners" (AI kezdőknek) tananyagának magyar adaptációja. Bemutatja, miért nem érdemes neurális hálót nulláról, saját kódból tanítani, milyen szerepet tölt be a PyTorch és a TensorFlow, és mi az a túlillesztés, ami a gépi tanulás egyik leggyakoribb buktatója.

Vissza a tananyaghoz


Miért kellenek keretrendszerek

Egy neurális háló hatékony tanításához két dologra van szükség. Az első a tenzorokon végzett műveletek, vagyis a szorzás, összeadás és olyan függvények kiszámítása, mint a szigmoid vagy a softmax. A második az összes kifejezés gradiensének meghatározása, hogy elvégezhető legyen a gradiens ereszkedésen alapuló optimalizáció.

Az első feladatra a numpy könyvtár is alkalmas, de a gradiensek kiszámításához külön mechanizmus kell. Ha valaki saját kézzel írt keretrendszerrel próbálkozik, minden derivált függvényt manuálisan kell beprogramoznia a visszaterjesztést végző lépésbe. Egy jó keretrendszer ehelyett automatikusan kiszámítja bármely, általunk definiált kifejezés gradiensét. Ezt a képességet automatikus differenciálásnak, röviden autogradnek nevezik.

Emellett fontos, hogy a számítások GPU-n vagy más speciális hardveren, például TPU-n is lefuthassanak, hiszen egy mély neurális háló tanítása rengeteg műveletet igényel, és ezek párhuzamosítása jelentősen felgyorsítja a folyamatot.


PyTorch és TensorFlow

Jelenleg két keretrendszer uralja a mély tanulás világát, a TensorFlow és a PyTorch. Mindkettő alacsony szintű API-t kínál a tenzorokkal végzett műveletekhez, CPU-n és GPU-n egyaránt. Emellett mindkettőhöz tartozik egy magasabb szintű réteg is, a TensorFlow-hoz a Keras, a PyTorch-hoz pedig a PyTorch Lightning.

A magas szintű API gyors eredményt hoz, mert nem kell a részletekkel foglalkozni. Az alacsony szintű API viszont sokkal nagyobb kontrollt ad a tanítási folyamat felett, ezért kutatási környezetben, új architektúrák kipróbálásánál gyakran ezt választják. A két megközelítés nem kizárja, hanem kiegészíti egymást. Lehet saját réteget építeni alacsony szintű API-val, majd azt beilleszteni egy magas szintű API-val felépített nagyobb hálóba, vagy fordítva, a magas szintű API-val definiált hálóhoz saját, alacsony szintű tanítási ciklust írni. Mindkét API ugyanazokra az alapfogalmakra épül, ezért jól együttműködnek.

Kezdéskor érdemes az alacsony szintű API-val és a tenzorokkal indulni, mert ez adja meg az alapos megértést arról, hogyan működik egy neurális háló a motorháztető alatt. Aki gyorsan szeretne eredményt látni, és nem akar sok időt tölteni a részletekkel, nyugodtan ugorhat egyenesen a magas szintű API-ra épülő megoldásokhoz.


Mi az a túlillesztés

A túlillesztés, angolul overfitting, a gépi tanulás egyik legfontosabb és leggyakrabban félreértett fogalma. Képzeljünk el egy egyszerű feladatot, amelyben öt pontra kell egy görbét illeszteni. Egy két paraméteres lineáris modell egyenes vonalat rajzol, amely nem megy át pontosan mindegyik ponton, a tanítási hibája mondjuk 5,3, a validációs hibája pedig 5,1, vagyis a kettő közel áll egymáshoz.

Egy hét paraméteres, jóval bonyolultabb modell viszont pontosan áthaladhat mind az öt ponton, így a tanítási hibája nulla lesz. Csakhogy ez a modell nem az adatok mögötti valódi mintázatot tanulta meg, hanem szó szerint bemagolta a tanítópontokat, ezért a validációs hibája nagyon magas, akár 20 is lehet. Ez a jelenség a túlillesztés, vagyis a modell "gazdagsága", a paraméterek száma és a rendelkezésre álló tanítási minták száma közötti egyensúly felborulása.

A túlillesztésnek jellemzően három forrása van.


Hogyan ismerhető fel és előzhető meg

A túlillesztés jellegzetes jele, hogy a tanítási hiba nagyon alacsony, miközben a validációs hiba magas. Tanítás közben mindkét hiba csökkenni kezd, majd egy ponton a validációs hiba megáll, sőt elkezd újra emelkedni, miközben a tanítási hiba tovább csökken. Ez a pillanat jelzi, hogy a modell a jelentős mintázatok helyett már az adatokban rejlő zajt tanulja meg, és innentől a tanítást célszerű leállítani, vagy legalább menteni a modell addigi állapotát. Ezt a technikát korai leállításnak (early stopping) nevezik.

Ha a jelenség egyszer felismerhető, több eszköz is rendelkezésre áll a kezelésére.


Torzítás és variancia dilemmája

A túlillesztés valójában egy tágabb statisztikai jelenség, a torzítás és variancia közötti dilemma (bias variance tradeoff) egyik megnyilvánulása. A modell hibájának két fő forrása van.

Tanítás közben a torzítási hiba jellemzően csökken, ahogy a modell egyre pontosabban közelíti az adatokat, a varianciahiba viszont ezzel párhuzamosan nőni kezd. A cél mindig egy egyensúlyi pont megtalálása, amit vagy manuálisan érünk el, amikor felismerjük a túlillesztés jeleit, vagy automatikusan, regularizációs technikák beépítésével.


Gyakorlati kód

Aki a fenti fogalmakat kódban, PyTorch tenzorokkal és autograd használatával is végig szeretné követni, a Microsoft eredeti Jupyter notebookjában talál lépésről lépésre bemutatott példát. IntroPyTorch.ipynb megnyitása 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.


← Előző lecke Következő lecke →

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 →