Erstellen Sie ein Textzusammenfassungsprojekt mit Hugging Face Transformers: Teil 1

Quellknoten: 1236281

Wann OpenAI im Juli 2020 die dritte Generation ihres auf Textgenerierung spezialisierten Modells für maschinelles Lernen (ML) veröffentlichte, wusste ich, dass etwas anders war. Dieses Modell traf einen Nerv wie kein anderes zuvor. Plötzlich hörte ich Freunde und Kollegen, die vielleicht an Technologie interessiert sind, sich aber normalerweise nicht sehr für die neuesten Fortschritte im Bereich KI/ML interessieren, darüber sprechen. Sogar der Guardian schrieb ein Artikel darüber. Oder, um genau zu sein, die Modell schrieb den Artikel und der Guardian redigierte und veröffentlichte ihn. Es war nicht zu leugnen – GPT-3 war ein Gamechanger.

Nach der Veröffentlichung des Modells begannen die Leute sofort, sich mögliche Anwendungen dafür auszudenken. Innerhalb weniger Wochen sind viele beeindruckende Demos entstanden, die auf der zu finden sind GPT-3-Website. Eine besondere Anwendung, die mir aufgefallen ist, war Textzusammenfassung – die Fähigkeit eines Computers, einen bestimmten Text zu lesen und seinen Inhalt zusammenzufassen. Es ist eine der schwierigsten Aufgaben für einen Computer, weil er zwei Bereiche innerhalb des Bereichs der Verarbeitung natürlicher Sprache (NLP) kombiniert: Leseverstehen und Textgenerierung. Deshalb war ich so beeindruckt von den GPT-3-Demos zur Textzusammenfassung.

Sie können sie ausprobieren Hugging Face Spaces-Website. Mein Favorit ist im Moment ein Anwendung die Zusammenfassungen von Nachrichtenartikeln mit nur der URL des Artikels als Eingabe generiert.

In dieser zweiteiligen Serie schlage ich einen praktischen Leitfaden für Organisationen vor, damit Sie die Qualität von Textzusammenfassungsmodellen für Ihren Bereich beurteilen können.

Tutorial-Übersicht

Viele Organisationen, mit denen ich zusammenarbeite (Wohltätigkeitsorganisationen, Unternehmen, NGOs), haben riesige Mengen an Texten, die sie lesen und zusammenfassen müssen – Finanzberichte oder Nachrichtenartikel, wissenschaftliche Forschungsberichte, Patentanmeldungen, Rechtsverträge und mehr. Natürlich sind diese Organisationen daran interessiert, diese Aufgaben mit NLP-Technologie zu automatisieren. Um die Kunst des Möglichen zu demonstrieren, verwende ich oft die Demos zur Textzusammenfassung, die fast immer beeindrucken.

Aber was jetzt?

Die Herausforderung für diese Organisationen besteht darin, dass sie Textzusammenfassungsmodelle auf der Grundlage von Zusammenfassungen für viele, viele Dokumente bewerten möchten – und nicht für eines nach dem anderen. Sie wollen keinen Praktikanten einstellen, dessen einzige Aufgabe darin besteht, die Bewerbung zu öffnen, ein Dokument einzufügen und auf die Stelle zu klicken Zusammenfassen Knopf, warte auf die Ausgabe, beurteile, ob die Zusammenfassung gut ist, und mache das für Tausende von Dokumenten noch einmal.

Ich habe dieses Tutorial mit Blick auf mein vergangenes Ich von vor vier Wochen geschrieben – es ist das Tutorial, das ich mir damals gewünscht hätte, als ich diese Reise begann. In diesem Sinne ist die Zielgruppe dieses Tutorials jemand, der mit KI/ML vertraut ist und zuvor Transformer-Modelle verwendet hat, aber am Anfang seiner Reise zur Textzusammenfassung steht und tiefer eintauchen möchte. Da es von einem „Anfänger“ und für Anfänger geschrieben wurde, möchte ich die Tatsache betonen, dass dieses Tutorial ist a praktischer Leitfaden – nicht praktischer Leitfaden. Bitte behandeln Sie es so, als ob George EP-Box hatte gesagt:

In Bezug darauf, wie viel technisches Wissen in diesem Tutorial erforderlich ist: Es beinhaltet etwas Codierung in Python, aber die meiste Zeit verwenden wir den Code nur zum Aufrufen von APIs, sodass auch keine tiefen Codierungskenntnisse erforderlich sind. Es ist hilfreich, mit bestimmten Konzepten von ML vertraut zu sein, z. B. was es bedeutet Zug und einsetzen ein Modell, die Konzepte von TAUCHERAUSBILDUNG, Bestätigung und Testdatensätze, und so weiter. Habe mich auch mit dem beschäftigt Transformers-Bibliothek before könnte nützlich sein, da wir diese Bibliothek in diesem Tutorial ausgiebig verwenden. Ich füge auch nützliche Links zum Weiterlesen dieser Konzepte hinzu.

Da dieses Tutorial von einem Anfänger geschrieben wurde, erwarte ich nicht, dass NLP-Experten und fortgeschrittene Deep-Learning-Praktizierende viel von diesem Tutorial mitbekommen. Zumindest nicht aus technischer Sicht – die Lektüre könnte Ihnen trotzdem gefallen, also bitte noch nicht verlassen! Aber Sie müssen sich in Bezug auf meine Vereinfachungen gedulden – ich habe versucht, nach dem Konzept zu leben, alles in diesem Tutorial so einfach wie möglich zu machen, aber nicht einfacher.

Aufbau dieses Tutorials

Diese Serie erstreckt sich über vier Abschnitte, die in zwei Beiträge aufgeteilt sind, in denen wir verschiedene Phasen eines Projekts zur Textzusammenfassung durchlaufen. Im ersten Beitrag (Abschnitt 1) ​​beginnen wir mit der Einführung einer Metrik für Textzusammenfassungsaufgaben – ein Leistungsmaß, mit dem wir beurteilen können, ob eine Zusammenfassung gut oder schlecht ist. Wir führen auch den Datensatz ein, den wir zusammenfassen möchten, und erstellen eine Baseline mit einem No-ML-Modell – wir verwenden eine einfache Heuristik, um eine Zusammenfassung aus einem bestimmten Text zu generieren. Das Erstellen dieser Baseline ist ein äußerst wichtiger Schritt in jedem ML-Projekt, da es uns ermöglicht, zu quantifizieren, wie viel Fortschritt wir durch den Einsatz von KI in der Zukunft machen. Damit können wir die Frage „Lohnt es sich wirklich, in KI-Technologie zu investieren?“ beantworten.

Im zweiten Beitrag verwenden wir ein Modell, das bereits vortrainiert wurde, um Zusammenfassungen zu generieren (Abschnitt 2). Dies ist mit einem modernen Ansatz in ML namens möglich Transferlernen. Dies ist ein weiterer nützlicher Schritt, da wir im Grunde genommen ein handelsübliches Modell nehmen und es an unserem Datensatz testen. Auf diese Weise können wir eine weitere Baseline erstellen, die uns hilft zu sehen, was passiert, wenn wir das Modell tatsächlich auf unserem Datensatz trainieren. Der Ansatz heißt Zero-Shot-Zusammenfassung, weil das Modell keinen Kontakt mit unserem Datensatz hatte.

Danach ist es an der Zeit, ein vortrainiertes Modell zu verwenden und es mit unserem eigenen Datensatz zu trainieren (Abschnitt 3). Dies wird auch genannt Feintuning. Es ermöglicht dem Modell, aus den Mustern und Eigenheiten unserer Daten zu lernen und sich langsam daran anzupassen. Nachdem wir das Modell trainiert haben, verwenden wir es, um Zusammenfassungen zu erstellen (Abschnitt 4).

Um es zusammenzufassen:

  • Teil 1:
    • Abschnitt 1: Verwenden Sie ein No-ML-Modell, um eine Baseline zu erstellen
  • Teil 2:
    • Abschnitt 2: Erstellen Sie Zusammenfassungen mit einem Zero-Shot-Modell
    • Abschnitt 3: Trainieren Sie ein Zusammenfassungsmodell
    • Abschnitt 4: Evaluieren Sie das trainierte Modell

Der gesamte Code für dieses Tutorial ist im Folgenden verfügbar GitHub Repo.

Was werden wir am Ende dieses Tutorials erreicht haben?

Am Ende dieses Tutorials haben wir wird nicht über ein Textzusammenfassungsmodell verfügen, das in der Produktion verwendet werden kann. Wir werden nicht einmal eine haben gut Zusammenfassungsmodell (hier Schrei-Emoji einfügen)!

Was wir stattdessen haben werden, ist ein Ausgangspunkt für die nächste Phase des Projekts, die Experimentierphase. Hier kommt die „Wissenschaft“ in Data Science ins Spiel, denn jetzt geht es darum, mit verschiedenen Modellen und unterschiedlichen Einstellungen zu experimentieren, um zu verstehen, ob ein ausreichend gutes Zusammenfassungsmodell mit den verfügbaren Trainingsdaten trainiert werden kann.

Und um ganz transparent zu sein, es besteht eine gute Chance, dass die Schlussfolgerung lautet, dass die Technologie einfach noch nicht ausgereift ist und das Projekt nicht umgesetzt wird. Und Sie müssen Ihre Geschäftsinteressenten auf diese Möglichkeit vorbereiten. Aber das ist ein Thema für einen anderen Beitrag.

Abschnitt 1: Verwenden Sie ein No-ML-Modell, um eine Baseline zu erstellen

Dies ist der erste Abschnitt unseres Tutorials zum Einrichten eines Textzusammenfassungsprojekts. In diesem Abschnitt legen wir anhand eines sehr einfachen Modells eine Basislinie fest, ohne ML tatsächlich zu verwenden. Dies ist ein sehr wichtiger Schritt in jedem ML-Projekt, da wir so nachvollziehen können, wie viel Wert ML im Laufe des Projekts hinzufügt und ob es sich lohnt, darin zu investieren.

Den Code für das Tutorial finden Sie im Folgenden GitHub Repo.

Daten, Daten, Daten

Jedes ML-Projekt beginnt mit Daten! Wenn möglich, sollten wir immer Daten verwenden, die sich auf das beziehen, was wir mit einem Textzusammenfassungsprojekt erreichen möchten. Wenn unser Ziel beispielsweise darin besteht, Patentanmeldungen zusammenzufassen, sollten wir auch Patentanmeldungen verwenden, um das Modell zu trainieren. Ein großer Vorbehalt für ein ML-Projekt ist, dass die Trainingsdaten normalerweise gekennzeichnet werden müssen. Im Zusammenhang mit der Textzusammenfassung bedeutet dies, dass wir den zusammenzufassenden Text sowie die Zusammenfassung (das Label) bereitstellen müssen. Nur wenn beides bereitgestellt wird, kann das Modell lernen, wie eine gute Zusammenfassung aussieht.

In diesem Tutorial verwenden wir ein öffentlich verfügbares Dataset, aber die Schritte und der Code bleiben genau gleich, wenn wir ein benutzerdefiniertes oder privates Dataset verwenden. Und noch einmal, wenn Sie ein Ziel für Ihr Textzusammenfassungsmodell vor Augen haben und über entsprechende Daten verfügen, verwenden Sie stattdessen bitte Ihre Daten, um das Beste daraus zu machen.

Die von uns verwendeten Daten sind die arXiv-Datensatz, die Zusammenfassungen von arXiv-Artikeln sowie deren Titel enthält. Für unseren Zweck verwenden wir das Abstract als den Text, den wir zusammenfassen möchten, und den Titel als Referenzzusammenfassung. Alle Schritte zum Herunterladen und Vorverarbeiten der Daten sind im Folgenden verfügbar Notizbuch. Wir benötigen eine AWS Identity and Access Management and (IAM)-Rolle, die das Laden von Daten zu und von ermöglicht Amazon Simple Storage-Service (Amazon S3), um dieses Notebook erfolgreich zu betreiben. Der Datensatz wurde als Teil des Papiers entwickelt Zur Verwendung von ArXiv als Datensatz und ist lizenziert unter der Creative Commons CC0 1.0 Universal Public Domain Widmung.

Die Daten werden in drei Datensätze aufgeteilt: Trainings-, Validierungs- und Testdaten. Wenn Sie Ihre eigenen Daten verwenden möchten, stellen Sie sicher, dass dies auch der Fall ist. Das folgende Diagramm veranschaulicht, wie wir die verschiedenen Datensätze verwenden.

Eine häufige Frage an dieser Stelle ist natürlich: Wie viele Daten brauchen wir? Wie Sie sich wahrscheinlich schon denken können, lautet die Antwort: Es kommt darauf an. Es hängt davon ab, wie spezialisiert die Domäne ist (das Zusammenfassen von Patentanmeldungen unterscheidet sich stark vom Zusammenfassen von Nachrichtenartikeln), wie genau das Modell sein muss, um nützlich zu sein, wie viel das Training des Modells kosten sollte und so weiter. Wir kommen zu einem späteren Zeitpunkt auf diese Frage zurück, wenn wir das Modell tatsächlich trainieren, aber kurz gesagt, wir müssen verschiedene Datensatzgrößen ausprobieren, wenn wir uns in der Experimentierphase des Projekts befinden.

Was macht ein gutes Modell aus?

In vielen ML-Projekten ist es ziemlich einfach, die Leistung eines Modells zu messen. Das liegt daran, dass es normalerweise wenig Unklarheit darüber gibt, ob das Ergebnis des Modells korrekt ist. Die Labels im Datensatz sind oft binär (Wahr/Falsch, Ja/Nein) oder kategorial. Auf jeden Fall ist es in diesem Szenario einfach, die Ausgabe des Modells mit der Bezeichnung zu vergleichen und sie als richtig oder falsch zu markieren.

Beim Generieren von Text wird dies schwieriger. Die Zusammenfassungen (die Beschriftungen), die wir in unserem Datensatz bereitstellen, sind nur eine Möglichkeit, Text zusammenzufassen. Aber es gibt viele Möglichkeiten, einen gegebenen Text zusammenzufassen. Selbst wenn das Modell also nicht 1:1 mit unserem Label übereinstimmt, kann die Ausgabe dennoch eine gültige und nützliche Zusammenfassung sein. Wie vergleichen wir also die Zusammenfassung des Modells mit der von uns bereitgestellten? Die Metrik, die in der Textzusammenfassung am häufigsten verwendet wird, um die Qualität eines Modells zu messen, ist die ROUGE Punktzahl. Um die Mechanik dieser Metrik zu verstehen, beziehen Sie sich auf Die ultimative Leistungsmetrik im NLP. Zusammenfassend misst der ROUGE-Score die Überlappung von n-Gramm (zusammenhängende Folge von n Items) zwischen der Modellzusammenfassung (Kandidatenzusammenfassung) und der Referenzzusammenfassung (die Bezeichnung, die wir in unserem Datensatz bereitstellen). Aber das ist natürlich kein perfektes Maß. Um seine Einschränkungen zu verstehen, schauen Sie sich das an ROUGE oder nicht ROUGE?

Wie berechnen wir also den ROUGE-Score? Es gibt einige Python-Pakete, um diese Metrik zu berechnen. Um Konsistenz zu gewährleisten, sollten wir in unserem gesamten Projekt dieselbe Methode verwenden. Da wir zu einem späteren Zeitpunkt in diesem Tutorial ein Trainingsskript aus der Transformers-Bibliothek verwenden werden, anstatt ein eigenes zu schreiben, können wir einfach einen Blick in die Quellcode des Skripts und kopieren Sie den Code, der den ROUGE-Score berechnet:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

Durch die Verwendung dieser Methode zur Berechnung der Punktzahl stellen wir sicher, dass wir während des gesamten Projekts immer Äpfel mit Äpfeln vergleichen.

Diese Funktion berechnet mehrere ROUGE-Scores: rouge1, rouge2, rougeL und rougeLsum. Die „Summe“ in rougeLsum bezieht sich auf die Tatsache, dass diese Metrik über eine gesamte Zusammenfassung berechnet wird, wohingegen rougeL wird als Durchschnitt über einzelne Sätze berechnet. Welchen ROUGE-Score sollten wir also für unser Projekt verwenden? Auch hier müssen wir in der Experimentierphase verschiedene Ansätze ausprobieren. Für was es wert ist, die Original ROUGE-Papier stellt fest, dass „ROUGE-2 und ROUGE-L bei Zusammenfassungsaufgaben für einzelne Dokumente gut funktioniert haben“, während „ROUGE-1 und ROUGE-L bei der Bewertung kurzer Zusammenfassungen hervorragend abschneiden.“

Erstellen Sie die Grundlinie

Als nächstes wollen wir die Baseline erstellen, indem wir ein einfaches Modell ohne ML verwenden. Was bedeutet das? Auf dem Gebiet der Textzusammenfassung verwenden viele Studien einen sehr einfachen Ansatz: Sie nehmen den ersten n Sätze des Textes und erklären ihn zur Candidate Summary. Anschließend vergleichen sie die Kandidatenzusammenfassung mit der Referenzzusammenfassung und berechnen den ROUGE-Score. Dies ist ein einfacher, aber leistungsstarker Ansatz, den wir in wenigen Codezeilen implementieren können (der gesamte Code für diesen Teil befindet sich im Folgenden Notizbuch):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

Für diese Auswertung verwenden wir den Testdatensatz. Das ist sinnvoll, denn nachdem wir das Modell trainiert haben, verwenden wir denselben Testdatensatz auch für die abschließende Auswertung. Wir versuchen auch verschiedene Nummern für n: Wir beginnen nur mit dem ersten Satz als Kandidatenzusammenfassung, dann mit den ersten beiden Sätzen und schließlich mit den ersten drei Sätzen.

Der folgende Screenshot zeigt die Ergebnisse für unser erstes Modell.

Die ROUGE-Scores sind am höchsten, wobei nur der erste Satz die Kandidatenzusammenfassung darstellt. Das bedeutet, dass die Zusammenfassung durch mehr als einen Satz zu ausführlich wird und zu einer niedrigeren Punktzahl führt. Das bedeutet, dass wir die Punktzahlen für die Ein-Satz-Zusammenfassungen als Grundlage verwenden werden.

Es ist wichtig zu beachten, dass diese Zahlen für einen so einfachen Ansatz eigentlich ziemlich gut sind, insbesondere für die rouge1 Ergebnis. Um diese Zahlen in einen Zusammenhang zu bringen, können wir auf verweisen Pegasus-Modelle, die die Ergebnisse eines State-of-the-Art-Modells für verschiedene Datensätze zeigt.

Fazit und wie es weiter geht

In Teil 1 unserer Serie haben wir den Datensatz vorgestellt, den wir während des gesamten Zusammenfassungsprojekts verwenden, sowie eine Metrik zur Bewertung von Zusammenfassungen. Wir haben dann die folgende Baseline mit einem einfachen Modell ohne ML erstellt.

Im nächsten Postverwenden wir ein Zero-Shot-Modell – insbesondere ein Modell, das speziell für die Textzusammenfassung öffentlicher Nachrichtenartikel trainiert wurde. Dieses Modell wird jedoch überhaupt nicht auf unserem Datensatz trainiert (daher der Name „Zero-Shot“).

Ich überlasse es Ihnen als Hausaufgabe, zu erraten, wie sich dieses Zero-Shot-Modell im Vergleich zu unserer sehr einfachen Basislinie verhalten wird. Einerseits wird es ein viel ausgefeilteres Modell sein (es ist eigentlich ein neuronales Netzwerk). Andererseits wird es nur verwendet, um Nachrichtenartikel zusammenzufassen, sodass es möglicherweise mit den Mustern zu kämpfen hat, die dem arXiv-Datensatz inhärent sind.


Über den Autor

Heiko Hotz ist Senior Solutions Architect für KI und maschinelles Lernen und leitet die Natural Language Processing (NLP)-Community innerhalb von AWS. Vor dieser Funktion war er Head of Data Science für den EU-Kundendienst von Amazon. Heiko hilft unseren Kunden dabei, ihre KI/ML-Reise auf AWS erfolgreich zu gestalten, und hat mit Organisationen in vielen Branchen zusammengearbeitet, darunter Versicherungen, Finanzdienstleistungen, Medien und Unterhaltung, Gesundheitswesen, Versorgungsunternehmen und Fertigung. In seiner Freizeit reist Heiko so viel wie möglich.

Zeitstempel:

Mehr von AWS Maschinelles Lernen