(предыдущий пост с описанием моделей
чат-бота тут:
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.