Basierend auf dem Code-Repo TC-Bot und dem Papier End-to-End Task-Completion Neural Dialogue Systems. Dieses Repo ist eine vereinfachte Version von TC-Bot und weist eine ähnliche Genauigkeit auf, obwohl es nicht direkt vergleichbar ist.
Dies zeigt, wie man einen einfachen DQN-Agenten mit Deep Reinforcement Learning mithilfe eines einfachen Benutzersimulators als zielorientierten Chatbot trainiert. Der Code ist eine vereinfachte Version von TC-Bot von MiuLab. Der Hauptunterschied besteht darin, dass dieser Code keine NLG- oder NLU-Komponenten enthält, sondern lediglich den Dialogmanager trainiert. NL-Komponenten sind nicht erforderlich, um zu verstehen, wie ein GO-Chatbot mit DRL trainiert wird, und werden daher nicht implementiert.
Hier ist ein Diagramm aus dem Papier für TC-Bot, das dem in diesem Projekt verwendeten Dialogfluss mit Ausnahme der LU- und NLG-Komponenten ähnelt:
Neben der Entfernung von NL gibt es Änderungen an den Erfolgsbedingungen, dem DQN-Agent-Optimierer und ein paar weitere kleinere Änderungen. Daher sollte die Genauigkeit nicht direkt zwischen TC-Bot und diesem Repo verglichen werden.
Die Datenbank besteht aus Kinokarten, der gleichen Datenbank, die auch in TC-Bot verwendet wird. Sowohl die Pickle- als auch die Textversion der Daten können im Datenverzeichnis eingesehen werden.
Eine 5-teilige Tutorial-Reihe, die diesen Code im Detail beschreibt und durchgeht, finden Sie hier auf Medium!
Mit python train.py
können Sie einen Agenten von Grund auf trainieren.
In Constants.json können Sie Hyperparameter ändern, einschließlich „save_weights_file_path“ und „load_weights_file_path“ (beides relative Pfade), um Gewichte zu speichern bzw. zu laden. Um beispielsweise die vorab trainierten Gewichte im Gewichtungsordner zu verwenden, legen Sie den Wert von „load_weights_file_path“ auf „weights/model.h5“ fest. Gewichte für Ziel- (Tar) und Verhaltens-Keras-Modelle (Beh) werden jedes Mal gespeichert, wenn die aktuelle Erfolgsquote einen neuen Höchststand erreicht.
Sie können einen Agenten auch mit python test.py
testen. Stellen Sie jedoch sicher, dass Gewichte geladen werden, indem Sie „load_weights_file_path“ in „constants.json“ auf einen relativen Pfad mit Verhalten und Zielgewichtungen festlegen.
Alle Konstanten sind ziemlich selbsterklärend, mit Ausnahme von „Vanilla“ unter „Agent“, was DQN (wahr) oder Doppel-DQN (falsch) bedeutet. Standardmäßig ist Vanilla DQN.
Hinweis: Wenn beim Trainieren oder Testen ein Unpickling-Fehler auftritt, führen Sie python pickle_converter.py
aus. Das sollte das Problem beheben
Sie können den Agenten testen, indem Sie Ihre eigenen Aktionen als Benutzer eingeben (anstatt eine Benutzersimulation zu verwenden), indem Sie „usersim“ unter „Run“ in „constants.json“ auf „false“ setzen. Sie geben bei jedem Schritt einer Episode/Konversation in der Konsole eine Aktion und einen Erfolgsindikator ein. Das Format für die Aktionseingabe ist: Absicht/Inform-Slots/Request-Slots.
Beispielhafte Aktionseingaben:
Darüber hinaus wird die Konsole nach einem Indikator fragen, ob der Agent bereits erfolgreich war (außer nach der ersten Aktionseingabe einer Episode). Zulässige Eingaben sind -1 für Verlust, 0 für noch kein Ergebnis, 1 für Erfolg.
Verwendete Hyperparameter aus konstanten.json.
Tabelle der Episoden (alle 2.000 von 40.000) nach maximaler Erfolgsrate einer Periode/Zughäufigkeit (alle 100 Episoden) bis zu dieser Episode: