Часть I: Введение и цикл обучения

В этой серии мы собираемся узнать о целевых чат-ботах и ​​обучить одного с помощью глубокого обучения с подкреплением на Python! Все с нуля! Код для этой серии руководств можно найти здесь.

Содержание серии

Часть I: Введение и цикл обучения

Часть II: Агент DQN

Часть III: Отслеживание состояния диалога

Часть IV: Имитатор пользователя и контроллер модели ошибок

Часть V: Запуск агента и дальнейшие исследования

Что такое целевой чат-бот?

Целенаправленный чат-бот (GO) пытается решить конкретную проблему для пользователя. Эти чат-боты могут помочь людям забронировать билет, найти место для бронирования и т. Д. Существует два основных способа обучения чат-бота GO: контролируемое обучение с помощью кодировщика-декодера, который напрямую сопоставляет диалог пользователя с ответами, и обучение с подкреплением, которое обучает чат-бота посредством пробного использования. беседы с реальными пользователями или имитатором пользователей на основе правил. Чат-боты GO, обученные с помощью глубокого обучения с подкреплением, - это очень увлекательная и зрелая область исследований с многочисленными практическими приложениями!

Система диалога

Диалоговая система для чат-бота GO, использующего обучение с подкреплением, разделена на 3 основные части: диспетчер диалогов (DM), модуль понимания естественного языка (NLU) и модуль генератора естественного языка (NLG). Кроме того, DM разделен на средство отслеживания состояния диалога (DST) или просто средство отслеживания состояния (ST) и политику для самого агента, которая во многих случаях представлена ​​нейронной сетью. Кроме того, системный цикл содержит пользователя с целью пользователя. Пользовательская цель представляет собой то, что пользователь хочет получить от разговора, что в случае приведенной ниже диаграммы является резервацией в ресторане.

В этом цикле пользователь произносит что-то, что обрабатывается компонентом NLU в так называемый семантический фрейм, который представляет собой низкоуровневое представление высказывания на естественном языке, которое может быть обработано агентом. DST обрабатывает действие пользовательского диалога (семантический фрейм) и историю текущего разговора в представление состояния, которое может использоваться политикой агента. Это состояние затем подается в качестве входных данных в политику или нейронную сеть агента и приводит к действию в форме семантического фрейма. База данных (БД) также может быть запрошена для добавления информации к действию агента, такой как информация о ресторане или информация о билетах в кино. Затем действие агента (также известного как «система» на этой диаграмме) обрабатывается компонентом NLG, который преобразует его в естественный язык для чтения пользователем.

MiuLab TC-Bot

Это руководство и сопровождающий его код основаны на диалоговой системе MiuLab под названием TC-Bot. Главный вклад их статьи заключается в том, что в ней показано, как имитировать пользователя с использованием базовых правил, чтобы агент можно было обучить с помощью обучения с подкреплением очень быстро, по сравнению с обучением агента с реальными людьми. В других статьях это тоже было сделано, но эта статья выделяется как хороший пример (с кодом!) Того, как создать успешную систему обучения.

Имитатор пользователя и контроллер модели ошибок

Мы более подробно рассмотрим пользовательский симулятор позже в этой серии, но пока поймите, что это детерминированный симулятор, основанный на правилах, который пытается смоделировать реального пользователя. В этом случае он основан на моделировании повестки дня пользователя, что означает, что он использует внутреннее состояние, которое представляет ограничения и потребности симулятора пользователя. Это внутреннее состояние отслеживает текущий разговор, а также то, что ему еще нужно сделать для достижения своей текущей цели. Цель выбирается случайным образом из списка доступных целей пользователя, где цель состоит из набора ограничений и другой информации, которая направляет действия симулятора пользователя, когда он пытается выполнить свою текущую цель. Контроллер модели ошибок (EMC) используется для добавления ошибки к действиям симулятора пользователя на уровне семантического кадра, что, как было показано, улучшает результаты обучения.

Что вы должны знать для этой серии руководств

Вот список вещей, которые вы должны знать и которые не будут рассмотрены в этой серии, но важны для понимания кода:

  • Уметь писать код на Python довольно хорошо
  • Знайте, как работать со словарями на питоне, ведь мы будем их много использовать!
  • Умейте кодировать простой DQN
  • Знайте, как сделать очень простую модель нейронной сети с Keras.

Мы будем кодировать Python ≥ 3.5, Keras (любая последняя версия) и, конечно же, numpy.

Теперь перейдем к данным, которые мы будем использовать! В этой части мы будем работать с train.py.

Данные о билетах в кино

База данных: это база данных билетов в кино с разными атрибутами или местами. Вот несколько пунктов (в произвольном порядке):

Он организован в виде словаря, где ключи представляют собой индекс билета в виде длинного числа (например, целое число), а значения также представляют собой словари, которые содержат информацию о фильме, который представляет билет. Как видите, не все билеты имеют одинаковые атрибуты и, очевидно, не всегда одинаковые значения!

Словарь базы данных: другой файл содержит словарь, где ключи - это разные слоты, которые могут быть в заявке, а значения - это списки возможных значений для каждого слота. Вот несколько различных элементов (усеченные списки значений):

Список целей пользователя: Наконец, у нас есть цели пользователя в виде списка словарей, которые содержат слоты запроса и информации для каждой цели. Позже мы подробнее рассмотрим, что это означает. Примеры:

Цель этой базы данных состоит в том, чтобы агент нашел билет, который соответствует ограничениям пользователя, заданным пользовательской целью этого эпизода. Это непростая задача, так как каждый билет уникален и в большинстве есть разные слоты!

Анатомия действия

Очень важно понимать анатомию действия в этой системе. И пользовательский sim, и агент принимают в качестве входных и выходных действий в форме семантических фреймов, если мы на секунду игнорируем естественный язык. Действие содержит намерение, а также слоты информирования и запроса. Слот в этой серии руководств означает пару ключ-значение, обычно относящуюся к одному сообщению или запросу. Например, в dict {‘starttime’: ’tonight’, ‘theater’: ’regal 16’}, ‘starttime’: ’tonight’ и ‘theater’: ’regal 16’ оба слота. Примеры действий:

Намерение представляет собой тип действия, перечисленный ниже. Остальная часть действия разделена на информационные слоты, которые содержат ограничения, и слоты запросов, которые содержат информацию, которую необходимо заполнить. Список возможных ключей указан в dialogue_config.py, а их значения - в dict базы данных, упомянутом выше. Слот информирования - это информация, которую отправитель хочет, чтобы получатель знал. Он состоит из ключа из списка ключей и значения из списка значений этого ключа. Слот запроса содержит ключ, значение для которого отправитель хочет найти у получателя. Таким образом, это ключ из списка ключей и ‘UNK’ в качестве значения, которое означает неизвестно, поскольку отправитель еще не знает, какое значение работает для этого слота.

Все намерения

  • Информировать: предоставить ограничения в виде информационных слотов.
  • Запрос: запрашивать заполнение слотов запросов значениями
  • Спасибо: используется только пользователем; он просто указывает агенту, что он сделал что-то хорошее или что пользователь готов закончить разговор
  • Найдено совпадение: используется только агентом; указывает пользователю, что у него есть совпадение, которое, по его мнению, будет соответствовать цели пользователя
  • Отклонить: используется только пользователем; используется только в ответ на действие агента, имеющего намерение найти совпадение, чтобы указать, что совпадение не соответствует его ограничениям
  • Готово: агент использует это, чтобы закрыть беседу и посмотреть, выполнила ли она текущую цель, действие пользователя имеет это намерение автоматически, если эпизод длится слишком долго.

Состояние

Состояние создается ЗБ в качестве входных данных для агента, чтобы выбрать соответствующее действие. Это огромное количество полезной информации из истории текущего разговора. Мы рассмотрим это более подробно во второй части.

Теперь, когда бухгалтерский учет закончен, давайте перейдем к циклу обучения и к коду!

Обучение агента

Эта диаграмма представляет собой последовательность одного раунда, одного полного цикла обучения. Четырьмя основными частями этой системы являются агент dqn_agent, средство отслеживания состояния диалога state_tracker, пользователь (или имитатор пользователя) user и EMC emc. Давайте пройдемся по этапам одного раунда:

  1. Получить текущее состояние, которое эквивалентно предыдущему следующему состоянию, ИЛИ начальное состояние, если это начало эпизода, и отправить его в качестве входных данных в метод действия get агента.
  2. Получить действие агента и отправить его методу обновления ST для действия агента: ST обновляет свою собственную историю текущего разговора в этом методе, а также обновляет действие агента с помощью информации запроса базы данных
  3. Обновленное действие агента отправляется в качестве входных данных в пошаговый метод пользователя: на этапе пользовательский сим создает свой собственный ответ, основанный на правилах, а также выводит информацию о вознаграждении и успехе (не изображено).
  4. EMC вносит в действие пользователя сообщение об ошибке.
  5. Действие пользователя с ошибкой отправляется в качестве входных данных в метод обновления ST для действий пользователя: аналогично обновлению ST с методом действия агента, однако он просто сохраняет информацию в своей истории, он не обновляет действие пользователя важным способом
  6. Наконец, следующее состояние выводится из состояния получения ST, и на этом завершается текущий опытный кортеж раунда, который добавляется в память агента.

Важное замечание: как и в случае с любым агентом DQN, буфер памяти до некоторой степени заполняется на этапе «разогрева». В отличие от многих случаев использования DQN в играх, на этом этапе агент не выполняет случайных действий. Вместо этого во время разминки он использует очень простой алгоритм, основанный на правилах, который будет объяснен в части II.

Как видите, мы не используем никаких компонентов естественного языка (NL), поэтому действия всегда будут семантическими фреймами. В этой серии мы обучаем DM, который не требует NL. NLG и NLU предварительно обучаются отдельно от агента и не являются необходимыми для понимания того, как обучать агента с помощью DRL. Не волнуйся! Вы все равно многому научитесь, и честно научиться обучать агента с помощью DRL гораздо интереснее, чем знать, как обучать компоненты NL с помощью контролируемого обучения. Взгляните на часть V этой серии, чтобы узнать, где вы можете узнать о добавлении компонентов NL!

Сброс эпизода

Прежде чем мы перейдем к циклам разминки и тренировки, рассмотрим функцию сброса эпизода, которая вызывается перед каждым эпизодом. Также обратите внимание, что беседа - это то же самое, что и серия, и я использую их как синонимы.

Короче говоря, сброс эпизода обновляет объекты и получает начальное действие пользователя в эпизоде.

Разогреть агента

Во-первых, мы определяем внешний цикл для запуска только до тех пор, пока память агента не будет заполнена до WARMUP_MEM или пока его буфер памяти не заполнится полностью. Затем мы должны сбрасывать эпизод в каждом цикле и получать начальное состояние. Внутренний цикл выполняется run_round(state, warmup=True) до done == true, что означает, что эпизод окончен.

Обучить агента

Если игнорировать некоторые дополнительные переменные, цикл очень похож на разминку. Основное отличие заключается в том, что этот метод завершает свой внешний цикл, когда количество эпизодов достигает NUM_EP_TRAIN.

Как работает тренировочный блок

После каждого периода определенного количества эпизодов (TRAIN_FREQ) агент обучается с помощью своей памяти переживаний.

  1. Если коэффициент успешности этого периода больше или равен текущему лучшему коэффициенту успеха (инициализирован 0,0 в начале train_run()) И он выше, чем некоторый SUCCESS_RATE_THRESHOLD, то память агента очищается. Это сделано для того, чтобы избавиться от старого опыта, основанного на действиях предыдущей версии модели агента, то есть действиях, которые были предприняты менее оптимальной моделью. Затем это позволяет новым впечатлениям от лучшей версии модели заполнить память. Таким образом стабилизируются тренировка и производительность.
  2. Затем веса модели поведения агента копируются в целевую модель, которая требуется во всех DQN, используемых сегодня для стабилизации обучения.
  3. Наконец, агент обучен, что означает, что текущая память используется для улучшения весов модели.

Резюме обучения

Взгляните на полный код в train.py, чтобы получить полную картину!

  1. Загрузите данные базы данных
  2. Создайте объекты
  3. Звоните warmup_run()
  4. Звоните train_run()

Это основной цикл обучения чат-бота GO, обученного с помощью DRL. Важно понимать схему. Далее мы узнаем об агенте, о том, какие действия он может выполнять, о политике разминки и процессе внутренней оптимизации веса.

До встречи!