Hinweise für Besucher:
python3 manage.py runserver
aus, sofern Sie alle Anforderungen in webpage/requirements.txt erfüllen. Wenn Sie mit der Ausführung von flask auf diese Weise nicht vertraut sind, sehen Sie sich die Dokumentation für Flask-Script an. Bitte entschuldigen Sie die Unannehmlichkeiten!Mit Stand vom 9. Mai 2017 sind die Hauptpakete des Projekts wie folgt:
python3 manage.py runserver
Aus Benutzer-/Entwicklersicht bietet dieses Projekt eine übersichtlichere Schnittstelle zum Basteln an Sequenz-zu-Sequenz-Modellen. Das ideale Ergebnis ist eine Chatbot-API mit der Lesbarkeit von Keras, aber mit einem Grad an Flexibilität, der TensorFlow näher kommt.
Auf der „Client“-Seite ist das Spielen mit Modellparametern und deren Ausführung so einfach wie das Erstellen einer Konfigurationsdatei (YAML), das Öffnen eines Python-Interpreters und das Ausgeben einer Handvoll Befehle. Das folgende Snippet ist beispielsweise alles, was Sie benötigen, um mit Ihrer Konfiguration mit dem Training des Cornell-Datensatzes zu beginnen (natürlich nach dem Herunterladen):
import data
import chatbot
from utils import io_utils
# Load config dictionary with the flexible parse_config() function,
# which can handle various inputs for building your config dictionary.
config = io_utils . parse_config ( config_path = 'path_to/my_config.yml' )
dataset = getattr ( data , config [ 'dataset' ])( config [ 'dataset_params' ])
bot = getattr ( chatbot , config [ 'model' ])( dataset , config )
bot . train ()
Dies ist nur eine Möglichkeit, mit dem Projekt in Kontakt zu treten. Der Benutzer kann beispielsweise auch Parameter über Befehlszeilenargumente übergeben, die ebenfalls mit allen von ihm angegebenen Konfigurationsdateien zusammengeführt werden (Befehlszeilenargumente haben bei Konflikten Vorrang). Sie können auch den Standort eines zuvor gespeicherten Chatbots eingeben, um das Training fortzusetzen oder eine Konversation zu beginnen. Weitere Informationen finden Sie unter main.py
Ubuntu Dialogue Corpus: Der Vorverarbeitungsansatz ist in ubuntu_reformat.ipynb im Ordner „notebooks“ zu sehen. Der beabsichtigte Verwendungszweck des Datensatzes ist die Rangfolge der Antworten für Dialoge mit mehreren Runden, aber ich habe den eher einfachen Ansatz gewählt, Äußerungspaare zu extrahieren und sie als einzelne Sätze zu einzelnen Antworten zu interpretieren, die den Eingaben für den Encoder und Decoder entsprechen bzw. in den Modellen.
Cornell Movie-Dialogs: Ich habe mit dieser vorverarbeiteten Version des Cornell-Korpus begonnen und geringfügige Änderungen vorgenommen, um das Rauschen zu reduzieren.
Reddit-Kommentare: Ca. 1,7 Milliarden Reddit-Kommentare. Derzeit wird daran gearbeitet, diesen riesigen Datensatz vorzuverarbeiten und auf ein geeignetes Format für das Training von Konversationsmodellen zu reduzieren. Sobald der Vorgang abgeschlossen ist, werden die Download-Links für verarbeitete Datensätze veröffentlicht!
DynamicBot: verwendet einen stärker objektorientierten Ansatz, der von benutzerdefinierten Klassen in model_components.py angeboten wird. Das Ergebnis ist eine schnellere stapelweise verkettete Online-Einbettung und ein natürlicherer Ansatz beim Chatten. Es nutzt die (fantastische) neue Python-API in der Version TensorFlow 1.0, insbesondere die Funktion „dynamic_rnn“. Es hält sich auch an die bewährte Praxis des Variablen-Scopings und die gängigen Tensorflow-Konventionen, die ich in der Dokumentation und im Quellcode beobachtet habe, was nette Nebenwirkungen wie saubere Diagrammvisualisierungen in TensorBoard mit sich bringt.
SimpleBot: Vereinfachtes Bucket-Modell basierend auf dem komplizierteren „ChatBot“-Modell unten. Obwohl es bei der Anpassung von Bucket-Partitionen weniger flexibel ist und einen spärlichen Softmax über das gesamte Vokabular anstelle von Stichproben verwendet, ist es in seiner Implementierung weitaus transparenter. Es nutzt tf.contrib im Gegensatz zu ChatBot nur minimal und wird mehr oder weniger von Grund auf implementiert, in dem Sinne, dass es sich hauptsächlich auf die grundlegenden Tensorflow-Methoden verlässt. Wenn Sie neu bei TensorFlow sind, kann es hilfreich sein, die Implementierung durchzulesen, um ein Gefühl für gängige Konventionen in der TensorFlow-Programmierung zu bekommen, da sie das Ergebnis war, dass ich den Quellcode aller Methoden in ChatBot gelesen und meinen eigenen kompakter geschrieben habe Interpretation.
ChatBot: Erweiterte Version des in diesem TensorFlow-Tutorial beschriebenen Modells. Architekturmerkmale: Bucket-Eingaben, Decoder verwendet einen Aufmerksamkeitsmechanismus (siehe Seite 69 meiner Notizen) und Eingaben sind mit den einfachen Funktionen eingebettet, die in der tf.contrib-Bibliothek bereitgestellt werden. Verwendet außerdem eine abgetastete Softmax-Verlustfunktion, um größere Vokabulargrößen zu ermöglichen (Seite 67 der Anmerkungen). Zusätzliche Kommentare: Aufgrund der Art der Bucket-Modelle dauert die Erstellung des Modells im Vergleich zu anderen viel länger. Der größte Engpass scheint in der Größe des größten Buckets und in der Art und Weise zu liegen, wie die Gradientenoperationen erstellt werden basierend auf den Eimergrößen.
Das Webseitenverzeichnis zeigt eine einfache und platzsparende Möglichkeit zur Bereitstellung Ihrer TensorFlow-Modelle in einer Flask-Anwendung. Die Modelle werden „eingefroren“ – alle nicht zum Chatten benötigten Komponenten (z. B. Optimierer) werden entfernt und alle verbleibenden Variablen in Konstanten umgewandelt. Wenn der Benutzer auf einen Modellnamen klickt, wird eine REST-API für dieses Modell erstellt. Wenn der Benutzer einen Satz in das Formular eingibt, wird eine (AJAX) POST-Anfrage ausgegeben, wobei die Antwort der Antwortsatz des Chatbots ist. Weitere Details zur REST-API finden Sie unter „views.py“.
Die Flask-Anwendung folgt Best Practices, wie z. B. der Verwendung von Blueprints für die Instanziierung von Anwendungen, unterschiedlichen Datenbanken je nach Anwendungsumgebung (z. B. Entwicklung oder Produktion) und mehr.
Hier gehe ich näher darauf ein, wie die Modelle aufgebaut sind und wie sie visualisiert werden können. Dieser Abschnitt ist noch in Arbeit und noch nicht abgeschlossen.
Anstatt das Argument feed_dict
zu verwenden, um Datenstapel in das Modell einzugeben, ist es wesentlich schneller, die Eingabeinformationen und Vorverarbeitungstechniken in der Diagrammstruktur selbst zu kodieren. Das bedeutet, dass wir dem Modell zur Trainingszeit nichts füttern. Vielmehr verwendet das Modell eine Folge von Warteschlangen, um auf die Daten aus Dateien im Protobuf-Format von Google zuzugreifen, die Dateien in Tensorsequenzen zu dekodieren, die Sequenzen dynamisch zu stapeln und aufzufüllen und diese Stapel dann dem einbettenden Decoder zuzuführen. Alles innerhalb der Diagrammstruktur. Darüber hinaus wird diese Datenverarbeitung von mehreren Threads parallel koordiniert. Wir können Tensorboard (und Best Practices für das Scoping von Variablen) verwenden, um diese Art von Pipeline auf hoher Ebene zu visualisieren.
(Weitere Beschreibungen folgen in Kürze!)
In diese Modelle wurde viel recherchiert, und ich habe meine Notizen zu den „wichtigsten“ Arbeiten hier im letzten Abschnitt meiner Deep-Learning-Notizen hier dokumentiert. Die Notizen enthalten auch, wie ich versucht habe, das Material aus den Papieren in TensorFlow-Code zu übersetzen. Ich werde das aktualisieren, sobald die Ideen aus weiteren Artikeln in dieses Projekt einfließen.
Papiere:
Online-Ressourcen: