Este repositório hospeda a implementação do artigo "Aumentar a geração de respostas neurais com atenção tópica sensível ao contexto".
THRED é um sistema de geração de respostas multivoltas destinado a produzir respostas contextuais e com reconhecimento de tópico. A base de código evoluiu do repositório Tensorflow NMT.
TL; DR Etapas para criar um agente de diálogo usando esta estrutura:
conda env create -f thred_env.yml
(para usar pip
, consulte Dependências)MODEL_DIR
é um diretório onde o modelo será salvo. Recomendamos treinar em pelo menos 2 GPUs, caso contrário você pode reduzir o tamanho dos dados (omitindo as conversas do arquivo de treinamento) e o tamanho do modelo (modificando o arquivo de configuração). python -m thred --mode train --config conf/thred_medium.yml --model_dir
--train_data --dev_data --test_data
python -m thred --mode interactive --model_dir
1 pacotes necessários apenas para analisar e limpar os dados do Reddit. 2 usado apenas para testar modelos de diálogo no modo interativo de linha de comando
Para instalar as dependências usando pip
, execute pip install -r requirements
. E para o Anaconda, execute conda env create -f thred_env.yml
(recomendado). Depois de concluir as dependências, execute pip install -e .
para instalar o pacote thred.
Nosso conjunto de dados do Reddit, que chamamos de Reddit Conversation Corpus (RCC), é coletado de 95 subreddits selecionados (listados aqui). Processamos o Reddit por um período de 20 meses, de novembro de 2016 a agosto de 2018 (excluindo junho de 2017 e julho de 2017; utilizamos esses dois meses junto com os dados de outubro de 2016 para treinar um modelo LDA). Consulte aqui os detalhes de como o conjunto de dados do Reddit é construído, incluindo o pré-processamento e a limpeza dos arquivos brutos do Reddit. A tabela a seguir resume as informações do RCC:
Corpus | #trem | #dev | #teste | Download | Baixar com palavras de tópico |
---|---|---|---|---|---|
3 voltas por linha | 9,2 milhões | 508 mil | 406K | baixar (773 MB) | baixar (2,5 GB) |
4 voltas por linha | 4M | 223 mil | 178K | baixar (442 MB) | baixar (1,2 GB) |
5 voltas por linha | 1,8 milhões | 100 mil | 80 mil | baixar (242 MB) | baixar (594 MB) |
Nos arquivos de dados, cada linha corresponde a uma única conversa onde as expressões são separadas por TAB. As palavras do tópico aparecem após o último enunciado separadas também por uma TAB.
Observe que os arquivos de 3 voltas/4 voltas/5 voltas contêm conteúdo semelhante, embora com número diferente de declarações por linha. Eles são todos extraídos da mesma fonte. Se você encontrou algum erro ou expressão inadequada nos dados, relate suas preocupações aqui.
Nos arquivos de configuração do modelo (ou seja, os arquivos YAML em conf), os tipos de incorporação podem ser um dos seguintes: glove840B
, fastText
, word2vec
e hub_word2vec
. Para lidar com os vetores de incorporação pré-treinados, aproveitamos o Pymagnitude e o Tensorflow-Hub. Observe que você também pode usar random300
(300 refere-se à dimensão dos vetores incorporados e pode ser substituído por qualquer valor arbitrário) para aprender vetores durante o treinamento dos modelos de geração de resposta. As configurações relacionadas aos modelos de incorporação são fornecidas em word_embeddings.yml.
A configuração do treinamento deve ser definida em um arquivo YAML semelhante ao Tensorflow NMT. Exemplos de configurações para THRED e outras linhas de base são fornecidos aqui.
Os modelos implementados são Seq2Seq, HRED, Topic Aware-Seq2Seq e THRED.
Observe que embora a maioria dos parâmetros sejam comuns entre os diferentes modelos, alguns modelos podem ter parâmetros adicionais (por exemplo, modelos tópicos possuem parâmetros topic_words_per_utterance
e boost_topic_gen_prob
).
Para treinar um modelo, execute o seguinte comando:
python main.py --mode train --config < YAML_FILE >
--train_data < TRAIN_DATA > --dev_data < DEV_DATA > --test_data < TEST_DATA >
--model_dir < MODEL_DIR >
Em
, arquivos de vocabulário e arquivos de modelo do Tensorflow são armazenados. O treinamento pode ser retomado executando:
python main.py --mode train --model_dir < MODEL_DIR >
Com o comando a seguir, o modelo pode ser testado no conjunto de dados de teste.
python main.py --mode test --model_dir < MODEL_DIR > --test_data < TEST_DATA >
É possível substituir os parâmetros de teste durante o teste. Esses parâmetros são: largura do feixe --beam_width
, peso da penalidade de comprimento --length_penalty_weight
e temperatura de amostragem --sampling_temperature
.
É implementada uma interface de linha de comando simples que permite conversar com o modelo aprendido (semelhante ao modo de teste, os parâmetros de teste também podem ser substituídos):
python main.py --mode interactive --model_dir < MODEL_DIR >
No modo interativo, um modelo LDA pré-treinado é necessário para alimentar o modelo com as palavras do tópico inferidas. Treinamos um modelo LDA usando Gensim em um corpus Reddit, coletado para esse fim. Ele pode ser baixado aqui. O arquivo baixado deve ser descompactado e passado para o programa via --lda_model_dir
.
Por favor, cite o seguinte artigo se você usou nosso trabalho em sua pesquisa:
@article{dziri2018augmenting,
title={Augmenting Neural Response Generation with Context-Aware Topical Attention},
author={Dziri, Nouha and Kamalloo, Ehsan and Mathewson, Kory W and Zaiane, Osmar R},
journal={arXiv preprint arXiv:1811.01063},
year={2018}
}