Mini-Sprachmodell in Python

lock
Bevorstehend

Bauen Sie Ihr eigenes Bigramm-Modell in Python: Wörter zählen, Wahrscheinlichkeiten berechnen, Text generieren — und mit ChatGPT vergleichen.

Ziele dieses Moduls
  • Sie können ein Bigramm-Modell in Python implementieren: Wortpaare zählen, Ăśbergangswahrscheinlichkeiten berechnen und Texte generieren.
    Anwenden
  • Sie können den generierten Text evaluieren und den Einfluss des Trainingskorpus auf die Qualität der Ausgabe beurteilen.
    Anwenden
  • Sie können den Massstabsunterschied zwischen dem eigenen Bigramm-Modell und grossen Sprachmodellen (Milliarden Parameter, Transformer) erklären.
    Verstehen

Ăśberblick

Sie setzen um, was Sie Unplugged simuliert haben: Ein eigenes Sprachmodell in Python. Schritt für Schritt erstellen Sie ein Bigramm-Modell, das Sätze generiert. Zum Vergleich setzen Sie das Ergebnis neben ChatGPT — gleiche Idee, anderer Massstab.

Kompetenzen

  • Ein Bigramm-Modell in Python implementieren
  • Wortfrequenzen und bedingte Wahrscheinlichkeiten berechnen
  • Texte generieren und evaluieren
  • Den Massstabsunterschied zum eigenen Modell ↔ ChatGPT erklären

Von der MĂĽnze zum Code

In der Unplugged-Übung haben Sie ein Sprachmodell mit Papier und Stift gebaut: Pfeile zwischen Wörtern, zufällig wählen, Satz aufschreiben.

Jetzt setzen Sie exakt dieses Prinzip in Python um. Keine neuronalen Netze, keine Bibliotheken — nur Wörter zählen und Wahrscheinlichkeiten berechnen.

Dafür benötigen Sie: random und collections (beide sind in Python vorinstalliert).

Challenge

Schritt 1: Trainingsdaten einlesen

Das Modell braucht Text zum Lernen. Wir nutzen wieder die Grimm-Märchen.

Erstellen Sie eine Liste von Trainingssätzen:

trainingsdaten = [
  "Es war einmal ein Königssohn der bekam Lust in der Welt umherzuziehen",
  "Es war einmal ein König und eine Königin die lebten in Frieden",
  "Es war ein armer Mann und eine arme Frau die hatten nichts als eine kleine HĂĽtte"
]

Aufgabe: Zerlegen Sie jeden Satz in eine Liste von Wörtern (.split()) und speichern Sie alle Wortpaare (Bigramme) mit ihrer Häufigkeit.

Tipp: Ein Bigramm ist ein Paar (wort1, wort2). Zählen Sie mit defaultdict(int) oder einem normalen Dictionary.

Challenge

Schritt 2: Ăśbergangswahrscheinlichkeiten berechnen

Für die Generierung brauchen wir nicht nur Häufigkeiten, sondern Wahrscheinlichkeiten: Wenn das aktuelle Wort X ist, wie wahrscheinlich ist Wort Y als nächstes?

Bauen Sie ein Dictionary dieser Form:

modell = {
  "Es": [("war", 1.0)],
  "war": [("einmal", 0.5), ("ein", 0.25), ("eine", 0.25)],
  ...
}

Aufgabe: Berechnen Sie für jedes Wort die relativen Häufigkeiten aller Folge-Wörter. Die Summe der Wahrscheinlichkeiten pro Wort muss 1.0 ergeben.

Challenge

Schritt 3: Text generieren

Nun bauen Sie die Generierungsfunktion. Das ist genau die Münze aus der Unplugged-Übung — nur in Code.

import random

def generiere_text(modell, start_wort, laenge=15):
    wort = start_wort
    satz = [wort]
    for _ in range(laenge):
        if wort not in modell:
            break
        nachfolger = modell[wort]
        # Zufällig wählen, gewichtet nach Wahrscheinlichkeit
        wort = random.choices(
            [w for w, p in nachfolger],
            weights=[p for w, p in nachfolger]
        )[0]
        satz.append(wort)
    return " ".join(satz)

Aufgabe: Rufen Sie die Funktion mit verschiedenen Startwörtern auf. Was passiert, wenn Sie mit «Es» starten? Was mit «ein»?

Warning

Häufige Fehler

  • KeyError bei der Generierung: Nicht jedes Wort aus dem Training hat Folge-Wörter. PrĂĽfen Sie mit if wort not in modell: break.
  • Wahrscheinlichkeiten summieren nicht zu 1.0: PrĂĽfen Sie, ob Sie die Häufigkeiten korrekt durch die Gesamtzahl teilen.
  • Immer derselbe Output: Vergessen Sie nicht random.choices() mit Gewichten zu verwenden, nicht random.choice().
  • Satz wird zu lang: Setzen Sie ein vernĂĽnftiges Limit (laenge=15) und brechen Sie ab, wenn das Wort keine Nachfolger hat.

Reflection

Vergleich: Ihr Modell vs. ChatGPT

Ihr Bigramm-ModellChatGPT (GPT-4)
Parameter~50 Übergänge~1,8 Billionen
Kontext1 Wort128.000 Token
Trainingsdaten3 Sätze~13 Billionen Token
ArchitekturMarkov-KetteTransformer + RLHF
GenerierungWort = wahrscheinlichstes nächstesToken = wahrscheinlichstes nächstes

Das Prinzip ist identisch: Nächste Einheit vorhersagen, basierend auf Wahrscheinlichkeiten. Der Unterschied? Massstab.

Bonus: Grösseres Korpus

Laden Sie einen längeren Text (z.B. eine Datei mit allen Grimm-Märchen) und trainieren Sie Ihr Modell damit.

Beobachtung: Wie verändert sich die Qualität der generierten Sätze? Werden sie «besser»? Warum?

Dieser Effekt zeigt genau, warum grosse Sprachmodelle so viel mehr Trainingsdaten brauchen: Mehr Daten = bessere Muster = plausiblere Ausgabe.

Abschlussaufgabe

Kopieren Sie Ihren vollständigen Bigramm-Code unten hinein. Ihr Code sollte:

  1. Trainingsdaten einlesen und Bigramme zählen
  2. Ăśbergangswahrscheinlichkeiten berechnen
  3. Einen Text von mindestens 10 Wörtern generieren

Extra: FĂĽgen Sie einen kurzen Kommentar hinzu, was ĂĽberraschend war am generierten Text.

Antwort wird geladen...
Lokal gespeichert — Login, um Antworten dauerhaft zu sichern.

Quellen & Attribution