Encoder-Decoder-Modelle für die Textzusammenfassung in Keras
Die Textzusammenfassung ist ein Problem bei der Verarbeitung natürlicher Sprache bei der Erstellung einer kurzen, genauen und flüssigen Zusammenfassung eines Quelldokuments.
Die für die maschinelle Übersetzung entwickelte Encoder-Decoder-Architektur eines wiederkehrenden neuronalen Netzwerks hat sich bei der Anwendung auf das Problem der Textzusammenfassung als wirksam erwiesen.
Es kann schwierig sein, diese Architektur in der Deep-Learning-Bibliothek von Keras anzuwenden, da ein Teil der Flexibilität geopfert wird, um die Bibliothek sauber, einfach und benutzerfreundlich zu gestalten.
In diesem Tutorial erfahren Sie, wie Sie die Encoder-Decoder-Architektur für die Textzusammenfassung in Keras implementieren.
Nach Abschluss dieses Tutorials wissen Sie:
- Wie die Textzusammenfassung mithilfe der wiederkehrenden neuronalen Netzwerkarchitektur Encoder-Decoder angegangen werden kann.
- Wie verschiedene Encoder und Decoder für das Problem implementiert werden können.
- Drei Modelle, mit denen Sie die Architektur für die Textzusammenfassung in Keras implementieren können.
Starten Sie Ihr Projekt mit meinem neuen Buch „Deep Learning for Natural Language Processing“, einschließlich Schritt-für-Schritt-Anleitungen und den Python-Quellcode-Dateien für alle Beispiele.
Fangen wir an.
Tutorial-Übersicht
Dieses Tutorial ist in 5 Teile unterteilt; sie sind:
- Encoder-Decoder-Architektur
- Encoder für die Textzusammenfassung
- Decoder zur Textzusammenfassung
- Quelltext lesen
- Implementierungsmodelle
Encoder-Decoder-Architektur
Die Encoder-Decoder-Architektur ist eine Möglichkeit, wiederkehrende neuronale Netze für Sequenzvorhersageprobleme zu organisieren, die eine variable Anzahl von Eingaben, Ausgaben oder sowohl Eingaben als auch Ausgaben haben.
Die Architektur umfasst zwei Komponenten: einen Encoder und einen Decoder.
- Encoder: Der Encoder liest die gesamte Eingabesequenz und codiert sie in eine interne Darstellung, häufig einen Vektor fester Länge, der als Kontextvektor bezeichnet wird.
- Decoder: Der Decoder liest die codierte Eingabesequenz vom Encoder und generiert die Ausgabesequenz.
Weitere Informationen zur Encoder-Decoder-Architektur finden Sie im Beitrag:
- Encoder-Decoder-Lang-Kurzzeit-Speichernetzwerke
Sowohl das Encoder- als auch das Decoder-Untermodell werden gemeinsam, also gleichzeitig, trainiert.
Dies ist eine ziemliche Leistung, da anspruchsvolle Probleme in natürlicher Sprache traditionell die Entwicklung separater Modelle erforderten, die später in einer Pipeline aneinandergereiht wurden, wodurch sich während des Sequenzgenerierungsprozesses Fehler anhäufen konnten.
Die gesamte codierte Eingabe wird als Kontext zum Generieren jedes Schritts in der Ausgabe verwendet. Obwohl dies funktioniert, begrenzt die Kodierung der Eingabe mit fester Länge die Länge der Ausgabesequenzen, die generiert werden können.
Eine Erweiterung der Encoder-Decoder-Architektur besteht darin, eine ausdrucksstärkere Form der codierten Eingabesequenz bereitzustellen und dem Decoder zu ermöglichen, zu lernen, worauf er bei der Generierung jedes Schritts der Ausgabesequenz auf die codierte Eingabe achten muss.
Diese Erweiterung der Architektur wird Aufmerksamkeit genannt.
Weitere Informationen zur Aufmerksamkeit in der Encoder-Decoder-Architektur finden Sie im Beitrag:
- Aufmerksamkeit in wiederkehrenden neuronalen Netzwerken im Langzeit-Kurzzeitgedächtnis
Die Encoder-Decoder-Architektur mit Aufmerksamkeit ist beliebt für eine Reihe von Problemen bei der Verarbeitung natürlicher Sprache, die Ausgabesequenzen variabler Länge erzeugen, wie z. B. Textzusammenfassung.
Die Anwendung der Architektur auf die Textzusammenfassung ist wie folgt:
- Encoder: Der Encoder ist dafür verantwortlich, das Quelldokument zu lesen und es in eine interne Darstellung zu kodieren.
- Decoder: Der Decoder ist ein Sprachmodell, das für die Generierung jedes Wortes in der Ausgabezusammenfassung unter Verwendung der codierten Darstellung des Quelldokuments verantwortlich ist.
Encoder für die Textzusammenfassung
Die Komplexität des Modells liegt im Encoder, da er für die Erfassung der Bedeutung des Quelldokuments verantwortlich ist.
Es können verschiedene Arten von Encodern verwendet werden, obwohl häufiger bidirektionale rekurrente neuronale Netze wie LSTMs verwendet werden. In Fällen, in denen rekurrente neuronale Netze im Encoder verwendet werden, wird eine Worteinbettung verwendet, um eine verteilte Darstellung von Wörtern bereitzustellen.
Alexander Rush et al. verwendet einen einfachen Bag-of-Words-Encoder, der die Wortreihenfolge verwirft, und Faltungsencoder, die explizit versuchen, N-Gramme zu erfassen.
Unser grundlegendstes Modell verwendet einfach die Wortmenge des Eingabesatzes, die bis zur Größe H eingebettet ist, und ignoriert dabei Eigenschaften der ursprünglichen Reihenfolge oder Beziehungen zwischen benachbarten Wörtern. […] Um einige der Modellierungsprobleme mit Bag-of-Words zu lösen, erwägen wir auch die Verwendung eines Deep Convolutional Encoders für den Eingabesatz.
— Ein neuronales Aufmerksamkeitsmodell für die Zusammenfassung abstrakter Sätze, 2015.
Konstantin Lopyrev verwendet einen tiefen Stapel von 4 wiederkehrenden LSTM-Neuronalen Netzen als Encoder.
Dem Encoder wird der Text eines Nachrichtenartikels wortweise als Eingabe zugeführt. Jedes Wort durchläuft zunächst eine Einbettungsschicht, die das Wort in eine verteilte Darstellung umwandelt. Diese verteilte Darstellung wird dann mithilfe eines mehrschichtigen neuronalen Netzwerks kombiniert
– Generierung von Schlagzeilen mit wiederkehrenden neuronalen Netzen, 2015.
Abigail See et al. Verwenden Sie als Encoder ein einschichtiges bidirektionales LSTM.
Die Token des Artikels w(i) werden einzeln in den Encoder (ein einschichtiges bidirektionales LSTM) eingespeist, wodurch eine Folge von versteckten Encoderzuständen h(i) entsteht.
– Auf den Punkt kommen: Zusammenfassung mit Pointer-Generator-Netzwerken, 2017.
Ramesh Nallapati et al. Verwenden Sie in ihren Encodern bidirektionale wiederkehrende GRU-Neuronale Netze und integrieren Sie zusätzliche Informationen zu jedem Wort in der Eingabesequenz.
Der Encoder besteht aus einem bidirektionalen GRU-RNN…
– Abstrakte Textzusammenfassung mithilfe von Sequenz-zu-Sequenz-RNNs und darüber hinaus, 2016.
Decoder zur Textzusammenfassung
Der Decoder muss jedes Wort in der Ausgabesequenz anhand von zwei Informationsquellen generieren:
- Kontextvektor: Die vom Encoder bereitgestellte codierte Darstellung des Quelldokuments.
- Generierte Sequenz: Das Wort oder die Wortfolge, die bereits als Zusammenfassung generiert wurde.
Der Kontextvektor kann eine Codierung mit fester Länge sein, wie in der einfachen Encoder-Decoder-Architektur, oder eine ausdrucksstärkere Form, die über einen Aufmerksamkeitsmechanismus gefiltert wird.
Die generierte Sequenz wird mit wenig Vorbereitung bereitgestellt, beispielsweise einer verteilten Darstellung jedes generierten Wortes über eine Worteinbettung.
Bei jedem Schritt t empfängt der Decoder (ein einschichtiger unidirektionaler LSTM) die Worteinbettung des vorherigen Wortes (während des Trainings ist dies das vorherige Wort der Referenzzusammenfassung; zum Testzeitpunkt ist es das vom Decoder ausgegebene vorherige Wort).
– Auf den Punkt kommen: Zusammenfassung mit Pointer-Generator-Netzwerken, 2017.
Alexander Rush et al. Zeigen Sie dies übersichtlich in einem Diagramm, in dem x das Quelldokument ist, enc der Encoder ist, der die interne Darstellung des Quelldokuments bereitstellt, und yc das ist Folge zuvor generierter Wörter.
Um Wörter einzeln zu generieren, muss das Modell so lange ausgeführt werden, bis eine maximale Anzahl zusammenfassender Wörter generiert ist oder ein spezielles Ende-der-Sequenz-Token erreicht ist.
Der Prozess muss gestartet werden, indem dem Modell ein spezielles Start-of-Sequence-Token zur Verfügung gestellt wird, um das erste Wort zu generieren.
Der Decoder verwendet als Eingabe die verborgenen Ebenen, die nach Eingabe des letzten Wortes des Eingabetextes generiert werden. Zunächst wird ein Sequenzendesymbol als Eingabe eingegeben, wobei wiederum eine Einbettungsschicht verwendet wird, um das Symbol in eine verteilte Darstellung umzuwandeln. […]. Nach der Generierung jedes Wortes wird dasselbe Wort als Eingabe eingegeben, wenn das nächste Wort generiert wird.
– Generieren von Schlagzeilen mit wiederkehrenden neuronalen Netzen, 2015.
Ramesh Nallapati et al. Generieren Sie die Ausgabesequenz mithilfe eines GRU-rekurrenten neuronalen Netzwerks.
… der Decoder aus einem unidirektionalen GRU-RNN mit der gleichen Hidden-State-Größe wie der Encoder besteht
Quelltext lesen
Die Anwendung dieser Architektur ist flexibel, je nach dem konkreten Textzusammenfassungsproblem, das angesprochen wird.
Die meisten Studien konzentrieren sich auf einen oder nur wenige Quellsätze im Encoder, dies muss jedoch nicht der Fall sein.
Beispielsweise könnte der Encoder so konfiguriert werden, dass er das Quelldokument in unterschiedlich großen Blöcken liest und codiert:
- Satz.
- Absatz.
- Seite.
- Dokumentieren.
Ebenso kann der Decoder so konfiguriert werden, dass er jeden Block zusammenfasst oder die codierten Blöcke aggregiert und eine umfassendere Zusammenfassung ausgibt.
Auf diesem Weg wurden einige Arbeiten durchgeführt, bei denen Alexander Rush et al. Verwenden Sie ein hierarchisches Encodermodell mit Berücksichtigung sowohl auf Wort- als auch auf Satzebene.
Dieses Modell zielt darauf ab, diese Vorstellung von zwei Wichtigkeitsebenen zu erfassen, indem zwei bidirektionale RNNs auf der Quellenseite verwendet werden, eines auf Wortebene und das andere auf Satzebene. Der Aufmerksamkeitsmechanismus wirkt auf beiden Ebenen gleichzeitig
– Ein neuronales Aufmerksamkeitsmodell für die Zusammenfassung abstrakter Sätze, 2015.
Implementierungsmodelle
In diesem Abschnitt sehen wir uns an, wie die Encoder-Decoder-Architektur für die Textzusammenfassung in der Keras Deep Learning-Bibliothek implementiert wird.
Allgemeines Modell
Eine einfache Realisierung des Modells umfasst einen Encoder mit einer Einbettungseingabe, gefolgt von einer verborgenen LSTM-Ebene, die eine Darstellung des Quelldokuments mit fester Länge erzeugt.
Der Decoder liest die Darstellung und eine Einbettung des zuletzt generierten Worts und verwendet diese Eingaben, um jedes Wort in der Ausgabezusammenfassung zu generieren.
Es gibt ein Problem.
Keras erlaubt keine rekursiven Schleifen, bei denen die Ausgabe des Modells automatisch als Eingabe in das Modell eingespeist wird.
Das bedeutet, dass das oben beschriebene Modell nicht direkt in Keras implementiert werden kann (möglicherweise aber in einer flexibleren Plattform wie TensorFlow).
Stattdessen werden wir uns drei Varianten des Modells ansehen, die wir in Keras implementieren können.
Alternative 1: One-Shot-Modell
Das erste alternative Modell besteht darin, die gesamte Ausgabesequenz auf einmal zu generieren.
Das heißt, der Decoder verwendet allein den Kontextvektor, um die Ausgabesequenz zu generieren.
Hier ist ein Beispielcode für diesen Ansatz in Keras unter Verwendung der funktionalen API.
vocab_size = ...
src_txt_length = ...
sum_txt_length = ...
# encoder input model
inputs = Input(shape=(src_txt_length,))
encoder1 = Embedding(vocab_size, 128)(inputs)
encoder2 = LSTM(128)(encoder1)
encoder3 = RepeatVector(sum_txt_length)(encoder2)
# decoder output model
decoder1 = LSTM(128, return_sequences=True)(encoder3)
outputs = TimeDistributed(Dense(vocab_size, activation='softmax'))(decoder1)
# tie it together
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam')
Dieses Modell stellt eine starke Belastung für den Decoder dar.
Es ist wahrscheinlich, dass der Decoder nicht über ausreichend Kontext verfügt, um eine kohärente Ausgabesequenz zu erzeugen, da er die Wörter und ihre Reihenfolge auswählen muss.
Alternative 2: Rekursives Modell A
Ein zweites alternatives Modell besteht darin, ein Modell zu entwickeln, das eine Einzelwortvorhersage generiert und diese rekursiv aufruft.
Das heißt, der Decoder verwendet den Kontextvektor und die verteilte Darstellung aller bisher generierten Wörter als Eingabe, um das nächste Wort zu generieren.
Ein Sprachmodell kann verwendet werden, um die bisher generierte Wortfolge zu interpretieren, um einen zweiten Kontextvektor bereitzustellen, der mit der Darstellung des Quelldokuments kombiniert wird, um das nächste Wort in der Folge zu generieren.
Die Zusammenfassung wird durch rekursiven Aufruf des Modells mit angehängtem zuvor generiertem Wort (oder genauer gesagt dem während des Trainings erwarteten vorherigen Wort) erstellt.
Die Kontextvektoren könnten konzentriert oder addiert werden, um dem Decoder einen breiteren Kontext zur Interpretation und Ausgabe des nächsten Worts bereitzustellen.
Hier ist ein Beispielcode für diesen Ansatz in Keras unter Verwendung der funktionalen API.
vocab_size = ...
src_txt_length = ...
sum_txt_length = ...
# source text input model
inputs1 = Input(shape=(src_txt_length,))
am1 = Embedding(vocab_size, 128)(inputs1)
am2 = LSTM(128)(am1)
# summary input model
inputs2 = Input(shape=(sum_txt_length,))
sm1 = = Embedding(vocab_size, 128)(inputs2)
sm2 = LSTM(128)(sm1)
# decoder output model
decoder1 = concatenate([am2, sm2])
outputs = Dense(vocab_size, activation='softmax')(decoder1)
# tie it together [article, summary] [word]
model = Model(inputs=[inputs1, inputs2], outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam')
Dies ist besser, da der Decoder die Möglichkeit erhält, die zuvor generierten Wörter und das Quelldokument als Kontext für die Generierung des nächsten Wortes zu verwenden.
Es stellt eine Belastung für den Zusammenführungsvorgang und den Decoder dar, zu interpretieren, wo er sich bei der Generierung der Ausgabesequenz befindet.
Alternative 3: Rekursives Modell B
Bei dieser dritten Alternative generiert der Encoder eine Kontextvektordarstellung des Quelldokuments.
Dieses Dokument wird dem Decoder bei jedem Schritt der generierten Ausgabesequenz zugeführt. Dadurch kann der Decoder denselben internen Zustand aufbauen, der zum Generieren der Wörter in der Ausgabesequenz verwendet wurde, sodass er für die Generierung des nächsten Wortes in der Sequenz vorbereitet ist.
Dieser Vorgang wird dann wiederholt, indem das Modell für jedes Wort in der Ausgabesequenz immer wieder aufgerufen wird, bis ein maximales Längen- oder Sequenzende-Token generiert wird.
Hier ist ein Beispielcode für diesen Ansatz in Keras unter Verwendung der funktionalen API.
vocab_size = ...
src_txt_length = ...
sum_txt_length = ...
# article input model
inputs1 = Input(shape=(src_txt_length,))
article1 = Embedding(vocab_size, 128)(inputs1)
article2 = LSTM(128)(article1)
article3 = RepeatVector(sum_txt_length)(article2)
# summary input model
inputs2 = Input(shape=(sum_txt_length,))
summ1 = Embedding(vocab_size, 128)(inputs2)
# decoder model
decoder1 = concatenate([article3, summ1])
decoder2 = LSTM(128)(decoder1)
outputs = Dense(vocab_size, activation='softmax')(decoder2)
# tie it together [article, summary] [word]
model = Model(inputs=[inputs1, inputs2], outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam')
Haben Sie weitere alternative Implementierungsideen?
Lassen Sie es mich in den Kommentaren unten wissen.
Weiterführende Literatur
In diesem Abschnitt finden Sie weitere Ressourcen zum Thema, wenn Sie tiefer in die Materie eintauchen möchten.
Papiere
- Ein neuronales Aufmerksamkeitsmodell für die Zusammenfassung abstrakter Sätze, 2015.
- Generierung von Schlagzeilen mit wiederkehrenden neuronalen Netzen, 2015.
- Abstrakte Textzusammenfassung mithilfe von Sequenz-zu-Sequenz-RNNs und darüber hinaus, 2016.
- Auf den Punkt kommen: Zusammenfassung mit Pointer-Generator-Netzwerken, 2017.
Verwandt
- Encoder-Decoder-Lang-Kurzzeit-Speichernetzwerke
- Aufmerksamkeit in wiederkehrenden neuronalen Netzwerken im Langzeit-Kurzzeitgedächtnis
Zusammenfassung
In diesem Tutorial haben Sie erfahren, wie Sie die Encoder-Decoder-Architektur für die Textzusammenfassung in der Keras-Deep-Learning-Bibliothek implementieren.
Konkret haben Sie gelernt:
- Wie die Textzusammenfassung mithilfe der wiederkehrenden neuronalen Netzwerkarchitektur Encoder-Decoder angegangen werden kann.
- Wie verschiedene Encoder und Decoder für das Problem implementiert werden können.
- Drei Modelle, mit denen Sie die Architektur für die Textzusammenfassung in Keras implementieren können.
Haben Sie Fragen?
Stellen Sie Ihre Fragen in den Kommentaren unten und ich werde mein Bestes tun, um sie zu beantworten.