Dies ist ein Chatbot, der durch seq2seq und Reinforcement Learning trainiert wurde.
seq2seq
Seq2seq ist ein klassisches Modell für strukturiertes Lernen, dessen Eingabe und Ausgabe beide sequenziell sind
Das Vanilla-seq2seq-Modell wird in einem NIPS '14-Artikel „Sequence to Sequence Learning with Neural Networks“ beschrieben, wobei der Encoder und der Decoder getrennt sind
Das seq2seq-Modell in diesem Repository besteht aus zwei LSTMs, ähnlich dem in einem ICCV '15-Artikel „Sequence to Sequence – Video to Text“ beschriebenen Modell. Der Encoder und der Decoder haben die gleichen Gewichtungen
RL
Nachdem ich den Chatbot mit genügend Epochen trainiert habe, verwende ich eine RL-Technik namens Policy Gradient, um den Chatbot weiter zu verbessern
Dadurch kann der Chatbot interessantere Reaktionen im Hinblick auf die Belohnungsfunktion generieren
Meine Belohnungsfunktion ähnelt der, die in einem EMNLP '16-Artikel „Deep Reinforcement Learning for Dialogue Generation“ beschrieben wird
Lassen Sie mich Ihnen einige Chatbot-Ergebnisse zeigen:
Ergebnis 1 (A und B sind beide ein trainierter Chatbot)
A: Können Sie mir einen Gefallen tun?
B: Alles.
A: Ich möchte, dass du einen Vater beugst.
B: Natürlich.
A: Es tut mir so leid, dass ich nicht unhöflich sein wollte, aber.
B: Verstehe es nicht, zumindest ist es so viel, wie ich kann.
Ergebnis 2 (A und B sind beide ein trainierter Chatbot)
A: Ich habe es nicht getan! Ich habe keine Waffe!
B: Du Lügner. Sie möchten trotzdem Ihr Geld zurückbekommen.
A: Etwas stimmt mit der Wahrheit nicht.
B: Ich will kein Geld, nur ein bisschen Geld, das ich nicht einfach so mitnehmen kann.
A: Was ist los?
B: Hör mir zu. Ich habe jetzt Angst.
A: Ah, du wirst das ganze Geld brauchen, ich brauche deine Hilfe.
Ergebnis 3 (A und B sind beide ein trainierter Chatbot)
A: Ich habe vergessen, die Coca-Cola zu besorgen.
B: Mir ist etwas im Kopf steckengeblieben.
A: Es ist in Ordnung, ich schätze, es kommt in der ganzen Scheiße ziemlich häufig vor.
B: Ich meine, wir sind schon seit der Kindheit zusammen.
A: Umso mehr Grund.
B: Es ist nicht er, es ist seine Schuld und er ist blind wegen Gott.
A: Und es ist eine seltsame Geschichte.
Weitere Ergebnisse von Chatbot finden Sie in diesem Verzeichnis
Die Konfigurationen dieser Ergebnisse durch neuronale Netze werden im Dateinamen beschrieben
Sind Sie vom Ergebnis des Chatbots überrascht? :D
Sie können diese erstaunlichen Dialoge selbst erstellen!
Befolgen Sie einfach die folgenden Anweisungen:
pip install -r Anforderungen.txt
./script/download.sh
./script/simulate.sh <PATH TO MODEL> <SIMULATE TYPE> <INPUT FILE> <OUTPUT FILE>
<PFAD ZUM MODELL>
Um einen seq2seq-Dialog zu generieren, geben Sie „ model/Seq2Seq/model-77 “ ein.
Um den RL-Dialog zu generieren, geben Sie „ model/RL/model-56-3000 “ ein.
<TYP SIMULIEREN>
kann 1 oder 2 sein
Die Zahl stellt die Anzahl früherer Sätze dar, die der Chatbot berücksichtigt
Wenn Sie 1 wählen, berücksichtigt der Chatbot nur den letzten Satz
Wenn Sie 2 auswählen, berücksichtigt der Chatbot die letzten beiden Sätze (einen vom Benutzer und einen vom Chatbot selbst).
<EINGABEDATEI>
Schauen Sie sich result/sample_input_new.txt an
Dies ist das Eingabeformat des Chatbots. Jede Zeile ist der Anfangssatz eines Dialogs.
Der Einfachheit halber können Sie einfach die Beispieldatei verwenden.
<AUSGABEDATEI>
Geben Sie in die Ausgabedatei einen beliebigen Dateinamen ein
Wenn Sie möchten, dass der Chatbot für jede Frage nur eine einzige Antwort generiert
Befolgen Sie die nachstehenden Anweisungen:
pip install -r Anforderungen.txt
./script/download.sh
./script/run.sh <TYPE> <INPUT FILE> <OUTPUT FILE>
<TYP>
Um eine seq2seq-Antwort zu generieren, geben Sie „ S2S “ ein.
Um eine verstärkte Lernreaktion zu generieren, geben Sie „ RL “ ein.
<EINGABEDATEI>
Schauen Sie sich result/sample_input_new.txt an
Dies ist das Eingabeformat des Chatbots. Jede Zeile ist der Anfangssatz eines Dialogs.
Der Einfachheit halber können Sie einfach die Beispieldatei verwenden.
<AUSGABEDATEI>
Geben Sie in die Ausgabedatei einen beliebigen Dateinamen ein
Ich habe meinen Chatbot mit Python2.7 trainiert.
Wenn Sie den Chatbot von Grund auf trainieren möchten
Sie können den folgenden Anweisungen folgen:
Schauen Sie sich python/config.py an, alle Konfigurationen für das Training werden hier beschrieben.
Sie können einige Trainingshyperparameter ändern oder einfach die ursprünglichen beibehalten.
Ich verwende Cornell Movie-Dialogs Corpus
Sie müssen es herunterladen, entpacken und alle *.txt-Dateien in das Verzeichnis data/ verschieben
Dann laden Sie einige Bibliotheken mit pip herunter:
pip install -r Anforderungen.txt
./script/parse.sh
./script/train.sh
Lassen Sie uns einige Ergebnisse des seq2seq-Modells zeigen :)
./script/test.sh <PFAD ZUM MODELL> <EINGABEDATEI> <AUSGABEDATEI>
Und zeigen Sie einige Dialogergebnisse aus dem seq2seq-Modell!
./script/simulate.sh <PATH TO MODEL> <SIMULATE TYPE> <INPUT FILE> <OUTPUT FILE>
<TYP SIMULIEREN>
kann 1 oder 2 sein
Die Zahl stellt die Anzahl früherer Sätze dar, die der Chatbot berücksichtigt
Wenn Sie 1 wählen, berücksichtigt der Chatbot nur die Äußerung des Benutzers
Wenn Sie 2 wählen, berücksichtigt der Chatbot die Äußerung des Benutzers und die letzte Äußerung des Chatbots
Sie müssen den Parameter „training_type“ in python/config.py ändern
„normal“ für seq2seq-Training, „pg“ für Policy-Gradient
Sie müssen zunächst einige Epochen lang mit „Normal“ trainieren, bis es stabil ist (mindestens 30 Epochen werden dringend empfohlen).
Ändern Sie dann die Methode in „pg“, um die Belohnungsfunktion zu optimieren
./script/train_RL.sh
Beim Training mit Richtliniengradienten (Seite)
Möglicherweise benötigen Sie ein umgekehrtes Modell
Das umgekehrte Modell wird ebenfalls durch den Cornell Movie-Dialogs-Datensatz trainiert, jedoch mit umgekehrter Quelle und Ziel.
Sie können das vorab trainierte umgekehrte Modell von herunterladen
./script/download_reversed.sh
oder Sie können es selbst trainieren
Sie müssen keine Einstellungen zum umgekehrten Modell ändern, wenn Sie ein vorab trainiertes umgekehrtes Modell verwenden
Lassen Sie uns einige Ergebnisse des RL-Modells generieren und die Unterschiede zum seq2seq-Modell finden :)
./script/test_RL.sh <PFAD ZUM MODELL> <EINGABEDATEI> <AUSGABEDATEI>
Und zeigen Sie einige Dialogergebnisse des RL-Modells!
./script/simulate.sh <PATH TO MODEL> <SIMULATE TYPE> <INPUT FILE> <OUTPUT FILE>
<TYP SIMULIEREN>
kann 1 oder 2 sein
Die Zahl stellt die Anzahl früherer Sätze dar, die der Chatbot berücksichtigt
Wenn Sie 1 wählen, berücksichtigt der Chatbot nur den letzten Satz
Wenn Sie 2 auswählen, berücksichtigt der Chatbot die letzten beiden Sätze (einen vom Benutzer und einen vom Chatbot selbst).
Betriebssystem: CentOS Linux Version 7.3.1611 (Core)
CPU: Intel(R) Xeon(R) CPU E3-1230 v3 bei 3,30 GHz
GPU: GeForce GTX 1070 8 GB
Speicher: 16 GB DDR3
Python3 (für data_parser.py) und Python2.7 (für andere)
Po-Chih Huang / @pochih