Deep learning szoftverek
Neurális hálózatok - rétegenkénti szemlélet Előreterjesztés Visszaterjesztés Bemeneti réteg Bemeneti réteg x Rejtett réteg (FC, ReLU) C/ x w1 out1 Rejtett réteg (FC, lin) Rejtett réteg (FC, ReLU) C/ out1 w2 Rejtett réteg (FC, lin) out2 Szoftmax réteg (kimeneti réteg) u C/ out2 Szoftmax réteg (kimeneti réteg) C/ u Költségfüggvény Költségfüggvény x/ out1 w1/ out1 out1/ out2 w2/ out2 u/ out2 C/ C
Neurális hálózatok - számítási gráf szemlélet Előreterjesztés x * w1 o1 ReLU o1,rel w2 Minden művelet valamilyen elemi mátrix (tenzor) művelet: Szorzás, összeadás, elemenkénti függvény alkalmazáősa (pl.: nemlinearitás) * o2 soft max u y crossent ropy C
Neurális hálózatok - számítási gráf szemlélet Előreterjesztés C/ x x o1/ x o1/ w1 * w1 C/ w1 C/ o1 o1 o1, o2/ o1, / o1 C/ o1,relu ReLU o1,rel ReLU w2 C/ w2 ReLU o2/ w2 * C/ o2 u/ o2 o2 soft max C/ u u C/ u C/ y crossent ropy C C/ C y C/ y
Caffe U.C. Berkeley Vision and Learning Center (BVLC) Interfészek: C++ Python MATLAB Command line interface Előrecsatolt (konvolúciós) hálók tanítására jó Nem kell kódot írni (csak txt fájlokat) Gépi látás/képfeldolgozás területen elterjedt Dokumentációja nem naprakész: forráskódot érdemes olvasni Több GPU kezelése egy gépen belül: adatpárhuzamosítás
Caffe - fő osztályok Blob Layer Bottom blobokból Top blobokat csinál Net Tárolja az adatokat, deriváltakat Sok Layer, előreterjesztés, visszaterjesztés számításokat végzi Solver A gradiens alapján módosítja a súlyokat
Caffe - Protocol Buffers Minden objektum protobuf sémával van leírva (.proto fájl) Példányosításuk.prototxt fájl segítségével Nyelvfüggetlen Típusos JSON, Google fejlesztése https://github. com/bvlc/caffe/blob/master/src/ caffe/proto/caffe.proto Ebben a fájlban van minden a Cafferól, ez a legjobb és
Caffe - layer Setup: initialize the layer and its connections once at model initialization. Forward: given input from bottom compute the output and send to the top. Backward: given the gradient w.r.t. the top output compute the gradient w.r.t. to the input and send to the bottom. A layer with parameters computes the gradient w. r.t. to its parameters and stores it internally. Minden rétegnek van külön CPU és GPU implementációja
Caffe - net Ez írja le a modellünket A net a layerekből egy irányított, körmentes gráf Visszacsatolt hálózatokat emiatt nem lehet megvalósítani benne name: "LogReg" layer { name: "mnist" type: "Data" top: "data" top: "label" data_param { source: "input_leveldb" batch_size: 64 } } layer { name: "ip" type: "InnerProduct" bottom: "data"...... top: "ip" inner_product_param { num_output: 2 } } layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip" bottom: "label" top: "loss" }
Caffe - solver scaffolds the optimization bookkeeping and creates the training network for learning and test network(s) for evaluation. iteratively optimizes by calling forward / backward and updating parameters (periodically) evaluates the test networks snapshots the model and solver state throughout the optimization solver módszerek: Stochastic Gradient Descent AdaDelta Adaptive Gradient Adam Nesterov s Accelerated Gradient RMSprop 1. calls network forward to compute the output and loss 2. calls network backward to compute the gradients 3. incorporates the gradients into parameter updates according to the solver method 4. updates the solver state according to learning rate, history, and method
Caffe - tipikus használata 1. Adatok konvertálása (pl.: valamilyen scripttel) a. b. 2. A modell létrehozása (.prototxt fájl megírása) a. b. c. 3. 4. Nem jó, ha a fájlrendszerben sok külön bemeneti fájl van (pl.: sok kép) Adatokat egy óriás fájlba összemásoljuk, tipikusan LMDB vagy HDF5 fájlba Történhet kézzel De generálhatja egy script is (pl.: ResNet 152 réteg) Új vagy már meglévő hálózat (részleges) használata A solver létrehozása (.prototxt fájl megírása) Tanítás a../build/tools/caffe train \ -gpu 0 \ -model path/to/trainval.prototxt \ -solver path/to/solver.prototxt \ -weights path/to/pretrained_weights.caffemodel
Caffe - Model Zoo https://github.com/bvlc/caffe/wiki/model-zoo Megtanított modellekről egy linkgyűjtemény
Torch A NYU-ról indult Facebook, Twitter, DeepMind (ők már nem) használják és fejlesztik C-ben írták Lua scriptnyelven programozható Magas szintű scriptnyelv javascripthez hasonló C-hez könnyen illeszthető Van hozzá JIT, tehát nyugodtan lehet írni benne for ciklust Dokumentáció nem tejles, de használható https://github.com/torch/torch7/blob/master/doc/tensor.md https://github.com/torch/torch7/blob/master/doc/maths.md
Torch - tensor osztály Tensor osztály Mint numpy-ban a tömbök Adattípus könnyen konvertálható (csakúgy, mint numpy-ban) Pl.: double (64 bit) helyett float (32 bit) torch.floattensor GPU-n használat: GPU-n tárolt adat is csak egy adattípus torch.cudatensor Vele végzett műveletek a GPU-n futnak
Torch - nn, cunn, optim,... csomagok Önmagában a torch tensor osztályát ritkán szokás használni Különböző Lua csomagok alapulnak a tensor osztályon A következő csomagokból áll a torch: torch : tensors, class factory, serialization, BLAS nn : neural network Modules and Criterions optim : SGD, LBFGS and other optimization functions gnuplot : ploting and data visualization paths : make directories, concatenate file paths, and other filesystem utilities image : save, load, crop, scale, warp, translate images and such trepl : the torch LuaJIT interpreter cwrap : used for wrapping C/CUDA functions in Lua
Torch - module nn csomag Ami Caffe-ben Net vagy Layer volt, az itt Module Az egész hálózat is Module, és minden réteg is Module Előreterjesztés, visszaterjesztés külön implementálva a Moduleokon belül a Tensor osztállyal Rengeteg Module, folyamatosan készülnek újak Emiatt CPU-n is, GPU-n is könnyen használható https://github.com/torch/nn Saját Module is könnyen írható
Torch - module - példa require 'nn' self.output:resizeas(input):copy(input) local DropoutEx, Parent = torch.class('nn.dropoutex', 'nn.module') self.output:cmul(self.noise) function DropoutEx: init(p) self.output:div(1-self.p) Parent. init(self) self.p = p or 0.5 return self.output end if self.p >= 1 or self.p < 0 then error('<dropoutex> illegal percentage, must be 0 <= p < 1') end function DropoutEx:updateGradInput(input, gradoutput) self.noise = torch.tensor() end self.gradinput:resizeas(gradoutput):copy(gradoutput) self.gradinput:cmul(self.noise) -- simply mask the gradients function DropoutEx:updateOutput(input) with the noise vector self.noise:resizeas(input) self.gradinput:div(1-self.p) if self.p > 0 then return self.gradinput self.noise:bernoulli(1-self.p) else self.noise:zero() end end
Torch - nngraph Modulok összekapcsolása Számítási gráf h1 = nn.linear(20, 20)() h2 = nn.linear(10, 10)() hh1 = nn.linear(20, 1)(nn.Tanh()(h1)) hh2 = nn.linear(10, 1)(nn.Tanh()(h2)) madd = nn.caddtable()({hh1, hh2}) oa = nn.sigmoid()(madd) ob = nn.tanh()(madd) gmod = nn.gmodule({h1, h2}, {oa, ob}) x1 = torch.rand(20) x2 = torch.rand(10) gmod:updateoutput({x1, x2}) gmod:updategradinput({x1, x2}, {torch. rand(1), torch.rand(1)}) graph.dot(gmod.fg, 'Big MLP')
Theano University of Montreal, Yoshua Bengio csapata készítette Számítási gráfok Szimbolikus számítások Python numpy Multi-GPU (adat párhuzamosítás, modell párhuzamosítás) Tetszőleges probléma megoldható vele Visszacsatolt hálók Hesse-mátrix számítás
Theano Szimbolikus változók deklarációja
Theano Háló kimenetének, és a költségfüggvény értékének a kiszámítása - szimbolikusan Számítási gráf definiálása x a dot arelu ReLU w1 dot scores soft max probs w2 crossentropy y loss
Theano Készítsünk egy meghívható python függvényt a számítási gráfunkból, definiálva a bemeneteit és kimeneteit Itt történik a mágia Szimbolikus optimalizáció Natív kóddá fordítás CUDA kóddá fordítás Akár több tíz percig is eltarthat De elég egyszer létrehozni a függvényt
Theano Hívjuk meg a függvényt valódi értékeket tartalmazó numpy tömbökkel
Theano A visszaterjesztés is a számítási gráf része A gradienseket szimbolikusan tudjuk számítani A theano.function megoldja ezt is.
Theano Shared változók Két függvényhívás között megmarad az értéke GPU esetén a GPU RAM-ban marad Így megspórolható az ide-oda másolgatás
Theano Tanítási szabályokat is megadhatjuk a theano.function-nek, ami minden alkalommal végrehajtódik, amikor a függvényt meghívjuk Tanításhoz elég csak a függvényt hívni periodikusan Tanításhoz és kiértékeléshez külön függvényeket csinálhatunk, ugyanabból a számítási gráfból
TensorFlow Google belső fejlesztése (Google Brain) Nagyon hasonló, mint a Theano - számítási gráfok vannak itt is Könnyű vizualizálni (TensorBoard) Multi-GPU és multi-node tanítás (több gépen, több GPU-val) Aktívan fejlesztik, profi csapat áll mögötte Egyre több független projekt épül rá szoftver ökoszisztéma C++, Python http://download.tensorflow.org/paper/whitepaper2015.pdf
TensorFlow - Multi GPU
TensorFlow - Elosztott rendszer
TensorFlow - demo
TensorFlow - vizualizáció (TensorBoard) https://www.tensorflow.org/tensorboard
TensorFlow - vizualizáció (TensorBoard) https://www.tensorflow.org/versions/r0.8/how_tos/graph_viz/index.html
3D konvolúció
Keras Egy magasszintű réteg Theano vagy TensorFlow fölé nem nekünk kell implementálni a neurális háló összefüggéseit, ezek megvannak benne Nehéz debuggolni Ha valami kivétel történik, az nagyon mélyről is jöhet, pl.: Theano belsejéből Nem tudjuk biztosan, hogy mi is történt a Theano és a mi kódunk között
Keras
CNTK Microsoft készíti Egyelőre csak C++ https://github.com/microsoft/cntk Állítólag (Microsoft saját mérése alapján) nagyon hatékonyan párhuzamosít
Egyéb rendszerek BidMach Brainstorm Kaldi MatConvNet MaxDNN Deeplearning4j Lasagne(Theano) Marvin Leaf
Teljesítmény összehasonlítás https://github.com/soumith/convnet-benchmarks
Teljesítmény összehasonlítás https://github.com/soumith/convnet-benchmarks