Posted on August 27, 2015
Recurrent Neural Networks
Mensen beginnen hun denken niet elke seconde van voren af aan. Als je dit essay leest, begrijp je elk woord op basis van je begrip van eerdere woorden. Je gooit niet alles weg en begint weer van voren af aan te denken. Je gedachten hebben persistentie.
Traditionele neurale netwerken kunnen dit niet, en het lijkt een grote tekortkoming. Bijvoorbeeld, stel je voor dat je wilt classificeren wat voor soort gebeurtenis er gebeurt op elk punt in een film. Het is onduidelijk hoe een traditioneel neuraal netwerk zijn redenering over eerdere gebeurtenissen in de film zou kunnen gebruiken om latere gebeurtenissen te informeren.
Recurrente neurale netwerken pakken dit probleem aan. Het zijn netwerken met lussen erin, waardoor informatie kan blijven bestaan.
In bovenstaand diagram bekijkt een stukje neuraal netwerk, een soort invoer (x_t) en voert een waarde uit (h_t). Een lus maakt het mogelijk informatie door te geven van de ene stap in het netwerk naar de volgende.
Door deze lussen lijken recurrente neurale netwerken nogal mysterieus. Maar als je wat verder nadenkt, blijkt dat ze niet zoveel verschillen van een gewoon neuraal netwerk. Een recurrent neuraal netwerk kan worden gezien als meerdere kopieën van hetzelfde netwerk, die elk een bericht doorgeven aan een opvolger. Kijk eens wat er gebeurt als we de lus afrollen:
Dit kettingachtige karakter onthult dat recurrente neurale netwerken nauw verwant zijn aan reeksen en lijsten. Zij zijn de natuurlijke architectuur van neurale netwerken om voor dergelijke gegevens te gebruiken.
En zij worden zeker gebruikt! De laatste jaren zijn er ongelooflijke successen geboekt bij de toepassing van RNN’s op een verscheidenheid van problemen: spraakherkenning, taalmodellering, vertaling, beeldbijschriften… De lijst gaat maar door. Ik laat de bespreking van de verbazingwekkende prestaties die men met RNN’s kan bereiken over aan Andrej Karpathy’s uitstekende blog post, The Unreasonable Effectiveness of Recurrent Neural Networks. Maar ze zijn echt behoorlijk verbazingwekkend.
Essentieel voor deze successen is het gebruik van “LSTMs,” een heel speciaal soort recurrent neuraal netwerk dat, voor veel taken, veel veel beter werkt dan de standaard versie. Bijna alle opwindende resultaten op basis van recurrente neurale netwerken worden daarmee bereikt. Het zijn deze LSTM’s die dit essay zal onderzoeken.
Het probleem van lange-termijn afhankelijkheden
Een van de aantrekkelijke kanten van RNN’s is het idee dat zij in staat zouden kunnen zijn om eerdere informatie te verbinden met de huidige taak, zoals het gebruik van eerdere video frames het begrip van het huidige frame zou kunnen informeren. Als RNN’s dit zouden kunnen, zouden ze uiterst nuttig zijn. Maar kunnen ze dat? Dat hangt ervan af.
Soms hoeven we alleen maar naar recente informatie te kijken om de huidige taak uit te voeren. Neem bijvoorbeeld een taalmodel dat probeert het volgende woord te voorspellen op basis van de vorige woorden. Als we proberen het laatste woord te voorspellen in “de wolken staan in de lucht”, hebben we geen verdere context nodig – het is vrij duidelijk dat het volgende woord lucht zal zijn. In dergelijke gevallen, waarin de kloof tussen de relevante informatie en de plaats waar deze nodig is klein is, kunnen RNN’s leren om de informatie uit het verleden te gebruiken.
Maar er zijn ook gevallen waarin we meer context nodig hebben. Stel dat we proberen het laatste woord te voorspellen in de tekst “Ik ben opgegroeid in Frankrijk… Ik spreek vloeiend Frans.” Recente informatie suggereert dat het volgende woord waarschijnlijk de naam van een taal is, maar als we willen bepalen welke taal, hebben we de context van Frankrijk nodig, van verder terug. Het is heel goed mogelijk dat de kloof tussen de relevante informatie en het punt waar die nodig is, heel groot wordt.
Helaas, als die kloof groter wordt, zijn RNN’s niet meer in staat om te leren de informatie met elkaar te verbinden.
In theorie zijn RNN’s absoluut in staat om met dergelijke “lange-termijn afhankelijkheden” om te gaan. Een mens zou zorgvuldig parameters voor hen kunnen kiezen om speelgoedproblemen van deze vorm op te lossen. Jammer genoeg schijnen RNN’s in de praktijk niet in staat te zijn ze te leren. Het probleem werd diepgaand onderzocht door Hochreiter (1991) en Bengio, et al. (1994), die enkele vrij fundamentele redenen vonden waarom het moeilijk zou kunnen zijn.
Gelukkig hebben LSTM’s dit probleem niet!
LSTM Netwerken
Long Short Term Memory netwerken – gewoonlijk gewoon “LSTM’s” genoemd – zijn een speciaal soort RNN, dat in staat is langetermijnafhankelijkheden te leren. Ze werden geïntroduceerd door Hochreiter & Schmidhuber (1997), en werden verfijnd en gepopulariseerd door velen in het daaropvolgende werk.1 Ze werken enorm goed op een grote verscheidenheid van problemen, en worden nu op grote schaal gebruikt.
LSTMs zijn expliciet ontworpen om het lange-termijn afhankelijkheidsprobleem te vermijden. Het onthouden van informatie voor lange perioden is praktisch hun standaard gedrag, niet iets waar ze moeite mee hebben om te leren!
Alle recurrente neurale netwerken hebben de vorm van een keten van zich herhalende modules van neurale netwerken. In standaard RNN’s zal deze herhalende module een zeer eenvoudige structuur hebben, zoals een enkele tanh-laag.
LSTM’s hebben ook deze ketenachtige structuur, maar de herhalende module heeft een andere structuur. In plaats van één enkele neurale netwerklaag zijn er vier, die op een heel speciale manier op elkaar inwerken.
Maakt u zich geen zorgen over de details van wat er aan de hand is. We zullen later stap voor stap door het LSTM diagram lopen. Voorlopig proberen we gewoon vertrouwd te raken met de notatie die we zullen gebruiken.
In het bovenstaande diagram draagt elke lijn een volledige vector, van de uitvoer van een knooppunt naar de ingangen van andere knooppunten. De roze cirkels stellen puntsgewijze bewerkingen voor, zoals vectoroptelling, terwijl de gele vakken geleerde neurale netwerklagen zijn. Samengevoegde lijnen duiden op aaneenschakeling, terwijl een vertakkende lijn aanduidt dat de inhoud wordt gekopieerd en dat de kopieën naar verschillende plaatsen gaan.
Het kernidee achter LSTM’s
De sleutel tot LSTM’s is de celtoestand, de horizontale lijn die door de bovenkant van het diagram loopt.
De celtoestand is een soort lopende band. Hij loopt recht door de hele keten, met slechts enkele kleine lineaire interacties. Het is heel gemakkelijk voor informatie om er gewoon onveranderd langs te stromen.
De LSTM heeft wel de mogelijkheid om informatie aan de celtoestand te verwijderen of toe te voegen, zorgvuldig geregeld door structuren die poorten worden genoemd.
Poorten zijn een manier om optioneel informatie door te laten. Ze zijn opgebouwd uit een sigmoïde neurale netlaag en een puntgewijze vermenigvuldigingsoperatie.
De sigmoïde laag geeft getallen tussen nul en één, die beschrijven hoeveel van elke component moet worden doorgelaten. Een waarde van nul betekent “niets doorlaten”, terwijl een waarde van één betekent “alles doorlaten!”
Een LSTM heeft drie van deze poorten, om de celtoestand te beschermen en te controleren.
Step-by-Step LSTM Walk Through
De eerste stap in ons LSTM is te beslissen welke informatie we uit de celtoestand weggooien. Deze beslissing wordt genomen door een sigmoïdelaag, de “forget gate layer”. Deze kijkt naar \(h_{t-1}} en \(x_t), en geeft een getal tussen \(0) en \(1) voor elk getal in de celtoestand \(C_{t-1}}). Een cijfer(1) staat voor “dit volledig behouden”, terwijl een cijfer(0) staat voor “dit volledig wegdoen.”
Laten we teruggaan naar ons voorbeeld van een taalmodel dat probeert het volgende woord te voorspellen op basis van alle voorgaande woorden. In een dergelijk probleem kan de celstaat het geslacht van het huidige onderwerp bevatten, zodat de juiste voornaamwoorden kunnen worden gebruikt. Wanneer we een nieuw onderwerp zien, willen we het geslacht van het oude onderwerp vergeten.
De volgende stap is te beslissen welke nieuwe informatie we in de celtoestand gaan opslaan. Dit bestaat uit twee delen. Eerst beslist een sigmoïdelaag, de “input-gate-laag”, welke waarden we bijwerken. Vervolgens creëert een tanh-laag een vector van nieuwe kandidaat-waarden, die aan de toestand kunnen worden toegevoegd. In de volgende stap combineren we deze twee tot een update van de status.
In het voorbeeld van ons taalmodel willen we het geslacht van het nieuwe subject aan de celtoestand toevoegen, ter vervanging van het oude dat we vergeten.
Het is nu tijd om de oude celtoestand, \(C_{t-1}), bij te werken tot de nieuwe celtoestand \(C_t\). In de vorige stappen is al besloten wat we moeten doen, we hoeven het alleen nog maar te doen.
We vermenigvuldigen de oude toestand met \(f_t\), waarbij we de dingen vergeten die we eerder besloten hadden te vergeten. Dan tellen we i_t*tilde{C}_t) erbij op. Dit zijn de nieuwe kandidaat-waarden, geschaald met hoeveel we besloten hebben om elke toestandswaarde bij te werken.
In het geval van het taalmodel laten we hier de informatie over het geslacht van het oude subject vallen en voegen we de nieuwe informatie toe, zoals we in de vorige stappen besloten.
Ten slotte moeten we beslissen wat we gaan uitvoeren. Deze uitvoer zal gebaseerd zijn op de toestand van de cel, maar zal een gefilterde versie zijn. Eerst voeren we een sigmoïdelaag uit die bepaalt welke delen van de celtoestand we gaan uitvoeren. Dan halen we de celtoestand door de sigmoïdlaag (om de waarden tussen -1 en 1 te plaatsen) en vermenigvuldigen die met de output van de sigmoïdlaag, zodat we alleen die delen outputten die we besloten hebben te outputten.
In het voorbeeld van het taalmodel wil het, omdat het net een onderwerp heeft gezien, misschien informatie outputten die relevant is voor een werkwoord, voor het geval dat dat het volgende is. Het kan bijvoorbeeld aangeven of het onderwerp enkelvoud of meervoud is, zodat we weten in welke vorm een werkwoord moet worden vervoegd als dat het volgende is.
Varianten op het lange-korte-termijngeheugen
Wat ik tot nu toe heb beschreven, is een vrij normaal LSTM. Maar niet alle LSTM’s zijn hetzelfde als de bovenstaande. In feite lijkt het erop dat bijna elk artikel over LSTM’s een iets andere versie gebruikt. De verschillen zijn klein, maar het is de moeite waard om er een paar te noemen.
Een populaire LSTM-variant, geïntroduceerd door Gers & Schmidhuber (2000), is het toevoegen van “kijkgatverbindingen.” Dit betekent dat we de poortlagen naar de celtoestand laten kijken.
Het bovenstaande diagram voegt kijkgaten toe aan alle poorten, maar veel papers zullen sommige kijkgaten geven en andere niet.
Een andere variatie is het gebruik van gekoppelde vergeet- en invoerpoorten. In plaats van afzonderlijk te beslissen wat we moeten vergeten en wat we aan nieuwe informatie moeten toevoegen, nemen we die beslissingen samen. We vergeten alleen wanneer we iets in de plaats gaan invoeren. We voeren alleen nieuwe waarden in de toestand in wanneer we iets ouder vergeten.
Een iets dramatischer variatie op de LSTM is de Gated Recurrent Unit, of GRU, geïntroduceerd door Cho, et al. (2014). Het combineert de vergeet- en invoerpoorten in één “update poort”. Het voegt ook de celtoestand en verborgen toestand samen, en brengt enkele andere veranderingen aan. Het resulterende model is eenvoudiger dan standaard LSTM-modellen, en wordt steeds populairder.
Dit zijn slechts een paar van de meest opvallende LSTM-varianten. Er zijn er nog veel meer, zoals Depth Gated RNNs van Yao, et al. (2015). Er is ook een heel andere aanpak van langetermijnafhankelijkheden, zoals Clockwork RNNs van Koutnik, et al. (2014).
Welke van deze varianten is het beste? Doen de verschillen ertoe? Greff, et al. (2015) doen een mooie vergelijking van populaire varianten, en vinden dat ze allemaal ongeveer hetzelfde zijn. Jozefowicz, et al. (2015) testten meer dan tienduizend RNN-architecturen, en vonden sommige die beter werkten dan LSTM’s op bepaalde taken.
Conclusie
Eerder noemde ik de opmerkelijke resultaten die mensen bereiken met RNN’s. In wezen worden die allemaal bereikt met LSTM’s. Ze werken echt veel beter voor de meeste taken!
Opgeschreven als een stel vergelijkingen, zien LSTMs er behoorlijk intimiderend uit. Hopelijk heeft het stap voor stap doorlopen van dit essay ze een beetje meer benaderbaar gemaakt.
LSTMs waren een grote stap in wat we kunnen bereiken met RNNs. Het is natuurlijk om je af te vragen: is er nog een grote stap? Een veelgehoorde mening onder onderzoekers is: “Ja, er is een volgende stap en het is aandacht!” Het idee is om elke stap van een RNN informatie te laten kiezen om naar te kijken uit een of andere grotere verzameling van informatie. Bijvoorbeeld, als je een RNN gebruikt om een bijschrift te maken dat een afbeelding beschrijft, zou het een deel van de afbeelding kunnen kiezen om naar te kijken voor elk woord dat het produceert. Xu, et al. (2015) doen in feite precies dit – het kan een leuk uitgangspunt zijn als je aandacht wilt onderzoeken! Er zijn een aantal echt opwindende resultaten met aandacht, en het lijkt erop dat er nog veel meer in de pijplijn zitten…
Aandacht is niet de enige opwindende rode draad in RNN-onderzoek. Bijvoorbeeld, Grid LSTMs door Kalchbrenner, et al. (2015) lijken uiterst veelbelovend. Werk met behulp van RNN’s in generatieve modellen – zoals Gregor, et al. (2015), Chung, et al. (2015), of Bayer & Osendorfer (2015) – lijkt ook zeer interessant. De afgelopen jaren zijn een spannende tijd geweest voor recurrente neurale netwerken, en de komende beloven alleen maar meer te worden!
Acknowledgments
Ik ben een aantal mensen dankbaar voor het helpen me LSTM’s beter te begrijpen, commentaar te leveren op de visualisaties, en feedback te geven op deze post.
Ik ben mijn collega’s bij Google zeer dankbaar voor hun nuttige feedback, vooral Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis, en Ilya Sutskever. Ik ben ook veel andere vrienden en collega’s dankbaar dat ze de tijd hebben genomen om me te helpen, waaronder Dario Amodei en Jacob Steinhardt. Ik ben vooral Kyunghyun Cho dankbaar voor de zeer doordachte correspondentie over mijn diagrammen.
Vóór deze post heb ik geoefend met het uitleggen van LSTM’s tijdens twee seminarreeksen die ik heb gegeven over neurale netwerken. Dank aan iedereen die daaraan heeft deelgenomen voor hun geduld met mij, en voor hun feedback.
-
Naast de oorspronkelijke auteurs hebben veel mensen bijgedragen aan de moderne LSTM. Een niet volledige lijst is: Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo, en Alex Graves.