Эта работа пытается воспроизвести результаты Нейронной Разговорной Модели (также известной как чат-бот Google). Он использует RNN (модель seq2seq) для прогнозирования предложений. Это делается с помощью Python и TensorFlow.
Часть программы, посвященная загрузке корпуса, вдохновлена Torch Neuralconvo от Macournoyer.
На данный момент DeepQA поддерживает следующий корпус диалогов:
--corpus opensubs
.--corpus scotus
. См. инструкции по установке.--corpus ubuntu
. См. инструкции по установке.Чтобы ускорить обучение, также можно использовать предварительно обученные встраивания слов (спасибо Eschnou). Дополнительная информация здесь.
Для программы требуются следующие зависимости (легко установить с помощью pip: pip3 install -r requirements.txt
):
Вам также может потребоваться загрузить дополнительные данные, чтобы nltk работал.
python3 -m nltk.downloader punkt
Набор данных Корнелла уже включен. Для других наборов данных просмотрите файлы readme в соответствующих папках (внутри data/
).
Для веб-интерфейса требуются некоторые дополнительные пакеты:
Также доступна установка Docker. Более подробная инструкция здесь.
Чтобы обучить модель, просто запустите main.py
После обучения вы можете проверить результаты с помощью main.py --test
(результаты генерируются в файле save/model/samples_predictions.txt) или main.py --test interactive
(более увлекательно).
Вот несколько флагов, которые могут быть полезны. Для получения дополнительной помощи и опций используйте python main.py -h
:
--modelTag
: позволяет дать имя текущей модели, чтобы различать их при тестировании/обучении.--keepAll
: используйте этот флаг при обучении, если при тестировании вы хотите видеть прогнозы на разных этапах (может быть интересно увидеть, как программа меняет свое имя и возраст по мере прохождения обучения). Предупреждение: это может быстро занять много места для хранения, если вы не увеличите параметр --saveEvery
.--filterVocab 20
или --vocabularySize 30000
: Ограничьте размер словаря и оптимизируйте производительность и использование памяти. Замените слова, использованные менее 20 раз, токеном
и установите максимальный размер словаря.--verbose
: при тестировании будет печатать предложения по мере их вычисления.--playDataset
: показать несколько примеров диалогов из набора данных (можно использовать совместно с --createDataset
если это единственное действие, которое вы хотите выполнить). Чтобы визуализировать вычислительный график и стоимость с помощью TensorBoard, просто запустите tensorboard --logdir save/
.
По умолчанию архитектура сети представляет собой стандартный кодер/декодер с двумя уровнями LSTM (скрытый размер 256) и размером внедрения для словаря 32. Сеть обучается с использованием ADAM. Максимальная длина предложения установлена на уровне 10 слов, но ее можно увеличить.
После обучения с ним можно будет общаться в чате, используя более удобный интерфейс. Сервер просмотрит модель, скопированную в save/model-server/model.ckpt
. Когда вы впервые захотите использовать его, вам необходимо настроить его с помощью:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
Затем, чтобы запустить сервер локально, используйте следующие команды:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
После запуска интерфейс должен быть доступен по адресу http://localhost:8000/. Если вы хотите развернуть программу на сервере, используйте вместо этого python manage.py runserver 0.0.0.0
. Дополнительная информация здесь.
Удивительно, но можно получить некоторые результаты всего за 1 или 2 часа обучения (на GeForce GT 740M), радикально сократив входную последовательность до 5 слов и выходную до 3 (плюс жетоны go
и eos
) и используя небольшой размер встраивания (около 25). С тех пор я изменил код, и теперь длина вывода должна совпадать с длиной ввода, но вы все равно можете воспроизвести исходные результаты, используя эту версию. Конечно, в сети особо болтливым не будет:
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
Вот случай, когда это не удается:
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
С более длинными предложениями сеть обучается гораздо медленнее. После 250 000 итераций с maxLength=10 сеть по-прежнему в основном дает уклончивые ответы (отвечая на большинство открытых вопросов словами «Я не знаю»), но, похоже, она интегрировала некоторую базовую семантику:
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
Как видно из последних вопросов, сеть по-прежнему путает пол и настоящее/будущее. Я также пробовал более или менее успешно задавать более глубокие философские вопросы.
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
Модель, которую я обучил, весьма ограничена размером встраивания, который я установил, ее размером и размером обучающего корпуса. Его «вектор мысли», вероятно, слишком мал, чтобы ответить на следующие вопросы:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
Кроме того, кажется, что он переобучен, поскольку иногда он просто выдает из своего обучающего набора предложения, не связанные с вопросом. Добавление некоторого отсева должно уменьшить проблему.
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
Примечание: ссылки больше не работают.
Вы можете найти предварительно обученную модель здесь. , обученный корпусу по умолчанию. Чтобы использовать его:
DeepQA/save/
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
в data/samples/
../main.py --modelTag pretrainedv2 --test interactive
. Благодаря Николасу С. здесь (оригинал) представлены несколько дополнительных предварительно обученных моделей (совместимых с TF 1.2) для различных наборов данных. Папка также содержит предварительно обработанный набор данных для Cornell, OpenSubtitles, Ubuntu и Scotus (для перемещения внутри data/samples/
). Они необходимы, если вы не хотите обрабатывать наборы данных самостоятельно.
Если у вас высокопроизводительный графический процессор, не стесняйтесь экспериментировать с гиперпараметрами/корпусом, чтобы обучить лучшую модель. Судя по моим экспериментам, наибольшее влияние на результаты оказывают скорость обучения и процент отсева. Также, если вы хотите поделиться своими моделями, не стесняйтесь обращаться ко мне, и я добавлю их сюда.
Помимо опробования более крупной/глубокой модели, есть много небольших улучшений, которые можно протестировать. Не стесняйтесь отправить запрос на включение, если вы реализуете один из них. Вот несколько идей:
loop_function
tf.nn.seq2seq.rnn_decoder
, добавить его не составит большого труда. После этого появится возможность поиграть с температурой SoftMax, чтобы получить более консервативные или экзотические прогнозы.embedding_rnn_seq2seq
на embedding_attention_seq2seq
в model.py
.Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
мы могли бы сгенерировать 3 новые образцы: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
и Q:Sentence 2. => A:Sentence X.
. Внимание: другие комбинации, такие как Q:Sentence 1. => A:Sentence X.
не будут работать, поскольку это нарушит переход 2 => X
, который связывает вопрос с вопросом. отвечать)
и
, чтобы кодировщик знал, когда собеседник меняется. Однако я не уверен, что простой модели seq2seq будет достаточно, чтобы отразить долгосрочные зависимости между предложениями. Добавление системы сегментов для группировки одинаковых входных длин может значительно повысить скорость обучения.