TensorFlow (röviden a Google nyílt forrású gépi tanulás rendszeréről)


Mostanában sok helyen lehetett olvasni, hogy a Google megnyitotta a forrását az általa használt gépi tanulás rendszernek. Ez az ami a Google Photos alatt futva automatikusan felcímkézi a képeket, felismeri a streetview képeken az utcák számozását, de ez dolgozik a beszédfelismerő rendszer alatt is. Szóval itt valami egészen ütős dologról van szó. Gondoltam utánaolvasok kicsit, hogy mi is ez a TensorFlow. Bár annak idején tanultam MI-t az egyetemen, inkább nevezném magam laikusnak. Főleg azután, hogy ránéztem a TensorFlow-ra. :) 

Első körben neurális hálókra számítottam, erre tenzorok fogadnak. Legutoljára az általános relativitáselmélet kapcsán találkoztam tenzorokkal. Ezek sokdimenziós mátrixszerűségek (https://hu.wikipedia.org/wiki/Tenzor). Ott ezzel írta le Einstein a 4 dimenziós téridő görbületét 5 dimenzióban. De hogy jön ez az MI-hez? Nos, a TensorFlow-val tenzor transzformációs gráfokat lehet összerakni. Ezek olyan cuccok, amibe bemennek ezek a tenzorok, többféle módon transzformálódhatnak, a transzformációk eredményei összevonhatóak, és bemenetei lehetnek újabb transzformációknak, aztán a végén kiömlik egy rakás másik tenzor. Tök jó, de ez még mindig hogy jön az MI-hez?

Szerencsére a készítők mellékeltek pár tutorialt is, amiből kiderül, hogy hogyan lesz a tenzor transzformációs gráfból mesterséges intelligencia. Az első példa "kézírás felismerés kezdőknek" (http://www.tensorflow.org/tutorials/mnist/beginners/index.md). A feladat, hogy hogy adott egy kézzel írt szám 0-9-ig, és ezt kell felismerni. Minden szám egy 28x28-as szürke skálás kép. Ez ugye 784 pontot, azaz 784 db számot jelent. Ezt a 784 számot felfoghatjuk úgy is, mint egy pont koordinátáit a 784 dimenziós térben (ne, még csak ne is próbáljuk meg elképzelni), és puff, már meg is van a bemeneti tenzor. Az eredmény meg ugye 0-9-ig egy szám, pontosabban 10 db érték, ami azt mondja meg, hogy rendszerünk az adott bemenetre milyen számot tippel. Ugye ha jó a rendszer, akkor arra a számra fogja mondani a legnagyobb esélyt, ami oda van írva. Ezt úgy kell elképzelni, hogy mondjuk egy írott 6-osra azt mondja, hogy 10%, hogy 8, 20% hogy 9, és 70%, hogy 6-os számot lát. Szóval a kimenet 10 érték. Ezt is el lehet képzelni egy pontnak a 10 dimenziós térben, így ez is leírható egy tenzorként. Szóval kb. megvan amit kerestünk. A problémát oda redukáltuk, hogy bemegy egy tenzor, és kijön egy másik. Ami pedig közben a fekete dobozban történik, az a magic, amit a TensorFlow csinál, és amiket ezzel a fent említett tezor transzformációs gráffal lehet leírni.

Ez mind szép és jó, de nekünk konvolúciós neurális hálókat ígértek, erre tenzorokat kapunk, meg egy "vacak" transzformációs gráfot. A jó hír az, hogy ezek a neurális hálók leírhatóak ilyen transzformációs gráf alakban. A TensorFlow tehát nem egy nurális háló library, annál eggyel alacsonyabb szintű, általánosabb dolog, ami többek között lehetőséget nyújt neurális hálók összerakására is. Olyan ez kicsit, mint a 3D grafika esetén. A dolog ott is valójában mátrix műveletekről szól. Ha mozgatunk, nagyítunk, elforgatunk, stb. valamit, az valójában annyit jelent, hogy sorban mátrixokkal szorozgatjuk be a ponthalmaz koordinátáit. Persze ezt az egészet egy magasabb szintű réteg elfedi előlünk, így nekünk elég megmondani azt, hogy most forgatni vagy mozgatni akarunk valamit, és a rendszer legenerálja a megfelelő mátrixokat. Ugyanígy megy ez a TensorFlow esetén is. Megmondhatjuk, hogy hogyan nézzen ki a neurális hálózatunk, és a rendszer ebből felépíti nekünk a megfelelő gráfot. A legjobb az egészben az, hogy ezt aztán nagyon optimálisan képes futtatni is. Képes kiszervezni műveleteket a GPU-nak, több szálon futtatni, és ezzel kicsalni a lehető legnagyobb teljesítményt a futtató hardverből. E mellett az egészet kitehetjük a cloud-ba, vagy éppen futtathatjuk mobil eszközökön. Nekünk elég a matematikai modellekkel foglalkozni, a hardverre való leképzést a TensorFlow intézi, és valójában talán ez a rendszer legnagyobb előnye, hogy egy absztrakciós szintet húz a hardver fölé.

Akit a technikai részletek érdekelnek, a transzformációk és a rendszer alapja C++-ban készült (érthető okokból, hiszen gyorsnak kell lennie), és e felett van egy Python réteg, amin keresztül programozható. A meglévő készlet szabadon bővíthető új transzformációkkal, és remélhetőleg most hogy nyílt forrású lett, talán megjelennek a Python mellett más interfészek is, pl. Java. Ha valakit mélyebben érdekel a dolog, a http://www.tensorflow.org/ oldalon elér minden információt. Érdemes a tutorialokkal kezdeni. Nem egyszerű cucc, de hát a gépi intelligencia sem egy kifejezetten egyszerű terület ...

#blog