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



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



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

Почему так:
— Не нужен большой softmax слой для выбора слов, а значит мы можем больше ресурсов нейросети выделить на собственно задачу анализа текста.
— Полученная модель сопоставления годится для разных целей, теоретически можно заставить чатбот общаться на разные специальные темы, просто загрузив новую базу текстов, без нового обучения. Это полезно на практике.
— Можно сделать модель, которая работает быстро и может реально общаться со многими пользователями одновременно без нескольких GPU на сервере.

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

Почему нейронные сети?
Нельзя ли подойти к задаче более классическим методом? Загрузить набор ответов в БД и искать полнотекстовым индексом по предыдущей фразе? Ответ, так сделать можно, но результат получается не очень. Вот допустим:

Ч: привет!
К: грег, мария, это али…
Ч: как дела?
К: из соседнего номера поступила жалоба на шум, месье
Ч: как тебя зовут?
К: спасибо, спасибо.
Ч: сколько тебе лет?
К: ты живешь где-то рядом...?


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

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

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

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

Самая простая модель берет соединение последовательности векторов слов контекста и ответа и подает все это на обычный полностью соединенный слой. Поскольку ответ бывает разной длины, его записываем в вектор длины фиксированной, заполняя “лишнее” место нулями. Считается, что это плохо. Посмотрим.

Второй вариант отличается тем, что до “смешивания” контекста и ответа им дан “свой собственный” слой для формирования представления. Ну и дальше может быть несколько слоев обработки, на рисунке показано два.

Третий вариант кодирует последовательность разной длины с помощью рекуррентного LSTM кодировщика. Это много медленнее и обучается дольше. Но вроде как должно работать лучше.


Рис.1. Архитектура нейронных сетей

Результаты
По способности выбирать правильный ответ из нескольких предложенных вариантов (случайно взятых ответов), самый лучший результат показала модель номер 2, с пятью слоями для анализа данных по 700 нейронов в каждом (+1 слой репрезентации входных данных, тоже из 700 нейронов). Чтобы обучить такую глубокую сеть, пришлось использовать Хайвей (Highway) слои, которые позволяют информации проще распространятся от нижних слоев к верхним, также подождать несколько дней пока модель рассчитывалась на GPU. Модель номер 1 явно недообучилась, а номер 3 долго думала, и тоже не добрала до результатов модели номер 2 несколько процентов. Что напоминает нам о том, хотя самые простые модели не годятся для больших объемом данных, все же никогда не следует умножать сущности сверх необходимости.

Получившаяся система располагает базой в 30 миллионов пар реплик, а нейронная сеть имеет около 3 млн. обучаемых параметров.

Какие же диалоги можно в результате получить?

Ч: Привет
К: привет.
Ч: Как твои дела?
К: Не знаю.
Ч: Как тебя зовут?
К: меня зовут юнис.
Ч: Сколько тебе лет?
К: Пятнадцать.
Ч: Где ты живешь?
К: Дома.
Ч: ты учишься в школе?
К: Нет
Ч: а где ты учишься?
К: в бундесвере.
Ч: Ты любишь музыку?
К: да, я люблю музыку.
Ч: Какая музыка тебе нравится?
К: в основном я слушаю r&b, фанк.
Ч: Ты веришь в бога?
К: я и сейчас верю в бога, старина
Ч: что такое мораль?
К: два человека вместе — разве это не мораль?
Ч: какого цвета море?
К: цвета океана после шторма.


Достаточно хорошо, на мой взгляд. Вот еще пример:

Ч: Где живет бегемот?
К: Жил
Ч: а что, сейчас не живет?
К: Я не знаю.
Ч: тогда где он жил раньше?
К: у парка, на мэйпл стрит.
Ч: куда же он пропал?
К: куда он пропал?
Ч: я тебя спрашиваю, куда он пропал?
К: я не понимаю, почему я снова в больнице.
Ч: потому что ты болеешь
К: я просто хочу помогать людям.
Ч: Тогда скажи мне, где бегемот!
К: почему ты так сильно хочешь это знать?
Ч: просто ответь мне
К: ты хочешь, чтобы я помогла тебе попрощаться с родными?
Ч: Это угроза?
К: Наблюдение
Ч: Так где же все-таки бегемот?
К: он на гавайях, но радж управляет отсюда
Ч: Кто такой радж?
К: не встречалась с ним?
Ч: Нет, никогда
К: жили-были муж с женой, только муж каждую ночь исчезал.


Как можно поговорить с этим ботом в живую?
Я попробовал сделать android-приложение которое общается с сервером, на котором расположен бот. Приложение сырое, находится в стадии тестирования, чтобы его установить надо вступить в группу бета-тестировщиков:
plus.google.com/u/0/communities/103302070341792486151

После чего его можно установить с:
play.google.com/apps/testing/mindy.bot

PS
в настоящее время функция этого приложения — исследовательская. денег не берет, рекламы не показывает. Пока в приложении используется упрощенная модель, для уменьшения нагрузки на сервер.

PPS
Если модель попытается общаться на английском, просто отвечайте ей на русском, и она исправит свою ошибку.



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

Комментарии (68)


  1. ZlodeiBaal
    27.03.2016 22:45

    Прикольно. А пробовали вопросы с премии Лёбнера задавать? Они по-моему прикольно уровень показывают.
    http://www.aisb.org.uk/events/loebner-prize


  1. konar
    27.03.2016 23:00
    +1

    Спасибо за статью. Когда открывал спойлер с предложением пообщаться с ботом — ожидал увидеть ссылку на веб-приложение… К сожалению, android-устройства есть не у всех.


    1. SerJook
      28.03.2016 11:59

      С горем пополам установил Минди на BlueStacks App Player на Windows, очень медленно и с трудом отвечает
      https://goo.gl/Wyw4gb


  1. mOlind
    27.03.2016 23:26
    +2

    Здорово, но судя по всему без понимания контекста и смысла сказанного тяжело как-то осмысленно вести беседу. Т.е. бот не помнит, что он сам сказал минуту назад и не сможет понять что 2 одинаковых вопроса с разным порядком слов — это по сути одно и то же. В английском с этим немного проще, там грамматика определят порядок слов.


    1. Durham
      28.03.2016 12:40

      Порядок слов как раз понимает. Но в демо приняты меры, чтобы одинаковых ответов рядом не было, случайно выбирается ответ, поэтому может казаться, что есть такая проблема. А контекст диалога — исходно задача сформулирована в этой статье как сопоставление вопроса и ответа без контекста. Это ограничение задано заранее. Есть способы учесть контекст, со временем можно их внедрить. Сейчас систему можно рассматривать как просто улучшенный поиск по запросам пользователя, что само по себе полезно для ряда приложений, поэтому такая постановка задачи.


  1. semenyakinVS
    27.03.2016 23:54
    +7

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


  1. Milfgard
    28.03.2016 00:09
    +9

    Давным-давно, когда была 95-я винда, автор Чатмастера тоже просил насобирать ему диалогов. И уровень диалогов был примерно такой же.


    1. bask
      28.03.2016 12:55

      20 лет топчемся на месте


    1. Durham
      28.03.2016 13:00
      +1

      Разница в том, что нейросеть действительно имеет некое представление о мире и набор знаний. Это можно увидеть в тщательно поставленных тестах. Например на вопрос "где живет человек?" ответ "дом" оценивается выше чем "нора", а на вопрос "что такое мотор", выше ранжируется "механизм", "деталь", ниже, например, "животное". Это принципиально другой уровень. При выборе готовых ответов по базе это не всегда заметно, т.к. не всегда в запасе есть правильные ответы.


  1. FisHlaBsoMAN
    28.03.2016 00:38
    +2

    интересно было бы скормить диалоги какого либо живого чата на каком либо сайте или например личку вконтакте. Может конференцию из жаббера или тему форума из флудилки типа беседка


    1. RiseOfDeath
      28.03.2016 12:19

      И получился бы еще один бот нацист-сексист-ксенофоб


  1. Alexsey
    28.03.2016 01:05
    +2

    Главное не давать доступ к этому боту ребятам с 4chan. А то он и без них весьма странные диалоги ведет (про бегемота), а уж если их позвать то будет еще хлеще, чем с Майкрософтовской Tay. :)


    1. Durham
      28.03.2016 12:45

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


  1. PastorGL
    28.03.2016 02:16
    +7

    Чатботы это прикольно.
    Лет 12 назад я сам однажды обучал бота на нескольких десятков мегабайт логов ирцешных чатов (коли уж ты админ на сервере, грех было не сохранить приватные разговоры для истории, хоть и не спортивно). Использовал не нейросеть, а самописный полнотекстовый поисковик — алгоритм пытался выбрать подходящий ответ из базы с учётом трёх предыдущих реплик собеседника. Диалоги я размечал полуавтоматически, по ключевым словам, словоформы это поделие поддерживало более-менее нормально. В результате с ботом можно было сносно общаться на какую-то выбранную тему. Ну, до тех пор, пока у него ответы не заканчивались, и он не начинал повторяться, или не встречал слова, у которых несколько смыслов.
    Если темой было что-то из вечного: обсуждение пьянок, флирт, либо ругань, то разговоры получались достаточно длительными. Неудивительно, 90% аудитории сервера были либо студенты, либо вчерашние студенты, о чём они ещё могли беседовать… Рекорд — почти сорок минут, 68 реплик, без больших огрехов, бот сумел развести девушку на свидание. Хотя она и отметила, что «Александр» парень довольно странный.
    Исходники, к сожалению, у меня не сохранились.


    1. Akr0n
      28.03.2016 06:00

      А если те люди в личке обсуждали что-то интимное или секретное типа паролей, Ваш бот выдавал это каждому желающему?


      1. PastorGL
        28.03.2016 10:35
        -1

        Нет, конечно. Но я сильно меньше стал уважать людей после того как мне пришлось вычитать сотни страниц приватов :/


        1. mefest
          28.03.2016 12:35
          +3

          Вас бы тоже стали сильно меньше уважать прознав про то, что вы читаете их «приваты»


          1. PastorGL
            28.03.2016 20:51
            +1

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


        1. Akr0n
          02.04.2016 08:36

          Если бот сам, тупо поиском решал, что выдавать, а что нет, то как Вы могли контролировать выдает ли он в виде ответов такую инфу? Например, кто-то в диалогах спрашивал "какой пароль?", а собеседник в ответ присылал его, что выдавал Ваш бот на аналогичный вопрос?


    1. Indexator
      28.03.2016 13:29

      бот сумел развести девушку на свидание
      Исходники, к сожалению, у меня не сохранились.
      Диалог, хотя бы, сохранился?)


      1. WinPooh73
        28.03.2016 17:15

        Может быть, девушка тоже была ботом?


      1. PastorGL
        28.03.2016 20:57
        +2

        Я физически уронил свой винчестер с бэкапами. Была такая серия у IBM на стеклянных блинах в начале 2000-х. Всё, что написал за школьные годы, студенчество, и пару лет после — в осколки. Обидно было аж до слёз.


    1. Indexator
      29.03.2016 14:47

      Хотя она и отметила, что «Александр» парень довольно странный.
      :D
      image


  1. AlexFadeev
    28.03.2016 07:37
    +3

    Ахах, как же круто. Я все мечтаю создать своего Джарвиса хотя бы в пределах умного дома. =Р Чтобы он именно более менее мог разговаривать, вести диалог и связанно отвечать. Чтобы диалог строился примерно в таком духе:

    — Джарвис
    — Да?
    — Я читаю книгу, мне музыка мешает
    — Конечно. Я выключил музыку и прибавил света над вами. Приятного чтения.

    Уиииии! Такие разработки нейронных сетей — это просто безумно как круто. =)


    1. 2PAE
      28.03.2016 12:19

      Недавно размышлял на системой умных домов, что я от этого хочу. И пришёл к «простому» выводу.
      Я хочу что-бы дом, выполнял мои желания, ДО ТОГО, как я их озвучу. Он их ДОЛЖЕН угадывать.
      Вот это будет тот вариант, который меня устроит.
      А взять дистанционку, и убрать музыку и включить свет, я и сам могу. И сделаю это быстрее и менее затратно.


      1. AlexFadeev
        28.03.2016 12:33

        Согласен, это идеал. Но добиться того значительно сложнее.

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

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

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

        Плюс ко всему, голосовое управление и распознание речи дает еще массу удобных фич. Например, хозяйка стоит на кухне и что-то готовит. Замечает, что чего-то не хватает и просто не отрываясь от дел произносит: «Джарвис, напомни Саше купить хлеба.» Вместо того, чтобы мыть руки, сушить, идти к терминалу, искать там нужное приложение, вбивать на неудобной сенсорной клавиатуре таск в лист. А тем временем у меня все автоматом синхронизируется и я моментально знаю, что надо купить хлеба.

        Так что каждому свое назначение.


        1. AlexFadeev
          28.03.2016 12:42

          Можно даже пойти дальше.

          — Джарвис
          — Да
          — Запиши хлеб в список покупок. И еще килограмм картошки.
          — Хлеб Черный или Белый?
          — Давай оба
          — Сделано

          Ну и, разумеется это должно быть нейронной сетью. Которая постоянно обучается. Таким образом, система уже знает, что картофель надо покупать обычный, а не мытый. Система примерно знает среднюю цену и проверяет ее по имеющейся базе. Выбирает по лучшему рейтинг и цене. И закладывает 3кг на неделю, так как уже знает, что примерно столько мы едим. Поэтому у нее не возникает вопроса относительно картофеля.

          А в конце недели автоматически формируется список на основании базы того же Утконоса, к примеру. Подтверждается у хозяина и автоматически оплачивается и заказывается.

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


        1. 2PAE
          28.03.2016 12:51

          1)
          Начните с более простого. Управление светом.
          Система которая будет иметь обратную связь с центральным сервером, с датчиками присутствия и тогда, на количестве накопленной информации о действиях пользователя, можно будет прогнозировать и "угадывать".
          2)
          Ну а холодильник, это просто холодный склад. И без кладовщика никак. :)
          Можно облегчить действия кладовщика, соединить весы со сканером штрих кодов, и ваша роль сведется к взвешиванию продукта, перед тем как поставить в холодильник и после доставания из холодильника.
          3)
          Голосовое управление я не скидываю со счетов, просто управление должно быть комплексным. И звук, и кнопки и прогноз.
          Тогда оно будет удобным.


          1. AlexFadeev
            28.03.2016 12:56

            1) Разумеется. В данный момент я прорабатываю общую концепцию всех хотелок, чтобы заложить при формировании железной составляющей. Так как я начинаю ремонт в квартире, у меня есть возможность проложить все коммуникации заранее. Я не хочу строить беспроводную сеть модулей и хочу построить все на более надежной в данном случае Ethernet сети. Поэтому да, сначала свет, отопление, вентиляция и прочие базовые вещи.
            2) Вот я и ищу варианты избавиться от подобных промежуточных действий. Так как зная себя, уверен, через месяц что мне, что жене просто задолбает все взвешивать и сканировать в ручную. Тем более это не решает вопроса с использованием продуктов во время готовки. Получается взвешивание и сканирование будет сопровождать абсолютно каждое действие. Даже когда посреди ночи ты лезешь в холодильник взять простого йогурта. Не круто. И не удобно.
            3) Естественно. Только комплексный системный подход. Только хардкор. =)


            1. 2PAE
              28.03.2016 13:09

              Уф, помню как у нас внедряли диет питание от 1С. Посмотрел я со стороны… Склад он такой…
              Тут нужна новая парадигма. В привычной, холодильник — склад, без строгого учёта никуда…


              1. AlexFadeev
                28.03.2016 13:10

                Именно. Вот я над новой концепцией парадигмы и думаю… =)


                1. JustRoo
                  28.03.2016 13:35

                  Как вариант — позволить холодильнику самому выбирать, что ты будешь есть. Тогда не ты подходишь к холодильнику и говоришь "нужно купить хлеб и картошки", а ты подходишь к холодильнику, и уже он говорит "я заказал хлеб, черный и белый, и три килограмма картошки, а еще в морозилке лежит рыба, как насчет судака под картофелем на ужин?". И обучается на основе твоих ответов плюс собственных представлений о правильном питании =)


                  1. AlexFadeev
                    28.03.2016 13:45

                    В целом да, примерно такая же мысль закрадывалась. Но, есть несколько важных моментов:
                    1) Это все равно не решает вопрос отслеживания количества оставшихся продуктов после готовки
                    2) Немного смущает, что компьютер будет решать за меня, чего есть… =))) Но это чисто параноидальные замашки уже. =)
                    3) Пока система научится предугадывать мои желания, она меня разорит на покупке лишних продуктов. Но этот вопрос решается виртуальным обучением, разумеется.

                    Пока что, какую бы концепцию я не вообразил, избавиться от концепции склада с учетом не получается. Все равно надо понимать, что есть и хватит ли этого для каких-то блюд. Ну и, кстати, продукты — это не только холодильник, но и еще больше различных продуктов в других полках и т.д.

                    Пока что рабочих два варианта и оба мне не очень нравятся:
                    1) Либо придумать сложную систему мониторинга, сканирования и взвешивания. Посадить датчики на каждую полку не так сложно. И отслеживать изменение масс, коррелируя это с используемыми в данный момент продуктами. Над рабочей поверхностью, к примеру, можно замутить сканер, который будет распознавать продукты. Плюс доска-весы. Ну и т.д. То есть в целом это реализуемо. Хоть и сложно. Я уж точно на данный момент не смогу написать систему, распознающую такую вариативность продуктов. А как уж отличить апельсин он оранжевого яблока или грейпфрута я вообще без понятия.
                    Да и появляется серьезный вопрос о целесообразности и стоимости такой разработки для решения в целом простой бытовой задачи.
                    2) Либо все же принудить себя самостоятельно вести продуктовый «дневник» с применением голосового управления, сканирования чеков, штрихкодов и т.д. Это проще, но выглядит уже не так эффективно и удобно.

                    Но в целом то, что вы предложили, скорее всего идеальный вариант для такой системы с точки зрения закупки продуктов. Можно сказать, это ТРИЗ с точки зрения компьютера. Он решает задачу путем получения решения непосредственно от меня.


                  1. AlexFadeev
                    28.03.2016 13:57

                    Вообще сейчас появилась интересная мысль.

                    Можно развить нейроную сеть. У нас есть следующие данные:
                    1) Количество и список закупаемых продуктов
                    2) Рецептурный список. Уверен, рацион любого человека не сильно разнится в глобальном плане и как правило человек ест все время похожие блюда. При этом мы знаем в среднем расходуемое количество продуктов на каждый рецепт
                    3) Рацион и частоту питания каждого человека.
                    4) Со временем предпочтения и хотелки человека.
                    5) Стандартные сроки годности тех или иных продуктов

                    Таким образом теоретически можно обойтись без складского учета и вести этот учет приблизительно основываясь на всех этих данных. Через какое-то время «жизни» такая нейронная сеть будет достаточно точно предугадывать расход продуктов и необходимый список закупки, а так же предлагать актуальные и подходящие рецепты.


                    1. Per_Ardua
                      29.03.2016 21:31

                      Спасибо) Страница в закладках, буду смотреть на ваши комментарии, при настройке своей сети)


          1. Alexsandr_SE
            28.03.2016 15:46

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


  1. PapaTramp
    28.03.2016 07:54
    +1

    Ничто не ново под луной. В эпоху FIDO и BBS под Maximus'ом тоже работал бот для общения, и чем больше была словарная база — тем лучше он отвечал собеседнику.


  1. past
    28.03.2016 11:53

    Можно натаскать бота на пьесах. Хороший русский язык и по ролям расписано.


    1. Durham
      28.03.2016 12:47

      Это кстати мысль. Спасибо. Правда вопрос сколько таких диалогов существует в природе...


  1. loker39
    28.03.2016 12:19

    Я все жду статью «Нейросеть на JS в 100 строк» =)


  1. Segmentq
    28.03.2016 12:19

    Можете его в telegram активировать?


    1. Durham
      29.03.2016 21:32

      На все сил и времени не хватает. Может быть когда-нибудь руки дойдут.


  1. alekssamos
    28.03.2016 12:19

    Ну сейчас кстати можно кое как пообщаться с Siri или Google Now…
    А ещё, вот похожая статья + ссылка на бота в ВК: habrahabr.ru/post/251687
    И вот ещё (самообучающийся): chatbot.tw1.ru


  1. Chvalov
    28.03.2016 12:19

    Увы нету доступа к APK файлу, не могли бы вы залить его на файловопомойку?


  1. Dimidroll1902
    28.03.2016 12:19

    «В процессе работы мне приходилось это неизбежно читать, и голова пухла от длинных бесед какого-то Сергея и Сейлор Мун (кому то же это пришло в голову!)»
    Лукьяненко.
    Кстати, довольно неплохая дилогия («Моя жена ведьма»), что бы отвлечься и дать отдохнуть мозгам.


    1. hacklex
      28.03.2016 17:40

      … может, Белянин?
      Если да – то подтверждаю, неплохая.


      1. Dimidroll1902
        28.03.2016 17:46

        Да, прошу прощения, надо спать больше.
        Конечно Белянин.
        Еще довольно неплохая серия у него — "Тайный сыск царя Гороха".


  1. rjunimagu
    28.03.2016 12:19

    Узнал фразу из The Big Bang Theory(сезон 4, эпизод 9, 08:05) — «он на гавайях, но радж управляет отсюда». Сравнил диалог из субтитров и приведенный для понимания почему бот ошибся. В данном эпизоде указанной фразе предшествовала — «ну, и где телескоп?», и больше никакого контекста рядом не совпадает. Следовательно бот ориентировался только по одной фразе? Если так то немного разочарован


    1. Durham
      28.03.2016 12:51

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


  1. phantom-code
    28.03.2016 12:19

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


  1. stassss2011
    28.03.2016 12:19

    Ссылка на Google Play выдает URL Not Found. Тестировщиком стал.


    1. Durham
      28.03.2016 12:49

      Это ошибка судя по всему на стороне Google Play. Я не знаю почему она иногда появляется. Помогает от нее найти программу поиском на Google Play, и поставить от туда (для тестировщиков она видна в поиске).


  1. jok40
    28.03.2016 12:44

    При запуске Минди появляется ошибка: "Ошибка соединенияSASLError using SCRAM-SHA-1: not authorized". После чего программа запускается, но при любой попытке общения приложение крэшится с сообщением "К сожалению приложение остановилось". Про какую авторизацию речь?


  1. Nakilon
    28.03.2016 13:14
    -4

    30 миллионов пар реплик? Вот вам пример моего бота на 2 миллионах:

    > x: крутая вещь реклама в интернете
    > velik: раньше нужно было хлеба и зрелищ
    > x: бумажки на подъездах гораздо сложней расклеивать
    > velik: или бумажки с прикреплёнными воздушными шариками!

    > x: людей чота боится
    > velik: ой, еще бы

    > x: книжечка торна оказалась очень даже ок
    > x: и еще пацаны там посоветовали другую — «путь к реальности»
    > velik: гляди и перестал бы сюда заходить

    > x: 8 квадратов — я даже не знаю
    > velik метра 3 на 4
    > x: ну там 6 еще можно найти
    > y: ну, калькулятор говорит диаметр проволоки
    > velik: :cool: я всегда с собой ношу — ка-а-а-ль-ку-у-у-ля-а-тор!
    > y: говорит 3.2
    > velik: человеческим голосом```

    > x: а gitlab умеет gated check in?
    > velik: That would be nice )

    > x: sh: gm: command not found
    > velik: эта команда не имеет коровьей суперсилы

    > x: может мне тоже купить книгу по сишарпу? :simple_smile:
    > velik: 20р всего лишь

    > x: <http://map.letapis.by/by/#intro> Мапа станаўлення Беларусі Гісторыя Беларусі ў картах ад Вялікага княства Літоўскага да Рэспублікі
    > x: великое сяброцарство
    > velik: зиг хайль, дольчен золдатен

    > x: почему распространено заблуждение что жаба — гогно
    > velik: провокация на скандал, здесь за такое наказывают

    > x: бурление https://habrahabr.ru/post/278341/
    > x: Почему умер Хабр. Что делать и куда бежать
    > x: Disclaimer. Этот пост — развёрнутый ответ на пост Хабр умирает?.. В исходном посте я дал ссылку на свою дискуссию с deniskin от ноября 2014 года (чуть позднее…
    > velik: да тут мощный троллинг

    > x: или волны гравитационные
    > velik: меня может укачивать

    > nakilon: «комик санс вам в морду» говорят суровые рубисты
    > velik: вот как ты например

    При чем, лог был довольно трешовый (с Клавогонок) — с вкраплениями флуда в виде сообщений-смайликов, и не айтишный по сути.

    А работает это методом типа того, который вы забраковали — «Загрузить набор ответов в БД и искать полнотекстовым индексом по предыдущей фразе...»
    Шел 2016 год, а на школьном портале все еще не поняли, когда нейронные сети нужны, а когда нет…


  1. Alexey2005
    28.03.2016 14:23
    +1

    У меня сложилось впечатление, что работа с нейросетями напоминает гадание на кофейной гуще. Нет никакого способа заранее спроектировать нейросеть исходя из имеющейся задачи, и приходится использовать "метод научного тыка", когда перебирается несколько взятых наугад структур вплоть до достижения результата.


    1. Durham
      28.03.2016 16:18

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


  1. iKBAHT
    28.03.2016 18:13

    Не понятно как обучается сеть. Как сеть понимает что ответ A является приемлемым, а ответ B нет?


    1. sadreamer
      29.03.2016 21:33

      Тот же вопрос. Что на выходе сети? Бинарный классификатор на «релевантно/нерелевантно»? Потом ранжируете все релевантные ответы по вероятности и выбираете один с максимальной?


    1. Durham
      29.03.2016 21:34

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


      1. iKBAHT
        30.03.2016 11:24

        Как происходит выбор ответа в ходе диалога? Как я понял, нужно прогнать через нейросеть k раз контекст вопроса + вариант ответа №i (i от 0 до k), и затем выбрать ответ, которому сеть поставила максимальный балл?


        1. Durham
          01.04.2016 20:01

          Да. На практике имеет смысл отобрать n кандидатов обычным поиском, и ранжировать только их


  1. TimKruz
    31.03.2016 13:08

    Я всё-таки не понимаю, зачем использовать ИНС в данном случае?
    Вот мой наипростейший, но обучаемый алгоритм — ideone.com/PULsAa
    Суть в том, что нужно сначала задать вопрос, а затем самому ответить на него, тогда программа сохранит пару вопрос-ответ, и когда мы снова зададим тот же вопрос (с любыми искажениями в определённых пределах — с помощью нечёткого поиска устраняется влияние опечаток, всяких словоформ и перестановки слов; в данном примере для пущей простоты выполняется поиск строки целиком, но можно искать по словам, тогда подбор будет адекватнее) она вспомнит и озвучит наш ответ.
    Чем больше БД, тем на большее число вопросов она сможет адекватно отвечать.
    Конечно, в таком простом алгоритме не предусмотрено влияние контекста и предыдущих сообщений, но и у вас тоже это всё не предусмотрено…
    Вообще, мне, к сожалению, совершенно непонятны нейронные сети, хоть я и читал множество статей и книг про них… Поэтому я хочу сделать ИИ (для начала в форме чат-бота), не основанный на ИНС, но при этом я не хочу хардкодить функции, а хочу я разработать такой алгоритм, который будет учиться чему угодно подобно ребёнку.
    На данный момент (последние 4 года) я обдумываю идею базы данных, в которой узлы (предложения, слова, буквы; или фрагменты изображений; сэмплы звуков) связаны между собой связями с определёнными приоритетами… Кажется, это похоже на нейронную сеть, но в отличие от ИНС такая БД работает просто и понятно. Основное предназначение этой БД — предсказание будущего на основе прошлого, то есть реакция на настоящее в соотвествии с прошлым опытом — в общем, суть разума. Что думаете: я на верном пути или снова заблуждаюсь?


    1. Alexey2005
      01.04.2016 00:14

      То, что вы описываете, похоже на concept learning.
      Думаю, прежде чем изобретать велосипед, можно ознакомиться с тем, что уже изобретено, т.к. методов построения ИИ придумано множество, и над этим размышляли лучшие умы планеты на протяжении десятилетий.
      Вот есть например обучение на основе байесовского классификатора — на основе этого метода построена работа такой программы, как Акинатор (угадывает персонажа, задав несколько вопросов, система обучаемая, устойчива к ошибкам — на часть вопросов можно ответить неправильно).
      Есть обучаемые системы на основе генетических алгоритмов, системы на основе дерева решений и т.д.
      Информации в сети полно, есть и наборы лекций, и обучающие курсы, и просто подборки статей, и даже книги.
      Можно начать, к примеру, с книги "Machine Learning" за авторством Tom M. Mitchell — там подробно, с математическими выкладками, рассматривается целая куча методов построения обучаемых систем.


  1. semenyakinVS
    01.04.2016 09:29

    Я вот сегодня о чём подумал… А были случаи, когда чатботов — пусть и урезанных с учётом оптимизации — использовали в компьютерных играх для генерации диалогов с NPC? Чтобы с игроками общались не простые диалоговые деревья (пусть и с развесом по каким-то факторам), а именно навороченные чатботы, с асимптотой на прохождение теста Тьюринга? И чтобы при этом учитывались такие факты как темперамент NPC, настроение, и.т.д. Ведь круто было бы!
    Особенно если бы происходило какое-нибудь самообучение ботов по результатам диалогов и обмен опытом между всеми когда-либо с кем-либо говорившими ботами. Например, обучение на основании оценки того, насколько человеку диалог показался "естественным" — скорее всего, на основании косвенных факторов, вроде трекинга поведения игрока во время разговора (тут из жизни можно взять критерии, из психологии общения).


    1. Alexey2005
      01.04.2016 10:06

      К сожалению, подавляющее большинство игроков вообще диалоги с НПСами пролистывает даже не читая. Из всего диалога их интересует только две вещи: куда бежать и кого бить. И уж заниматься печатанием текста будет совсем ничтожный процент играющих, особенно на консолях.
      А затраты на разработку подобного ИИ весьма существенные. Ну и кто захочет вкладываться в подобную фичу, если она будет востребована от силы парой процентов игроков?


      1. semenyakinVS
        01.04.2016 10:23

        Эх. Да… Пожалуй, даже если ограничить набор реплик со стороны пользователя и сделать значимым каждый разговор (как в жизни, где любой встречный может поменять судьбу) — это только будет раздражать. Пожалуй, вы правы, скучные бытовые беседы — пусть и погружающие в атмосферу и создающую живой мир — массовый игрок не любит.


        1. Durham
          01.04.2016 20:00

          Возможно здесь перепутана причина и следствие — поскольку игровые персонажи тупые, то игроку не интересны их тексты, а интересно "куда бежать и кого бить". Если они не будут такие тупые, появятся принципиально новые игровые возможности. А нет этого сейчас по простой причине. Технология еще не дошла. Думаю со временем мы такое увидим.