SwabianGPT: Wie ich ein LLM für Dialekt-Übersetzung feingetuned habe

1/2/2025

Summary

Eine praktische Reise durch das Fine-Tuning eines LLAMA 3.1 Modells zur Übersetzung zwischen Standarddeutsch und schwäbischem Dialekt, Datenaufbereitung mit synthetischem Kontext, QLoRA-basierte Trainingstechniken und Evaluierungen aus der Praxis

Einführung

Im Oktober 2024 begann ich mein Bachelor-Studium in Data Science und Künstlicher Intelligenz. Als Teil unserer anfänglichen Kursarbeit wurden wir Studenten beauftragt, ein Machine Learning- oder KI-Projekt zu entwickeln, um praktische Erfahrung in diesem Bereich zu sammeln.
Da ich zuvor viel über die Architektur und Funktionsweise von Transformern und Large Language Models (LLMs) gelesen hatte, entwickelte ich ein starkes Interesse an diesem Bereich. Dies führte mich dazu, mein Projekt auf das Fine-Tuning eines solchen LLMs zu fokussieren, spezifisch kam mir die Idee zur Entwicklung eines Übersetzungssystems zwischen Standarddeutsch und schwäbischem Dialekt.
Bei der Auswahl einer Modellarchitektur erwog ich spezialisierte Übersetzungsmodelle wie T5. Angesichts meines Interesses, LLM-Fine-Tuning-Techniken zu erkunden, entschied ich mich jedoch für das LLAMA 3.1 8B Modell, trotz seiner potenziellen Limitierungen für Übersetzungsaufgaben. Diese Entscheidung stimmte mit meinen Lernzielen überein, auch wenn spezialisierte Übersetzungsmodelle möglicherweise eine überlegene Leistung erzielen könnten.

Datenaufbereitung

Bevor ich mit dem eigentlichen Fine-Tuning-Prozess zu beginnen konnte, musste ich einen geeigneten Datensatz finden. Glücklicherweise entdeckte ich www.schwaebisch-schwaetza.de, eine Website, die ein umfassendes Wörterbuch mit über 12.000 Übersetzungen von Standarddeutsch zum schwäbischem Dialekt hostet. Auf Nachfrage erklärte sich der Administrator dieser Website glücklicherweise bereit mir diese Daten für das Projekt bereitzustellen.
Der Datensatz präsentierte jedoch zwei Hauptherausforderungen: Er war unstrukturiert und es fehlte an kontextuellen Informationen um die Wortpaare herum, was entscheidend ist, damit das LLM dialektale Muster effektiv lernen kann. Hier ist ein Beispiel des ursprünglichen Datensatzes:
Schwäbisch: A blaus Mol
Standarddeutsch: Bluterguss
Um Kontext hinzuzufügen, kam ich schließlich auf die Idee, ein State-of-the-Art LLM zu nutzen, um synthetischen Kontext um die ursprünglichen Wörter zu erstellen. Also nutzte ich die Claude-API und XAIs Grok-API, die ich promptete, natürliche Sätze um jedes Wortpaar zu generieren: Hier ist das Beispiel nach diesem Schritt:
Schwäbisch: Du hosch ja a blaus Mol am Arm! Wa isch denn do bassiert
Standarddeutsch: Du hast ja einen schlimmen Bluterguss am Arm! Was ist denn da passiert?
Dies verbesserte die Datenqualität signifikant, obwohl einige Übersetzungen nicht perfekt waren. Anschließend lud ich diesen erweiterten Datensatz auf Hugging Face hoch, kann ihn aber leider aufgrund meiner Vereinbarung mit dem Website-Besitzer nicht öffentlich teilen.

SFT-Fine-Tuning

Nun war ich endlich bereit um mit dem eigentlichen Finetuning zu starten. Dazu beschloss ich zuerst, den Fine-Tuning-Prozess in zwei Phasen aufzuteilen: SFT (Supervised Fine-Tuning) und DPO (Direct Preference Optimization). Bevor ich jedoch näher in diese Methoden eintauche, lass mich das Kernkonzept von QLoRA erklären, welches effizientes Fine-Tuning erst möglich macht.
Traditionell erfordert das Fine-Tuning eines LLMs die Aktualisierung aller Parameter im Modell basierend auf den neuen Daten, was signifikante Rechenressourcen verlangt. Die LoRA-Technik verfolgt einen etwas anderen Ansatz: Anstatt alle Parameter zu aktualisieren, friert es sie diese ein und fügt eine kleine Anzahl trainierbarer Parameter zusätzlich zu den bestehenden hinzu. Diese innovative Methode macht Fine-Tuning hocheffizient und ermöglicht das Training auf einer einzelnen Grafikkarte. Das „Q" in QLoRA steht dabei für Quantisierung, was sich auf die Reduzierung der Präzision von Modellgewichten bezieht. Standard-Modellgewichte werden typischerweise als 32-Bit-Gleitkommazahlen gespeichert, aber wir können diese Präzision auf verschiedene Level reduzieren: 16-Bit, 8-Bit, 4-Bit oder sogar experimentelle 1-Bit-Darstellungen. Während die Reduzierung der Präzision die Modelleffektivität leicht beeinträchtigen kann, verringert sie dramatisch die benötigten Rechenressourcen sowohl für Training als auch Inferenz. Diese fundamentalen Konzepte untermauern beide Fine-Tuning-Methoden, die ich einsetzte. Für die SFT-Phase erweiterte ich den zuvor erstellten Datensatz, indem ich spezifische Prompts zu jedem Datenpunkt hinzufügte. Diese Prompts beinhalteten Anweisungen wie „übersetze den folgenden Satz ins Standarddeutsche: {Schwäbischer Satz}" oder umgekehrt für die entgegengesetzte Richtung. Ich implementierte das Training mit UnslothAIs Notebook für LLAMA 3.1 8B. UnslothAI ist ein Framework, das diese Fine-Tuning-Techniken effizient implementiert und den Trainingsprozess deutlich vereinfacht. Es ist einfach zu verwenden und integriert sich perfekt mit Hugging Face. Das Training wurde auf Google Colab für 2 Epochen durchgeführt, was zu einem zufriedenstellenden Loss-Wert von ungefähr 0,8 führte, was für diese Übersetzungsaufgabe angemessen ist.

DPO-Fine-Tuning

Vielleicht bist du auch schon einmal auf ChatGPTs Feedback-Interface gestoßen, was sich auf die zweite Stufe des Fine-Tunings bezieht. Traditionell nutzte diese Stufe RLHF (Reinforcement Learning from Human Feedback), wo Modelle lernen, indem sie Paare von Ausgaben vergleichen, um zu bestimmen, welche besser ist. DPO (Direct Preference Optimization) folgt einem ähnlichen Prinzip des Lernens aus menschlichen Präferenzen.
DPO-Fine-Tuning erfordert einen Präferenz-Datensatz, der drei Schlüsselspalten enthält: Prompt, Chosen und Rejected. Um diesen Datensatz effizient zu erstellen, wählte ich 300 Beispiele aus meinem initialen Datensatz aus und generierte zwei Modellantworten für jeden Prompt, die ich in einer CSV-Datei speicherte. Ich evaluierte dann manuell die Paare von Ausgaben, wählte die bessere Antwort für die „Chosen"-Spalte aus und platzierte die Alternative in der „Rejected"-Spalte. Während dieser manuelle Evaluierungsprozess mühsam war, war er notwendig, um Qualität sicherzustellen. Alternative Ansätze wie Community-Voting könnten funktionieren, wären aber ebenfalls zeitaufwendig. Hier ist ein Beispiel aus dem finalen Datensatz:
Prompt: „Übersetze ins Hochdeutsche: A blaus Mol"
Chosen: „Bluterguss"
Rejected: „Ein blauer Fleck"
Anschließend lud ich den kuratierten Präferenz-Datensatz erneut auf Hugging Face hoch. Glücklicherweise bietet UnslothAI ebenfalls ein Colab-Notebook an, welches speziell für DPO-Fine-Tuning entwickelt wurde, was es mir erlaubte, Konsistenz in meinem Entwicklungs-Framework zu bewahren. Ich führte das Training für 3 Epochen durch und veröffentlichte das resultierende Modell auf Hugging Face.

Evaluierung und Fazit

Anstatt wie üblich formale Benchmarks zu implementieren, evaluierte ich das Modell ausschließlich durch praktisches Testen, dazu führte verschiedene Übersetzungsversuche durch. Während das Modell meist die korrekten Übersetzungen produzierte, war es nicht konsistent mit der Präzision der Übersetzung. Einige Übersetzungsfehler können auf Qualitätsprobleme des Datensatzes zurückgeführt werden, insbesondere bei den von Claude und Grok generierten Beispielen, die gelegentlich ungenaue oder irreführende Übersetzungen enthielten. Lass mich das mit einem realen Beispiel aus einem schwäbischen Lied demonstrieren: "Oinr isch immer der Arsch, und er woiß id mol warum." Das Modell produzierte verschiedene Übersetzungen:
Eine tiefergreifende, fundamentale Herausforderung liegt in der Natur des schwäbischen Dialekts selbst. Als eine primär gesprochene Sprache ohne standardisierte Rechtschreibung oder Verwendung variiert Schwäbisch signifikant über verschiedene Regionen hinweg. Selbst als lebenslanger Bewohner eines schwäbischsprachigen Gebiets in Deutschland begegnete ich unbekannten Ausdrücken beim Durchsehen des Datensatzes. Diese regionale Variation macht die Erstellung eines umfassenden, "optimalen" Datensatzes besonders herausfordernd. Folgende potenziellen Verbesserungen könnten meiner Ansicht nach die Leistung des Modells noch weiter steigern:
Dieser Ansatz repräsentiert einen aufregenden Bereich für zukünftige Erkundung und Entwicklung.

Ressourcen & Code

Der Code für dieses Projekt, einschließlich der Fine-Tuning-Notebooks und Modellkonfigurationen, ist in meinem GitHub-Repository verfügbar: SwabianGPT.
Während du den Code als Referenz oder Inspiration für ähnliche Projekte nutzen kannst, beachte bitte, dass die exakte Reproduktion der Ergebnisse nicht möglich sein wird, da der Trainingsdatensatz aufgrund von Lizenzvereinbarungen nicht geteilt werden kann.
Das Repository beinhaltet:

Abschließende Worte

Ich hoffe, du hast das Lesen dieses Artikels genossen. Wenn du Fragen oder Anmerkungen hast, kontaktiere mich gerne.
Dein Mario 💚
SwabianGPT: Wie ich ein LLM für Dialekt-Übersetzung feingetuned habe | Mario Raach