Wie trainiere ich einen Chatbot?

10

Ich wollte anfangen, mit neuronalen Netzen zu experimentieren, und als Spielzeugproblem wollte ich einen zum Chatten trainieren, dh einen Chat-Bot wie Cleverbot implementieren. Jedenfalls nicht so schlau.

Ich habe mich nach Dokumentationen umgesehen und viele Tutorials zu allgemeinen Aufgaben gefunden, aber nur wenige zu diesem speziellen Thema. Der, den ich gefunden habe, hat die Ergebnisse nur enthüllt, ohne Einblicke in die Implementierung zu geben. Diejenigen, die es getan haben, haben es ziemlich flach gemacht (die Tensorflow-Dokumentationsseite auf seq2seq fehlt imho).

Jetzt habe ich das Gefühl, dass ich das Prinzip mehr oder weniger verstanden habe, aber ich bin mir nicht sicher und ich bin mir nicht einmal sicher, wie ich anfangen soll. Daher werde ich erklären, wie ich das Problem angehen würde, und ich möchte ein Feedback zu dieser Lösung erhalten, das mir sagt, wo ich mich irre, und möglicherweise einen Link zu detaillierten Erklärungen und praktischem Wissen über den Prozess habe.

  1. Der Datensatz, den ich für die Aufgabe verwenden werde, ist der Speicherauszug aller meiner Facebook- und WhatsApp-Chat-Verlaufsdaten. Ich weiß nicht, wie groß es sein wird, aber möglicherweise immer noch nicht groß genug. Die Zielsprache ist nicht Englisch, daher weiß ich nicht, wo ich schnell aussagekräftige Gesprächsproben sammeln kann.

  2. Ich werde aus jedem Satz einen Gedankenvektor erzeugen. Ich weiß immer noch nicht wie eigentlich; Ich habe ein schönes Beispiel für word2vec auf der Website deeplearning4j gefunden, aber keines für Sätze. Ich habe verstanden, wie Wortvektoren aufgebaut sind und warum, aber ich konnte keine erschöpfende Erklärung für Satzvektoren finden.

  3. Mit Gedankenvektoren als Eingabe und Ausgabe werde ich das neuronale Netzwerk trainieren. Ich weiß nicht, wie viele Schichten es haben soll und welche lstm-Schichten sein müssen.

  4. Dann sollte es ein anderes neuronales Netzwerk geben, das einen Gedankenvektor in eine Zeichenfolge umwandeln kann, die einen Satz bildet. Ich habe gelesen, dass ich das Auffüllen verwenden sollte, um unterschiedliche Satzlängen auszugleichen, aber ich vermisse, wie man Zeichen codiert (sind Codepunkte genug?).

Totem
quelle

Antworten:

7

Ich würde empfehlen, zunächst diesen Blogpost zu lesen . Sie können den Code wahrscheinlich ausschlachten, um eine RNN zu erstellen, die eine Anweisung eines Dialogs aufnimmt und dann die Antwort auf diese Anweisung ausgibt.

Das wäre die einfache Version Ihres Projekts, alles ohne Wortvektoren und Gedankenvektoren. Sie geben nur Zeichen ein, sodass Tippfehler Sie nicht betreffen müssen.

Der nächste komplexere Schritt wäre die Eingabe von Wortvektoren anstelle von Zeichen. Auf diese Weise können Sie auf Wörter verallgemeinern, die nicht Teil Ihrer Trainingsdaten sind. Und es ist wahrscheinlich immer noch nur eine geringfügige Änderung des Codes.

Wenn Sie darauf bestehen, Gedankenvektoren zu verwenden, sollten Sie sich über die NN-Übersetzung informieren . Und versuchen Sie wahrscheinlich, ein vorab geschultes Encoder-Netzwerk zu erhalten. Oder trainieren Sie es selbst auf einem großen Übersetzungskorpus für Ihre Sprache.

Mit Ihrem kleinen Trainingsset ist das Beste, was Sie tun können, wahrscheinlich eine massive Überanpassung, bis Ihr System Ihre Trainingsdaten wörtlich neu erstellt. Durch die Verwendung von Wortvektoren kann Ihr System die gleiche Antwort auf "Ich habe die Katze heute geschlagen" geben. wie Sie in den Trainingsdaten zu "Ich habe den Hund gestern getreten."

Ich bin mir nicht sicher, ob Vektoren einen großen Unterschied machen werden. Wenn Sie den Decoder überhaupt zum Lernen bringen.

BlindKungFuMaster
quelle
Ich habe den ersten Artikel bereits vor einiger Zeit gelesen und bin der Meinung, dass Zeichen nicht die richtige Abstraktionsebene sind. Ich habe nicht daran gedacht, nacheinander mit Wortvektoren zu arbeiten, aber ich denke, das ist auch ein interessanter und weniger komplexer Weg. Ich werde die Zeitung lesen, was wahrscheinlich das ist, wonach ich
Totem
Ich habe einen Bot-Kern gefunden, den ich verwenden kann ... Aber ich bin bei der Textgenerierung festgefahren. ai.stackexchange.com/questions/5963/… Ich frage mich, ob es trotz der Vektoren und der Lernrate immer noch nicht so funktioniert, wie es sollte ... Ich mache mir Sorgen, dass dies ein Mangel der Bibliothek sein könnte, die ich bin Verwenden, aber ich glaube nicht, dass dies für eine Ebenengröße von 300 möglich sein könnte ... Oder hängt der erforderliche Schulungsaufwand von der Größe der Ebene ab? Jede Hilfe wäre dankbar. Bitte beachten Sie die verwendete Bibliothek.
FreezePhoenix
0

Entsprechend Ihrem Projektkonzept möchte ich Sie zunächst bitten, einige testgetriebene Entwicklungstechniken anzuwenden. Versuchen Sie zunächst, eine kleinere Datenbank zu erstellen, mit der Sie eine kleine Datenmenge verarbeiten können, um eine gewünschte Verbesserung zu erzielen.

Verwenden Sie diese Datenbank jedoch, um einen organisierten Baum inline mit Ihren Daten als Knoten zu erstellen. Wenn also ein Bot beginnt, Feedback aus der Datenbank zu generieren, das mit Datenpunkten aus Ihrem angegebenen Datensatz markiert ist. Und somit ist das Feedback oder die Antwort der richtige Weg zum nächsten Knoten im Baum.

Hinweis : Verwenden Sie für den Anfang nicht Ihren großen Chat-Verlauf als Ganzes, da dies eine einfache Aufgabe ist. Zu viele Eingaben == Überanpassung.

Quintumnia
quelle