Rekurrentne närvivõrk

**Rekurrentne närvivõrk** (RNN) on tehisnärvivõrkude klass, kus ühendused sõlmede vahel moodustavad suunatud graafi mööda jada. See võimaldab närvivõrgul ära tunda mustreid andmejadades. Erinevalt pärilevivõrkudest saab RNN kasutada oma sisemist olekut (mälu), et töödelda sisendite järjendeid. See muudab need kasutatavaks toimingutes nagu segmenteerimata ja ühendatud käekirja tuvastamine või kõnetuvastus.

Mõistet "rekurrentne närvivõrk" kasutatakse valimatult, et viidata kahele laiale liigile sarnase üldise struktuuriga närvivõrkudele, millest üks on lõpliku siirdega ja teine on piiramatu siirdega. Mõlemad neist väljendavad ajalist dünaamilist käitumist. Lõpliku siirdega rekurrentne võrk on tsükliteta suunatud graaf, mille saab kirja panna ja asendada rangelt pärilevivõrguga, samas piiramatu siirdega rekurrentne võrk on suunatud tsükleid sisaldav graaf, mida ei ole võimalik asendada pärilevivõrguga.

Nii lõpliku siirdega kui ka piiramatu siirdega rekurrentsed võrgud võivad omada lisaks veel salvestatud olekut, mis võib olla otsese närvivõrgu kontrolli all. Salvestatud olek võib olla ka asendatud teise võrgu või graafiga, kui see sisaldab ajalisi viivitusi või tagasisideahelaid. Sellised kontrollitud olekud on üks osa tüüpides LSTM ja GRU.

## Ajalugu
Rekurrentsed närvivõrgud töötati välja 1980. aastatel. Hopfieldi võrgud avastas John Hopfield 1982. aastal.

### LSTM
Pika lühiajalise mälu (ingl *long short term memory*, edaspidi LSTM) võrgud avastati Hochreiteri ja Schmidhuberi poolt 1997. aastal ja saavutati mitmeid täpsusrekordeid mitmes rakendusvaldkonnas.
2007. aasta paiku tegi LSTM murrangulisi samme kõnetuvastuses, edestades traditsioonilisi mudeleid teatud kõnetuvastusrakendustes. 2009. aastal oli LSTM võrk esimene RNN, mis võitis mustrituvastuskonkursi, saades esimesi kohti konkurssidel segmenteerimata käekirja tuvastamises. 2014. aastal kasutas Hiina otsingumootor Baidu CTC (ingl *Connectionist Temporal Classification*) treenitud RNN-i, et murda Switchboard Hub5'00 kõnetuvastuse võrdlusalus, kasutamata lisaks ühtegi traditsioonilist kõne töötlemise meetodit.

LSTM parandas ka suure sõnavaraga kõnetuvastust ja kõnesünteesi, seda kasutati Google'i Androidis. 2015. aastal tegi Google'i kõnetuvastus teadaolevalt suure, 49% hüppe, kasutades CTC-treenitud LSTM-i, mida kasutas Google'i häälotsing.

LSTM purustas rekordeid, parandades masintõlget, keele modelleerimist ja mitmekeelset keeletöötlust. LSTM võrgud koos konvolutsiooniliste närvivõrkudega (CNN) täiustasid ka automaatset pildi pealkirjastamist.

## Arhitektuur
Järgnevalt on välja toodud kaks populaarset rekurrentse närvivõrgu arhitektuuri.

### Tavaline rekurrentne närvivõrk

Tavaline RNN koosneb kolmest kihist: sisend-, peidetud rekurrentne ja väljundkiht. Sisendkihil on N sisendsõlme. Sisend koosneb vektorite jadast läbi aja t {..., x_{t-1}, x_{t}, x_{t+1},...}. Sisendsõlmede ühendused on defineeritud kaalude maatriksis W_{IH}. Peidetud kiht koosneb rekurrentsetest sõlmedest, millel on vähemalt üks tagasileviühendus. Peidetud kihis on M sõlme, mis on omavahel ühendatud läbi aja rekurrentsete ühendustega. Peidetud kiht defineerib süsteemi oleku ehk mälu:

h_t = f_H(o_t), kus

o_t = W_{IH}x_t + W_{HH}h_{t-1} + b_h,

f_H() on peidetud kihi aktivatsioonifunktsioon ja  b_h on peidetud sõlmede kaaluvektor.
Peidetud kiht on ühendatud väljundkihti kaalutud ühendustega W_{HO}. Väljundkihil on P sõlme y_t = (y_1,y_2,...,y_P), mis arvutatakse nii:

y_t=f_O(W_{HO}h_t + b_o), kus

f_O() on aktivatsioonifunktsioon ja b_o on väljundkihi kaalude vektor.

Neid samme korratakse järjestikku üle aja  t = (1, ... , T)

Juhendamisega õppe jaoks diskreetses ajas, andmejadad reaalarvuliste väärtustega sisendvektoritest antakse sisendsõlmedele ükshaaval. Igal ajajärgul arvutab iga mittesisendsõlm oma praeguse aktivatsiooni mittelineaarse funktsioonina kõikidest temasse ühenduvate ühikute aktivatsioonide kaalutud summast. Näiteks kui sisendjada on kõnesignaal, mis vastab räägitud numbrile, siis tahetud lõppväljund jada lõpus võib olla silt, mis klassifitseerib numbri.

Iga jada tekitab vea, mille suurus arvuliselt on kõikide võrgu poolt arvutatud aktivatsioonide kõrvalekallete summa vastavatest tahetud signaalidest. Mitmeid jadasid sisaldava treeninghulga puhul on viga võrdne kõigi individuaalsete jadade vigade summaga.
### Pikk lühiajaline mälu (LSTM)

LSTM on süvaõppesüsteem, mis väldib haihtuva gradiendi probleemi (ingl *vanishing gradient problem*). LSTM on tavaliselt täiendatud rekurrentsete lülitustega, mida kutsutakse unustuslülitusteks. LSTM takistab tagasilevivigade haihtumist või plahvatamist. Selle asemel saavad vead voolata läbi piiramata arvu virtuaalsete kihtide. Nii saab LSTM õppida ülesanded, mis nõuavad mälestusi ja sündmusi, mis juhtusid tuhandeid või isegi miljoneid diskreetseid ajajärke varem. Probleemi spetsiifilist LSTM sarnast topoloogiat saab edasi arendada. LSTM töötab isegi siis, kui oluliste sündmuste vahel on pikk aeg ning palju muid sündmusi ja suudab käsitleda signaale, mis hõlmavad väikese ja suure sagedusega komponente.

LSTM suudab õppida ära tundma kontekstitundlikke keeli erinevalt varasematest mudelitest, mis põhinesid Markovi peitmudelil ja muudel sarnastel kontseptidel.

## Teegid
* Apache Singa
* Caffe – loodud Berkeley Vision and Learning Centeri (BVLC) poolt. See toetab nii CPU-d kui ka GPU-d. Välja töötatud C++-is ning omab Pythoni ja MATLAB-i pakendeid.
* Chainer – esimene stabiilne süvaõppe teek. Täielikult Python, CPU ja GPU tugi, hajus treenimine.
* Deeplearning4j – süvaõpe Javas ja Scalas multi-GPU toega Sparkis. Üldine süvaõppeteek JVM jaoks, töötab C++ teadusliku andmetöötlusmootori peal. Võimaldab luua enda tehtud kihte. Integreeritav Hadoopi ja Kafkaga.
* Dynet – dünaamiline närvivõrkude *toolkit*.
* Keras – kõrgtaseme teek, lihtsalt kasutatav API, pakendab paljusid teisi süvaõppeteeke.
* Microsoft Cognitive Toolkit
* MXNet – tänapäevane avatud lähtekoodiga süvaõpperaamistik, mida kasutatakse, et treenida ja luua süvanärvivõrke.
* pytorch – tensorid ja dünaamilised närvivõrgud Pythonis tugeva GPU kiirendusega.
* TensorFlow – Apache 2.0 litsentsiga Theano-sarnane teek, CPU, GPU ja Google'i patenteeritud TPU toega.
* Torch (www.torch.ch) – teaduslik andmetöötlusraamistik, millel on lai masinõppe algoritmide tugi, kirjutatud C ja Lua keeltes. Peamine autor on Ronan Collobert ja praegu kasutatakse Facebook AI Reaserch ja Twitteri poolt.
* Theano – süvaõppe teek Pythonile, API ühildub suuresti populaarse NumPy teegiga. Lubab kasutajatel kirjutada sümboolseid matemaatilisi võrrandeid, luues ise automaatselt nende tuletised, nii et kasutaja ei pea ise kodeerima gradiente või tagasilevi. Need sümboolsed võrrandid kompileeritakse automaatselt CUDA koodi, et saaks kasutada kiiret GPU implementatsiooni.

## Rakendused
Rekurrentsete närvivõrkude rakendusi:

* masintõlge;
* robotikontroll;
* aegridade ennustamine;
* kõnetuvastus;
* aegridade anomaaliate avastamine;
* rütmi õppimine;
* muusikakompositsioon;
* grammatika õppimine;
* käekirjatuvastus;
* inimese tegevustuvastus;
* valgu homoloogia tuvastamine;
* valkude subtsellulaarse lokaliseerimise prognoosimine;
* mitu ennustusülesannet äriprotsesside juhtimise valdkonnas.

## Viited