GRU und LSTM - eine Einführung

February 13, 2022
9 min
NLP
LSTMs wurden schon vor der Jahrtausendwende entwickelt - sind sie heute noch aktuell? Pictrue: MartinaFotos on pixabay.com

In den letzten beiden Artikeln haben wir in einem Zweiteiler erklärt, wie NLP mit Rekurrenten Neuronalen Netzen (RNN) funktionieren kann. Dabei haben wir gezeigt, wie durch das schrittweise Bearbeiten von Sätzen Zusammenhänge zwischen Wörtern gebildet werden, indem die Inputs von benachbarten Wörtern zur Weiterverarbeitung weitergegeben werden. Auch Bidirektionale RNNs haben wir eingeführt, genauso wie das Einlesen einer ganzen Sequenz vor dem Ausgeben von Outputs, da dies bestimmte Use Cases erst ermöglicht – z.B. das Einlesen eines ganzen Satzes zur Übersetzung in eine andere Sprache mit einer anderen Anzahl von Wörtern.

Doch was, wenn sinnstiftende Wörter innerhalb eines Satzes weit auseinander liegen? Ein bekanntes Beispiel dafür ist folgendes Satzpaar:

A) „Die Frau überkreuzte die Straße nicht, weil sie zu müde war.“
B) „Die Frau überkreuzte die Straße nicht, weil sie zu befahren war.“

Wir erkennen instinktiv, dass sich das Wort „müde“ im ersten Satz auf die Frau bezieht und nicht etwa auf eine schläfrige Straße. Ebenso erkennen wir mühelos, dass sich das Wort „befahren“ im Satz B) auf die Straße bezieht. Doch wie kann ein NLP-Modell basierend auf RNNs dies erkennen? Beim Einlesen der Wörter kann das Modell keinen Unterschied zwischen den Sätzen erkennen, bis es bei den Wörtern „müde“ oder „befahren“ angekommen ist. Entscheidend ist in diesem Beispiel, dass es einen logischen Unterschied macht, ob der Satz mit „müde“ oder „befahren“ endet, da dies einen entscheidenden Einfluss auf das Wort „sie“ hat.

Man bedenke, dass eine Übersetzung bei Nichtbeachtung dieses Sachverhalts so aussehen könnte:

„The woman didn’t cross the street because she was too busy.”

Oder auch

“The woman didn’t cross the street because it was too tired.”

Zum Glück gibt es für eine solche Problematik schlaue Ideen von schlauen Menschen. Eine dieser Ideen wurde sogar schon 1997 von den deutschen Informatikern Sepp Hochreiter und Jürgen Schmidhuber vorgestellt. Verrückt eigentlich, dass diese Technologie ihren endgültigen Durchbruch erst fast 20 Jahre später feierte, als sie seit 2016 oft im Bereich NLP eingesetzt wurden. Das ist für uns vielleicht ein Anreiz, seine Ideen zu verwirklichen, auch wenn es gerade noch keinen konkreten Nutzen für ein großes Anwendungsfeld dafür gibt. Doch lasst uns Schritt für Schritt gehen. Heute geht es um Gated Recurrent Units (GRUs) und das eben angesprochene Long short-term memory (LSTM).

Verschwindende Gradienten in langen Sätzen

Der Grund für das Problem sind verschwindende Gradienten in langen Sätzen. RNNs versuchen immer Zusammenhänge zwischen verschiedenen Wörtern von Sätzen herauszufinden und diese durch Gradienten in Vektoren darzustellen. Dies ist bei kurzen Sätzen wie „Leonie isst Chips während des Films“ gut möglich. Dass die Chips etwas mit Essen zu tun haben und nicht etwa mit Computern, kann das RNN auch ohne weitere Mechanismen leicht herausfinden.

Schwieriger wird es bei dem Satz „Leonie isst, während sie gemeinsam mit Jakob einen Film über das Internet streamt, gerne die Chips, die ihr Jakob einst empfohlen hat.“ Hier könnten durch die Wörter „Internet“ und „streamt“ Verbindungen zu IT-Systemen entstehen und eine Übersetzung des Satzes könnte misslingen (Leonie soll natürlich keine Computerchips essen).

Es ist für Rekurrente Neuronale Netze schwierig, sinnstiftende Verbindungen zwischen Worten über viele Worte hinweg aufrecht zu erhalten. Die Gradienten, die diese Informationen beinhalten, werden durch die Backpropagation von Wort zu Wort kleiner und verlieren dadurch ihren Einfluss auf die Vorhersage des entsprechenden Wortes.

Eine Lösung dafür ist es, bestimmte Keywords herauszufinden, deren Einfluss über beliebig viele Wörter hinweg erhalten bleibt. Im genannten Beispiel wäre das das Wort „isst“, dessen Einfluss sich das Modell im Hinterkopf behalten muss, bis es das Wort „Chips“ übersetzen soll.

GRUs

Wichtig ist es also, Möglichkeiten zu finden, den Vektor eines Keywords zu speichern und im richtigen Moment zu nutzen. Eine Möglichkeit dafür sind Gated Recurrent Units (GRUs). Dort wird eine Gate-Funktion eingeführt, die den Kontext eines Wortes speichert und Wort für Wort abfragt, ob der Kontext weiter beibehalten werden soll oder nicht.

Wenn wir RNNs nochmal in Erinnerung rufen, so findet in einem einzelnen Glied stets die Berechnung einer neuen Hidden Unit auf Basis der vorherigen Hidden Unit und dem neuen Input mit Weights und einem Bias statt. Die neue Hidden Unit kann, wenn man möchte, zusätzlich die Basis für einen neuen Output sein. Wie die Berechnungen im Detail ablaufen, haben wir hier erklärt. Am Ende der Berechnung steht eine Aktivierungsfunktion g, in diesem Beispiel tanh.

Berechnung einer Hidden Unit eines RNN basierend auf dem Input und der vorherigen Hidden Unit

Visualisiert sieht das so aus:

Ein Berechunungsglied eines RNN

In GRUs werden Gates eingeführt. Diese sollen dazu dienen, entscheiden zu können, ob der Einfluss aus dem neuen Wort xt verwendet werden soll, oder nicht. Dazu wird wie gehabt durch eine tanh-Funktion mit xt und at-1 ein Wert für ein neues Wort gebildet, den wir in diesem Fall cc nennen – Candidate for Memory-Cell.

Berechnung des Kandidaten für die Memory-Cell

Dieser wird jedoch nicht einfach übernommen, sondern wird mithilfe des Gates auf seine Relevanz überprüft. Zur Berechnung des Gates, für das der griechische Großbuchstabe Γ (Gamma) verwendet wird, wird eine sigmoid-Funktion verwendet, da diese in den meisten Fällen entweder 0 oder 1 ist.

Berechnung des Update-Gates

Mithilfe des Gates wird dann entweder der neue Wert übernommen oder der alte beibehalten. Da das Gate entweder 0 oder 1 ist, kann es folgendermaßen angewandt werden, um die nächste Hidden Unit zu berechnen:

Berechnung der nächsten Unit mithilfe des Gates

Visualisiert sieht das so aus – die letzte Berechnung findet im „GRU“-Feld statt:  

Vereinfachtes Schema einer GRU-Zelle

In unserem Beispiel-Satz „Leonie isst, während sie gemeinsam mit Jakob einen Film über das Internet streamt, gerne die Chips, die ihr Jakob einst empfohlen hat.“ wäre das Gate nach „isst“ stets 0, bis es beim Wort „Chips“ angekommen ist. Die Informationen, dass es ums Essen geht, werden also genutzt, um die korrekte Übersetzung zu bilden.

Man muss jedoch erwähnen, dass auch bei Γu = 0 nicht alle Informationen verloren gehen, da Γu in der Regel ein hochdimensionaler Vektor ist, also ein Vektor voller Einsen und Nullen, der dann genau die Teile einer neuen Hidden Unit bearbeitet, die benötigt werden. Die Informationen der dazwischenliegenden Wörter gehen also nicht verloren.

Ganz vollständig ist das GRU so jedoch immer noch nicht. Zusätzlich zum Update-Gate (Γu) wird ein weiteres Gate eingeführt: Das Reset-Gate Γr. Es bestimmt, wie relevant das vorherige Wort zur Berechnung des neuen Wortes ist. Es findet Einzug in die Berechnung von cc wie folgt:

Vollständige Berechnung von cc

Es wird durch eine Sigmoid-Funktion ähnlich zu Γu berechnet:

Berechnung des Reset-Gates

In der Grafik wird es so „eingeschoben“:

Vollständiges Schema eines GRU

Damit sind wir mit GRUs am Ende. Im Folgenden möchten wir noch LSTMs einführen, die meiner persönlichen Ansicht nach in den Papern, die ich gelesen habe, öfter genutzt werden als GRUs.

LSTMs

Bei LSTMs gibt es genauso wie bei GRUs ebenfalls Gates, jedoch gibt es kein Reset-Gate, dafür jedoch zwei andere Gates. Zusätzlich zum Update-Gate (Γu) gibt es das Forget-Gate (Γf) und das Output-Gate (Γo), die analog zu den Gates bei GRUs berechnet werden:

Berechnung der Gates bei einem LSTM

Das cc wird dabei wieder wie bei einem normalen RNN berechnet:

Berechnung des Kandidaten für die Memory-Cell

Darüber hinaus besteht zusätzlich zu a ein c, das von Zelle zu Zelle weitergegeben wird. Das c wird ähnlich dazu berechnet, wie der nächste Hidden State a bei GRUs berechnet wird – nämlich durch die Bewertung von Kandidaten durch Gates. Es wird jedoch nicht nur das Update-Gate Γu und der Kehrwert (1- Γu) verwendet, sondern neben dem Update-Gate noch das Forget-Gate Γf. Dadurch wird es ermöglicht, Informationen aus der bisherigen Memory-Cell ct-1 und dem neuen Kandidaten zu erhalten.

Berechnung der Memory-Cell

Der neue Hidden State at wird dann durch das Output-Gate Γo und eine Aktivierungsfunktion (tanh) der Memory-Cell berechnet:

Berechnung des neuen Hidden State der Zelle auf Basis der Memory-Cell

Ein LSTM nutzt also mehr Gates und mehr Berechnungen als ein GRU. Visualisiert sieht eine Zelle eines LSTM folgendermaßen aus:

Schema eines LSTM

Wie man sehen kann, werden c und a in separaten Streams von Glied zu Glied weitergegeben. Dadurch können anders als bei GRUs Informationen in c leichter gespeichert werden, ohne die Berechnung von a – dem eigentlich maßgeblichen Wert – zu beeinflussen. Wird die in c gespeicherte Information allerdings benötigt, um a vorherzusagen, wird auf sie zurückgegriffen.

Andere Darstellungen von GRUs und LSTMs

Wir möchten euch in diesem Fall auf zwei andere Blogeinträge aufmerksam machen, die auf anderen Seiten veröffentlicht wurden und in denen GRUs und LSTMs ebenfalls anschaulich erklärt werden:

Illustrated Guide to LSTM’s and GRU’s: A step by step explanation

Understanding LSTM Networks

Nutzen von LSTMs und GRUs

Beim Lesen von diversen Papern, die die Entwicklung von Language Models beschreiben, habe ich schon öfters gesehen, dass LSTMs genutzt wurden. Sie wurden angewandt, um die Zusammenhänge zwischen verschiedenen Satzteilen sinnvoll zu verbinden.

Doch nicht nur beim Studieren von wissenschaftlichen Veröffentlichungen kommt man mit LSTMs in Berührung; auch Ihr habt bestimmt schon einmal Produkte genutzt, die LSTMs verwenden – wenn auch nicht bewusst. Google hat schon 2012 die Spracherkennung in Android Smartphones mit LSTM RNNs optimiert. Zuvor haben sie dafür den Algorithmus Gaussian Mixture Models genutzt, anschließend dann reguläre tiefe Neuronale Netze, doch mithilfe LSTM RNNs konnte die Spracherkennung erheblich verbessert werden. Trainiert wurde das Language Model auf Voicemails von Nutzern, die Google die Erlaubnis gaben, sie zum Trainieren des Modells nutzen zu dürfen. Wie sie dabei vorgegangen sind und mit welchen Problemen sie zu kämpfen hatten, hat die Forschungsabteilung von Google hier beschrieben.

Doch das war 2012. LSTMs und GRUs waren lange Teil von neuen Entwicklungen im Bereich des Natural Language Processing, heutzutage bauen nahezu alle Neuentwicklungen auf der Transformer-Architektur auf. Viele unserer nächsten Blogartikel werden davon handeln und das Vorgehen und die Vorteile vollumfänglich erklären.

Tot sind LSTMs und GRUs dennoch nicht. Auch heute noch gibt es spannende Use-Cases für die beiden Technologien. Für bestimmte Use-Cases bieten die Techniken immer noch Vorteile, man muss nur etwas kreativ sein. So gibt es zum Beispiel spannende Ansätze, LSTMs bei der Vorhersage von Aktienkursen zu nutzen. Der Vorteil dabei ist, dass durch LSTMs die zeitliche Komponente der Aktienkursentwicklung beachtet werden kann. Die zeitlich unterschiedlichen Aktienkurse werden dann als Sequenz im Sinne von RNNs gesehen. Das LSTM wurde dabei genutzt, um längerfristige Zusammenhänge zwischen den Kursentwicklungen zu verstehen.

Auch in der medizinischen Forschung wird die Technik verwendet, um beispielsweise Gensequenzen besser vorhersagen zu können. Insgesamt nehmen die Zitationen des LSTM-Papers - also wie oft andere Wissenschaftler in ihren Publikationen darauf als Quelle referenzieren - auch 25 Jahre nach Veröffentlichung immer noch weiter zu. Das ist im wissenschaftlichen Bereich eher unüblich, da die meisten Veröffentlichungen nach einigen Jahren nicht mehr auf dem Stand der Technik sind - doch mit LSTMs werden auch heute immer noch neue Anwendungsmöglichkeiten gefunden.

Wie das damals abgelaufen ist bei der Entwicklung und welche Trends in Zukunft interessant werden, erzählen die beiden Autoren des LSTM in diesem sehr hörenswerten Podcast: 

Referenzen
Portrait of Blogger
Nicolai Maisch
<  Previous
Rekurrente Neuronale Netze leicht erklärt - Teil 2
Next  >

Kommentare