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
| Marcus | spoke | with | Mary | Jane | about | John | yesterday |
| $x^{< 1 >}$ | $x^{< 2 >}$ | $x^{< 3 >}$ | $x^{< 4 >}$ | $x^{< 5 >}$ | $x^{< 6 >}$ | $x^{< 7 >}$ | $x^{< 8 >}$ |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
| $y^{< 1 >}$ | $y^{< 2 >}$ | $y^{< 3 >}$ | $y^{< 4 >}$ | $y^{< 5 >}$ | $y^{< 6 >}$ | $y^{< 7 >}$ | $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.
Recurrent Neural Network
Alternative Darstellung:
Die Vorhersage zu jedem Zeitpunkt basiert nur auf dem aktuellen Input und den Vorgängern.
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>}) \]
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}$ |
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.
GRU or LSTM Units können auch nur Informationen aus der Vergangenheit verwenden.
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)
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.
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.
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:
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 |
| Sally | Johnson | is | an | orange | farmer | |
| Robert | Lin | is | a | durian | cultivator |
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
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:
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.
Ähnlich wie vortrainierte CNNs generalisieren die meisten NLP Modelle mit Word Embeddings besser, als ohne.
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.)
|
|
Idee kann auf andere explizite Vorurteilskategorien angewendet werden:
Die meisten offenen Word Embeddings sind nicht debiased.
Und wenn, dann meistens nur für eine Richtung (meist Geschlecht).
Mehrsprachige Word Embeddings
Idee:
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.
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.