Три варианта рекуррентно-сверточных сетей в задаче определения длины ответа

Jan 29, 2018 21:49

(предыдущий пост с описанием моделей чат-бота тут: https://kelijah.livejournal.com/232313.html)

Код для тренировки вспомогательной модели, которая определяет число слов ответа для заданной предпосылки и вопроса выложен тут https://github.com/Koziev/chatbot/blob/master/PyModels/nn_answer_length.py.

Постановка задачи

Задача заключается в следующем. Допустим, есть тройка предложений - предпосылка, вопрос и ответ:

T: Боевики курдских военизированных формирований занимают Киркук.
Q: Кто занимает Киркук?
A: Боевики курдских военизированных формирований

В данном случае ответ содержит 4 слова. А в примере:

T: 19 января Никите исполняется 5 лет.
Q: Сколько лет исполнилось Никите в январе?
A: 5

ответ содержит одно слово. Задача сводится к стандартной классификации вариантов от 1 слова до 5-7 слов.

Выбор варианта архитектуры

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

Простейшее решение - один рекуррентный слой

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


Достигается точность ~0.89.

Параллельные рекуррентные и сверточные слои

Добавим на одном уровне с рекуррентным слоем несколько сверточных слоев (красноватый слой) с GlobalMaxPooling1D. Затем выходы всех слоев склеиваем и опять-таки направляем на классификатор:


Достигаемая точность 0.95

Сверточные слои, поверх которых работает рекуррентный слой

Идея, реализуемая в данной архитектуре, проста. Сверточные слои выделают словосочетания разного типа, включая синтаксические паттерны. Рекуррентный слой доставляет "имена" найденных паттернов к классификатору. Некоторые люди назвали бы группу сверточных слоев spatial pooler'ом, а рекуррентный слой - temporal pooler'ом, работающими в режиме supervised learning:


Достигаемая точность - 0.99.

convolutional networks, chatbot, language model, lstm, keras, рекуррентные сети, python, чатбот

Previous post Next post
Up