?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Планы по новой генеративной модели чат-бота ("Машина Хомского")
kelijah
Готовлю к переносу в код чатбота новый генератор ответов на основе генеративной грамматики с обвесом из нескольких нейросеток. Далее - небольшие подробности о решаемой задаче.

Генератор ответа в чатботе принимает на вход найденные в базе фактов предпосылки (в общем случае от 0 до 2-3), заданный вопрос, и формирует ответ. Если не рассматривать случаев, когда ответом являются слова “да” или “нет”, то генератор должен взять некоторые слова (attention модель), сложить их в "мешок", иногда просклонять или проспрягать, добавить служебные слова, затем выстроить в правильном порядке (предлоги перед именной группой и т.д.). Например:

предпосылка: Ты позабыла свой обет

вопрос: О чем ты забыла?

ответ: О своем обете

Кстати, генерация ответа из мешка слов - задача, которая активно используется для тренировки практических языковых навыков у детей в первом-втором классе школы.

В текущей реализации основная проблема связана с моделью посимвольной генерации (авторегрессионная модель с выбором одного следующего символа на каждый вызов). Эта модель сейчас обучается по двое суток и нередко выдает искаженный текст.
Как мне кажется, хорошей альтернативой будет новая модель на основе генеративной грамматики. В свое время эта концепция Хомского неплохо так встряхнула дескриптивное болото лингвистики со всеми этими каритивами, так почему бы не попробовать ее для чатбота? Тем более что генеративная грамматика чрезвычайно проста в реализации. Мы предполагаем, что есть набор правил генерации, применяемых рекурсивно, и позволяющих генерировать любые синтаксически валидные фразы языка. Если не гнаться за полнотой покрываемого языкового поля и ограничиться неким подмножеством, например из ответов длиной от 1 до 5 слов, то получается компактный набор правил. У меня получилось примерно 200 правил для генерации русских ответов. Важным достоинством генерируемых этими правилами фраз является их грамматическое качество. В большинстве случаев получаются вполне валидные цепочки слов, хотя их осмысленность - отдельная тема.

Недостатки генеративной модели являются продолжением ее достоинств. Самый главный недостаток - модель вычислительно тяжёлая. Для типичного сочетания предпосылки и вопроса создаётся несколько тысяч вариантов ответа, из которых только несколько оказываются осмысленными перефразировками правильного ответа.

Тем не менее, будучи оснащена хорошо обученной дискриминативной моделью валидации вариантов ответа, описываемая архитектура обладает хорошей выразительной силой. В некоторых случаях результат ее работы выглядит как простое копирование слов из предпосылки, хотя на самом деле сначала был сформирован мешок слов, из которого сгенерированы синтаксически валидные варианты, один из которых и показан:

premise:> кристалл обладает природным антибактериальным действием
question:> обладает кристалл чем ?
answer=Природным антибактериальным действием (0.993309288901)

Без каких-либо переделок эта же архитектура может выполнять подбор формы слов, например - склонение:

premise:> Я дружу с Мишей
question:> как зовут моего друга ?
answer=Миша (0.0527198509705)

Ошибки, которые делает архитектура, тоже интересны. Поскольку это "машина управляемых текстовых галлюцинаций", то результат сильно зависит от дискриминаторной части, которая отбирает наиболее подходящие варианты. Иногда она пропускает что-то слишком креативное:

premise:> в степи за станцией стоят зенитки
question:> зенитки где находятся ?
true answer=в степи за станцией
predicted answer=Степи за станцией перегона (0.114703481843)  (ERROR)

Не говоря уже о банальных ошибках согласования, от которых на самом деле не застрахован и обычный человек:

premise:> коля покачал головой
question:> коля покачал чем ?
true answer=головой
predicted answer=Голову (0.731233797589)  (ERROR)

Или вот типичная ошибка из-за невнимательности:

premise:> гриша подозрительно поглядел на барятина
question:> поглядел подозрительно гриша на кого ?
true answer: на барятина
predicted answer=На гришу (2.94164681944e-08)  (ERROR)