### [Atualização 2017-03-14]
- Atualize para o TensorFlow v1.0.0, sem compatíveis com versões anteriores, pois o TensorFlow mudou muito.
- Um modelo pré-treinado com o Twitter corpus é adicionado, apenas
./go_examplepara conversar! (ou visualize meu exemplo de bate -papo)- Você pode começar com o rastreamento deste script
go_examplepara saber como as coisas funcionam!
Este é um modelo SEQ2SEQ modificado no exemplo do TensorFlow.
app.py do servidor de frasco leve de peso é incluído para ser o back -end do aplicativo Facebook Messenger. Expliquei alguns detalhes sobre os recursos e alguns truques de implementação aqui.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Você pode encontrar corpus como bate -papo no Twitter, legenda de filmes abertos ou fóruns de PTT do meu repositório de corpus de bate -papo. Você precisa colocá -lo em Caminho como:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
E criar algumas frases de teste (cada frase por linha) em:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
Depois de treinar seu modelo até a perplexidade com menos de 50 anos, você poderia fazer:
python3 main.py --mode test --model_name <MODEL_NAME>
[NOTA !!!] Se você colocar algum parâmetro substituindo neste main.py Commmand, certifique -se de aplicar para treinar e testar ou apenas modificar no lib/config.py para falhas.
python3 app.py --model_name <MODEL_NAME>
Você pode ver este exemplo mínimo de FB_MESSENGER para obter mais detalhes, como configurar SSL, Webhook e Work-Arounds para bug conhecido.
Aqui está uma comparação interessante: a conversa esquerda permitiu a pesquisa de feixe com feixe com feixe = 10, a resposta é apenas melhor do que sempre "eu não sei". A conversa certa também usou a pesquisa de feixes e, além disso, ativou o modelo anti-linguagem. Isso deveria suprimir a resposta genérica, e a resposta parece melhor.
[Atualização 2017-03-09] O aprendizado de reforço não funciona agora, aguarde a correção.
Se você deseja alguma chance de melhorar seu modelo, aqui implementei uma arquitetura de aprendizado de reforço inspirada em Li et al., 2016. Apenas ative a opção Reforce_learn em config.py , convém adicionar sua própria regra na função step_rf() em lib/seq2seq_mode.py .
Observe que você deve treinar no modo normal para obter um modelo decente primeiro! , como o aprendizado de reforço explorará o corajoso mundo novo com este modelo pré-treinado. Ele acabará levando uma eternidade para melhorar se você começar com um modelo ruim.
O SEQ2SEQ é um ótimo modelo lançado por Cho et al., 2014. No começo, é usado para fazer a tradução da máquina, e logo as pessoas descobrem que qualquer coisa sobre mapear algo para outra coisa também poderia ser alcançada pelo modelo SEQ2SEQ. O Chatbot é um desses milagres, onde consideramos o diálogo consecutivo como algum tipo de relacionamento de "mapeamento".
Aqui está a imagem clássica da Intro Mostrar a arquitetura do modelo SEQ2SEQ, citação deste post do blog sobre o recurso de resposta automática do Gmail.
O problema é que até agora não encontramos uma função objetiva melhor para o chatbot. Ainda estamos usando o MLE (estimativa máxima provável), o que está indo bem para a tradução da máquina, mas sempre gera resposta genérica como "eu também", "acho que sim", "eu te amo" enquanto bate -papo.
Essas respostas não são informativas, mas têm grande probabilidade-uma vez que tendem a aparecer muitas vezes no treinamento de corpus. Não vamos sempre responder a essas não -censagens, por isso precisamos encontrar uma maneira de tornar nosso bot mais "interessante", tecnicamente falando, para aumentar a "perplexidade" de reproje.
Aqui reproduzimos o trabalho de Li. et al., 2016 tentam resolver esse problema. A idéia principal é usar o mesmo modelo SEQ2SEQ que um modelo de idioma, para obter as palavras candidatas com alta probabilidade em cada registro de data e hora de decodificar como um anti-modelo, então penalizamos essas palavras sempre sendo alta probabilidade de qualquer entrada. Por esse anti-modelo, poderíamos obter uma resposta informativa mais especial, não genérica.
O trabalho original de Li. et al. Use MERT (OCH, 2003) com bleu como métricas para encontrar a melhor ponderação de probabilidade ( λ e γ no escore (t) = p (t | s)-λu (t) + γnt ) do modelo anti-linguagem correspondente. Mas acho que a pontuação do Bleu no corpus de bate -papo tende a ser sempre zero, portanto, não consegue obter um resultado significativo aqui. Se alguém tiver alguma idéia sobre isso, envie -me uma mensagem, obrigado!
Existem algumas opções para treinamento e previsão de modelos em lib/config.py. Basicamente, eles são auto-explicados e podem trabalhar com o valor padrão na maioria dos casos. Aqui listamos apenas algo que você precisa configurar:
Sobre o ambiente
| nome | tipo | Descrição |
|---|---|---|
| modo | corda | Modo de trabalho: trem/teste/chat |
| Model_name | corda | Nome do modelo, afeta seu caminho de trabalho (armazenando os dados, nn_model, pastas de resultados) |
| scope_name | corda | No TensorFlow, se você precisar carregar dois gráficos ao mesmo tempo, precisará salvá -los/carregá -los em um espaço de nome diferente. (Se você precisar de apenas um modelo SEQ2SEQ, deixe -o como padrão) |
| vocab_size | Inteiro | Depende do seu idioma corpus: para o inglês, o 60000 é bom o suficiente. Para chinês, você precisa de pelo menos 100000 ou 200000. |
| gpu_usage | flutuador | Fração de memória GPU TensorFlow usada, o padrão é 1 e o TensorFlow ocupará 100% da sua GPU. Se você tiver empregos multi -trabalhos compartilhando seu recurso de GPU, faça 0,5 ou 0,3, para 2 ou 3 trabalhos. |
| reforço_learn | int | Definir 1 para ativar o modo de aprendizado de reforço |
Sobre decodificar
| nome | tipo | padrão | Descrição |
|---|---|---|---|
| feam_size | int | 10 | Tamanho da pesquisa de feixe, configuração 1 é igual à pesquisa gananciosa |
| ANTILM | flutuador | 0 (desativado) | punir o peso do modelo anti-linguagem |
| n_bonus | flutuador | 0 (desativado) | Recompensa peso do comprimento da frase |
A functina anti-LM está desativada por padrão, você pode começar a definir antILM = 0,5 ~ 0,7 e n_bonus = 0,05 para verificar se você gosta da diferença nos resultados.
Para o treinamento, a GPU é recomendada, uma vez que o SEQ2SEQ é um modelo grande, você precisa de um determinado poder de computação para fazer o treinamento e prever com eficiência, especialmente quando você define um grande tamanho de pesquisa de feixe.
O requisito de DRAM não é rigoroso como CPU/GPU, pois estamos fazendo um gradiente estocástico decente.
Se você é novo no aprendizado profundo, configurando coisas como GPU, o ambiente Python é irritante para você, aqui estão os dockers do meu ambiente de aprendizado de máquina:
(Docker de versão não-GPU) / (GPU Version Docker)
O SEQ2SEQ é um modelo com muitas preliminares, gastei algum tempo pesquisando e aqui estão alguns melhores materiais que me beneficiam muito:
O melhor post do blog explicando o modelo RNN, LSTM, GRU e SEQ2SEQ: Entendendo as redes LSTM por Christopher Olah.
Este trabalho Sherjilozair/char-rnn-tensorflow me ajuda a aprender muito sobre o modelo de idioma e o gráfico de implementação no TensorFlow.
Se você está interessado em mais mágica sobre o RNN, aqui está um post do blog de leitura obrigatória: a eficácia irracional das redes neurais recorrentes de Andrej Karpathy.
A versão de baunilha seq2seq+atenção: nicolas-ivanov/tf_seq2seq_chatbot. Isso ajudará você a descobrir o principal fluxo do modelo de baunilha seq2seq, e eu construo esse repositório com base neste trabalho.
Atualmente, construo pesquisa de feixe fora do gráfico, o que significa-é muito lento. Há discussões sobre o Build It In-Graph aqui e ali. Infelizmente, se você quiser adicionar algo mais do que pesquisa de feixe, como esse trabalho anti-LM, você precisa de muito mais do que apenas a pesquisa de feixe para estar no gráfico.
Não descobri como o MERT com Bleu pode otimizar o peso do modelo anti-LM, pois atualmente o bleu geralmente é zero.