Il s'agit d'un chatbot formé par seq2seq et l'apprentissage par renforcement .
séquence2séq
Seq2seq est un modèle classique d'apprentissage structuré, ses entrées et sorties sont toutes deux des séquences
Le modèle vanilla seq2seq est décrit dans un article NIPS '14 Sequence to Sequence Learning with Neural Networks, l'encodeur et le décodeur sont séparés.
Le modèle seq2seq dans ce référentiel est construit avec 2 LSTM, similaire à celui décrit dans un article ICCV '15 Sequence to Sequence -- Video to Text, l'encodeur et le décodeur partagent les mêmes poids.
R.L.
Après avoir entraîné le chatbot avec suffisamment d'époques, j'utilise une technique RL appelée gradient de politique pour améliorer encore le chatbot.
En faisant cela, le chatbot peut générer des réponses plus intéressantes concernant la fonction de récompense
Ma fonction de récompense est similaire à celle décrite dans un article de l'EMNLP '16 Deep Reinforcement Learning for Dialogue Generation.
Laissez-moi vous montrer quelques résultats du chatbot :
Résultat 1 (A et B sont tous deux des chatbots formés)
A : Pouvez-vous me rendre un service ?
B : N'importe quoi.
A : Je veux que tu fasses plier un père.
B : Bien sûr.
R : Je suis vraiment désolé, je ne voulais pas être impoli, mais.
B : Ne comprends pas, au moins c'est à peu près autant que possible.
Résultat 2 (A et B sont tous deux des chatbots formés)
R : Je ne l'ai pas fait ! Je n'ai pas d'arme !
B : Espèce de menteur. Vous voulez toujours récupérer votre argent.
R : Quelque chose ne va pas dans la vérité.
B : Je ne veux pas d'argent, juste un peu que je ne peux pas retirer de ça.
R : Qu'est-ce qui ne va pas ?
B : Écoute-moi. J'ai peur maintenant.
A : Ah, tu auras besoin de tout l'argent dont j'ai besoin de ton aide.
Résultat 3 (A et B sont tous deux des chatbots formés)
R : J’ai oublié de prendre le Coca-Cola.
B : J'ai quelque chose de coincé dans la tête.
A : Ce n'est pas grave, je suppose que c'est assez courant dans toutes ces merdes.
B : Je veux dire, nous sommes ensemble depuis que nous sommes petits.
R : Raison de plus.
B : Ce n'est pas lui, c'est sa faute et il est aveugle à cause de Dieu.
R : Et c’est une histoire étrange.
vous pouvez trouver plus de résultats de chatbot dans ce répertoire
Les configurations des réseaux de neurones de ces résultats sont décrites dans le nom du fichier
Êtes-vous étonné du résultat du chatbot ? :D
Vous pouvez générer vous-même ces dialogues étonnants !
Suivez simplement les instructions ci-dessous :
pip install -r exigences.txt
./script/download.sh
./script/simulate.sh <CHEMIN VERS LE MODÈLE> <TYPE DE SIMULATION> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
<CHEMIN VERS LE MODÈLE>
pour générer la boîte de dialogue seq2seq, tapez " model/Seq2Seq/model-77 "
pour générer la boîte de dialogue RL, tapez " model/RL/model-56-3000 "
<TYPE SIMULATION>
peut être 1 ou 2
le nombre représente le nombre d'anciennes phrases prises en compte par le chatbot
si vous choisissez 1, le chatbot ne prend en compte que la dernière phrase
si vous choisissez 2, le chatbot prendra en compte les deux dernières phrases (une de l'utilisateur et une du chatbot lui-même)
<FICHIER D'ENTRÉE>
Jetez un oeil à result/sample_input_new.txt
C'est le format de saisie du chatbot, chaque ligne est la phrase de début d'une boîte de dialogue.
Vous pouvez simplement utiliser le fichier d'exemple pour plus de commodité.
<FICHIER DE SORTIE>
le fichier de sortie, tapez le nom de fichier de votre choix
Si vous souhaitez que le chatbot génère une seule réponse pour chaque question
Suivez les instructions ci-dessous :
pip install -r exigences.txt
./script/download.sh
./script/run.sh <TYPE> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
<TYPE>
pour générer une réponse seq2seq, tapez " S2S "
pour générer une réponse d'apprentissage par renforcement, tapez " RL "
<FICHIER D'ENTRÉE>
Jetez un oeil à result/sample_input_new.txt
C'est le format de saisie du chatbot, chaque ligne est la phrase de début d'une boîte de dialogue.
Vous pouvez simplement utiliser le fichier d'exemple pour plus de commodité.
<FICHIER DE SORTIE>
le fichier de sortie, tapez le nom de fichier de votre choix
J'ai formé mon chatbot avec python2.7.
Si vous souhaitez former le chatbot à partir de zéro
Vous pouvez suivre ces instructions ci-dessous :
Jetez un œil à python/config.py, toutes les configurations pour la formation sont décrites ici.
Vous pouvez modifier certains hyper-paramètres d’entraînement, ou simplement conserver ceux d’origine.
J'utilise le corpus Cornell Movie-Dialogs
Vous devez le télécharger, le décompresser et déplacer tous les fichiers *.txt dans le répertoire data/
Téléchargez ensuite quelques bibliothèques avec pip :
pip install -r exigences.txt
./script/parse.sh
./script/train.sh
Montrons quelques résultats du modèle seq2seq :)
./script/test.sh <CHEMIN VERS LE MODÈLE> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
Et affichez quelques résultats de dialogue du modèle seq2seq !
./script/simulate.sh <CHEMIN VERS LE MODÈLE> <TYPE DE SIMULATION> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
<TYPE SIMULATION>
peut être 1 ou 2
le nombre représente le nombre d'anciennes phrases prises en compte par le chatbot
si vous choisissez 1, le chatbot ne prendra en compte que l'énoncé de l'utilisateur
si vous choisissez 2, le chatbot prendra en compte l'énoncé de l'utilisateur et le dernier énoncé du chatbot.
vous devez modifier le paramètre training_type dans python/config.py
« normal » pour la formation seq2seq, « pg » pour le gradient politique
vous devez d'abord vous entraîner avec « normal » pendant certaines époques jusqu'à ce qu'il soit stable (au moins 30 époques sont fortement recommandées)
puis changez la méthode en 'pg' pour optimiser la fonction de récompense
./script/train_RL.sh
Lors d'une formation avec un gradient de politique (pg)
vous aurez peut-être besoin d'un modèle inversé
le modèle inversé est également entraîné par l'ensemble de données Cornell Movie-Dialogs, mais avec la source et la cible inversées.
vous pouvez télécharger un modèle inversé pré-entraîné en
./script/download_reversed.sh
ou vous pouvez l'entraîner vous-même
vous n'avez pas besoin de modifier les paramètres du modèle inversé si vous utilisez un modèle inversé pré-entraîné
Générons quelques résultats du modèle RL et trouvons les différents du modèle seq2seq :)
./script/test_RL.sh <CHEMIN VERS LE MODÈLE> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
Et affichez quelques résultats de dialogue du modèle RL !
./script/simulate.sh <CHEMIN VERS LE MODÈLE> <TYPE DE SIMULATION> <FICHIER D'ENTRÉE> <FICHIER DE SORTIE>
<TYPE SIMULATION>
peut être 1 ou 2
le nombre représente le nombre d'anciennes phrases prises en compte par le chatbot
si vous choisissez 1, le chatbot ne prend en compte que la dernière phrase
si vous choisissez 2, le chatbot prendra en compte les deux dernières phrases (une de l'utilisateur et une du chatbot lui-même)
Système d'exploitation : CentOS Linux version 7.3.1611 (noyau)
Processeur : processeur Intel(R) Xeon(R) E3-1230 v3 à 3,30 GHz
GPU : GeForce GTX 1070 8 Go
Mémoire : 16 Go DDR3
Python3 (pour data_parser.py) & Python2.7 (pour les autres)
Po-Chih Huang / @pochih