Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
GÉPI TANULÁST SEGÍTŐ FÜGGVÉNYKÖNYVTÁRAK ÁTTEKINTÉSE REVIEW OF MACHINE LEARNING TOOLBOXES FÜVESI Viktor1, KONYHA József2 Ph.D., tudományos munkatárs,
[email protected]
1
tudományos segédmunkatárs,
[email protected] Miskolci Egyetem, Alkalmazott Földtudományi Kutatóintézet, 1,2 Műszerfejlesztési és Informatikai Osztály 2
1,2
Kivonat: Ebben a cikkben a gépi tanulási módszerek, azon belül is mesterséges neurális hálózatok, modellezését és szimulációját segítő függvénykönyvtárak rövid áttekintését szeretnénk megtenni. Mivel a szóba jöhető csomagok listája igen hosszú, ki szeretnénk emelni azokat a gyűjteményeket, amelyek lehetőséget biztosítanak a számítógépben található grafikus vezérlő számítási kapacitásának kiaknázására, valamint ingyenesen használhatók. Az áttekintés során két programozási nyelvet és környezetet is érintünk. Rövid példákkal be is mutatjuk a szélesebb felhasználó táborral rendelkező szoftvercsomagok használatát és összehasonlítjuk azok képességeit is. Kulcsszavak: gépi tanulás, neurális hálózat, függvény könyvtár, mátrix szorzás, összehasonlítás Abstract: In this article a brief overview is given about toolboxes of machine learning, which give some help for the modelling and simulation of neural networks. The list of the potential packages are real long, so we will highlight the libraries, which provide the opportunity to use calculation power of the graphics controller of the computer and open source. During the overview two programming languages and environment will be respected. Using short examples the application of function libraries with wider user camp will be introduced and their features will be compared. Keywords: machine learning, neural network, toolbox, matrix multiplication, comparison
1. BEVEZETÉS Számos olyan probléma létezik, amely megoldása a hagyományos matematikai módszerek segítségével nehézkes, számításigényes feladat, de az ember könnyedén megbirkózik a problémával. Az ilyen esetekben alkalmazhatóak a mesterséges intelligencia területéhez tartozó módszerek. A mesterséges intelligencia egyik alapkövét képezi a gépi tanulási eljárások [1], amelyek az új körülményekhez való adaptálódáshoz, mintázatok felismeréséhez és általánosításhoz kapcsolódó feladatokat megoldani képes módszereket gyűjti magába [2]. A szóba jöhető problémák a következő öt nagyobb csoportba sorolhatók: osztályozási és regressziós feladatok, klaszterezés, eloszlás becslés problémája és dimenzió csökkentés. Osztályozási feladatok során, ha az általánosabb többosztályos problémára gondolunk, minden tanító pont az N osztály valamelyikéhez tartozik. A cél egy olyan függvény előállítása, amely új adatpont esetén pontosan megjósolja az új pont osztályát [3]. Egy jó példa lehet erre a kézzel írt számjegyek felismerése. A regressziós feladat nagyon hasonló az osztályozási problémához, de itt az előállítandó függvény egy közelítést ad az új pontra. Erre lehet példa egy motor sebesség profiljának becslése vagy a tőzsde változásainak előrejelzése [4]. Az előbbi két probléma a felügyelt tanulás (supervised learning) témakörébe tartozik [5]. A felügyelet nélküli tanulásra (unsupervised learning) példa a dimenzió csökkentés és a klaszterezés feladatai. Ezekben az esetekben kiindulásképpen azok a jelöletlen adatpontok állnak rendelkezésre, amelyekben mintákat szeretnénk felismerni, de semmilyen közvetlen információnk nincs a megoldásra vonatkozóan. A dimenzió csökkentés
116
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
során, egy magasabb leképezésű adathalmaznak az alacsonyabb leképezéssel bíró, transzformált változatát keressük úgy, hogy az adatban rejlő, felhasználás szempontjából fontos, információk ne sérüljenek [6]. Ezt a módszert lehet használni, adattömörítéshez, zajszűréshez, de adatok struktúrájának feltáráshoz is [6]. A klaszterezés során az adatokban rejlő belső struktúrákat kell felismerni, csoportokba kell sorolni az adatokat. Erre lehet példa a szociális hálózatban található, azonos preferenciával rendelkező adatok csoportosítása [7]. Utoljára maradt az eloszlás becslés, ahol azt próbáljuk megmondani, hogy egy új adatpont a korábbiakhoz illeszkedik-e vagy sem. Ezt a módszert újdonság detektáláshoz lehet felhasználni [8]. A gépi tanulás problémájának áttekintése után nézzük meg milyen függvénycsomagok állnak a felhasználó rendelkezésére, ha ezzel a területtel kíván foglakozni. Az áttekintésben különös figyelmet szentelünk a neurális hálózatok alkalmazásának lehetőségének és a számítógépben található grafikus kártyák (GPU) általános számításokra való felhasználására. 2. FÜGGVÉNYKÖNYVTÁRAK Számos programcsomag (Julia [9][10], Torch [11][12], Caffee [13][14], Theano [15], Tensorflow [16], stb) áll a felhasználók rendelkezésére, amely GPU-val történő számításokat valamilyen formában támogat és neurális hálózatok szimulációját is lehetővé teszi. Ebben a cikkben két programozási csomag kerül részletesebben bemutatásra, a legfontosabb tulajdonságainak kiemelésével. Az első, a merőben új programozási nyelv, a Julia [9], a másik a lua-ra épülő Torch [11] szkript nyelv. 2.1. Julia programozási nyelv A Julia [9] egy magas szintű, dinamikusan fejlődő programozásai nyelv, amely mögött erős közösségi háttér húzódik. Jelenleg a 0.4.5 verziónál tart, de már készülőben a 0.5-ös változat is. Bőséges, beépített matematikai függvénykönyvtárral rendelkezik, de számos módon bővíthető a nyelv utasításkészlete. C függvények közvetlenül hívhatók a környezetből, de Python-os eljárások esetén is könnyen megvalósítható az átjárhatóság. Nem elhanyagolható, hogy a nyelv, Unicode karakterkészletet támogat.
1. ábra Julia értelmező a terminál ablakban (bal) és Juno [17] környezetben (jobb) A nyelv bővíthetőségét saját csomagrendszerrel oldották meg, amely lehetővé teszi, hogy a felhasználók saját fejlesztésű csomagokat hozzanak létre és osszanak meg egymással. A nyelvhez tartozó internetes oldal [9] tanúsága szerint több mint 1000 kisebb-nagyobb csomag letölthető a környezethez. A teljesség igénye nélkül néhány fontosabb:
117
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
Arduino – Alapszintű Arduino parancsok továbbítását megvalósító interfész könyvtár, BackpropNeuralNet – Előre csatolt neurális hálózatok tanítását és szimulációját biztosító csomag, CUDA – Interfész csomag a CUDA nyelvhez, Gaston – Interfész a Gnuplot-hoz, HDF5 – formátum kezelését lehetővé tevő csomag, Images – képek kezelését megvalósító csomag. A Julia értelmező a nagyobb operációs rendszerek (Windows, Mac OS, Fedora, RHEL) alatt elfut, de mivel szabadon letölthető, a forráskódja bármilyen rendszer alá lefordítható. Fedora Linux alá való telepítésének eredményét és egy, a fejlesztők által javasolt, Juno elnevezésű fejlesztői környezet képe látható az 1. ábrán. A nyelv teljesítményét tekintve igen jó eredményeket produkál. Az 1. táblázatban látható két eljárás (quick rendező algoritmus és egyszerű mátrix szorzás) és azok megvalósítása különféle programozási és szkript nyelveken. Az irodalmi adatok [9] magukért beszélnek, hiszen a Julia igen jól teljesített. C Julia gcc5.1.1 0.4.0 Quick rendezés 1.00 1.15 Mátrix szorzás 1.00 1.02 Módszerek
Matlab R2015b 4.92 1.12
Octave 4.0.0 1866.01 1.12
LuaJIT gsl-shell2.3.1 2.03 1.16
1. Táblázat Julia teljesítményének összehasonlítása [9] 2.2. Torch programcsomag A Torch [12] egy tudományos számításokra kihegyezett keretrendszer, amely erősen támogatja a gépi tanulási algoritmusokat illetve a GPU használatot is. Gyors prototípus gyártáshoz kifejlesztett szkript alapú nyelv, mely Lua alapra épül, így N dimenziós tömbök kezelését alapesetben, külön kiegészítés használata nélkül képes kezelni. Nagyszámú, lineáris algebrához kapcsolódó rutint és számos numerikus optimalizálási függvényt tartalmaz. A megírt kódok könnyen portolhatók OS, Android és FPGA-ra is.
2. ábra Torch értelmező a terminál ablakban (bal) és ZeroBrane Studio [18] környezetben (jobb) Számos kiegészítéssel rendelkezik, mint a korábban tárgyalt Julia nyelv. Az elérhető csomagok számos kategóriába sorolhatók, mint: gépi tanulás, vizualizáció, gép látás, hang- és
118
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
képfeldolgozás, de elosztott számítások és párhuzamos folyamatok kezelésével kapcsolatos csomagok is találhatók. A program értelmezője a 2. ábrán balra látható, még az egyik népszerű lua IDE, az ábra jobb felén található. 3. KÍSÉRLETEK TORCH KÖRNYEZETBEN Torch környezetben többféle különböző processzor (CPU) és GPU alkalmazásával számítási kísérleteket végeztünk, hogy összehasonlítsuk a teljesítménybeli különbségeket és a skálázódást. Két nagyobb kísérletsorozat kerül bemutatásra a következőkben, amelyből az elsőnél négyzetes mátrixok szorzásának időszükségletét mérjük, még a második esetben rejtett rétegű neurális hálózatokat tanítunk be különböző számú rejtett neuron szám mellett. A kísérletekhez kétféle processzor (i5-4440S és i5-6600) illetve kétféle GPU (GTX 750 2GB és GTX 960 4GB) kerület felhasználásra. A kísérleteket Fedora 23, linux alapú operációs rendszer alatt végeztük. 3.1. Mátrix szorzás Ebben a kísérletben négyzetes mátrixokat szoroztunk össze. A mátrixok mérete 50 és 10000 között változott, tartalmuk 0 és 1 közé eső véletlen számok voltak. Csak azt az időt mértük, ami az effektív számítás elvégzéshez volt szükséges. Az eredményeket a 3. ábra tartalmazza. A diagram tanúsága szerint, ahogy várható volt, a mátrixok méretének növekedésével nőtt a számítási idő. Az i5-6600-as CPU még kisebb méret mellett fel tudta venni a versenyt a grafikus vezérlőkkel, sőt a korábbi 7. generáció tagját még meg is előzte, de nagy méretek esetén egyértelmű a grafikus vezérlők előnye. A legnagyobb 10000 x 10000-es mátrix méret esetén 8-szor annyi időre volt szüksége a Skylake architektúrás CPU-nak a művelet elvégzéshez, mint a nem túl régi, Maxwell architektúrájú Nvidia GPU-nak. Szépen látszik a fejlődés a grafikus kártyák között is, hiszen a 2 generáció különbség körülbelül 2-szeres időt jelent. Itt megjegyezném a két kártya CUDA magjainak a száma között is kétszeres szorzó figyelhető meg. A GTX 750 512 CUDA maggal rendelkezik, még a GTX 960-as 1024-el dicsekedhet [19].
3. ábra Mátrixok összeszorzásához szükséges idő a méret függvényében, a különféle hardverek esetén
119
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
Kiemelném a Torch környezet adta kényelmi szolgáltatásokat, amit a grafikus kártya használat során tapasztaltunk. A következő, 4. ábra mutatja a CPU-ra és a GPU-ra megírt mátrix szorzást végző függvények forráskódját. Egyfelől a mátrixok létrehozása során van különbség a két kód között, másfelől a pontos időmérésekhez szükséges szinkronizációs függvények meghívása jelent másik különbséget a forráskódok között. function gpu_matrix_mult(act_size) mat1 = torch.CudaTensor(act_size, act_size):uniform(0,1) mat2 = torch.CudaTensor(act_size, act_size):uniform(0,1) mat_out = torch.CudaTensor() cutorch.synchronize() start = sys.tic() mat_out = mat1 * mat2 cutorch.synchronize() proc_time = sys.toc() print(proc_time) return proc_time end
function cpu_matrix_mult(act_size) mat1 = torch.FloatTensor(act_size, act_size):uniform(0,1) mat2 = torch.FloatTensor(act_size, act_size):uniform(0,1) mat_out = torch.FloatTensor() start = sys.tic() mat_out = mat1 * mat2 proc_time = sys.toc() print(proc_time) return proc_time end
4. ábra Mátrix szorzás elvégzéshez írt rutinok Torch nyelven CPU-ra (bal) és GPU-ra (jobb) 3.2. Neurális hálózatok tanítása A másik kísérlet, amit a Torch környezeten belül végeztünk az több különböző méretű, egy rejtett réteggel rendelkező neurális hálózatok betanítása volt. A szükséges tanító mintakészleteket, mesterségesen állítottuk elő a következő leképezés segítségével.
y(t ) sin(1.8x(t )) z ,
(1)
ahol y(t) – a hálózat kimenete a t. iterációs lépésben; x(t) – a hálózat bemente a t. iterációs lépésben; z – -0.1 - +0.1 tartományon eloszló véletlen zaj. Az x(t) egy szinuszosan változó függvény volt, aminek segítségével egy 500 pontból álló készletet állítottunk össze. Maga a hálózat, egy rejtett rétegű, perceptron neuron modellen alapuló hálózat volt. Szigmoid aktivációs függvénnyel a rejtett és lineáris függvénnyel a kimeneti rétegben. A hálózat súlyainak kezdeti értékei -0.05 és 0,05 tartományon belüli véletlen számok voltak. Tanító kritériumként, átlagos négyzetes hibát használtunk. A hálózatok tanítása sztochasztikus gradiens módszer (SGD) segítségével történt. Minden tanítás, viszonylag rövid 100 iterációs ciklusig történt. Az effektív tanítási időket mérve, különféle hardverelemeket használva, az elért eredményeket az 5. és 6. ábrák foglalják össze. Kis és közepes hálózatméret esetén (10 - 10000 rejtett neuronszám) hálózatméret estén a CPU bizonyult gyorsabbnak, de ettől nagyobb méret esetén már a grafikus vezérlők gyorsítottak a tanítás idején. Maximálisan 40% körüli időnyereséget lehetet elérni a grafikus vezérlő alkalmazásával. Itt jegyezném meg, hogy a hálózat struktúrája igen egyszerű volt, hiszen egy bemenettel és egy kimenettel és egy
120
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
rejtett réteggel rendelkeztek a hálózatok. Több réteg esetén valószínűleg jobban kijöhet a mátrix szorzásnál tapasztalt gyorsulás.
5. ábra Kisebb méretű neurális hálózatok tanításhoz szükséges idő a rejtett neuronok számának függvényében, különféle hardverek esetén
6. ábra Nagyobb méretű neurális hálózatok tanításhoz szükséges idő a rejtett neuronok számának függvényében, különféle hardverek esetén criterion = nn.MSECriterion() if use_GPU then criterion:cuda() end -- set up SGD trainer trainer = nn.StochasticGradient(mlp, criterion) trainer.learningRate = 0.01 trainer.shuffleIndices = false mlp_params = mlp:getParameters() mlp_params:uniform(-0.05, 0.05) mlp:zeroGradParameters()
--make neural network mlp = nn.Sequential(); num_inputs = 1; num_outputs = 1; mlp:add(nn.Linear(num_inputs, num_hiddens)) mlp:add(nn.Sigmoid()) mlp:add(nn.Linear(num_hiddens, num_outputs)) if use_GPU then mlp:cuda() end
7. ábra Neurális hálózat felépítése Torch-ban
121
Műszaki Tudomány az Észak – Kelet Magyarországi Régióban 2016
Ahogy a mátrix szorzás esetén tapasztalható volt, minimális energia befektetésével, könnyen átültethető a programkód CPU-ról GPU-ra, illetve a hálózat létrehozási is csupán pár sor (7. ábra). ÖSSZEFOGLALÁS Két nagy népszerűségnek örvendő függvénykönyvtárat vizsgáltunk meg főbb jellemzőik figyelembevételével. A Julia programozási nyelv esetében irodalmi forrásokra hivatkozva mutattuk be annak teljesítményét. A második, részletesebben megvizsgált programcsomag esetében két vizsgálatot végeztünk többféle hardverelem használata mellett. Arra jutottunk, hogy összetettebb számítási feladat esetén, javasolt a GPU használata, hiszen programozás szempontjából nem jelent nagy munkabefektetést, annak használata, de ha fontos az időparaméter, akkor tetemes időnyereséget lehet elérni a GPU, mint a számolóegység használatával. FELHASZNÁLT IRODALOM [1] [2] [3] [4] [5] [6]
[7] [8] [9] [10] [11] [12] [13] [14]
[15] [16] [17] [18] [19]
SCHAPIRE, R.: Theoretical Machine Learning, COS 511, Lecture notes, 2008. RUSSELL, S., NORVIG, P.: Mesterséges Intelligencia, Modern megközelítésben, Panem Könyvkiadó, 2005., ISBN 963 545 411 2. RIFKIN, R.: Multiclass Classification, 9.520 Class 06, 2008. ZISSERMAN, A.: Machine Learning, Hilary Term, University of Oxford, 2015 HERTZMANN, A., Fleet, D.: Machine Learning and Data Mining, Lecture Notes, CSC 411/D11, Computer Science Department, University of Toronto, 2012. CUNNINGHAM, J. P., GHAHRAMANI, Z.: Linear Dimension Reduction: Survey, Insights and Generalizations, Journal of Machine Learning Research 16, pp. 2859-2900, 2015. ORMÁNDI, R.: Gépi tanulás a gyakorlatban, Bevezetés, Szegedi Egyetem, 2013 SZEPESVÁRI CS.: Gépi tanulás – Rövid bevezetésa, MTA SZTAKI, 2005. Julia, http://julialang.org BEZANSON, J., EDELMAN, A., KARPINSKI, S., SHAH, V. B.: Julia: A fresh approach to numerical computing, http://arxiv.org/abs/1411.1607, 2014 Torch: a scientific computing framework for LuaJIT, http://torch.ch COLLOBERT, R., KAVUKCUOGLU, K., FARABET, C.: Torch7: A Matlab-like Environment for Machine Learning, BigLearn, NIPS Workshop, 2011. Caffe: Deep Learning Framework, http://caffe.berkeleyvision.org YANGQING, J., SHELHAMER, E., DONAHUE, J., KARAYEV, S., LONG, J., GIRSHICK, R., GUADARRAMA, S., DARRELL, T.: Caffe: Convolutional Architecture for Fast Feature Embedding, arXiv preprint arXiv:1408.5093, 2014. THEANO DEVELOPMENT TEAM: Theano: A Python framework for fast computation of mathematical expressions, arXiv e-prints abs/1605.02688, 2016. DEAN, J., MONGA, R. ET AL.: TensorFlow: Large-scale machine learning on heterogeneous systems, Google Research, 2015 JUNO: A flexible IDE for the 21th century, http://junolab.org ZeroBrane Studio: Lightweight IDE for your Lua needs, https://studio.zerobrane.com Geforce.com, http://www.geforce.com/hardware/desktop-gpus
122