#### [Обновление 2017-03-14]
- Обновите до Tensorflow v1.0.0, не совместимо с обратной стороны, так как Tensorflow так сильно изменился.
- Добавлена предварительно обученная модель с корпусом Twitter, просто
./go_exampleto to Chat! (или предварительно просмотреть мой пример чата)- Вы можете начать с отслеживания этого скрипта
go_example, чтобы узнать, как все работает!
Это модель SEQ2SEQ, измененная из примера TensorFlow.
app.py включено, чтобы быть бэкэнд приложения Facebook Messenger. Я объяснил несколько деталей о функциях и некоторых трюках в реализации здесь.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Вы можете найти такую корпус, как Twitter Chat, Open Movie Subtitle или PTT -форумы из моего хранилища чата. Вам нужно поместить его под путь, как:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
И вручную создать некоторые испытательные предложения (каждое предложение на строку) в:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
После того, как вы обучили свою модель до озадачивания до 50 или около того, вы могли бы сделать:
python3 main.py --mode test --model_name <MODEL_NAME>
[ПРИМЕЧАНИЕ !!!] Если вы поместите какой -либо перезапись параметров в этом Main.py Commmand, обязательно примените как для обучения, так и для тестирования, или просто изменить в lib/config.py для сбоя.
python3 app.py --model_name <MODEL_NAME>
Вы можете увидеть этот минимальный пример fb_messenger для получения более подробной информации, например, настройка SSL, Webhook и Workings для известной ошибки.
Вот интересное сравнение: поиск луча в левом разговоре с помощью луча = 10, ответ едва ли лучше, чем всегда «я не знаю». Правильный разговор также использовал поиск пучка и дополнительно, включенная анти-языковая модель. Это должно подавить общий ответ, и ответ кажется лучше.
[Обновление 2017-03-09] Подкрепление обучения не работает сейчас, подождите исправление.
Если вы хотите, чтобы какой -то шанс улучшить вашу модель, здесь я внедрил архитектуру обучения подкрепления, вдохновленную Li et al., 2016. Просто включите опцию reatforce_learn в config.py , вы можете добавить свое собственное правило в функции step_rf() в функции lib/seq2seq_mode.py .
Обратите внимание, что вам следует тренироваться в обычном режиме, чтобы сначала получить приличную модель! , поскольку обучение подкреплению изучит смелый новый мир с помощью этой предварительно обученной модели. В конечном итоге это понадобится вечно, чтобы улучшить себя, если вы начнете с плохой модели.
SEQ2SEQ - отличная модель, выпущенная CHO et al., 2014. Сначала она используется для машинного перевода, и вскоре люди обнаруживают, что что -либо о сопоставлении чего -либо с другой вещью также может быть достигнуто по модели SEQ2SEQ. Чатбот - одно из этих чудес, где мы рассматриваем последовательный диалог как какое -то «картирование» отношения.
Вот классическое вступительное изображение показывает архитектуру модели SEQ2SEQ, цитата этого блога о функции Gmail Auto-Reply.
Проблема в том, что до сих пор мы не нашли лучшую объективную функцию для чат -бота. Мы все еще используем MLE (оценка максимальной вероятности), которая приносит пользу для машинного перевода, но всегда генерируем общий ответ, такой как «Я тоже», «я думаю», «Я люблю тебя» во время чата.
Эти ответы не являются информативными, но они имеют большую вероятность-поскольку они, как правило, появляются много раз в учебном корпусе. Мы не будем не всегда отвечать на этот нечестный, поэтому нам нужно найти какой -то способ сделать наш бот более «интересным», технически говоря, чтобы увеличить «недоумение» отзывания.
Здесь мы воспроизводим работу Ли. et al., 2016 Попробуйте решить эту проблему. Основная идея заключается в использовании одной и той же модели SEQ2SEQ, что и языковая модель, чтобы получить слова-кандидаты с высокой вероятностью в каждой декодирующей временной метке в качестве антимодели, затем мы наказываем, что эти слова всегда являются высокой вероятностью для любого ввода. По этой антимодели мы могли получить более особенный, негенерический, информативный ответ.
Оригинальная работа Ли. et al. Используйте MERT (OCH, 2003) с BLEU в качестве метрик, чтобы найти наилучшую вероятность веса ( λ и γ в оценке (T) = P (t | S)-λu (T) + γNT ) соответствующей антигуланской модели. Но я нахожу, что счет Bleu в чате корпус, как правило, всегда равен нулю, поэтому не может получить значимый результат здесь. Если у кого -нибудь есть идеи об этом, отбросьте мне сообщение, спасибо!
Есть некоторые варианты для обучения модели и прогнозирования в lib/config.py. В основном они самостоятельно выяснены и могут работать со значением по умолчанию в большинстве случаев. Здесь мы перечисляем только то, что вам нужно для конфигурации:
О окружающей среде
| имя | тип | Описание |
|---|---|---|
| режим | нить | Рабочий режим: поезд/тест/чат |
| model_name | нить | Имя модели влияет на ваш рабочий путь (хранение данных, NN_Model, папки результатов) |
| scope_name | нить | В TensorFlow, если вам нужно загрузить два графика одновременно, вам нужно сохранить/загрузить их в разные пространства имен. (Если вам нужна только одна модель SEQ2SEQ, оставьте ее по умолчанию) |
| vocab_size | целое число | Зависит от вашего языка корпуса: для английского, 60000 достаточно хорош. Для китайцев вам нужно не менее 100000 или 200000. |
| GPU_USAGE | плавать | Используемая фракция памяти Tensorflow GPU, по умолчанию составляет 1, а Tensorflow будет занимать 100% вашего графического процессора. Если у вас есть многочисленные рабочие места, разделяющие ресурс GPU, сделайте его 0,5 или 0,3, для 2 или 3 рабочих мест. |
| reatforce_learn | инт | Установите 1, чтобы включить режим обучения подкреплению |
О декодировании
| имя | тип | по умолчанию | Описание |
|---|---|---|---|
| beam_size | инт | 10 | Размер поиска луча, настройка 1 равна жадному поиску |
| Антилм | плавать | 0 (отключено) | наказать вес антиязыковой модели |
| n_bonus | плавать | 0 (отключено) | вознаграждение длины предложения |
Фунант анти-LM отключен по умолчанию, вы можете начать с установки Antilm = 0,5 ~ 0,7 и n_bonus = 0,05, чтобы увидеть, нравится ли вам разница в результатах.
Для обучения рекомендуется GPU, поскольку SEQ2SEQ является большой моделью, вам нужна определенная вычислительная мощность для эффективного выполнения и прогнозирования, особенно когда вы устанавливаете большой размер поиска луча.
Требование DRAM не является строгим, как процессор/графический процессор, так как мы делаем стохастический градиент.
Если вы новичок в глубоком обучении, создание таких вещей, как графический процессор, вас раздражает среда Python, вот докеры моей среды машинного обучения:
(версия без GPU Docker) / (версия GPU Docker)
SEQ2SEQ - это модель со многими предварительными, я проводил довольно много времени, и вот несколько лучших материалов, которые мне очень приносят пользу:
Лучший пост, объясняющий модель RNN, LSTM, GRU и SEQ2SEQ: понимание сети LSTM Кристофером Олахом.
Эта работа Sherjilozair/char-rnn-tensorflow помогает мне многое узнать о языковой модели и графике реализации в Tensorflow.
Если вы заинтересованы в большем количестве магии в отношении RNN, вот необходимый пост-блог: необоснованная эффективность повторяющихся нейронных сетей Андрея Карпати.
Ванильная версия Seq2seq+Внимание: Николас-Иванов/TF_SEQ2SEQ_CHATBOT. Это поможет вам выяснить основной поток модели Vanilla SEQ2SEQ, и я строю этот репозиторий на основе этой работы.
В настоящее время я строю поиск луча из графика, что означает-это очень медленно. Есть дискуссии о создании его в графе здесь и там. Но, к сожалению, если вы хотите добавить что-то большее, чем поиск пучков, например, эта работа против LM, вам нужно гораздо больше, чем просто поиск луча, чтобы быть в графе.
Я не выяснил, как MERT с BLEU может оптимизировать вес анти-LM модели, поскольку в настоящее время BLEU часто составляет нулевой.