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

  1. Железо стало гораздо быстрее и можно легко обсчитывать модели на GPU
  2. Появилась куча неплохих бесплатных фреймворков для нейросетей
  3. Одурманенные предыдущим хайпом, компании стали собирать бигдату — теперь есть на чем тренироваться!
  4. Нейронки в некоторых областях приблизились к человеку, а в некоторых — уже превзошли в решении ряда задач (где тут лопаты продают, надо срочно бункер рыть)

Но управлять этим, по прежнему, сложно: много математики, высшей и беспощадной. И либо ты из физмата, либо сиди и решай 2-3 тысячи задачек в течении двух-трех лет, чтобы понимать, о чем идет речь. Разобраться по дороге на собеседование в электричке, полистав книжку «Программирование на PHP/JavaScript за 3 дня» — не получится, ну никак, и списать никто не даст (даже за ящик водки).


Вам не дадут «списать» модель нейросети даже за ящик водки. Часто именно на Ваших данных публично доступная модель работает внезапно плохо и придется разбираться в тервере и матане

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

Красота теории и практика


Даже в такой, казалось бы, интуитивно понятной и прикладной до уровня «АК-47» области, как обработка реляционных данных, крупная и очень известная компания IBM в свое время замучилась и, по сути, «выдавила» старика Кодда, знаменитого создателя «языка для базок», для прогулок на все четыре стороны. Что же произошло? Кодд утверждал, что SQL, распространяемый IBM — это зло, он не строг и не полон и не соответствует строгой и красивой теории :-) Тем не менее, мы же все пользуемся SQL до сих пор и… ничего, живые.

Примерно то же происходит сейчас и с машинным обучением. С одной стороны еженедельно или, даже, чаще, выходят окрыляющие научные публикации на тему внезапной победы ГироДраконов (имеющих в физиологических шариках — гироскопы) над ГиперКашалотами в Тьюринг-пространствах в созвездии Маленького Принца, массово появляются бесплатные прототипы на github и в дистрибутивах нейронных фреймворков, которые понимают смысл вопроса на 5% лучше предыдущих прототипов — но, по сути, продолжая ни черта не понимать суть. Одновременно с этим, путем сильнейшего группового насилия над нейросетью и самой идеей обучения с подкреплением в пространствах огромной размерности — она вдруг начинает обыигрывать Atari в двумерные игры и про победу нейросетей над чемпионами в Go, наверно, все давно знают уже. А с другой, бизнес начинает осознавать, что область еще очень сырая, находится в фазе бурного роста и прикладных, эффективно решающих задачи людей кейсов еще очень мало — хотя они, безусловно, есть и просто поражают. К сожалению, гораздо больше академических игрушек: нейронки старят лица, генерят порно (не гуглите, потеряете потенцию на сутки) и создают глючную верстку по дизайну веб-страниц.


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

А реальный, потрясающий успех в некоторых сферах, таких как, например, распознавание образов, достигнут ценой обучения огромных сверточных сетей из сотен слоев — что могут себе позволить, пожалуй, только гиганты индустрии: Google, Microsoft… Аналогично дело обстоит и с машинным переводом: вам нужны большие, очень большие, объемы данных и большие вычислительные мощности.

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

Языковые нейронные модели сейчас, как никогда, очень интересны, но многие требуют значительных корпусов текстов и, опять таки, вычислительных ресурсов, что особенно пока затруднительно для русского языка. И хотя дело сдвинулось с мертвой точки и уже можно найти эмбеддинги и не только для русского, эффективно их использовать в составе сложных языковых моделей в production, не тащя 1000 килограмм питонячих потрохов и стадо хрюкающих слонов — неясно как.


Вы думаете, что развернуть Hadoop без помощи понимающих системных администраторов — просто? Пойдите лучше и похрюкайте вместе с этим стадом :)

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

Поэтому рассчитывать на то, что вы займетесь deeplearning «на коленке» и что-то из этого полезного получится и быстро — не стоит (ударение на букву «о»). Нужно и знать немало и работать в «поте лица своего».

Бизнес-кейсы алгоритмов ML — в сухом остатке


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

  1. Классификация чего угодно на несколько классов (спам/не спам, купит/не купит, уволится/не уволится)
  2. Персонализация: какой товар/услугу человек купит, уже купив другие?
  3. Регрессия чего угодно в циферку: определяем цену квартиры по ее параметрам, цену автомобиля, потенциальный доход клиента по его характеристикам
  4. Кластеризация чего угодно в несколько групп
  5. Обогащение бизнесовых датасетов или предобучение с помощью GAN
  6. Перевод одной последовательности в другую: Next Best Offer, циклы лояльности клиента и др.


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

Бизнес-менеджерам, тем временем, ничего не остается делать, как с утра до вечера кидать в разработчиков учебниками математики со словами: «ну найдите же прикладное применение этим алгоритмам, for-fan — не предлагать!» и нанимать экспертов, понимающих научные публикации и способные, хотя бы на python, писать адекватный код.

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


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

Выбор алгоритма, почему нейронки


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

  1. За счет факторизации слоев и нелинейности, они способны аппроксимировать гораздо более сложные паттерны меньшим числом слоев, чем плоско-широкие модели
  2. Нейросети, при достаточном числе обучающих примеров, лучше работают с новыми данными «by design» (генерализация лучше)
  3. Нейросети могут работать лучше классических моделей и даже лучше моделей, которые предварительно парсят тексты и вычленяют из них смысловые отношения между словами и предложениями.
  4. Если использовать регуляризацию, похожую на действие алкоголя в мозге человека (dropout), то нейросети адекватно сходятся и не сильно страдают от переобучения

В результате мы пришли к такой, довольно простой, но, как оказалось, очень эффективной на практике архитектуре:

Обучается нейросеть часа полтора (без GPU, а на нем гораздо быстрее) и использует для обучения датасет ~ 100к привязок вопросов к категориям.

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

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

  1. код на PHP
  2. верстку
  3. мат-перемат-сленг
  4. описание проблемы, задачи, идеи
  5. ссылки на файлы внутри продукта

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

Вот как это работает изнутри:


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


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

Планы на будущее


Сейчас мы экспериментируем на Keras с другими архитектурами текстовых классификаторов:

— на базе рекуррентной сети
— на базе сверточной сети
— на базе bag-of-words

Лучше всего работает многослойный классификатор, на вход которого подаются one-hot вектора символов (из небольшого словаря символов корпуса), затем проходит несколько слоев 1D-свертки c global-max/average pooling и на выходе стоит обычная feed-forward слой с softmax. Подобный классификатор обучить сквозным способом так и не получилось, и даже batch normalization не помог (надо было меньше на девушек заглядываться и слушать преподавателя) — но удалось таки хорошенько ее обучить путем последовательного обучения слоя за слоем. Видимо, когда мы придумаем, как вместо тензоров на java эффективно использовать тензоры на Keras/python/Tensorflow на production — мы обязательно выкатим эту архитектуру на бой и еще больше обрадуем наших менеджеров и клиентов.

Так работает не всем понятная 1D-свертка. Можно сказать, что создаются kernels (сверточные ядра), определяющие 1-2-3-n цепочки символов, «аля» мульти-nrgams модель. В нашем случае лучше всего работает 1D-свертка с окном 9.

В завершении поста, дорогие друзья, желаю вам не тушевать перед ML и нейронками, смело брать их и использовать, строить и обучать модели и уверен, вы сами увидите, как AI эффективно работает, как помогает снять с людей рутину и увеличить качество ваших сервисов. Всем удачи и хорошего и, главное, быстрого схождения нейросетей! Целую нежно.
Поделиться с друзьями
-->

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


  1. frees2
    23.06.2017 17:43
    -2

    Вам не дадут «списать» модель нейросети даже за ящик водки.


    Может кто из молодёжи не понимает, думает это фейк у них такой. Так вот, поголовно расплачиваются, коньяком, стоит ящик, заместо одеколона использую, ибо коньяк дорогущий, а мы конъяков не потребляем, водкой не комифлю им.
    Директорским стулом кожаным, сломался через три года. Всё на балансе. Путевкой в Амазонию ( думали крокодилы и пираньи съедят и расплачиваться не придётся…


    1. AlexSerbul
      23.06.2017 18:20

      Я пробовал, но не работало. Говорят: задача поставлена не математически, иди дальше думай :-) А клиенты продолжаю звонить.


    1. MTonly
      23.06.2017 18:30
      +7

      Комментарий сгенерирован нейросетью? %)


      1. ls1
        26.06.2017 08:44

        … сразу после распознавания ящика коньяка


  1. begemot_sun
    23.06.2017 17:43
    +3

    Для авто-саппорта идеален Акинатор. Почему до сих пор нет внедрений?


    1. AlexSerbul
      23.06.2017 18:20
      +1

      Ну тут же не авто-саппорт. Тут — автоматический роутинг обращения в нужную категорию по его содержимому.


  1. it2manager
    23.06.2017 18:54
    +1

    Вы пишите, что выбрали сеть потому что… Можно в цифрах, точность Байеса, SVM, сети и что вы там еще использовали на вашем наборе данных. Сколько у вас классов?


    1. AlexSerbul
      23.06.2017 18:54

      Не, лень было их сравнивать. Я ссылку на статью со сравнениям дал. Классов под сто.


      1. it2manager
        24.06.2017 09:47
        +1

        Вопрос собственно возник из-за того, что мы также используем автоматическую классификацию сообщений. Используется слегка модифицированный байес. Классов — 60, точность — 82%. Обучение классификатора занимает — 5 минут на core i5. Алгоритм реализован без привлечения программистов :) Вопрос — насколько необходимо городить огород и исследовать нейронки, когда простые алгоритмы справляются очень неплохо?


        1. AlexSerbul
          24.06.2017 11:32

          «Работает — не трогай!» :-). Наивный байес прекрасен, из апостериорных вероятностей слов он апроксимирует априорную вероятность конкретного раздела, но… делает это наивно — не учитывая возможные связи слов. В фразе «да пошел ты на ...» люди и N-nram модели увидят подходящее слово, а байес — нет :-) Тем не менее, он неплохо работает же и часто, вместе с скорее более точной но дольше обучаемой SVM используется как baseline.

          Мы в нашем случае употребили нейронку по следующим причинам:
          — сразу несколько языков
          — в перемешку идет код, верстка, мат-перемат, благословения и текст
          — нужна устойчивость к опечаткам (bag of char ngram3), т.е. стемминг Портера на слова не подошел бы
          — нейронку можно улучшать не включая мозг: развивая архитектуру и повышая ее точность (например идти в сторону 1D свертки или эмбеддингов, paragraph vectors ...), а байеса как?

          Ну и одновременно мы развиваем направление помощников в диалогах, тоже на нейронках, вот пример:


          У меня вопрос, а какие у Вас тексты, на скольки языках? Если вставки кода в них?


          1. frees2
            24.06.2017 16:59
            +1

            А почему просто нельзя попробовать, посмотреть как модифицируются фразы, предложения?
            Несколько языков, не будучи филологом, и то понимаю сложность, нет решений у IBM.
            Да вам памятник рядом с Пушкиным поставят. (, если не только мат удаляете.)

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


            1. AlexSerbul
              24.06.2017 17:04

              ну… NLP это сложная AI-complete задачка, ее может и решат лет через 10 000. Если было бы можно ифами и логикой это делать — давно бы делали. А нужно уже сейчас языки понимать.


              1. frees2
                24.06.2017 20:38

                «Полно тут дизайнеров без портфолио», это конечно не литературно, так пишу. Если поменять слова то и эмоциональность немного изменится.

                Знакомый говорил, язык изобретают. Сначала будет перевод на некий логический (семантический?) язык (хранение, обработка информации на нём удобнее, если надо — снова преобразование в человеческий язык), возможно и роботы на нём станут общаться.


          1. it2manager
            25.06.2017 00:25
            +1

            Текст на русском и английском (менее 3%). Есть вставки кодов ошибок dotnet. В качестве токенизации используем TF-SLF (http://injoit.org/index.php/j1/article/viewFile/118/91).


          1. it2manager
            25.06.2017 00:31
            +1

            Сама «игрушка» написана на питоне. Алгоритм таков: Убираем Стоп-слова (предлоги, союзы, местоимения, фразы «без смысла», типа: с уважением, спасибо, благодарны и т.д. ), словарь небольшой -> нормализуем (pymorphy2) -> считаем TF-SLF-> вычисляем вероятности-> сохраняем в БД.


            1. AlexSerbul
              25.06.2017 00:33

              спасибо, очень интересно


          1. it2manager
            25.06.2017 01:00
            +1

            Было желание поиграться с SVM, но никак руки не дойдут, как я упоминал выше, не программист и не математик -образование хорошее :), времени нет :). А если разница будет на 2-3% то жаба задушит за потраченное время.


            1. AlexSerbul
              25.06.2017 01:04

              Далеко не все настоящие программисты по образованию пишут правильный код и не все математики по образованию — хорошо математят :-) Я — электро-механик, но с 12 лет пишу код и ООчень люблю математику и посвящаю ей свободное время. Нейронки, судя по рекламным брошюрам :-) позволяют не заниматься предварительной обработкой фич, а лить на вход все, что есть, и сеть сама расставит веса. В этом, насколько я понимаю, их основная сила — универсальное оружие :-)


              1. it2manager
                25.06.2017 01:19
                +1

                Универсальное оружие это да, но есть ограничения: у нас в некоторых категориях по 15-20 документов, для нейронки, исходя из того, что я читал, это очень мало… как следствие, может быть некорректная классификация, поэтому остановился на байесе (быстро и сердито :-) ) и на вкусное оставил SVM.


                1. AlexSerbul
                  25.06.2017 01:29

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


  1. unicast
    23.06.2017 19:38
    +1

    Саш, продам лопату ;-)


    1. AlexSerbul
      23.06.2017 19:39

      :-)


  1. shurupkirov
    24.06.2017 09:40
    +2

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


  1. erwins22
    24.06.2017 16:08
    +1

    выставите соревнование на киндл.


    1. AlexSerbul
      24.06.2017 17:05

      спасибо за идею!


    1. alex4321
      25.06.2017 03:04
      +1

      Может таки каггл? Или я упустил что-то?


      1. AlexSerbul
        25.06.2017 12:39

        Это хорошая идея, спасибо, обсудим — но может более просто? Мы предлагаем более прямой путь к монетизации коллегам датасайнтистам: без каггла и прочих посредников сразу выкладывать решения и модули на наши маркетплейсы: https://www.bitrix24.ru/apps/ и https://marketplace.1c-bitrix.ru/. Клиенты будут их скачивать, использовать в своих продуктах и разработчикам модулей деньги платить.


        1. erwins22
          27.06.2017 20:41
          +1

          соревнование vs занудная работа?


          1. AlexSerbul
            28.06.2017 11:20
            +1

            Сейчас остро стоит вопрос монетизации ML. Чтобы третья волна не оказалась очередным хайпом для рекламы фундаментальной науки — соревнований недостаточно, нужно рукава закатить и порешать еще сотню нестандартных задачек из реальности :-)


            1. erwins22
              28.06.2017 14:14
              +2

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

              Это тоже самое что пробежать марафон вместе с толпой народа или каждый день ходить по 5 км на работу и домой.


  1. sci_nov
    24.06.2017 22:01
    +1

    Если использовать регуляризацию, похожую на действие алкоголя в мозге человека (dropout), то нейросети адекватно сходятся и не сильно страдают от переобучения

    Мудро :).


  1. AlexeyCaTHaR
    25.06.2017 12:35
    +1

    Нейросеть это конечно хорошо, но лучше бы ввели простую кнопку = вы ответили чушь, только, чтобы не получить втык за выход из времени ответа на обращение…


    1. AlexSerbul
      25.06.2017 12:36

      Отличная идея, кстати, спасибо!