Zero-Shot Textklassifikation


Die Textklassifikation ist eine der häufigsten Anwendungen der natürlichen Sprachverarbeitung (NLP). Sie besteht darin, einem Textausschnitt eine Reihe vordefinierter Kategorien zuzuweisen. Je nach Art des Problems kann der Textausschnitt ein Satz, ein Absatz oder sogar ein ganzes Dokument sein. Es gibt viele potenzielle Anwendungen der Textklassifikation in der realen Welt, aber zu den häufigsten gehören Sentiment-Analyse, Themenmodellierung und Absicht, Spam- und Hassrede-Erkennung.
Der Standardansatz zur Textklassifikation besteht darin, einen Klassifikator in einem überwachten Regime zu trainieren. Dazu benötigt man Paare aus Text und zugehörigen Kategorien (auch Labels genannt) aus dem interessierenden Bereich als Trainingsdaten. Dann kann ein beliebiger Klassifikator (z.B. ein neuronales Netzwerk) eine Zuordnungsfunktion vom Text zur wahrscheinlichsten Kategorie lernen. Während dieser Ansatz in vielen Situationen gut funktionieren kann, hängt seine Durchführbarkeit stark von der Verfügbarkeit dieser handbeschrifteten Trainingsdatenpaare ab.
Auch wenn vortrainierte Sprachmodelle wie BERT die benötigte Datenmenge reduzieren können, machen sie diese nicht vollständig überflüssig. Daher bleibt die Datenverfügbarkeit für Anwendungen in der realen Welt die größte Hürde.
Zero-Shot-Lernen
Es gibt zwar verschiedene Definitionen des Zero-Shot-Lernens1, aber im Allgemeinen kann es als ein Regime definiert werden, in dem ein Modell eine Aufgabe löst, auf die es zuvor nicht explizit trainiert wurde.
Es ist wichtig zu verstehen, dass eine „Aufgabe“ sowohl im weiteren als auch im engeren Sinne definiert werden kann: Zum Beispiel zeigten die Autoren von GPT-2, dass ein auf Sprachgenerierung trainiertes Modell auf völlig neue nachgelagerte Aufgaben wie maschinelle Übersetzung2 angewendet werden kann. Gleichzeitig wäre eine engere Definition der Aufgabe, zuvor ungesehene Kategorien in Bildern zu erkennen, wie im OpenAI CLIP-Papier3 gezeigt.
Aber was all diese Ansätze gemeinsam haben, ist die Idee der Extrapolation gelernter Konzepte über das Trainingsregime hinaus. Ein mächtiges Konzept, weil es die Lösbarkeit einer Aufgabe von der Verfügbarkeit von (beschrifteten) Trainingsdaten entkoppelt.
Zero-Shot-Lernen für Textklassifikation
Die Lösung von Textklassifikationsaufgaben mit Zero-Shot-Lernen kann als gutes Beispiel dafür dienen, wie man die Extrapolation gelernter Konzepte über das Trainingsregime hinaus anwenden kann. Eine Möglichkeit, dies zu tun, ist die Verwendung von natürlicher Sprachinferenz (NLI) wie von Yin et al. (2019)4 vorgeschlagen. Es gibt auch andere Ansätze, wie die Berechnung von Abständen zwischen Text-Einbettungen oder die Formulierung des Problems als Lückentext.
Bei NLI besteht die Aufgabe darin zu bestimmen, ob eine Hypothese in Anbetracht einer Prämisse5 wahr (entailment), falsch (contradiction) oder unbestimmt (neutral) ist. Ein typischer NLI-Datensatz besteht aus Satzpaaren mit zugehörigen Labels in der folgenden Form:

Beispiele von http://nlpprogress.com/english/natural_language_inference.html
Yin et al. (2019) schlugen vor, große Sprachmodelle wie BERT, die auf NLI-Datensätzen trainiert sind, zu nutzen und ihre Sprachverständnisfähigkeiten für die Zero-Shot-Textklassifikation auszunutzen. Dies kann geschehen, indem man den interessierenden Text als Prämisse nimmt und für jede potenzielle Kategorie eine Hypothese formuliert, indem man eine sogenannte Hypothesen-Vorlage verwendet. Dann lässt man das NLI-Modell vorhersagen, ob die Prämisse die Hypothese beinhaltet. Schließlich kann die vorhergesagte Wahrscheinlichkeit der Einbeziehung als Wahrscheinlichkeit des Labels interpretiert werden.
Zero-Shot-Textklassifikation mit Hugging Face 🤗
Lass uns die oben formulierte Idee genauer untersuchen, indem wir die hervorragende Hugging Face-Implementierung für Zero-Shot-Textklassifikation verwenden.
Wir sind daran interessiert, den untenstehenden Satz in vordefinierte Themen zu klassifizieren:
topics = ['Web', 'Panorama', 'International', 'Wirtschaft', 'Sport', 'Inland', 'Etat', 'Wissenschaft', 'Kultur']
test_txt = 'Eintracht Frankfurt gewinnt die Europa League nach 6:5-Erfolg im Elfmeterschießen gegen die Glasgow Rangers'
Dank der 🤗 Pipeline-Abstraktion müssen wir die Vorhersageaufgabe nicht selbst definieren. Wir müssen lediglich eine Pipeline instanziieren und die Aufgabe als zero-shot-text-classification definieren. Die Pipeline kümmert sich um die Formulierung der Prämisse und Hypothese sowie um den Umgang mit den Logits und Wahrscheinlichkeiten aus dem Modell.
Wie oben geschrieben, benötigen wir ein Sprachmodell, das auf einer NLI-Aufgabe vortrainiert wurde. Das Standardmodell für Zero-Shot-Textklassifikation in 🤗 ist bart-large-mnli. BART ist ein Transformer-Encoder-Decoder für Sequenz-zu-Sequenz-Modellierung mit einem bidirektionalen (BERT-ähnlichen) Encoder und einem autoregressiven (GPT-ähnlichen) Decoder6. Das mnli-Suffix bedeutet, dass BART anschließend auf dem MultiNLI-Datensatz7 weiter trainiert wurde.
Da wir jedoch deutsche Sätze verwenden und BART nur Englisch unterstützt, müssen wir das Standardmodell durch ein benutzerdefiniertes Modell ersetzen. Dank des 🤗 Modell-Hubs ist es ziemlich einfach, einen geeigneten Kandidaten zu finden. In unserem Fall ist mDeBERTa-v3-base-xnli-multilingual-nli-2mil7 ein solcher Kandidat. Lass uns den Namen kurz entschlüsseln für ein besseres Verständnis: Es ist eine mehrsprachige Version von DeBERTa-v3-base (das selbst eine verbesserte Version von BERT/RoBERTa8 ist), die anschließend auf zwei cross-lingualen NLI-Datensätzen (XNLI9 und multilingual-NLI-26lang10) weiter trainiert wurde.
Mit der richtigen Aufgabe und dem richtigen Modell können wir nun die Pipeline instanziieren:
from transformers import pipeline
model = 'MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7'
pipe = pipeline(task='zero-shot-classification', model=model, tokenizer=model)
Als nächstes rufen wir die Pipeline auf, um die wahrscheinlichste Kategorie unseres Textes basierend auf den Kandidaten vorherzusagen. Aber als letzten Schritt müssen wir auch die Standard-Hypothesen-Vorlage ersetzen. Dies ist notwendig, da die Standardvorlage wieder auf Englisch ist. Daher definieren wir die Vorlage als 'Das Thema ist {}'. Beachte, dass {} ein Platzhalter für die zuvor definierten Themenkandidaten ist. Du kannst jede Vorlage definieren, die dir gefällt, solange sie einen Platzhalter für die Kandidaten enthält:
template_de = 'Das Thema ist {}'
prediction = pipe(test_txt, topics, hypothesis_template=template_de)
Schließlich können wir die Vorhersage aus der Pipeline bewerten. Der untenstehende Code gibt die drei wahrscheinlichsten Themen zusammen mit ihren vorhergesagten Wahrscheinlichkeiten aus:
print(f'Zero-shot prediction for: \n {prediction["sequence"]}')
top_3 = zip(prediction['labels'][0:3], prediction['scores'][0:3])
for label, score in top_3:
print(f'{label} - {score:.2%}')Zero-shot prediction for:
Eintracht Frankfurt gewinnt die Europa League nach 6:5-Erfolg im Elfmeterschießen gegen die Glasgow Rangers
Sport - 77.41%
International - 15.69%
Inland - 5.29%
Wie man sehen kann, liefert das Zero-Shot-Modell ein vernünftiges Ergebnis, wobei „Sport“ das wahrscheinlichste Thema ist, gefolgt von „International“ und „Inland“.
Unten sind einige weitere Beispiele aus anderen Kategorien. Wie zuvor sind die Ergebnisse insgesamt recht vernünftig. Beachte, wie das Modell für den zweiten Text eine unerwartet niedrige Wahrscheinlichkeit für „Kultur“ vorhersagt.
further_examples = ['Verbraucher halten sich wegen steigender Zinsen und Inflation beim Immobilienkauf zurück',
'„Die bitteren Tränen der Petra von Kant“ von 1972 geschlechtsumgewandelt und neu verfilmt',
'Eine 541 Millionen Jahre alte fossile Alge weist erstaunliche Ähnlichkeit zu noch heute existierenden Vertretern auf']
for txt in further_examples:
prediction = pipe(txt, topics, hypothesis_template=template_de)
print(f'Zero-shot prediction for: \n {prediction["sequence"]}')
top_3 = zip(prediction['labels'][0:3], prediction['scores'][0:3])
for label, score in top_3:
print(f'{label} - {score:.2%}')Zero-shot prediction for:
Verbraucher halten sich wegen steigender Zinsen und Inflation beim Immobilienkauf zurück
Wirtschaft - 96.11%
Inland - 1.69%
Panorama - 0.70%
Zero-shot prediction for:
„Die bitteren Tränen der Petra von Kant“ von 1972 geschlechtsumgewandelt und neu verfilmt
International - 50.95%
Inland - 16.40%
Kultur - 7.76%
Zero-shot prediction for:
Eine 541 Millionen Jahre alte fossile Alge weist erstaunliche Ähnlichkeit zu noch heute existierenden Vertretern auf
Wissenschaft - 67.52%
Web - 8.14%
Inland - 6.91%
Der gesamte Code kann auf GitHub gefunden werden. Neben den oben genannten Beispielen findest du dort auch Anwendungen der Zero-Shot-Textklassifikation auf zwei beschrifteten Datensätzen, einschließlich einer Bewertung der Genauigkeit. Darüber hinaus habe ich einige Prompt-Tuning durchgeführt, indem ich mit der Hypothesen-Vorlage experimentiert habe.
Abschließende Gedanken
Zero-Shot-Textklassifikation bietet einen geeigneten Ansatz, wenn entweder Trainingsdaten begrenzt (oder sogar nicht vorhanden) sind oder als einfach zu implementierende Benchmark für anspruchsvollere Methoden. Während explizite Ansätze, wie das Feinabstimmen großer vortrainierter Modelle, sicherlich immer noch implizite Ansätze wie das Zero-Shot-Lernen übertreffen, macht ihre universelle Anwendbarkeit sie sehr attraktiv.
Darüber hinaus sollten wir erwarten, dass Zero-Shot-Lernen im Allgemeinen in den nächsten Jahren wichtiger wird. Dies liegt daran, dass sich die Art und Weise, wie wir Modelle zur Lösung von Aufgaben verwenden werden, mit der zunehmenden Bedeutung großer vortrainierter Modelle weiterentwickeln wird. Daher plädiere ich dafür, dass Zero-Shot-Techniken bereits heute Teil des Werkzeugsatzes eines modernen Datenwissenschaftlers sein sollten
Quellen:
1 https://joeddav.github.io/blog/2020/05/29/ZSL.html
2 https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
3 https://arxiv.org/pdf/2103.00020.pdf
4 https://arxiv.org/pdf/1909.00161.pdf
5 http://nlpprogress.com/english/natural_language_inference.html
6 https://arxiv.org/pdf/1910.13461.pdf
7 https://huggingface.co/datasets/multi_nli
8 https://arxiv.org/pdf/2006.03654.pdf
9 https://huggingface.co/datasets/xnli
10 https://huggingface.co/datasets/MoritzLaurer/multilingual-NLI-26lang-2mil7

