Postet den 27. august 2015
Rekursive neurale netværk
Mennesker starter ikke deres tænkning fra bunden i hvert sekund. Når du læser dette essay, forstår du hvert ord på baggrund af din forståelse af tidligere ord. Du smider ikke alt væk og begynder at tænke fra bunden igen. Dine tanker har vedholdenhed.
Traditionelle neurale netværk kan ikke gøre dette, og det virker som en stor mangel. Forestil dig for eksempel, at du ønsker at klassificere, hvilken slags begivenhed der sker på hvert punkt i en film. Det er uklart, hvordan et traditionelt neuralt netværk kan bruge sine ræsonnementer om tidligere begivenheder i filmen til at informere senere begivenheder.
Rekursive neurale netværk løser dette problem. De er netværk med sløjfer i dem, hvilket gør det muligt for information at bestå.
I ovenstående diagram ser et stykke af det neurale netværk, \(A\), på et input \(x_t\) og udsender en værdi \(h_t\). En løkke gør det muligt at sende oplysninger fra et trin i netværket til det næste.
Disse løkker får tilbagevendende neurale netværk til at virke lidt mystiske. Hvis man tænker lidt mere over det, viser det sig imidlertid, at de ikke er så meget anderledes end et normalt neuralt netværk. Et recurrent neuralt netværk kan opfattes som flere kopier af det samme netværk, der hver især sender en besked videre til en efterfølger. Overvej, hvad der sker, hvis vi ruller løkken ud:
Denne kædelignende karakter afslører, at tilbagevendende neurale netværk er nært beslægtet med sekvenser og lister. De er den naturlige arkitektur af neurale netværk, der skal bruges til sådanne data.
Og de bliver bestemt brugt! I de sidste par år har der været utrolig stor succes med at anvende RNN’er på en lang række problemer: talegenkendelse, sprogmodellering, oversættelse, billedtekstning … Listen kan fortsættes. Jeg vil overlade diskussionen af de fantastiske bedrifter, man kan opnå med RNN’er, til Andrej Karpathys fremragende blogindlæg, The Unreasonable Effectiveness of Recurrent Neural Networks (Den urimelige effektivitet af recurrente neurale netværk). Men de er virkelig ret fantastiske.
Den afgørende faktor for disse succeser er brugen af “LSTM’er”, en meget speciel form for recurrent neural network, som til mange opgaver fungerer meget, meget bedre end standardversionen. Næsten alle spændende resultater, der er baseret på recurrent neural networks, er opnået med dem. Det er disse LSTM’er, som dette essay vil undersøge.
Problemet med langsigtede afhængigheder
Et af de tiltalende træk ved RNN’er er ideen om, at de kan være i stand til at forbinde tidligere oplysninger med den nuværende opgave, f.eks. kan brugen af tidligere videobilleder informere forståelsen af det nuværende billede. Hvis RNN’er kunne gøre dette, ville de være yderst nyttige. Men kan de det? Det kommer an på.
I nogle tilfælde har vi kun brug for at se på de seneste oplysninger for at udføre den aktuelle opgave. Tænk f.eks. på en sprogmodel, der forsøger at forudsige det næste ord på baggrund af de foregående ord. Hvis vi forsøger at forudsige det sidste ord i “skyerne er på himlen”, har vi ikke brug for yderligere kontekst – det er ret indlysende, at det næste ord vil være himmel. I sådanne tilfælde, hvor afstanden mellem den relevante information og det sted, hvor der er brug for den, er lille, kan RNN’er lære at bruge den tidligere information.
Men der er også tilfælde, hvor vi har brug for mere kontekst. Overvej at forsøge at forudsige det sidste ord i teksten “Jeg er vokset op i Frankrig… Jeg taler flydende fransk”. Nyere oplysninger tyder på, at det næste ord sandsynligvis er navnet på et sprog, men hvis vi vil indsnævre hvilket sprog, har vi brug for konteksten Frankrig, fra længere tilbage i tiden. Det er helt muligt, at kløften mellem de relevante oplysninger og det punkt, hvor de er nødvendige, bliver meget stor.
Det er desværre sådan, at når denne kløft vokser, bliver RNN’er ude af stand til at lære at forbinde oplysningerne.
I teorien er RNN’er absolut i stand til at håndtere sådanne “langsigtede afhængigheder”. Et menneske kunne omhyggeligt vælge parametre til dem for at løse legetøjsproblemer af denne form. Desværre synes RNN’er i praksis ikke at være i stand til at lære dem. Problemet blev udforsket i dybden af Hochreiter (1991) og Bengio, et al. (1994), som fandt nogle ret fundamentale grunde til, at det kan være vanskeligt.
Trods alt har LSTM’er ikke dette problem!
LSTM-netværk
Long Short Term Memory-netværk – normalt bare kaldet “LSTM’er” – er en særlig form for RNN, der er i stand til at lære langsigtede afhængigheder. De blev introduceret af Hochreiter & Schmidhuber (1997) og blev forfinet og populariseret af mange i det efterfølgende arbejde.1 De fungerer enormt godt på en lang række problemer og anvendes nu i vid udstrækning.
LSTM’er er udtrykkeligt designet til at undgå problemet med langtidsafhængighed. At huske oplysninger i lange perioder er praktisk talt deres standardadfærd og ikke noget, de kæmper for at lære!
Alle recurrent neural networks har form af en kæde af gentagne moduler af neurale netværk. I standard RNN’er vil dette gentagende modul have en meget enkel struktur, f.eks. et enkelt tanh-lag.
LSTM’er har også denne kædelignende struktur, men det gentagende modul har en anden struktur. I stedet for at have et enkelt lag i det neurale netværk er der fire, der interagerer på en helt særlig måde.
Du skal ikke bekymre dig om detaljerne i det, der foregår. Vi gennemgår LSTM-diagrammet trin for trin senere. Indtil videre skal vi bare prøve at blive fortrolig med den notation, vi skal bruge.
I ovenstående diagram bærer hver linje en hel vektor, fra udgangen af en knude til indgangene af andre knudepunkter. De lyserøde cirkler repræsenterer punktvise operationer, som f.eks. vektoraddition, mens de gule kasser er indlærte neurale netværkslag. Linjer, der smelter sammen, angiver sammenkædning, mens en linje, der giver sig i en gaffel, angiver, at dens indhold bliver kopieret, og at kopierne går til forskellige steder.
Den centrale idé bag LSTM’er
Nøglen til LSTM’er er celletilstanden, den vandrette linje, der løber gennem toppen af diagrammet.
Celletilstanden er lidt ligesom et transportbånd. Den løber lige ned gennem hele kæden, med kun nogle mindre lineære interaktioner. Det er meget nemt for informationerne at flyde uændret langs det.
LSTM’en har mulighed for at fjerne eller tilføje information til celletilstanden, hvilket er nøje reguleret af strukturer, der kaldes gates.
Gates er en måde at lade information passere på valgfrit. De er sammensat af et sigmoid neuralnetlag og en punktvis multiplikationsoperation.
Det sigmoide lag udsender tal mellem nul og et, der beskriver, hvor meget af hver komponent der skal lukkes igennem. En værdi på nul betyder “lad intet igennem”, mens en værdi på et betyder “lad alt igennem!”
En LSTM har tre af disse porte for at beskytte og kontrollere celletilstanden.
Skridt for skridt LSTM Walk Through
Det første skridt i vores LSTM er at beslutte, hvilke oplysninger vi vil smide væk fra celletilstanden. Denne beslutning træffes af et sigmoid lag kaldet “forget gate laget”. Det ser på \(h_{t-1}\) og \(x_t\) og udsender et tal mellem \(0\) og \(1\) for hvert tal i celletilstanden \(C_{t-1}\). Et \(1\) repræsenterer “beholder dette helt og holdent”, mens et \(0\) repræsenterer “skiller sig helt af med dette.”
Lad os gå tilbage til vores eksempel med en sprogmodel, der forsøger at forudsige det næste ord på baggrund af alle de foregående. I et sådant problem kan cellestatusen omfatte kønnet på det nuværende subjekt, så de korrekte pronominer kan anvendes. Når vi ser et nyt subjekt, ønsker vi at glemme det gamle subjekts køn.
Det næste skridt er at beslutte, hvilke nye oplysninger vi vil gemme i celletilstanden. Dette har to dele. For det første beslutter et sigmoidlag kaldet “input gate layer”, hvilke værdier vi skal opdatere. Dernæst skaber et tanh-lag en vektor af nye kandidatværdier, \(\tilde{C}_t\), som kan tilføjes til tilstanden. I det næste trin kombinerer vi disse to for at skabe en opdatering af tilstanden.
I eksemplet med vores sprogmodel vil vi gerne tilføje det nye subjekts køn til celletilstanden for at erstatte det gamle, som vi glemmer.
Det er nu tid til at opdatere den gamle celletilstand, \(C_{t-1}\), til den nye celletilstand \(C_t\). De foregående trin har allerede besluttet, hvad der skal gøres, vi skal bare gøre det rent faktisk.
Vi multiplicerer den gamle tilstand med \(f_t\), idet vi glemmer de ting, vi tidligere besluttede at glemme. Derefter tilføjer vi \(i_t*\tilde{C}_t\). Dette er de nye kandidatværdier, skaleret efter hvor meget vi besluttede at opdatere hver tilstandsværdi.
I sprogmodellens tilfælde er det her, vi faktisk ville droppe oplysningerne om den gamle forsøgspersons køn og tilføje de nye oplysninger, som vi besluttede i de foregående trin.
Sluttelig skal vi beslutte, hvad vi vil udstede. Dette output vil være baseret på vores cellestatus, men vil være en filtreret version. Først kører vi et sigmoid-lag, som bestemmer, hvilke dele af celletilstanden vi vil outputte. Derefter sender vi celletilstanden gennem \(\tanh\) (for at skubbe værdierne til at ligge mellem \(-1\) og \(1\)) og multiplicerer den med output fra sigmoidporten, så vi kun udsender de dele, vi har besluttet at udstede.
For sprogmodellens eksempel, da den lige har set et subjekt, vil den måske gerne udstede oplysninger, der er relevante for et verbum, i tilfælde af at det er det, der kommer som det næste. Den kan f.eks. udstede, om subjektet er ental eller flertal, så vi ved, hvilken form et verbum skal bøjes til, hvis det er det, der følger som det næste.
Varianter på Long Short Term Memory
Det, jeg har beskrevet indtil videre, er en ret normal LSTM. Men ikke alle LSTM’er er ens som ovenstående. Faktisk ser det ud til, at næsten alle artikler, der omhandler LSTM’er, bruger en lidt anderledes version. Forskellene er mindre, men det er værd at nævne nogle af dem.
En populær LSTM-variant, der blev introduceret af Gers & Schmidhuber (2000), er tilføjelse af “peephole-forbindelser”. Det betyder, at vi lader gate-lagene se på cellens tilstand.
Det ovenstående diagram tilføjer peepholes til alle gates, men mange papirer vil give nogle peepholes og ikke andre.
En anden variant er at bruge koblede forget- og input-gates. I stedet for hver for sig at beslutte, hvad der skal glemmes, og hvad vi skal tilføje nye oplysninger til, træffer vi disse beslutninger sammen. Vi glemmer kun, når vi skal indtaste noget i stedet. Vi indfører kun nye værdier i tilstanden, når vi glemmer noget ældre.
En lidt mere dramatisk variation af LSTM er Gated Recurrent Unit, eller GRU, der blev introduceret af Cho, et al. (2014). Den kombinerer glemsel- og indgangsportene til en enkelt “opdateringsgate”. Den slår også celletilstanden og den skjulte tilstand sammen og foretager nogle andre ændringer. Den resulterende model er enklere end standard LSTM-modeller og er blevet mere og mere populær.
Dette er kun nogle få af de mest bemærkelsesværdige LSTM-varianter. Der er masser af andre, som f.eks. Depth Gated RNNs af Yao, et al. (2015). Der er også nogle helt andre tilgange til håndtering af langsigtede afhængigheder, som Clockwork RNNs af Koutnik, et al. (2014).
Hvilken af disse varianter er bedst? Har forskellene nogen betydning? Greff, et al. (2015) laver en fin sammenligning af populære varianter og finder, at de alle er nogenlunde lige gode. Jozefowicz, et al. (2015) testede mere end ti tusinde RNN-arkitekturer og fandt nogle, der fungerede bedre end LSTM’er på visse opgaver.
Konklusion
Tidligere nævnte jeg de bemærkelsesværdige resultater, som folk opnår med RNN’er. I det væsentlige er alle disse resultater opnået ved hjælp af LSTM’er. De fungerer virkelig meget bedre til de fleste opgaver!
Skrevet ned som et sæt ligninger ser LSTM’er temmelig skræmmende ud. Forhåbentlig har det at gennemgå dem trin for trin i dette essay gjort dem lidt mere tilgængelige.
LSTM’er var et stort skridt i forhold til, hvad vi kan opnå med RNN’er. Det er naturligt at spørge sig selv: Er der endnu et stort skridt? En almindelig holdning blandt forskere er: “Ja! Der er et næste skridt, og det er opmærksomhed!” Ideen er at lade hvert trin i en RNN vælge oplysninger at kigge på fra en større samling af oplysninger. Hvis du f.eks. bruger en RNN til at skabe en billedtekst, der beskriver et billede, kan den vælge en del af billedet at kigge på for hvert ord, den udsender. Faktisk gør Xu, et al. (2015) præcis dette – det kan være et sjovt udgangspunkt, hvis du ønsker at udforske opmærksomhed! Der har været en række virkelig spændende resultater ved hjælp af opmærksomhed, og det ser ud til, at der er mange flere rundt om hjørnet …
Attention er ikke den eneste spændende tråd i RNN-forskningen. For eksempel synes Grid LSTMs af Kalchbrenner, et al. (2015) ekstremt lovende. Arbejde, der anvender RNN’er i generative modeller – såsom Gregor, et al. (2015), Chung, et al. (2015) eller Bayer & Osendorfer (2015) – virker også meget interessant. De sidste par år har været en spændende tid for recurrent neural networks, og de kommende lover kun at blive endnu mere spændende!
Acknowledgments
Jeg er taknemmelig over for en række personer for at hjælpe mig med at forstå LSTMs bedre, kommentere visualiseringerne og give feedback på dette indlæg.
Jeg er meget taknemmelig over for mine kolleger hos Google for deres nyttige feedback, især Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis og Ilya Sutskever. Jeg er også taknemmelig over for mange andre venner og kolleger for at have taget sig tid til at hjælpe mig, herunder Dario Amodei og Jacob Steinhardt. Jeg er især taknemmelig over for Kyunghyun Cho for ekstremt tankevækkende korrespondance om mine diagrammer.
Forud for dette indlæg øvede jeg mig i at forklare LSTM’er under to seminarrækker, som jeg underviste i neurale netværk. Tak til alle, der deltog i disse, for deres tålmodighed med mig og for deres feedback.
-
Ud over de oprindelige forfattere har mange mennesker bidraget til den moderne LSTM. En ikke udtømmende liste er: Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo og Alex Graves.