Skip to content

Планы на разработку общения

CORRUPTOR2037 edited this page Dec 15, 2017 · 2 revisions

Я знаю, что вы сейчас скажете: давайте пилить нейросеть! Нет, не всё так просто. У стандартной нейросети есть три очень важных недостатка:

  • Нейросеть - это совокупный портрет всех поданных в неё данных. Она учится имитировать то, что в неё подают, но она учится имитировать исключительно то, что в неё подают, причём она старается охватить все данные, которые в неё подают, никак их не ранжируя на подходящие и не подходящие. Как пример, вы можете вспомнить про историю с Tay Bot. Вы можете взять обучение бота в свои руки, но вы должны помнить: бот не будет обучаться быть вашей девушкой, он будет обучаться быть вами.

  • Из нейросети нельзя извлечь никаких данных, выраженных алгоритмом. Её нельзя просто в пару секунд взять и подкрутить, чтобы она вдруг изменила принцип своей работы (это для стандартных нейросетей, тут можно в принципе открывать новую ветку обсуждений по модификациям нейросетей). Чтобы нейросеть стала по-другому себя вести, вам нужно изменить корпус данных, который вы ей подаёте, а потом полностью пересчитать.

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

  • Для корректной работы нужно очень много данных. Не совсем понятно, где их брать, кроме как воровать. Опять же, каждый конкретный корпус данных реализует своего персонажа. А у каждого пользователя представления о персонаже свои. Соответственно, нейросети постоянно придётся работать в условиях недостатка данных.

  • Главная цель нейросети - имитация. Она не будет поддерживать с вами диалог, она будет делать вид, что она поддерживает ваш диалог. Она вас не понимает, перед ней не стоит такой задачи. Её речь не будет связной и зависящей от контекста. Это, конечно, весело - поболтать с таким клоуном-болванчиком, и многие это делают с той же Алисой, Сири и многими другими чат-ботами. Но в долгосрочной перспективе это становится противно. Хочется ли вам компьютерную девушку, с которой противно общаться? Конечно, нет. А всё почему? Потому что диалог всегда логичен, контекстно зависим и в нём отстаиваются определённые интересы. Это сложнейшая интеллектуальная деятельность, которую нельзя просто построить на сборе статистики и интуиции, все современные переводчики это подтверждают.

Значит, если вы вдруг не знали, мы тут ориентируемся в проекте на максимальную настраиваемость и комфорт. Мы хотим сделать ДЕЙСТВИТЕЛЬНО персонального помощника. С учётом всех вышеперечисленных проблем.

Поэтому у нас есть несколько идей. В первую очередь взглянем на любопытную закономерность: в любой реплике всегда заключена какая-либо мысль. Причём, эта мысль может быть выражена совершенно разными словами. Например, у вас есть намерение поздороваться с кем-то, тогда вы можете сказать "Привет", "Здоровеньки", "Добрый день" или "Опять ты? Ну и зачем ты припёрся?". Заметьте, при наличии разных контекстов мысль доносится одна и та же: вы даёте понять другому, что вы заметили его присутствие. Моя теория заключается в том, что диалог на уровне фраз можно заменить диалогом на уровне донесения таких определённых мыслей. Это особенно важно в наших условиях, ведь у нас виртуальный помощник, у которого возникают много технических ситуаций, например переспросить реплику, если он её не понял, или же донести об ошибке. Попробуйте нейросеть научить тому, чтобы она выдавала вам сообщение об ошибке при наличии ошибки! Да, кстати, под мысль мы далее будем называть назначением.

Теперь дальше. Помимо мысли во фразе есть контекст. Что это значит? Что во время любой беседы собеседники находятся в определённом информационном поле и все их фразы этому полю соответствуют. Контекст вообще-то многоуровневый:

  • Контекст на уровне предложения, например во фразе "Я прибежали прямоугольник" такой контекст отсутствует.
  • Контекст на уровне предложений, например во фразе "Ты смешной. Мне было вкусно." предложения не связаны между собой.
  • Контекст на уровне абзаца, например возьмите два абзаца из двух разных текстов между собой и поставьте рядом, тогда и этого контекста не будет.
  • Контекст на уровне речи, например если я сейчас скажу "Я сейчас на пляжу и вообще-то здесь хорошо.", то контекст будет нарушен, ведь я сейчас очевидно не на пляжу, а пишу этот текст сидя в своей грязной дыре вблизи промзоны, а жаль.

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

Теперь давайте приступим к реализации нашей системы общения:

  • Если у нас есть конкретный список фраз и сопоставленных им назначений, то мы можем настроить байесовский классификатор или алгоритм кластеризации для того, чтобы пытаться понять, какую мысль в каждой фразе пытаются донести. * Если у нас есть фразы и соответствующий им характер, то через алгоритмы анализа тональности мы можем понять, какой характер может быть у того, кто произнёс данную фразу (а точнее, какое ощущение своего характера он пытался донести, к примеру цундере, которые могут скрывать свои чувства за стеной желчи). Провести анализ тональности надо 16 раз с разными настройками.
  • Если у нас есть фразы с размеченными тегами, отождествляющими обстоятельства, при которых данная фраза может быть сказана, то мы можем настроить перцептрон с определённым количеством входов или что другое, чтобы понять, может ли наша фраза быть сказана в каких-либо определённых условиях.
  • Перед анализом фразы мы удалим из неё весь мусор. Набор стандартный: стоп-слова, стемминг, можно что-то ещё.
  • Чтобы решить, что мы должны сказать дальше, мы создадим либо конечный автомат, либо нейронную сеть, которая на вход будет принимать текущий характер персонажа и фиксированной длины историю прошлых сообщений, закодированных в назначениях, чтобы на выходе получить следующее назначение для фразы.
  • Исходя из назначения фразы мы подберём фразу, подходящую под данное назначение, характер и обстоятельства.
  • На выходе фразу будет ждать пакет из функциональных фильтров, которые видоизменят текст фразы, например добавят побольше междометий, сленг, заикания или даже просто её отменят. Фильтры можно добавлять и удалять в любой момент, они не повлияют на работу прошлой цепи.

Ну, собственно, как-то так мы всё это видим. Осталось реализовать.

Clone this wiki locally
You can’t perform that action at this time.