Recurrent Neural Networks

Sequentielle Daten

Sentiment Classification "The series I've enjoyed most in my life thus far." $\Rightarrow$ ★★★★★
Übersetzung "Artificial intelligence is useful" $\Rightarrow$ "La inteligencia artificial es útil"
Speech2Text $\Rightarrow$ Transcript
Text2Speech Geschriebener Text $\Rightarrow$
DNA Sequenz Analyse "ATGCTTCGGCAAGACTCAAAAATA" $\Rightarrow$ Eigenschaften
Music Generation $\emptyset$ $\Rightarrow$

Notation

MarcusspokewithMaryJaneaboutJohnyesterday
$x^{< 1 >}$$x^{< 2 >}$$x^{< 3 >}$$x^{< 4 >}$$x^{< 5 >}$$x^{< 6 >}$$x^{< 7 >}$$x^{< 8 >}$
10011010
$y^{< 1 >}$$y^{< 2 >}$$y^{< 3 >}$$y^{< 4 >}$$y^{< 5 >}$$y^{< 6 >}$$y^{< 7 >}$$y^{< 8 >}$
  • $T_x = 8$
  • $T_y = 8$

Wie sehen die Vektoren $x^{< t >}$ aus?

Ansatz: One-Hot Encoding der Wörter

Jedes Wort hat eine eigene Position im Vektor.

\[ x^{< t >} = \begin{bmatrix} 0 \\ \vdots \\ 0 \\ 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix} \]

Normale, Fully Connected Layer oder Convolutions funktionieren nicht gut auf Sequenz Daten.

  • Input / Output Größe sind nicht fix.
  • Inputs lassen sich nicht auf eine fixe Größe skalieren.
  • Wir wollen Feature Sharing zwischen verschiedenen Positionen der Sequenz.
  • Sowohl die Anzahl an Features je Position, als auch die Sequenz Länge können groß sein.

Recurrent Neural Network

Alternative Darstellung:

Die Vorhersage zu jedem Zeitpunkt basiert nur auf dem aktuellen Input und den Vorgängern.

  • He said, "Teddy Roosevelt was a great President."
  • He said, "Teddy bears are on sale."
  • $a^{< 0 >} = 0$
  • $a^{< t >} = g_1({\color{red} W_{aa}} a^{< t -1>} + {\color{red} W_{ax}} x^{< t >} + {\color{red} b_a})$
  • ${\hat y}^{< t >} = g_2({\color{red} W_y} a^{< t>} + {\color{red} b_y})$

Parameter Sharing passiert über alle Zeitschritte hinweg.

Alternative Notation:

\[a^{< t >} = g_1({\color{red} W_{a}} \begin{bmatrix} a^{< t -1>} \\ x^{< t >} \end{bmatrix} + {\color{red} b_a})\] mit \[ {\color{red} W_{a}} = \begin{bmatrix} {\color{red} W_{aa}} & {\color{red} W_{ax}} \end{bmatrix} \]

Loss für jeden einzelnen Zeitschritt kann wieder Cross Entropy sein:

\[ \mathcal{L}({\hat y}^{< t>}, y^{< t>}) = - y^{< t>} \log {\hat y}^{< t>} - (1-y^{< t>}) \log (1-{\hat y}^{< t>}) \]

Loss für die ganze Sequenz:

\[ \mathcal{L}(\hat y, y) = \sum_{t = 1}^{T_y} \mathcal{L}({\hat y}^{< t>}, y^{< t>}) \]

  • Für Inferenz berechnen wir einen Zeitschritt nach dem anderen.
  • Die Gradienten werden rückwärts durch die Zeit berechnet.

Was, wenn $T_x \neq T_y$?

Variante: $T_y = 1$

Beispiel: Sentiment Classification

"The series I've enjoyed most in my life thus far." $\Rightarrow$ "★★★★★" (5)

Many-to-many Many-to-one

Loss wird nur auf den letzten Output angewendet.

Variante: $T_x = 1$

Beispiel: Music Generation

$\emptyset$ $\Rightarrow$

Variante: $T_x \neq T_y, T_x > 1, T_y > 1$

Beispiel: Übersetzung

"Artificial intelligence is useful" $\Rightarrow$ "La inteligencia artificial es útil"

Zwei verschiedene Bausteine.

Vektor in der Mitte repräsentiert den gesamten Input.

Language Models

"The apple and pair salad." vs "The apple and pear salad."
Wahrscheinlichkeit:
$3.2 \cdot 10^{-13}$
Wahrscheinlichkeit:
$5.7 \cdot 10^{-10}$
$P(\text{sentence}) = P(y^{< 1>}, y^{< 2>}, \ldots, y^{< T_y>})$

Wahrscheinlichkeit, dass der Satz in einem beliebigen (realen) Text auftaucht (Zeitung, Wikipedia, ...)

Um ein solches Modell zu trainieren benötigen wir ein sehr großes Trainings Set (Corpus)

In jedem Beispielsatz mappen wir jedes Wort auf einen Target Vektor:

The Egyptian Mau is a bread of cat <EOS>
$y^{<1>}$ $y^{<2>}$ $y^{<3>}$ $y^{<4>}$ $y^{<5>}$ $y^{<6>}$ $y^{<7>}$ $y^{<8>}$ $y^{<9>}$

Mit einem Vokabular von 10000 Wörtern bräuchten wir zum Beispiel 10000 Softmax Outputs für die vorhersage.

Zu jedem Zeitpunkt verwenden wir die alten Targets als neue Features: $x^{<t>} = y^{<t-1>}$

\[ {\hat y}^{<t>} \to P(y^{<t>} | y^{<1>}, \ldots, y^{<t-1>}) \]

Dieses RNN lernt nun, die Wahrscheinlichkeit des nächsten Worts vorherzusagen, auf Basis der vorhergehenden Wörter.

Die Loss Funktion ist Cross Entropy (wie immer, wenn wir Softmax oder Sigmoid verwenden). \[ \mathcal{L}({\hat y}^{<t>}, y^{<t>}) = - \sum_i y^{<t>}_i \log {\hat y}^{<t>}_i\\ \mathcal{L} = \sum_t \mathcal{L}({\hat y}^{<t>}, y^{<t>}) \]

Die Wahrscheinlichkeit des ganzen Satzes können wir nun berechnen als:

\[ P(y^{<1>}, y^{<2>}, y^{<3>})\\[2mm] = P(y^{<1>}) P(y^{<2>} | y^{<1>}) P(y^{<3>} | y^{<1>}, y^{<2>}) \]

Was wir nun auch machen können: Gegeben den Start eines Textes können wir Wort für Wort eine Vervollständigung sampeln.

Jedes $y^{<t>}$ liefert uns eine Verteilung über unser Vokabular. Von dort können wir ein Wort sampeln.


          import numpy as np

          np.random.choice(["a", "bread", "cat", "Egyptian"],
              p=[0.7, 0.2, 0.08, 0.02])
        

Immer wenn wir ein neues Wort sampeln wird dieses zum nächsten Input unseres RNN.

Wir stoppen, wenn wir <EOS> sampeln.

Statt Wörtern können wir auch ein Vokabular aus einzelnen Zeichen verwenden.

Vocabulary = {a, b, c, d, e, ..., A, B, ..., 1, 2, 3, ...}

Kleineres Vokabular, dafür Längere Sequenzen

Beispiel von Andrej Karpathy

PANDARUS:
Alas, I think he shall be come approached and the day
When little srain would be attain'd into being never fed,
And who is but a chain and subjects of his death,
I should not sleep.

Second Senator:
They are away this miseries, produced upon my soul,
Breaking and strongly should be buried, when I perish
The earth and thoughts of many states.

DUKE VINCENTIO:
Well, your wit is in the care of side and that.

Second Lord:
They would be ruled after this chamber, and
my fair nues begun out of the fact, to be conveyed,
Whose noble souls I'll have the heart of the wars.
        

Langzeitabhängigkeiten

The cat, which already ate a lot of food, was full.

The cats, which already ate a lot of food, were full.

Vanishing gradient problem für RNNs:
Fehler aus späteren Zeitschritten haben es schwer, Gewichte in frühen Zeitschritten zu beeinflussen.

Folge: Es ist schwer für das RNN, relevante Aspekte zu lernen, die über eine lange Zeit erinnert werden sollen.

Exploding Gradients sind hier normalerweise kein großes Problem.

Mithilfe spezieller Architekturen können RNNs einfacher lernen, Informationen lange in ihrem State zu speichern.

  • LSTM
  • GRU

GRU or LSTM Units können auch nur Informationen aus der Vergangenheit verwenden.

  • He said, "Teddy Roosevelt was a great President."
  • He said, "Teddy bears are on sale."

Alternativ könnten wir das RNN umdrehen und Information aus der Zukunft verwenden

Kombinierter Output: ${\hat y}^{<t>} = g (W_y \begin{bmatrix}\overrightarrow{a}^{<t>} \\ \overleftarrow{a}^{<t>} \end{bmatrix} + b_y)$

Bidirectional RNNs (BRNN)

  • Verwenden Information sowohl aus der Vergangenheit, als auch aus der Zukunft der Sequenz.
  • Funktioniert mit jeder RNN Unit (z.B. GRU oder LSTM)

Deep RNNs

$a^{[2]<3>} = g(W_a^{[2]} \begin{bmatrix} a^{[2]<2>} \\ a^{[1]<3>}\end{bmatrix} + b_a^{[2]})$

Auch für tiefe RNNs können wir beliebige RNN Units (z.B. GRU oder LSTM) verwenden.

Ein RNN kann deep und bidirectional sein.

RNNs haben meistens nur wenige Layer.

Die Zeitdimension produziert meist schon viel Tiefe und Rechenaufwand.

Artificial Intelligence

Natural Language Processing

Wie sollen wir ein Wort repräsentieren?

One Hot Vektoren

Man (5391) Woman (9853) King (4914) Queen (7157) Apple (456) Orange (6257)
$\begin{bmatrix} 0 \\ 0 \\ 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \\ 0 \\ 0 \end{bmatrix}$ $\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \end{bmatrix}$ $\begin{bmatrix} 0 \\ 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix}$ $\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \end{bmatrix}$ $\begin{bmatrix} 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix}$ $\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \\ 0 \end{bmatrix}$

Alle Wörter werden gleich behandelt, Ähnlichkeiten werden ignoriert.

  • I want a glass of orange ___
  • I want a glass of apple ___

One Hot Vektoren sind unabhängig, weil sie orthogonal sind.

$v_1 \cdot v_2 = 0$

Word Embeddings

Idee: Suche eine featurisierte Repräsentation der Wörter

Man (5391) Woman (9853) King (4914) Queen (7157) Apple (456) Orange (6257)
Gender -1 1 -0.95 0.97 0.00 0.01
Royal 0.01 0.02 0.93 0.95 -0.01 0.00
Age 0.03 0.02 0.7 0.69 0.03 -0.02
Food 0.04 0.01 0.02 0.01 0.95 0.97
...
$e_{5391}$ $e_{9853}$ $e_{4914}$ $e_{7157}$ $e_{456}$ $e_{6257}$

Jetzt verwenden wir die Embeddings $e$ anstelle der One Hot Encodings.

"Apple" und "Orange" haben ähnlichere Embedding Vektoren $e_{456}$ und $e_{6257}$

$e_{456} \cdot e_{6257} > 0$

Ein Language Model kann nun zum Beispiel eine Vorhersage basierend auf "fruit" Feature machen:

  • I want a glass of orange ___
  • I want a glass of apple ___

Natürlich wollen wir das Embedding nicht per Hand angeben, sondern lernen.

Die gelernten Feature sind nicht notwendigerweise Interpretierbar.

Durch das Embedding generalisiert unser Modell tendenziell besser.

$Y$ 1 1 0 0 0 0
SallyJohnsonisanorangefarmer
RobertLinisaduriancultivator

Idee: Lerne das Embedding auf einem eigenen großen Corpus.
(muss nicht der gleiche wie der für die eigentliche Aufgabe sein).

Das gleiche Embedding kann für verschiedene Aufgaben verwendet werden.

Wir können einfach ein großes Vokabular verwenden.

Transfer Learning: Übertrage gelerntes Wissen von einem Datensatz auf einen anderen.

Transfer Learning

  1. Lerne Word Embedding auf einem großen Text Corpus (Millionen von Dokumenten)
    (oder lade ein bereits trainiertes Embedding runter)
  2. Verwende das Embedding als Input Features für das eigentliche Modell

Analog zu vortrainierten CNNs, wo wir nur die letzten Layer anpassen.

Analogien

Wir nehmen folgende Embedding Vektoren an:

\[ e_\text{man} = \begin{bmatrix} -1 \\ 0.01 \\ 0.03 \\ 0.09 \end{bmatrix} \quad e_\text{woman} = \begin{bmatrix} 1 \\ 0.02 \\ 0.02 \\ 0.01 \end{bmatrix} \quad e_\text{king} = \begin{bmatrix} -0.95 \\ 0.93 \\ 0.70 \\ 0.02 \end{bmatrix} \quad e_\text{queen} = \begin{bmatrix} 0.97 \\ 0.95 \\ 0.69 \\ 0.01 \end{bmatrix} \]

Man is to woman as king is to ___

$e_\text{man} - e_\text{woman} \approx \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix} \qquad e_\text{king} - e_\text{queen} \approx \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix} $

\[ e_\text{man} = \begin{bmatrix} -1 \\ 0.01 \\ 0.03 \\ 0.09 \end{bmatrix} \quad e_\text{woman} = \begin{bmatrix} 1 \\ 0.02 \\ 0.02 \\ 0.01 \end{bmatrix} \quad e_\text{king} = \begin{bmatrix} -0.95 \\ 0.93 \\ 0.70 \\ 0.02 \end{bmatrix} \quad e_\text{queen} = \begin{bmatrix} 0.97 \\ 0.95 \\ 0.69 \\ 0.01 \end{bmatrix} \]

Man is to woman as king is to ___

$e_\text{man} - e_\text{woman} \approx e_\text{king} - e_\text{queen}$

$e_\text{king} - e_\text{man} + e_\text{woman} \approx \begin{bmatrix} 1 \\ 1 \\ 0.7 \\ 0 \end{bmatrix}$

Suche nun Wort mit ähnlichem Embedding.

Das funktioniert auch mit gelernten Features!

Funktioniert mit vielen simplen Analogien:

  • Man:Woman as Boy:Girl
  • Ottawa:Canada as Nairobi:Kenya
  • Big:Bigger as Tall:Taller
  • Yen:Japan as Pound:England

Was bedeutet "ähnlich"?

Cosine Distance: $\frac{v_1 \cdot v_2}{||v_1||\; ||v_2||}$

Winkel ist wichtiger als Abstand.

Wie lernt man ein Word Embedding?

Zum Beispiel als Teil eines Language Models.

Da wir nur die Embeddings brauchen kann das sehr simpel sein.

  • Word2Vec
  • GloVe

Ähnlich wie vortrainierte CNNs generalisieren die meisten NLP Modelle mit Word Embeddings besser, als ohne.

  • Generalisiere auf Worte, die nicht in den Trainingsdaten sind.
  • Weniger Features pro Word $\Rightarrow$ weniger Parameter $\Rightarrow$ weniger Overfitting.

Vorurteile in Word Embeddings

Man:Woman as King:Queen

Man:Computer_Programmer as Woman:Homemaker

Father:Doctor as Mother:Nurse

Word Embeddings lernen Vorurteile aus den Trainingsdaten

Bolukbasi et.al.: Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings

Machine Learning Modelle sollten keine vorhandenen Vorurteile verstärken, die wir eigentlich gerne loswerden wollen.

Vor allem in sensiblen Anwendungen (Kreditwürdigkeitsprüfung, rechtliche Empfehlungen, etc.)

  1. Identifiziere Richtung des Bias: \[ e_\text{he} - e_\text{she}\\ e_\text{man} - e_\text{woman}\\ e_\text{male} - e_\text{female}\\ \Rightarrow \text{average} \]
  2. Neutralisiere: Projeziere jedes Word, welches nicht Bias Defining ist.
  3. Renormalisiere verbleibende Worte.

Idee kann auf andere explizite Vorurteilskategorien angewendet werden:

  • Ethnizität
  • Religion
  • Nationalität
  • ...

Die meisten offenen Word Embeddings sind nicht debiased.

Und wenn, dann meistens nur für eine Richtung (meist Geschlecht).

Mehrsprachige Word Embeddings

    Idee:

  • Trainiere mit einem mehrsprachigen Corpus
  • Stelle sicher, dass ähnliche Worte eine kleine Cosine Distance haben.

Mit einem mehrsprachigen Word Embedding kann unser Modell auch auf Sprachen generalisieren, welches es im Training nicht gesehen hat.

Das hat Limits, da z.B. die Grammatik der fremden Sprache natürlich nicht gelernt wird.

Gutes vortrainiertes Word Embedding: ConceptNet

Token basierte Encodings

Ein Dictionary für alle Wörter kann sehr groß werden, während ein RNN auf Zeichenbasis meist zu schwach ist.

Ein Token ist eine Gruppe von zusammenhängenden einzelnen Zeichen.

Es kann ein Wort oder auch nur Teil eines Wortes sein.

Byte Pair Encoding (BPE)

Idee: Wir starten mit einem Token für jedes mögliche Byte (256).

Die häufigsten Token Paare werden zu einem neuen Token gemerged.

Beispiel

String: aaabdaaabac

4 Token: a, b, c, d

aaabdaaabac

aa ist das häufigste Paar.

ZabdZabac

5 Tokens: a, b, c, d, Z=aa

ZabdZabac

ab ist das häufigste Paar.

ZYdZYac

6 Tokens: a, b, c, d, Z=aa, Y=ab

ZYdZYac

ZY ist das häufigste Paar

XdXac

7 Tokens: a, b, c, d, Z=aa, Y=ab, X=aaab

Ab jetzt können wir nicht weiter mergen.

Mit BPE können wir die Wörterbuchgröße gut kontrollieren, da wir bestimmen, wie lange Byte Pairs gemerged werden sollen.

Keine unbekannten Zeichen (jedes Byte hat schon ein Token).

Systeme wie ChatGPT verwenden Token basierte Encodings.

Token basierte Encodings funktionieren auch für komplizierte Anwendungsfälle.

  • Unterschiedliche Sprachen (mit unterschiedlichen Schriftzeichen).
  • Tippfelerr
  • Programmiersprachen
  • DNA
  • Schach Notation
  • ...

Z.B. für Übersetzungen mit RNNs wandeln wir eine Input Sequenz in eine Output Sequenz um.

Encoder-Decoder Architektur

Wir verwenden zwei verschiedene RNNs, eines zum Encoding, eines zum Decoding.

Beide verwenden den gleichen State Vektor.

Die gesamte Input Sequenz muss einmal in einem einzigen State Vektor repräsentiert werden.

Da die Länge fix ist, können wir keine beliebig langen Texte in einem Schritt übersetzen.

Der State Vektor zwischen dem Encoder und dem Decoder Modul ist ein Embedding für die gesamte Input Sequenz.

Zum Beispiel können wir über die Cosine Distance nun semantisch Ähnliche Texte suche.

Embeddings lassen sich analog auch für Bilder, etc. generieren.