Sie sind auf Seite 1von 4

Nach dem x-ten Klassifikationsalgorithmus schauen wir uns heute

mal etwas anderes an. Heute geht es um Textgenerierung. Der


Begriff ist selbsterklärend, denke ich mir, aber im Grunde geht es
darum, einen Algorithmus zu entwerfen, der sowohl Verteilungen von
Wörtern als auch die sequenziellen Nuancen eines Texts erfassen
kann, so dass er auf Basis dessen neuen Text generieren kann. Hier
ein klitzekleiner Fahrplan:

Ich will euch zuerst oberflächlich anhand von einem Beispiel den
Unterschied zwischen generativen und diskriminativen
Klassifikationsmodellen erklären, weil wir ja auch oft schon das
eine oder andere Mal mit diesen Begriffen im Laufe unseres
Studiums konfrontiert wurden. Zusätzlich haben wir ja auch schon in
diesem Kurs das eine oder andere Mal gehört, das generative
Modelle auch zur Textgenerierung herangezogen werden können.
Anschließend gehe ich auf den “Hauptalgorithmus” von diesem
Vortrag ein - die Markovkette. Dessen Ergebnisse werde ich, sollte
noch genug Zeit bleiben, mit jenen eines LSTMs vergleichen.

Jeder von uns hat schon mal gehört, dass generative bzw.
diskriminative Modelle unterschiedliche Herangehensweisen dabei
haben, gemeinsame Wahrscheinlichkeiten zu lernen. Ihr habt
vermutlich gehört, dass diskriminative Modelle mit Konditionalen
Wahrscheinlichkeiten arbeiten, während generative Modelle
gemeinsame Wahrscheinlichkeiten lernen.

Was ich euch jetzt aber zeigen will, ist ein intuitiver Zugang zu dem
Thema. Als Beispiel habe ich folgendes:

Ihr arbeitet für ein Callcenter, und ihr wollt einen Algorithmus
schreiben, der das Geschlecht von Anrufern klassifizieren kann. Um
die Annahme hier binär und einfach zu halten. Beschränken wir die
möglichen Geschlechter auf 2: männlich oder weiblich. Die
Herangehensweise ist die Folgende:

• Der Computer nimmt den erfassten Anruf auf


• er misst die Tonhöhe
• und klassifiziert anschließend

Nun müssen wir eine “Grenze“ in dieser Tonhöhe finden.

Der erste Ansatz ist der generative Ansatz: wir berechnen für alle
erfassten Samples den Mittelwert und die Standardabweichung,
nehmen an, dass unser Datensatz normalverteilt ist (typische
Annahme bei n> 100, siehe zentraler Grenzwertsatz) und finden
anschließend die Grenze, indem wir die Beiden Kurven miteinander
schneiden.

Was für Probleme habe ich hier? Leider ist es oft so, dass sich Daten
nicht nach der Normalverteilung verhalten, entweder weil man sich
generell die falsche Verteilung ausgesucht hat, oder weil die Größe
des Datensatzes einfach zu gering ist.

Versucht man bei einer solchen Verteilung, das generative Konzept


anzuwenden, wird man nicht sehr weit kommen und man sieht hier,
dass die ganzen weiblichen Samples hier als männlich klassifiziert
werden.

Ein anderer Ansatz, um ein solches Problem zu lösen ist der


diskriminative Ansatz. Grundsätzlich sagt man hierbei, dass einem
die Verteilung egal ist, stattdessen nehme ich an, alle Daten seien
eine gewisse Kategorie (männlich/ weiblich), und schaue mir
anschließend an, wo auf der Skala meine Fehlerquote am geringsten
ist.

Wende ich dieses Konzept nun auf den problematischen Datensatz


an, sehen wir, dass wir ein besseres Ergebnis erzielen.

Wie kann man generative Modelle aber nun nutzen, um neuen Text
zu generieren?
Auf Basis der gelernten Verteilung der Daten kann man den
Algorithmus neue Samples kreieren lassen. Wie das funktioniert,
schauen wir uns nun anhand der Markovkette an.

Viele von euch kennen die Markowkette bereits aus einem Statistik-
Kurs oder Ähnliches. Ganz generell gehalten ist die Markovkette ein
stochastischer Prozess zur Vorhersage von künftigen Ereignissen.
Das heißt wir sehen…ok, “stochastisch”, das heißt wir hantieren
vermutlich mit Wahrscheinlichkeiten. Ein Ereignis ist also, wie ihr es
aus der Wahrscheinlichkeitstheorie kennt, eine Teilmenge der
möglichen Werte der Zufallsvariable an einer bestimmten Stelle der
Markovkette.

Bevor wir zur Textgenerierung kommen, will ich noch auf was ganz
Charakteristisches für die Markovkette eingehen: die sogenannte
Markoveigenschaft. Die besagt, dass wir mit Kenntnis einer lediglich
begrenzten Vorgeschichte ebensogute Prognosen machen können
wie mit der gesamten Vorgeschichte meines sequentiellen
Prozesses.

In einer Markovkette erster Ordnung wäre der nächste Zustand Si+1,


wenn ich mich gerade in einem Zustand Si befinde, also nur P(Si+1 |
Si)

Das wäre jetzt also unsere genaue Definition der Markovkette.


Schauen wir uns mal ein Beispiel an:

Wie können wir dieses einfache Modell nun auf den Bereich
Textgenerierung anwenden? Wie würden in der Markovkette unsere
Zustände ausschauen? Was wären unsere Übergangsprozesse?
Unsere Zustände wären Wörter, Character oder N-Gramme, und
unsere Übergangsprozesse eine Abbildung der Trägermenge in den
reellen Zahlenraum zwischen 0,1. Als Verteilungsart nehmen wir die
diskrete Gleichverteilung für jeden im Text vorgekommenen
Nachfolger an ( derselbe Nachfolger kann auch mehrmals
vorkommen, weswegen manche Nachfolger wesentlich
wahrscheinlicher sind als andere). Das geht in python auch ganz
einfach, indem wir aus der Liste der beobachteten Werte einfach
normal samplen. Die Funktion random.choice nimmt default-mäßig
eine diskrete Gleichverteilung an, wenn nicht anders angegeben.

Uns jetzt wollen wir genau das mal ausprobieren. Wie bereits
angekündigt, habe ich ein paar Jupiter nötig ebooks für euch
vorbereitet, und um ein paar Texte von der Markovkette zu samplen,
schauen wir auch gleich mal rein.

Wie schaut das ganze dann bei dem LSTM aus? Dadurch, dass der
sequentielle Aspekt auch von LSTM im Generierungsprozess
berücksichtigt wird, gibt das LSTM tatsächlich verwendbaren
Output, und ist nicht beschränkt bei einer Bag-of-words-Annahme
oder dergleichen.
Wie genau schaut das dann aus? Auf Basis einer Character-Sequenz:
wie wahrscheinlich ist ein möglicher Folgecharacter dieser
Sequenz?

Wir haben 2 Inputs:

• x: eine Matrix A, mit den Dimensionen Sequenzlänge x der Länge


des Vokabulars
• y, das Label: einen Vektor mit der Länge des Vokabulars, one-hot-
encoded, mit einer 1 an der Stelle des zu erwartenden
Characters

An diese RNN-Struktur schließt ein Dense- Layer an, und als Output
bekommen wir einen Vektor der Länge des Vokabulars, auf den wir
Softmax anwenden, um eine Wahrscheinlichkeitsverteilung über das
gesamte mögliche Vokabular zu bekommen.

Ähnlich wie bei der Markov-Kette wird hier auch zufällig vom
Outputvektor gesampled, und gleichzeitig führen wir eine Feature
namens “Temperature” ein. Dieses erlaubt es uns, die
Wahrscheinlichkeitsverteilung und in weiterer Folge das Sampling
liberaler/konservatier zu machen. Dividieren wir den Outputvektor
mit einem Wert zwischen 0-1, wird das Sampling konservativer, Mit
einem Wert höher als 1 dementsprechend liberaler.

In dem folgenden BSp habe ich die Wahrscheinlichkeitsverteilung


etwas liberaler gemacht.

So, jetzt schauen wir uns noch den generierten Output des LSTMs
an.

Ok, dann wars das! Danke für eure Aufmerksamkeit!