Mesterséges neurális hálózatok – avagy, hogyan tanul egy gép?

2016. május 02. - tudom_ányos

Amint azt korábbi posztunkban is megírtuk, a számítógép egészen elképesztő dolgokat képes önállóan megtanulni, a hatalmas információhalmazok értelmezésétől kezdve a Go játékon át az emberi nyelven történő társalgásig. De hogyan is működik a gépi tanulás?


(forrás: www.extremetech.com)

A gépi tanulás módszerét az emberi agy analógiájára alkották meg a 20. század második felében. Az agyunkat felépítő mintegy százmilliárd idegsejt mindegyike a nyúlványain keresztül sok másikkal van kapcsolatban. A kapcsolatokon keresztül továbbítódik az ingerület, vagyis egy aktív állapotban lévő idegsejt a vele kapcsolatban lévő idegsejteket is nyugalmi állapotból aktív állapotba hozhat. A sejtek közötti kapcsolatok a tanulási folyamat során egyre erősebbek vagy gyengébbek lesznek, annak megfelelően, hogy a tanult feladat végrehajtásában az adott kapcsolaton keresztül továbbított ingerület hasznos volt-e. Így ha sokat gyakoroltuk egy problématípus megoldását vagy egy mozgásforma végrehajtását, akkor az ehhez használt kapcsolatok megerősödése miatt a következő alkalommal jobban teljesítjük az adott feladatot.

 
Az idegsejt felépítése (forrás: http://ilovebiosz.blogspot.hu)

Az önálló tanulásra képes programok, a mesterséges neurális hálózatok az emberi idegsejtekhez hasonló, szigmoid neuronoknak nevezett elemekből épülnek fel. Ezek sok másik neuronnal állnak különböző erősségű kapcsolatban. Minden kapcsolat irányított, vagyis a két végén lévő neuron között csak egy irányban áramlik az információ. Az egyes kapcsolatok erősségét egy-egy w-vel jelölt szám jellemzi, ezen kívül minden neuron rendelkezik egy-egy b-vel jelölt küszöbértékkel. Ezek a neurális hálózat paraméterei, ezen értékek változnak a tanulási folyamat során. A bemeneti neuronok a mi érzékszerveinkhez hasonlóan a külvilággal állnak kapcsolatban, így a program bemenetéről kapnak egy-egy x-szel jelölt számot, ami nulla és egy közötti érték lehet. A hálózat többi neuronja is nulla és egy közötti értékeket vehet fel. A nulla a teljes nyugalom állapotának, míg az 1-es érték a teljes aktivációnak felel meg. A köztes értékek egy köztes aktivációs szintet jelentenek, például az x=0,8 értékű neuron aktívabb egy x=0,3 értékű neuronnál.



A külvilággal közvetlen kapcsolatban nem lévő, rejtett neuronok a bejövő kapcsolataikon keresztül kapnak információt a többi neuron aktivációs állapotáról. Az adott kapcsolat w erőssége felerősíti a bejövő neuron x aktivációs értékét.

A bemeneti neuronoktól elindulva, a teljes neurális hálón végighaladva kiszámolhatjuk az egyes neuronok x aktivációs értékét. A hálózat utolsó neuronjai szintén kapcsolatban vannak a külvilággal, az ő értékük adja a program kimenetét. A neurális hálókat általában az intuíciót igénylő, programnyelven nehezen megfogalmazható feladatok megoldására alkalmazzák. Például ha kézzel írott számjegyeket szeretnénk a géppel felismertetni, nagyon bonyolult lenne parancsokkal meghatározni az egyes számjegyek jellemzőit, viszont egy neurális hálózat egyszerűen megtanulhatja a feladatot.

A felismerendő számjegyeket szürkeárnyalatos képként adhatjuk meg a programnak, ahol az egyes képpontok a bemeneti neuronoknak felelnek meg. Ha egy képpont fekete, a neuron x értéke 1, míg ha fehér, akkor x=0 lesz. A szürke árnyalatait a 0 és 1 közötti törtszámok jelölik. A neurális hálózatnak tíz kimenete lesz, a tíz lehetséges számjegynek megfelelően. Ezen tíz neuron közül ideális esetben egy vesz fel x=1 értéket, a többi x=0-t, így jelezve, hogy a hálózat szerint mi volt a képpontonként beolvasott számjegy.

Kezdetben a hálózat neuronjainak b küszöbértékét és a kapcsolatok w erősségét véletlenszerűen -1 és 1 közötti számokkal töltjük fel. Így ha egy képet beolvastatunk a programmal, teljesen véletlenszerű, milyen számjegyet ad válaszként. Mi viszont tudjuk, hogy a kép milyen számjegyet ábrázol, ezért a hálózat b és w paramétereit kicsit úgy változtatjuk, hogy a helyes számjegynek megfelelő kimeneti neuron aktivációs értéke nőjön, míg a többi kimeneti neuron értéke csökkenjen. Ez a változtatás automatizálható, ha megadjuk a programnak a tanuló képhez tartozó számot, akkor önállóan tudja a b és w paramétereit módosítani. Ha nagyon sok tanuló képet mutatunk a programnak a hozzá tartozó számértékkel együtt, akkor előbb-utóbb megtanulja a mögöttes logikát, és felismeri azokat a képeket is, amelyeket a tanulási folyamat során nem látott (tesztképek). Kulcsfontosságú, hogy a paramétereket minden lépésben csak kicsit módosítsuk, hogy a program által elkövetett hibát nehogy túlkorrigáljuk. Így sok tanulás után a program megtalálja az optimális b és w paramétereket, melyekkel fel tudja ismerni a számjegyeket.


(forrás: http://www.hdwallpapersact.com)

A folyamat az emberi tanuláshoz hasonlít. Ha a kosárra dobást gyakoroljuk, és az első próbálkozásunk túl erősre sikerül, akkor legközelebb gyengébben dobunk; ha az első dobás balra ment, akkor legközelebb jobbra célzunk. Természetesen fontos a mérték: ha túl kis mértékben korrigálunk, a második dobás is erős lesz illetve balra megy, míg ha túl sokat korrigálunk, túl gyenge illetve túl jobbra tartó lesz a dobásunk. Sok gyakorlással elérhetjük, hogy majdnem minden dobásunk bemenjen a kosárba. Ha ki szeretnénk próbálni, hogyan tanul egy neurális hálózat, a http://playground.tensorflow.org oldalon megtehetjük. A + jelekre kattintva hozzáadhatunk, a – jelekre kattintva elvehetünk neuronokat a hálózatból. „Classification” módban a hálózat feladata a „Data” menüben kiválasztott ábra logikájának megfejtése, így a tanuló kép alapján a tesztképen a narancssárga és kék pontok színének megtippelése. Emberi szemmel nézve a feladat egyszerűnek tűnik, mégsem tudnánk egyszerűen leprogramozni, éppen ezért alkalmazunk neurális hálózatot a probléma megoldására.


http://playground.tensorflow.org

A lejátszás gombra kattintva láthatjuk, hogy az egyes lépésekben hogyan lesz egyre okosabb a hálózatunk. A folyamatábrán a négyzetek az egyes neuronokat jelzik, kék színnel a pozitív, naranccsal a negatív w súlyú kapcsolatokat jelölik. Az input oszlopban kiválaszthatjuk, hogy a bemenő ábra mely tulajdonságaira figyeljen a hálózatunk. Ha komplexebb mintát, például spirált szeretnénk felismertetni a programmal, több bemeneti tulajdonságra és sok neuronra lesz szükségünk, és a „learning rate”-et is változtatnunk kell a futás közben. Ez a szám adja meg, milyen mértékben korrigálja a hibákat a program, ha túl nagy, akkor túlkorrigál, míg ha túl kicsi akkor csak nagyon lassan tanul.

A jövőben egyre nagyobb szerep jut majd a neurális hálóknak, ezért nagy szükség lesz a gépi tanulás megvalósításához, irányításához értő szakemberekre. Ha bővebben érdekel a neurális hálózatok működése, ebben az online elérhető könyvben sok érdekességet találsz.

A bejegyzés trackback címe:

http://tudomek.blog.hu/api/trackback/id/tr928654840

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.