LSTM

**LSTM** — rekurentā mākslīgā neironu tīkla (RNN) paveids “Long Short-Term Memory”, kas tiek izmantots dziļās mācīšanās jomā. Atšķirībā no standarta neironu tīkliem, LSTM ir atgriezeniskās saites savienojumi. Ar LSTM var aprēķināt visu, ko var izmantot Tjūringa mašīna. Tam nevar būt viens datu punkts (piem., attēls vai video). LSTM ir piemērots tādiem uzdevumiem kā saistītā rokraksta atpazīšana un runas atpazīšana. *Bloomberg Business Week* rakstīja: "Šīs īpašības neapšaubāmi padara LSTM par vislielāko komerciālo AI sasniegumu, ko izmanto visur, sākot no slimību prognozēšanas līdz mūzikas veidošanai."

Bieži sastopama LSTM vienība sastāv no šūnas, ievada vārtiem, izvada vārtiem un aizmiršanas vārtiem. Šūna atceras vērtības patvaļīgos laika intervālos, un trīs vārti regulē informācijas plūsmu uz un no šūnas.

LSTM tika izstrādāts, lai risinātu pārslodzes un izzūdošo gradientu problēmas, kas var rasties, apmācot tradicionālos RNN. Relatīvā nejutība pret tukšiem datiem ir LSTM priekšrocība pār RNN, slēptajiem Markova modeļiem un citām secību mācīšanās metodēm daudzās lietojumprogrammatūrās.

## Vēsture
thumb|LSTM šūna var apstrādāt datus secīgi un saglabāt tās slēpto stāvokli laika gaitā.
1997. gadā Zeps Hohreiters un Jirgens Šmīdhūbers ierosināja LSTM. Ieviešot *Constant Error Carousel* (CEC) vienības, LSTM nodarbojas ar pārslodzes un izzūdošām gradienta problēmām. LSTM bloka sākotnējā versija ietvēra šūnas, ievada un izvada vārtus.

1999. gadā Felikss Gers, viņa padomnieks Jirgens Šmīdhūbers un Freds Cummins LSTM arhitektūrā ieviesa aizmiršanas vārtus (sauktus arī par “turēšanas vārtiem”), ļaujot LSTM atjaunot savu stāvokli.

2000. gadā Gers, Šmīdhūbers un Cummins pievienoja arhitektūrā savienojumus no šūnas uz vārtiem. Turklāt izejas aktivizēšanas funkcija tika izlaista.

Citu panākumu vidū LSTM sasniedza rekorda rezultātus dabiskās valodas teksta saspiešanā, saistītā rokraksta atpazīšanā un uzvarēja ICDAR rokraksta sacensībās (2009).

Kopš 2016. gada vadošie tehnoloģiju uzņēmumi, tostarp Google, Apple un Microsoft, izmantoja LSTM kā pamatelementu jaunos produktos. Google izmantoja LSTM runas atpazīšanai viedtālrunī, viedajam palīgam Allo un Google tulkotājam. Apple izmanto LSTM "Quicktype" funkcijai iPhone un Siri. Amazon izmanto LSTM iekš Amazon Alexa.

2017. gadā Facebook katru dienu veica aptuveni 4,5 miljardus automātisko tulkojumu, izmantojot LSTM tīklus.

2017. gadā Mičiganas Universitāte, IBM pētniecība un Kornela Universitāte pētnieki publicēja pētījumu “Knowledge Discovery and Data Mining” (KDD) konferencē. Viņu pētījums apraksta jaunu neironu tīklu, kas noteiktus datu kopumus apstrādā labāk nekā plaši izmantotais LSTM tīkls.

## Ideja
Teorētiski, klasiskais RNN var izsekot patvaļīgām ilgtermiņa atkarībām. RNN problēma ir skaitļošanā — RNN apmācības laikā, izmantojot *back-propagation*, gradienti var "izzust" (tie var būt nulle) vai “pārslogoties” (tie ir tendēti uz bezgalību), jo procesā iesaistītie aprēķini izmanto galīgās precizitātes skaitļus. Izmantojot LSTM vienības, RNN daļēji atrisina gradienta izzušanas problēmu, jo LSTM vienības ļauj gradientiem palikt nemainītiem. Tomēr LSTM tīkli joprojām var ciest no gradienta pārslodzes problēmas.

## Arhitektūra
Ir vairākas LSTM vienību arhitektūras. Kopēja arhitektūra sastāv no šūnas (LSTM vienības atmiņas daļas) un trīs informācijas plūsmas "regulatoriem" (vārtiem) — ievada vārtiem, izvada vārtiem un aizmiršanas vārtiem. Dažām LSTM vienības variācijām nav vieni vai vairāki no šiem vārtiem vai varbūt ir citi vārti. Piemēram, GRU nav izvada vārtu.

*Šūna* ir atbildīga par atkarības saglabāšanu starp ievades secībā esošajiem elementiem. *Ievada* vārti kontrolē, cik daudz jauno vērtību ieplūst šūnā, *aizmiršanas* vārti kontrolē, cik lielā mērā vērtība paliek šūnā, un *izvada* vārti kontrolē, kāda daļa šūnas vērtības tiek izmantota izvada aprēķināšanai LSTM vienībai. LSTM vārtu aktivizēšanas funkcija bieži ir loģistikas funkcija.

Ir savienojumi uz un no LSTM vārtiem, no kuriem daži atkārtojas. Šo savienojumu svars, kas jāapgūst treniņa laikā, nosaka, kā darbojas vārti.

## Versijas
Turpmākajos vienādojumos mazie burti ir vektori. Matricas W_qun U_qsatur ievada un atkārtojumu svarojuma saistību, kur indekss _q var būt gan ievada vārti i, izvada vārti o, aizmiršanas vārti f vai atmiņas šūna c, atkarībā no tā, kas tiek aprēķināts. Šajā sadaļā tiek izmants "vektora apzīmējums". Piemēram, c_t \in \mathbb{R}^{h} ir nevis viena LSTM vienības šūna, bet h LSTM vienību šūnas.

### LSTM ar aizmiršanas vārtiem
Kompaktas vienādojumu formas padotajām LSTM vienībām ar aizmiršanas vārtiem:


\begin{align}
f_t &= \sigma_g(W_{f} x_t + U_{f} h_{t-1} + b_f) \\
i_t &= \sigma_g(W_{i} x_t + U_{i} h_{t-1} + b_i) \\
o_t &= \sigma_g(W_{o} x_t + U_{o} h_{t-1} + b_o) \\
c_t &= f_t \circ c_{t-1} + i_t \circ \sigma_c(W_{c} x_t + U_{c} h_{t-1} + b_c) \\
h_t &= o_t \circ \sigma_h(c_t)
\end{align}


kur sākotnējās vērtības ir c_0 = 0 un h_0 = 0 un operators \circapzīmē Hadamard produktu (element-gudrs produkts). Apakšindekss t apzīmē laika soli.

#### Mainīgie

* x_t \in \mathbb{R}^{d}: LSTM vienības ievades vektors
* f_t \in \mathbb{R}^{h}: aizmiršanas vārtu aktivizācijas vektors
* i_t \in \mathbb{R}^{h}: ievades vārtu aktivizācijas vektors
* o_t \in \mathbb{R}^{h}: izvades vārtu aktivizācijas vektors
* h_t \in \mathbb{R}^{h}: slēptā stāvokļa vektors, zināms arī kā LSTM vienības izejas vektors
* c_t \in \mathbb{R}^{h}: šūnas stāvokļa vektors
* W \in \mathbb{R}^{h \times d}, U \in \mathbb{R}^{h \times h}  un b \in \mathbb{R}^{h}: svara matricas un novirzes vektora parametri, kas jāapgūst apmācības laikā

mainīgie d un h attiecas uz ievades funkciju skaitu un slēpo vienības skaitu.

#### Aktivizācijas funkcijas

* \sigma_g: sigmoid funkcija.
* \sigma_c: hyperbolic tangent funkcija.
* \sigma_h: hyperbolic tangent funkcija vai kā LSTM raksts raksta, \sigma_h(x) = x.

#### Peephole LSTM
thumb|Peephole LSTM vienība ar ievada <math>i</math>, izvada <math>o</math>, un aizmiršanas <math>f</math>vārtiem. Katrus no šiem vārtiem var uzskatīt par "standarta" neironu vairāku slāņu neirona tīklā. Tie, izmantojot aktivizēšanas funkciju, aprēķina svērto summu aktivizāciju. <math>i_t,  o_t</math> un <math>f_t</math>laika <math>t</math>gaitā attēlo attiecīgi ievada, izvada un aizmiršanas vārtu aktivizēšanu. 3 izejas bultas no atmiņas šūnas <math>c</math> uz 3 vārtiem <math>i,  o</math> un <math>f</math> attēlo ''peephole'' savienojumus. Šie peephole savienojumi faktiski apzīmē atmiņas šūnas <math>c</math>aktivizēšanas ieguldījumu laikā ar soli <math>t-1</math>, t.i. ieguldījumu <math>c_{t-1}</math> nevis <math>c_{t}</math>, kā bildē attēlots. Citiem vārdiem sakot, vārti <math>i,  o</math> un <math>f</math> aprēķina aktivizēšanos ar laika soli <math>t</math> (<math>i_t,  o_t</math> un <math>f_t</math>), ņemot vērā arī atmiņas šūnas aktivizēšanu <math>c</math> ar laika soli <math>t - 1</math>,t.i, <math>c_{t-1}</math>. Vienīgā bulta, kas iziet no atmiņas šūnas no kreisās uz labo pusi, nav peephole savienojums un apzīmē <math>c_{t}</math>. Mazie aplīši ar <math>\times</math> simbolu ir element-gudrs reizinājums. Lielie apļi ar S veida līkni atspoguļo diferencējamas funkcijas pielietojumu (piemēram, sigmoido funkciju) ar svērto summu. Ir arī daudzi citi LSTM veidi.
Peephole savienojumi ļauj vārtiem piekļūt *constant error carousel* (CEC), kura aktivizācija ir šūnas stāvoklis. h_{t-1} netiek izmantots, tā vietā vairums vietās izmanto c_{t-1}.

: 
\begin{align}
f_t &= \sigma_g(W_{f} x_t + U_{f} c_{t-1} + b_f) \\
i_t &= \sigma_g(W_{i} x_t + U_{i} c_{t-1} + b_i) \\
o_t &= \sigma_g(W_{o} x_t + U_{o} c_{t-1} + b_o) \\
c_t &= f_t \circ c_{t-1} + i_t \circ \sigma_c(W_{c} x_t + U_{c} c_{t-1} + b_c) \\
h_t &= o_t \circ \sigma_h(c_t)
\end{align}


### Peephole konvolūcijas LSTM
Peephole konvolūcijas LSTM. Simbols * apzīmē konvulūcijas operatoru.

: 
\begin{align}
f_t &= \sigma_g(W_{f} * x_t + U_{f} * h_{t-1} + V_{f} \circ c_{t-1} + b_f) \\
i_t &= \sigma_g(W_{i} * x_t + U_{i} * h_{t-1} + V_{i} \circ c_{t-1} + b_i) \\
c_t &= f_t \circ c_{t-1} + i_t \circ \sigma_c(W_{c} * x_t + U_{c} * h_{t-1} + b_c) \\
o_t &= \sigma_g(W_{o} * x_t + U_{o} * h_{t-1} + V_{o} \circ c_{t} + b_o) \\
h_t &= o_t \circ \sigma_h(c_t)
\end{align}


## Atsauces