Este é um chatbot treinado por seq2seq e aprendizado por reforço .
seq2seq
Seq2seq é um modelo clássico para aprendizagem estruturada, sua entrada e saída são sequências
O modelo vanilla seq2seq é descrito em um artigo do NIPS '14 Sequence to Sequence Learning with Neural Networks, o codificador e o decodificador são separados
O modelo seq2seq neste repositório é construído com 2 LSTMs, semelhante ao descrito em um artigo ICCV '15 Sequence to Sequence - Video to Text, o codificador e o decodificador compartilham os mesmos pesos
RL
Depois de treinar o chatbot com épocas suficientes, uso uma técnica de RL chamada gradiente de política para melhorar ainda mais o chatbot
Ao fazer isso, o chatbot pode gerar respostas mais interessantes em relação à função de recompensa
Minha função de recompensa é semelhante àquela descrita em um artigo do EMNLP '16, Deep Reinforcement Learning for Dialogue Generation
Deixe-me mostrar alguns resultados do chatbot:
Resultado 1 (A e B são chatbots treinados)
R: Você pode me fazer um favor?
B: Qualquer coisa.
R: Eu quero que você dobre um pai.
B: Claro.
R: Sinto muito, não tive a intenção de ser rude, mas.
B: Não entenda, pelo menos é o máximo que posso.
Resultado 2 (A e B são chatbots treinados)
R: Eu não fiz isso! Eu não tenho uma arma!
B: Seu mentiroso. Você ainda quer receber seu dinheiro de volta.
R: Algo errado com a verdade.
B: Eu não quero nenhum dinheiro, nem um pouco que eu não possa tirar com isso.
R: O que há de errado.
B: Escute-me. Estou com medo agora.
R: Ah, você vai precisar de todo o dinheiro. Preciso da sua ajuda.
Resultado 3 (A e B são chatbots treinados)
R: Esqueci de pegar a Coca-Cola.
B: Eu tenho algo preso na cabeça.
R: Está tudo bem, acho que é bem comum nessa merda.
B: Quer dizer, estamos juntos desde criança.
R: Mais uma razão.
B: Não é ele, a culpa é dele e ele é cego por causa de Deus.
R: E é uma história estranha.
você pode encontrar mais resultados do chatbot neste diretório
As configurações das redes neurais desses resultados são descritas no nome do arquivo
Você está surpreso com o resultado do chatbot? :D
Você pode gerar esses diálogos incríveis sozinho!
Basta seguir as instruções abaixo:
pip instalar -r requisitos.txt
./script/download.sh
./script/simulate.sh <CAMINHO PARA O MODELO> <TIPO DE SIMULAÇÃO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
<CAMINHO PARA O MODELO>
para gerar a caixa de diálogo seq2seq, digite " model/Seq2Seq/model-77 "
para gerar a caixa de diálogo RL, digite " model/RL/model-56-3000 "
<TIPO DE SIMULAÇÃO>
pode ser 1 ou 2
o número representa o número de frases anteriores que o chatbot considera
se você escolher 1, o chatbot considera apenas a última frase
se você escolher 2, o chatbot considerará as duas últimas frases (uma do usuário e outra do próprio chatbot)
<ARQUIVO DE ENTRADA>
Dê uma olhada em result/sample_input_new.txt
Este é o formato de entrada do chatbot, cada linha é a frase inicial de um diálogo.
Você pode simplesmente usar o arquivo de exemplo por conveniência.
<ARQUIVO DE SAÍDA>
o arquivo de saída, digite qualquer nome de arquivo desejado
Se você deseja que o chatbot gere apenas uma única resposta para cada pergunta
Siga as instruções abaixo:
pip instalar -r requisitos.txt
./script/download.sh
./script/run.sh <TIPO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
<TIPO>
para gerar resposta seq2seq, digite " S2S "
para gerar resposta de aprendizagem por reforço, digite " RL "
<ARQUIVO DE ENTRADA>
Dê uma olhada em result/sample_input_new.txt
Este é o formato de entrada do chatbot, cada linha é a frase inicial de um diálogo.
Você pode simplesmente usar o arquivo de exemplo por conveniência.
<ARQUIVO DE SAÍDA>
o arquivo de saída, digite qualquer nome de arquivo desejado
Treinei meu chatbot com python2.7.
Se você quiser treinar o chatbot do zero
Você pode seguir as instruções abaixo:
Dê uma olhada em python/config.py, todas as configurações para treinamento estão descritas aqui.
Você pode alterar alguns hiperparâmetros de treinamento ou apenas manter os originais.
Eu uso Cornell Movie-Dialogs Corpus
Você precisa baixá-lo, descompactá-lo e mover todos os arquivos *.txt para o diretório data/
Então baixe algumas bibliotecas com pip:
pip instalar -r requisitos.txt
./script/parse.sh
./script/train.sh
Vamos mostrar alguns resultados do modelo seq2seq :)
./script/test.sh <CAMINHO PARA O MODELO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
E mostre alguns resultados de diálogo do modelo seq2seq!
./script/simulate.sh <CAMINHO PARA O MODELO> <TIPO DE SIMULAÇÃO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
<TIPO DE SIMULAÇÃO>
pode ser 1 ou 2
o número representa o número de frases anteriores que o chatbot considera
se você escolher 1, o chatbot considerará apenas a expressão do usuário
se você escolher 2, o chatbot considerará a expressão do usuário e a última expressão do chatbot
você precisa alterar o parâmetro training_type em python/config.py
'normal' para treinamento seq2seq, 'pg' para gradiente de política
você precisa primeiro treinar com 'normal' por algumas épocas até ficar estável (pelo menos 30 épocas é altamente recomendado)
em seguida, altere o método para 'pg' para otimizar a função de recompensa
./script/train_RL.sh
Ao treinar com gradiente de política (pág.)
você pode precisar de um modelo invertido
o modelo invertido também é treinado pelo conjunto de dados cornell movie-dialogs, mas com origem e destino invertidos.
você pode baixar o modelo reverso pré-treinado por
./script/download_reversed.sh
ou você pode treiná-lo sozinho
você não precisa alterar nenhuma configuração sobre o modelo reverso se usar o modelo reverso pré-treinado
Vamos gerar alguns resultados do modelo RL e encontrar a diferença do modelo seq2seq :)
./script/test_RL.sh <CAMINHO PARA O MODELO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
E mostre alguns resultados de diálogo do modelo RL!
./script/simulate.sh <CAMINHO PARA O MODELO> <TIPO DE SIMULAÇÃO> <ARQUIVO DE ENTRADA> <ARQUIVO DE SAÍDA>
<TIPO DE SIMULAÇÃO>
pode ser 1 ou 2
o número representa o número de frases anteriores que o chatbot considera
se você escolher 1, o chatbot considera apenas a última frase
se você escolher 2, o chatbot considerará as duas últimas frases (uma do usuário e outra do próprio chatbot)
SO: CentOS Linux versão 7.3.1611 (núcleo)
CPU: CPU Intel(R) Xeon(R) E3-1230 v3 a 3,30 GHz
GPU: GeForce GTX 1070 8GB
Memória: 16GB DDR3
Python3 (para data_parser.py) e Python2.7 (para outros)
Po-Chih Huang / @pochih