#### [Update 2017-03-14]
- Upgrade auf TensorFlow v1.0.0, kein rückwärtskompatibel, da sich TensorFlow so stark verändert hat.
- Ein vorgebildetes Modell mit Twitter Corpus wird nur
./go_example(oder Vorschau meines Chat -Beispiels)- Sie könnten von der Verfolgung dieses
go_example-Skripts beginnen, um zu wissen, wie die Dinge funktionieren!
Dies ist ein SEQ2SEQ -Modell, das aus dem TensorFlow -Beispiel modifiziert wurde.
app.py ist als Backend der Facebook Messenger App enthalten. Ich habe hier einige Details zu den Funktionen und einigen Implementierungstricks erläutert.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Möglicherweise finden Sie Korpus wie Twitter Chat, Open Movie Subtitel oder PTT -Foren aus meinem Chat Corpus -Repository. Sie müssen es unter Pfad stellen wie:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
Und Hand basteln einige Testsätze (jeden Satz pro Zeile) in:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
Nachdem Sie Ihr Modell bis zum Verwirrung von etwa 50 oder so trainiert haben, könnten Sie dies tun:
python3 main.py --mode test --model_name <MODEL_NAME>
[Anmerkung !!!] Wenn Sie einen Parameterüberschreib in diesem Hauptkommanda einfügen, wenden Sie sich unbedingt sowohl für den Training als auch für das Testen an oder ändern Sie einfach in lib/config.py für failsafe.
python3 app.py --model_name <MODEL_NAME>
Sie können dieses Beispiel für minimales FB_Messenger sehen, um weitere Details wie das Einrichten von SSL, Webhook und Workarounds für bekannten Fehler einzurichten.
Hier ist ein interessanter Vergleich: Die linke Konversation ermöglichte die Suche nach Beam mit Beam = 10, die Antwort ist kaum besser als immer "Ich weiß nicht". Die richtige Konversation verwendete auch die Beam-Suche und aktivierte zusätzlich das Antisprachel-Modell. Dies soll die generische Reaktion unterdrücken, und die Reaktion scheint besser zu sein.
[Update 2017-03-09] Das Verstärkungslernen funktioniert jetzt nicht, warten Sie auf Fix.
Wenn Sie eine Chance haben möchten, Ihr Modell weiter zu verbessern, habe ich hier eine von Li et al., 2016 inspirierte Verstärkungslernen -Architektur implementiert. Aktivieren Sie einfach die Option config.py für verstärken_Learn. Möglicherweise möchten Sie Ihre eigene Regel in step_rf() in lib/seq2seq_mode.py hinzufügen.
Beachten Sie, dass Sie im normalen Modus trainieren sollten, um zuerst ein anständiges Modell zu erhalten! Da das Verstärkungslernen die mutige neue Welt mit diesem vorgebliebenen Modell erforschen wird. Es wird ewig dauern, um sich zu verbessern, wenn Sie mit einem schlechten Modell beginnen.
SEQ2SEQ ist ein großartiges Modell, das von Cho et al., 2014 veröffentlicht wurde. Zunächst wird es zur maschinellen Übersetzung verwendet, und bald stellen die Leute fest, dass etwas über das Zuordnen von etwas zu einer anderen Sache auch durch das SEQ2SEQ -Modell erreicht werden kann. Chatbot ist einer dieser Wunder, in dem wir aufeinanderfolgenden Dialog als eine Art "Zuordnungs" -Dialogin betrachten.
Hier ist das klassische Intro-Bild.
Das Problem ist, dass wir bisher keine bessere Zielfunktion für Chatbot gefunden haben. Wir verwenden immer noch MLE (maximale Wahrscheinlichkeitsschätzung), was gut für die maschinelle Übersetzung eignet, aber immer generische Antwort wie "Ich auch", "Ich denke so", "Ich liebe dich", während er sich unterhielt.
Diese Antworten sind nicht informativ, aber sie haben eine große Wahrscheinlichkeit-da sie dazu neigen, im Training von Corpus viele Male aufzutreten. Wir sind nicht unser Chatbot nicht immer, wenn wir diese Nicht -Szense immer beantworten. Deshalb müssen wir einen Weg finden, um unseren Bot technisch gesehen interessanter zu machen, um die "Verwirrung" der Antwort zu erhöhen.
Hier reproduzieren wir die Arbeit von Li. et al., 2016 versuchen, dieses Problem zu lösen. Die Hauptidee besteht darin, dasselbe SEQ2SEQ-Modell wie ein Sprachmodell zu verwenden, um die Kandidatenwörter mit hoher Wahrscheinlichkeit in jedem decodierenden Zeitstempel als Anti-Model zu erhalten, und dann bestrafen wir diese Wörter, die immer eine hohe Wahrscheinlichkeit für jede Eingabe sind. Durch dieses Anti-Model könnten wir eine spezielle, nicht generische und informative Reaktion erhalten.
Die ursprüngliche Arbeit von Li. et al. Verwenden Sie Mert (Och, 2003) mit BLEU als Metriken, um die beste Wahrscheinlichkeitsgewichtung ( λ und γ in Score (t) = p (t | s)-λu (t) + γNT ) des entsprechenden Antisprachel-Modells zu finden. Aber ich finde, dass die BLEU -Punktzahl in Chat Corpus immer null ist und hier nicht ein sinnvolles Ergebnis erzielt kann. Wenn jemand eine Vorstellung davon hat, schreiben Sie mir eine Nachricht, danke!
Es gibt einige Optionen für Modelltraining und Vorhersage in lib/config.py. Grundsätzlich sind sie selbst erläutert und können für die meisten Fälle mit Standardwert arbeiten. Hier listen wir nur etwas auf, das Sie konfigurieren müssen:
Über Umwelt
| Name | Typ | Beschreibung |
|---|---|---|
| Modus | Saite | Arbeitsmodus: Zug/Test/Chat |
| model_name | Saite | Modellname, beeinflusst Ihren Arbeitspfad (Speichern der Daten, NN_Model, Ergebnisordner) |
| Scope_Name | Saite | In TensorFlow, wenn Sie gleichzeitig zwei Diagramme laden müssen, müssen Sie sie in verschiedenen Namespace speichern/laden. (Wenn Sie nur ein SEQ2SEQ -Modell benötigen, lassen Sie es standardmäßig.) |
| vocab_size | ganze Zahl | Hängt von Ihrer Korpussprache ab: Für Englisch ist 60000 gut genug. Für Chinesen benötigen Sie mindestens 100000 oder 200000. |
| gpu_usage | schweben | TensorFlow GPU -Speicherfraktion verwendet, Standard ist 1 und TensorFlow belegt 100% Ihrer GPU. Wenn Sie Multi -Jobs haben, die Ihre GPU -Ressource teilen, machen Sie sie für 2 oder 3 Jobs 0,5 oder 0,3. |
| verstärken_Learn | int | Setzen Sie 1, um den Verstärkungslernmodus zu ermöglichen |
Über Dekodierung
| Name | Typ | Standard | Beschreibung |
|---|---|---|---|
| Beam_Size | int | 10 | Strahlsuchgröße, Einstellung 1 entspricht der gierigen Suche |
| Antilm | schweben | 0 (deaktiviert) | Bestrafung des Gewichts des antisprachigen Modells |
| n_bonus | schweben | 0 (deaktiviert) | Belohnungsgewicht der Satzlänge |
Das Anti-LM-Functin ist standardmäßig deaktiviert. Sie können mit der Einstellung von Antilm = 0,5 ~ 0,7 und N_bonus = 0,05 beginnen, um festzustellen, ob Ihnen die Ergebnisse der Ergebnisse gefallen.
Für das Training wird GPU empfohlen, da SEQ2SEQ ein großes Modell ist. Sie benötigen eine bestimmte Rechenleistung, um das Training durchzuführen und effizient vorherzusagen, insbesondere wenn Sie eine große Strahlseuchgröße festlegen.
Die DRAM -Anforderung ist nicht streng wie CPU/GPU, da wir stochastische Gradienten anständig machen.
Wenn Sie neu im tiefgreifenden Lernen sind und Dinge wie die GPU aufstellen, ist die Python-Umgebung für Sie ärgerlich, hier sind Docker meiner maschinellen Lernumgebung:
(Nicht-GPU-Version Docker) / (GPU-Version Docker)
SEQ2SEQ ist ein Modell mit vielen Vorbereitungen. Ich habe einige Zeit mit der Überzeugung verbracht und hier sind einige beste Materialien, die mir sehr zugute kommen:
Der beste Blogpost, der RNN-, LSTM-, Gru- und SEQ2SQ -Modell erklärt: LSTM -Netzwerke von Christopher Olah verstehen.
Diese Arbeit Sherjilozair/Char-Rnn-TensorFlow hilft mir, viel über Sprachmodell und Implementierungsdiagramm in TensorFlow zu lernen.
Wenn Sie an mehr Magie über RNN interessiert sind, finden Sie hier einen Must Read Blogpost: die unangemessene Wirksamkeit wiederkehrender neuronaler Netzwerke von Andrej Karpathy.
Die Vanilla-Version SEQ2SEQ+Achtung: Nicolas-IVanov/TF_SEQ2SQ_CHATBOT. Auf diese Weise können Sie den Hauptfluss des Vanilla SEQ2SEQ -Modells herausfinden, und ich erstelle dieses Repository basierend auf dieser Arbeit.
Derzeit baue ich Strahlsuche aus dem Diagramm heraus, was bedeutet, dass es sehr langsam ist. Hier und da gibt es Diskussionen über den Bau im Graph. Wenn Sie jedoch etwas mehr als die Strahlsuche hinzufügen möchten, wie diese Anti-LM-Arbeit, benötigen Sie viel mehr als nur Strahlsuche, um im Graph zu sein.
Ich habe nicht herausgefunden, wie das MERT mit Bleu das Gewicht des Anti-LM-Modells optimieren kann, da derzeit die Bleu häufig Null ist.