Aussehen
Textgenerierung
Dieses Kapitel beschreibt die Textgenerierung zuerst als Überblick und dann in drei Bildern. Es ist okay jederzeit mit dem Lesen aufzuhören. Jede Erklärung beschreibt die vorherige detaillierter.
Überblick
Am Beispiel von generativen vortrainierten Transformern wie etwa ChatGPT schauen wir uns in diesem Kapitel an, wie eine KI auf Grundlage großer Textmengen selbst Text generieren und schlussendlich scheinbar chatten kann.
Die grundsätzliche Idee ist Folgende: Wenn ich rufe
Sein oder Nichtsein, das ist hier die...
dann ist jedem im Kopf klar, dass es mit "... Frage" weitergehen muss. Alles andere würde unsere Erwartungen hart enttäuschen.
Warum ist das so? Weil wir das wieder und wieder gehört haben.
Und genau das machen auch textgenerierende KIs. Sie erhalten einen angefangenen Text und können diesen vervollständigen.
Hier der Screenshot aus einer Testumgebung von OpenAI, der Firma hinter ChatGPT:
Das ist nicht das, was du beim Chatten erlebst? Erlaube mir bitte, ein wenig Drama einzubringen:
Ein klassisches Drama. Auftritt "System". Es gibt Anweisungen, was zu tun ist. Danach "User" mit der Frage "Wer bist du?" Und nun folgt in Dramenform die Antwort von Assistent:
Dieses Drama packen wir jetzt in eine schöne Oberfläche und fertig ist der Chat:
Erklärung 1 - Generierung
Aber wie kann die KI den Text vervollständigen? Dazu gehen wir stark abstrahiert so vor:
Wir schnappen uns ein gutes Buch und schneiden alle Wörter aus.
Wörter, die ähnlich sind, hängen wir an Wäscheleinen an ähnliche Stellen in unserem Klassenzimmer.
Erhalten wir einen Satzanfang mit anschließenden Wortlücken, suchen wir alle Wörter im Raum und ermitteln deren Mittelpunkt.
Das Wort, welches dem Mittelpunkt am nächsten hängt, ist unser nächstes Wort für die erste Wortlücke.
Nun wiederholen wir alle vorherigen Schritte, bis wir keine freie Wortlücke mehr haben, oder wir einen Punkt finden, der den Satz beendet.
Schauen wir uns im folgenden genauer an, wie wir Wörter aufhängen können und wie wir im Mittelpunkt das gesuchte Wort finden.
1. Vektorisierung
Schauen wir uns diese drei Beispielsätze an:
Die Apfelsine ist sehr saftig. Die Apfelsine enthält viel Vitamin C.
Die Orange ist sehr saftig. Die Orange enthält viel Vitamin C.
Die Zitrone ist sehr saftig. Die Zitrone enthält viel Vitamin C.
Als Mensch ist uns klar, dass Apfelsinen, Orangen und mit Einschränkung auch Zitronen recht ähnliche Früchte sind. Aber auch wenn wir ein Rechner sind oder in einem Fastfood-Restaurant groß geworden wären, wäre uns jetzt klar, dass die drei Begriffe Apfelsine, Orange und Zitrone sehr ähnliche Objekte oder Konzepte beschreiben müssen.
Stellen wir uns vor, wir würden diese und weitere Wörter aus einem Wörterbuch ausschneiden und als Karten nach Ähnlichkeit an Wäscheleinen in unser Klassenzimmer hängen, es könnte dann so aussehen:
Gehen wir davon aus, dass die linke obere Ecke des Raums die Koordinaten (0,0,0)
hat. Dann hätten die Karten die Koordinaten:
Name | Vektor |
---|---|
Apfelsine | (2,3,0) |
Orange | (2,3,0) |
Zitrone | (2,3,0) |
Pferd | (2,1,2) |
Auto | (0,5,5) |
Wir haben aus den Wörtern Vektoren gebildet.
Wie im Matheunterricht können wir mit Vektoren rechnen, etwa addieren. Dadurch ist es zum Beispiel möglich, folgende Berechnungen durchzuführen:
Orangenbaum – Orange = Baum
Königin – Frau + Mann = König
Aufgabe
Finde noch zwei weitere Beispiele, welche Wörter man addieren oder subtrahieren können müsste.
Okay, soweit waren wir aber schon in den 1980ern. Und es gab ein Problem:
Ich möchte die Bank…
Ja, was denn? "...streichen" oder "...überfallen"?. Der Satz geht exakt gleich los, aber er verändert sich je nach letzten Wort fundamental. Abgesehen von der Moral, sprechen wir einmal von der Bank im Sinne einer Sitzmöglichkeit und einmal als Institution. Dasselbe Wort müsste also je nach Kontext nun ganz woanders im Raum hängen.
Wir werden also verschiedene "Bank"-Zettel im Raum aufhängen, und zwar je nach Kontext woanders:
Wir benötigen aber einen Algorithmus, der möglichst allein herausfindet, welche Wörter in einem Satz für das jeweils gesuchte Wort entscheidend sind. Menschliche Heuristiken haben sich als unzureichend herausgestellt: Eine naheliegende Idee wäre, Wörter, die nahe beieinander liegen, als sich stark beeinflussend zu betrachten. Aber vergleiche das Beispiel
Ich werde morgen eine Bank rausrauben.
wo "Bank" und "Ausrauben" direkt beieinander stehen mit:
Ausgeraubt hatte die Räuberin, die schon als Kind ihren Bruder an den Haaren zog, die Bank.
wo "Ausgeraubt" und "Bank" alle anderen Wörter des Satzes umrahmen.
2. Prognose erstellen
Wenn wir alle Eingabevektoren bestimmt haben, können wir auf Grundlage der aus dem Training gesammelten Informationen den Fortgang des Textes also den nächsten Vektor bestimmen, indem wir unseren Text mit ähnlichen Texten aus den Trainingsdaten vergleichen.
3. Ausgabewort finden
Wir haben mithilfe der in Eingabevektoren umgewandelten Wörter stolz einen Vektor als Ausgabe gefunden und können präsentieren: (0.38, 5.09, 3.4)
. Nun ja, unsere Begeisterung hält sich in Grenzen. Kann da bitte mal jemand ein Wort draus machen? Und genau hier liegt das Problem, durch das Rechnen mit Vektoren (also Zahlen und nicht Wörtern) und Verschieben von Bedeutungen erhalten wir Zielkoordinaten, an denen wir kein Wort aufgehängt haben.
Etwa bei
Zitronen sind in der Abenddämmerung...
haben wir uns auf eine Farbe festgelegt:
Und jetzt wählen wir alle in der Nähe befindlichen Wörter aus und geben als Ausgabe das nächstgelegenee aus:
Also:
... bernsteinfarben
Das heißt, die KI hat im Grunde genommen einen viel präziseren Wortschatz als wir Menschen gefunden, da dieser Bedeutungen in Abhängigkeit der Trainingsdaten äußerst präzise ausdifferenzieren kann.
Details
Ist dir aufgefallen, dass du, auch wenn die eine textgenerierende KI exakt das Gleiche fragst, verschiedene Antworten erhältst? Das liegt daran, dass solche KIs nicht den Mittelpunkt nehmen, sondern eine Menge an nahe gelegenen Wörtern und dann ein zufälliges daraus auswählen. Dadurch entstehen auch bei gleicher Eingabe verschiedene Ausgaben. Denn das eine zufällige Wort bedingt den Suchbereich des nächsten.
Aufgabe
Stelle Mutmaßungen auf, warum oft empfohlen wird, für gute Antworten einer textgenerierenden KI die Eingaben auf Englisch zu stellen.
Erklärung 2 - Generierung
Hier vertiefen wir die Ideen aus Bild 1 und folgen stark abstrahiert dieser Idee:
Die KI erhält einen Satzanfang, etwa "Ich war noch nie in" und ergänzt diesen mit "New". Jetzt lautet der Satz "Ich war noch nie in New". Jede:r sollte jetzt klar sein, wie der Satz weitergehen muss. Ein Wortergibt das andere.
Um dies zu schaffen, durchläuft die KI folgende Schritte:
Eingabewörter erhalten
Eingabewörter in Vektoren umwandeln.
Eingabevektoren transformieren
Einen Ausgabevektor mit einem Fully Connected Layer bestimmen.
Ausgabewort mit optionaler Zufallsfunktion bestimmen.
Diese Schritte werden so lange wiederholt, bis das Ausgabewort "[STOP]" ausgewählt wird oder die maximale Textlänge erreicht ist.
Eingabewörter in Vektoren umwandeln
Das Umwandeln der Eingabewörter in Vektoren wird auch Embedding genannt. So können die erstellten Vektoren auch Embeddings genannt werden.
Das Umwandeln in Vektoren ist ein vergleichsweise altes Verfahren und hat diese Schritte:
1. Wörter in Stammwörter umwandeln.
Um die Anzahl der möglichen Wörter zu reduzieren, können wir diese etwa Stammwörtern umwandeln:
python
lemmatize_sentence("Harry ist besser als Voldemort")
ergibt:
['Harry', 'sein', 'gut', 'als', 'Voldemort']
2. Wörter vektorisieren.
python
model = Word2Vec(data, min_count = 1, vector_size = 10, window = 15, sg = 1)
Hier bilden wir mit einem älteren Algorithmus "Word2Vec" Wörter als 10-dimensionale Vektoren ab. Dabei wird jedes einzelne Wort in einem Kontext von 15 Wörtern betrachten.
Damit können wir schon Abstände von Wörtern anhand der Vektoren bestimmen und entscheiden, wie nah diese thematisch beieinander liegen:
python
model.wv.similarity('Albus', 'Dumbledore')
ergibt eine sehr hohe Übereinstimmung:
0.96201617
Während
python
model.wv.similarity('Dumbledore', 'Quidditch')
recht weit voneinander entfernt ist:
0.22198394
Übrigens werden in 10 Dimensionen diese Zahlen in "Dumbledore" so kodiert:
python
model.wv["Dumbledore"]
array([ 0.15148456, 0.49297988, 1.8927001 , 0.08583109, 0.39326102,
-1.4074827 , 0.4527954 , -0.03496859, -1.2141799 , -1.1253785 ],
dtype=float32)
Hier kannst du das ganze Programm einsehen, und wenn du ein Google-Konto hast, auch ausführen:
https://colab.research.google.com/drive/1azJDWClnRCFnfiUe-RPUUEO9imU9kYjb?hl=de3. Vektoren visualisieren (optional)
Beim Visualisieren sind wir mit 10 Vektoren als Menschen deutlich überfordert. Drei Dimensionen sind ein Raum, vier Dimensionen, mit etwas gutem Willen ein Raum im Wandel der Zeit, aber 10 Dimensionen? Daher haben wir für folgende Darstellung die gebildeten Vektoren auf nur noch zwei Dimensionen reduziert, sodass der Abstand zwischen den Punkten ähnlich bleibt. Dabei gehen Informationen verloren, aber wir können dennoch erste Schlussfolgerungen ziehen:
Eingabevektoren transformieren
Haben wir die Eingabevektoren bestimmt, können wir diese transformieren. Dies geschieht wie in Erklärung 1 - Generierung beschrieben.
Ausgabevektor bestimmen
Jetzt haben wir weiterhin gleich viele Eingabevektoren, nur bilden diese jetzt ihre Bedeutung auch untereinander ab.
Wir verbinden diese jeweils Eingabevektoren jetzt mit allen möglichen Ausgabevektoren. Die Ausgabevektoren sind alle Wörter die im Training jemals aufgetaucht sind. Egal welche Sprache.
Aufgrund der im Training gelernten Texte wird jetzt für jeden möglichen nächsten Vektor die jeweilige Wahrscheinlichkeit bestimmt.
Der Vektor mit der höchsten Wahrscheinlichkeit wird ausgewählt.
Ausgabewort auswürfeln
Der ausgewählte Vektor lässt sich nicht aus den Eingabektoren die unseren menschlichen Wörtern entsprechen ableiten, sondern aus den transformierten Vektoren. Also den Vektoren, die unterschneiden, ob eine Bank nun ein Gebäude oder ein Sitzmöbel ist. Leider haben wir dafür nicht immer ein Wort.
So könnte der Ausgabevektor der uns am Ende als "Bank" angezeigt wird eigentlich ganz exakt einer Stelle sein, die beschreiben "Ein Sitzmöglichkeit in weißer Farbe, etwas abseits des Weges aber schön in der Sonne gelegen". Nur haben wir für solche Bänke kein isoliertes Wort.
Wir könnten uns eins ausdenken und diese Art von Bänken "Solabankis" nennen (ausgedacht von ChatGPT). Da das aber niemanden kennt, suchen wir einfach bekannte Wörter die in der Nähe der "Solabankis" sind: Sonnenbank, Ruheoase, Lichtbank, Friedensplatz, Sonnensitz, Idyllbank, Entspannungsinsel, Rückzugsort, Sonnenfleck, Stillecke
Aus dieser Liste wählen wir je eingestellter Zufälligkeit ein Wort aus. Wenn keine Zufälligkeit gewünscht ist, nehmen wir schlicht das Wort, dessen Vektor am nächsten am gefundenen Vektor ist. Hier könnte das die Lichtbank sein.
Erklärung 2 - Training
Wir haben in den bisherigen Erklärungen bei der Generierung einfach hingenommen, dass die KI ein Wort voraussagen kann. Aber wie konnte dies gelernt werden?
Dieser Prozess gliedert sich in die Schritte Selbstüberwachtes und Bestärkendes Lernen.
Selbstüberwachtes Lernen
Instruction Model
Eine KI lernt nicht annähernd so effizient wie ein Mensch. Zeigt man einem Kleinkind einen Teddy kann das Kleinkind sofort ähnliche Objekte als Teddy identifizieren. Nach einigen Korrekturen, wo auch das Meerschweinchen als Teddy identifiziert und geknuddelt wurde, klappt das meist ganz gut. Eine KI hätte schon gern einige Tausend Beispiele, damit Sie auf einen Teddy kommt. Das liegt daran, dass eine KI nicht genauso wie wir lernt und Verständnis aufbaut.
Gut, dann ein paar Tausend Sätze über Teddys schreiben. Und über Kühe und Fusionsenergie. Hm, ganz schön viel. Wie wäre es, wenn wir einfach das gesamte Internet, Bücher, Zeitschriften-Artikel und mehr runterladen? Super Idee! Kein Aufwand für uns als Mensch und schon ist alles da. Aber darin jetzt Sätze über Teddys finden? Uff.
Also nehmen wir die runtergeladenen Texte, kopieren diese und streichen anschließend mit einem schwarzen Filzstift wild darin herum. Wir entfernen einige Wörter aus einem Zitat von Laozi:
Schöne Worte sind nicht immer wahr. Wahre Worte sind nicht immer schön.
nur noch:
Schöne Worte sind [LÜCKE] immer wahr. [LÜCKE] Worte sind nicht immer [LÜCKE].
Das heißt wir haben wie im Unterricht einen Lückentext aber haben wir ein:e Lehrer:in auch gleich die Musterlösung erschaffen.
Somit kann die KI selbst prüfen, ob sie schon richtig die Lücken voraussagen kann.
Details
Wir haben immer über das Vervollständigen von Texten gesprochen, hier werden aber Lücken gefüllt. Das liegt daran, dass es beim Training sehr unpraktisch wäre Sätze immer nur am Ende abzuschneiden und dann zu hoffen, dass die KI nicht nur ein Wort sondern gleich mehrere in Reihe richtig vorherzusagen lernt. Viel einfacher ist es im Training, wenn immer nur eine Lücke mit einem Wort gefüllt werden muss.
Finetuning
Wir haben jetzt ein Modell geschaffen, was ganz allgemein Texte vervollständigen kann. Um bis hierher zu kommen war uns die Textqualität recht egal. Hauptsache wir hatten viele Texte, um überhaupt eine Art von Textverständnis zu erlangen.
Jetzt werden wir wählerischer. Und dafür benötigen wir weniger Daten. Wir führen ein sogenanntes Finetuning durch als geben der KI Beispiele, wie genau wir uns ihre Vervollständigung vorstellen möchten.
Möchten wir also das die KI scheinbar mit uns Chatten kann, benötigen wir jetzt viele Beispielchats. Diese könnten wir entweder selbst erstellen oder uns auch wieder aus bestehenden Quellen besorgen. So hat eine Firma mit über 1.000 Mitarbeiter:innen jede einzelne gebeten vier Beispielchats zu führen und hat diese Daten zum Training verwendet.
Bestärkendes Lernen durch menschliche Rückkopplung
Super, wir haben eine KI, die chatten kann! Nur noch nicht wirklich gut. Wir bräuchten noch viel mehr Chats. Da wir die aber nicht in der Qualität und Menge haben, wie wir sie bräuchten, nutzen wir einen Trick:
KIs können überraschend viel schneller Lernen, wenn Menschen Ihnen beim Training kleine Tipps geben. Etwa was ein guter Chat ist und was nicht. Also benötigen wir genügend Mitarbeitende, die das machen. Und das sind oft auch wir:
Anhand dieser Bewertungen wird eine kleinere KI trainiert, die die Präferenzen von Menschen imitiert und so beim Training im Finetuning automatisch unterstützen kann.
Aufgabe
Was macht eigentlich einen guten Witz aus?
a) Definiere einen guten Witz.
b) Gib ein Beispiel für einen guten Witz.
Erklärung 3 - Generierung und Training
Der folgende Vortrag erklärt ab 8:55 bis 33:33 die Grundlagen des en- und decodieren sowie der Transformer:
Aufgabe
Erkläre was ein Transformer ist und wie dieser arbeitet.