Notas aos visitantes:
python3 manage.py runserver
. Se você não estiver familiarizado com a execução do flask dessa maneira, consulte a documentação do Flask-Script. Desculpe por qualquer inconveniente!A partir de 9 de maio de 2017, os principais pacotes do projeto são os seguintes:
python3 manage.py runserver
Do ponto de vista do usuário/desenvolvedor, este projeto oferece uma interface mais limpa para mexer em modelos sequência a sequência. O resultado ideal é uma API de chatbot com a legibilidade do Keras, mas com um grau de flexibilidade mais próximo do TensorFlow.
No lado do 'cliente', brincar com os parâmetros do modelo e executá-los é tão fácil quanto criar um arquivo de configuração (yaml), abrir um interpretador python e emitir alguns comandos. O trecho a seguir, por exemplo, é tudo o que é necessário para iniciar o treinamento no conjunto de dados Cornell (depois de baixá-lo, é claro) com sua configuração:
import data
import chatbot
from utils import io_utils
# Load config dictionary with the flexible parse_config() function,
# which can handle various inputs for building your config dictionary.
config = io_utils . parse_config ( config_path = 'path_to/my_config.yml' )
dataset = getattr ( data , config [ 'dataset' ])( config [ 'dataset_params' ])
bot = getattr ( chatbot , config [ 'model' ])( dataset , config )
bot . train ()
Esta é apenas uma forma de interagir com o projeto. Por exemplo, o usuário também pode passar parâmetros por meio de argumentos de linha de comando, que também serão mesclados com quaisquer arquivos de configuração especificados (precedência dada aos argumentos de linha de comando em caso de conflito). Você também pode passar a localização de um chatbot salvo anteriormente para retomar o treinamento ou iniciar uma conversa. Consulte main.py
para obter mais detalhes.
Ubuntu Dialogue Corpus: abordagem de pré-processamento pode ser vista em ubuntu_reformat.ipynb na pasta notebooks. O uso pretendido para o conjunto de dados é a classificação de respostas para diálogos multi-voltas, mas adotei a abordagem bastante simples de extrair pares de expressões e interpretá-los como frase única para resposta única, que correspondem às entradas para o codificador e decodificador , respectivamente, nos modelos.
Cornell Movie-Dialogs: Comecei com esta versão pré-processada do corpus Cornell e fiz pequenas modificações para reduzir o ruído.
Comentários do Reddit: Aprox. 1,7 bilhão de comentários no Reddit. Atualmente trabalhando no pré-processamento e redução deste enorme conjunto de dados para um formato adequado para treinar modelos de conversação. Publicará links para download do conjunto de dados processados quando concluído!
DynamicBot: usa uma abordagem mais orientada a objetos oferecida por classes personalizadas em model_components.py. O resultado é uma incorporação on-line concatenada em lote mais rápida e uma abordagem mais natural para bate-papo. Ele faz uso da (fantástica) nova API python na versão TensorFlow 1.0, notadamente o dynamic_rnn. Ele também segue boas práticas de escopo de variáveis e convenções comuns de tensorflow que observei na documentação e no código-fonte, que têm efeitos colaterais interessantes, como visualizações de gráficos limpas no TensorBoard.
SimpleBot: modelo simplificado em intervalos baseado no modelo mais complicado 'ChatBot' abaixo. Embora seja menos flexível na personalização de partições de bucket e use um softmax esparso em todo o vocabulário em vez de amostragem, é muito mais transparente em sua implementação. Ele faz uso mínimo de tf.contrib, em oposição ao ChatBot, e é mais ou menos implementado do "zero", no sentido de confiar principalmente nos métodos básicos de tensorflow. Se você é novo no TensorFlow, pode ser útil ler sua implementação para ter uma ideia das convenções comuns na programação de tensorflow, pois foi o resultado de eu ler o código-fonte de todos os métodos no ChatBot e escrever meu próprio código mais compacto interpretação.
ChatBot: versão estendida do modelo descrito neste tutorial do TensorFlow. Características da arquitetura: entradas agrupadas, o decodificador usa um mecanismo de atenção (consulte a página 69 de minhas notas e as entradas são incorporadas às funções simples fornecidas na biblioteca tf.contrib. Também emprega uma função de perda softmax amostrada para permitir tamanhos de vocabulário maiores (página 67 de notas). Comentários adicionais: devido à natureza dos modelos em buckets, leva muito mais tempo para criar o modelo em comparação com outros. O principal gargalo parece ser o tamanho do bucket maior e como as operações de gradiente são criadas com base no. tamanhos de balde.
O diretório da página da Web apresenta uma maneira simples e com uso eficiente de espaço para implantar seus modelos do TensorFlow em um aplicativo Flask. Os modelos são 'congelados' - todos os componentes não necessários para o bate-papo (por exemplo, otimizadores) são removidos e todas as variáveis restantes são convertidas em constantes. Quando o usuário clica no nome de um modelo, uma API REST para esse modelo é criada. Quando o usuário insere uma frase no formulário, é emitida uma solicitação POST (AJAX), onde a resposta é a frase de resposta do chatbot. Para obter mais detalhes sobre a API REST, consulte views.py.
A aplicação Flask segue as melhores práticas, como o uso de blueprints para instanciar aplicações, diferentes bancos de dados dependendo do ambiente da aplicação (por exemplo, desenvolvimento ou produção) e muito mais.
Aqui entrarei em mais detalhes sobre como os modelos são construídos e como eles podem ser visualizados. Esta seção é um trabalho em andamento e ainda não concluído.
Em vez de usar o argumento feed_dict
para inserir lotes de dados no modelo, é substancialmente mais rápido codificar as informações de entrada e as técnicas de pré-processamento na própria estrutura do gráfico. Isso significa que não alimentamos nada ao modelo no momento do treinamento. Em vez disso, o modelo usa uma sequência de filas para acessar os dados de arquivos no formato protobuf do Google, decodificar os arquivos em sequências de tensores, agrupar e preencher dinamicamente as sequências e, em seguida, alimentar esses lotes para o decodificador de incorporação. Tudo dentro da estrutura do gráfico. Além disso, esse processamento de dados é coordenado por vários threads em paralelo. Podemos usar tensorboard (e práticas recomendadas para escopo de variável) para visualizar esse tipo de pipeline em alto nível.
(Mais descrições em breve!)
Muitas pesquisas foram feitas sobre esses modelos, e tenho documentado minhas anotações sobre os artigos mais "importantes" aqui, na última seção de minhas notas de aprendizado profundo aqui. As notas também incluem como tentei traduzir o material dos artigos para o código do TensorFlow. Estarei atualizando isso à medida que as ideias de mais artigos chegarem a este projeto.
Artigos:
Recursos on-line: