Нигде, наверно, нет такой насущной необходимости в синергии знаний разных областей науки — как в области машинного обучения и Deep Learning. Достаточно открыть капот TensorFlow и ужаснуться — огромное количество кода на python, работающее с тензорами внутри… C++, вперемешку с numpy, для выкладки в продакшн требующее чуток покодить «на плюсах», вприкуску с bazel (это так волнует, всю жизнь мечтал об этом!). И другая крайность — ребята из Deeplearning4j прокляли python к чертовой матери и вращают тензоры на старой и доброй java. Но дальше всех ушли, похоже, студенты из университета Нью-Йорка — люди, причем не только студенты, причем давно и серьезно жгут на Luajit + nginx (аминь по католически). Ситуация осложняется недавним демаршем Google DeepMind в отношении «дедушки torch»: все проекты переводят на свой внутренний движок, родившийся из DistBelief.
Полнейший хаос и бардак.

Экспертов — «в топку»


Но начнем с конца. Стоит ли тратить время на изучение Deep Learning, насколько он нужен бизнесу и что это вообще такое? Вспомним, что «классическое» машинное обучение работает же, и неплохо, но, НО… требуется тщательный выбор и магическо-ненаучные манипуляции с атрибутами с привлечением экспертов в предметной области — а это долго, дорого и хрупко. Всем хочется дать машине данные и чтобы она САМА всему научилась (вот тебе архив с книжками — завтра научись писать новые; вот тебе фотографии — учись рисовать). И не отвлекайся, красавица, работай. И это стало получаться.
Хорошо известные работающие неплохо примеры, которым не нужны эксперты по языку — это машинный перевод. Ну весело же — берем корпус с переводами, учим нейронку и вуаля — она переводит не хуже, а даже лучше чем Moses.
Еще пример, где DeepLearning расцвел в свое красе — машинное зрение. Тоже весело — несколько слоев нейронки разного типа (сверточные, pooling) и чудо — сеть классифицирует изображение быстрее и иногда точнее человека. И опять — обучается этому только на данных, фичи выбираются автоматически в ходе обучения. Прекрасно!
Еще перспективный пример — рекуррентые нейронки для чатботов и для моделирования языка.
Тем не менее, Amazon релизит продукт, который внутри себя представляет ETL + старую, добрую, «бесплатную» логистическую регрессию! «Безумие» и отвага.

Теория и практика


Жизнь так устроена, что математически хорошо подкованные коллеги обычно пишут на «не очень удобном с точки зрения эксплуатации под высокими нагрузками языке». При этом эти коллеги — очень умные, знают много, множат матрицы в уме и отличают логистическую регрессию от дискриминантного анализа. А опытные опытные опытные инженеры хайлоада, больших данных и энтерпрайза, ангелы DevOps — хорошо программируют в больших объемах и это потом «не протухает», в уме переводят код в ассемблер — но вряд ли даже за отпуск смогут освоить и объяснить на пальцах принцип работы LDA, ссылаясь на Beta-распределение. И не стоит этим матерым бойцам показывать «программирование» в «ipython notebook» — запрут в серверной и заставят переписать код на ANSI C за ночь ;-)
Непонятно пока, что с этим всем делать — Google нанимает ученых со всего мира, сплавляет их с программистами и получаются извращения из смеси python и C++. Программисты нанимают ученых и пишут всю математику на «православной» java и чтобы разобраться в коде, нужно иметь опыт системного программирование лет, эдак, в 10. Но есть все-таки ощущение, что в ближайшие годы начнется интенсивный обмен знаниями и первая группа коллег начнет постигать тайны написания «хорошего кода», а вторая — учиться множить матрицы в памяти :-)
А пока — учимся договариваться, нет выхода.

Что же делать?


Что делать, чтобы разобраться и преуспеть — постоянно учиться и приобретать смежные знания! Хорошие алгоритмы, качественные модели, которые учатся на данных без помощи экспертов — нужны бизнесу, как никогда. Deeplearning очень интенсивно развивается, эта активная область научных исследований и проникает в нашу жизнь все глубже.
Благо, обучая модели на GPU (а эту возможность поддерживают уже многие фреймворки) — можно ускориться раз в 10. Не хватает скорости — стартуем на кластере. TensorFlow умеет это из коробоки, Deeplearning4j — масштабируется на Spark.
Да, нужно привыкнуть к научному стилю изложения — но со временем становится понятно, что вариантов Deep Learning архитектур и решаемых ими задач не так уж и много, и постепенно проясняется механика работы каждого класса решений.
Если тебе трудно понять трехэтажные матрицы, описывающие физику нейронок — отложи WorldOfTanks, потрать одни выходные на вводный курс по линейной алгебре и все со временем откроется. Ученые создают модели, а мы, инженеры — их только используем; ну иногда комбинируем.
И никогда не нужно кидаться в крайности. Вот напоследок вкусная и интересная статья, как Google реализовал свою рекомендательную систему для Google Play — видно, что начинали с классического, правда «широкого» классификатора, а закончили Deep&Wide и с неплохими показателями качества модели :-)

Всем удачи, вдохновения, энергии и новых, интересных задач и красивых, эффективных решений!
Поделиться с друзьями
-->

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


  1. lizarge
    03.08.2016 21:06
    +11

    О чем ваша статья? я вижу 4 абзаца сумбурного потока сознания, c непорядочными сумбурными ссылками.
    Где искать решение проблем, какой подход верный? Может вы предлагаете ссылку на свой git с С++ реализацией медленных Python вставок в готовых реализациях?

    Особенно порадовал вывод в секции «Что же делать?» в стиле лабораторной работы, и совет завязывать с танками, пост написан танкистом в завязке?


    1. HOMPAIN
      05.12.2016 02:43

      Непонятно чем обычный OLED хуже квантовых точек и чем вообще отличается?


      1. RockPresident
        09.08.2016 12:08

        Как человеку только начинающему изучать практическую сторону реализации ML алгоритмов, статья несёт очень много информации которую не так легко получить где-то ещё.


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


        Без таких статей как ваша различать все эти случаи в незнакомой области — не так-то просто или быстро. С подобной точки зрения не так-то часто и пишут. И куча времени может уйти на знакомство со ВСЕМИ инструментами, и потом собственное выстраивание выводов (с каким же работать блин???) которые здесь можно прочитать за 5 минут.


        Я к чему, спасибо за статью, полезной информации в ней не то что есть, её МНОГО! И даже ваш стиль с многими точечными упоминаниями даже отдельных алгоритмов, или примеров применения, или даже просто парыми слов о вашей отдельной эмоциональной реакции к конкретным решениям — это очень круто и сюда подходит. Это не структурированная информация или мануал. Это набор маленьких частичек информации, но их очень много. Если не реагировать на то что формат не очень стандартный а просто воспринимать информацию, то тут очень круто. )


  1. Danov
    03.08.2016 21:13

    Это статья — крик души. Печаль… У других работает, а самому тяжело вникнуть. Прям по классике — «Лисица и Виноград»


    1. DrPass
      05.12.2016 04:19
      +3

      В OLED цвет излучения определяется химическим составом полимера, в QLED цвет определяется физическими характеристиками вкраплений полупроводника. Основное преимущество, по сути, одно — органические полимеры не очень стойкие, и постепенно разрушаются. А для QLED-дисплеев используются твёрдые кристаллы с практически неограниченным сроком службы. Но дорого.


  1. Alex_ME
    03.08.2016 21:23
    +1

    постоянно учиться и приобретать смежные знания

    Кстати про "учиться":
    Часто вижу очень интересные вещи, которые нынче делают с нейронными сетями. Распознавание, сверточные сети, Deep Learning.


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


    1. alex_justes
      03.08.2016 21:26
      +1

      Начните с курса Machine-learning на coursera. Думаю будет интересно и полезно.


      1. Alex_ME
        03.08.2016 21:28

        Спасибо.


      1. abby
        03.08.2016 22:20

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


        1. maxpsyhos
          05.12.2016 08:42
          +2

          Это та-же ЖК-панель, только у каждого суб-пикселя индивидуальная подсветка своего цвета. А яркость регулируется по старинке, по углу поляризации в жидких кристаллах.


      1. AxisPod
        05.12.2016 07:24
        +1

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


        1. david_mz
          04.08.2016 11:56

          Так посоветуйте что-нибудь для инженеров.


          1. AlexSerbul
            04.08.2016 12:34

            http://colah.github.io/ — самое имхо лучшее


    1. dizverst
      04.08.2016 12:15
      +1

      Возможно, заинтересует книжка «Построение систем машинного обучения на языке Python» 2016 года, авторы Луис Педро Коэльо и Вилли Ричарт


  1. KvanTTT
    03.08.2016 22:43

    Нужно научить нейронок писать хороший код.


    1. maxpsyhos
      05.12.2016 09:59
      +3

      Как показывает практика с LED панелями, не проще :) В ЖК яркость пикселя управляются напряжением, а в точках, как и светодиодах — током, т.е. нужны более мощные и дорогие тонкоплёночные транзисторы.


      1. SKolotienko
        04.08.2016 00:12
        +2

        http://karpathy.github.io/2015/05/21/rnn-effectiveness/ (пролистайте в середину)


        1. AlexSerbul
          04.08.2016 00:26
          +1

          А я такую штуку поднимал и код Битрикс на ней генерил, а также «Войну и мир» и «Преступление и наказание» :-) Проблема пока в том, что какой бы тип ячейки рекуррентной сети вы бы не выбрали (LTSM, GRU, plain RNN), сколько бы слоев не ставили — такие модели хреново пока генерят последовательности на основе созданной языковой модели. Об этой проблемке пишет сотрудник Google Brain Team.


          1. elingur
            04.08.2016 12:10

            все верно, с языком сети не будут хорошо работать. Ибо нужно сравнивать не «образы слов» (лексики и ее всевозможных грамматических атрибутов), а семантических образов. А для этого пока есть только одно решение — онтологии. Но и оно пока неподъемно в общем случае. Поэтому если и пытаться запихивать язык в нейросети, то не лоб, а каким-то особым извращенным способом (типа через LDA/LSA и подобное).


            1. AlexSerbul
              04.08.2016 12:38
              +1

              А можно же так:
              1) Из слов сделать эмбеддинги низкой размерости — т.е. соединить близкие слова по контексту
              2) Пропустить набор эмбеддингов через рекуррентную сетку для получения семантического образа фразы
              3) Затем сравнить семант. образ фразы (вектор), после линейной трансформации (размерность остается той же), с аналогично пропущенной через рекуррентную нейронку фразой из параллельного корпуса
              4) Найти близкие фразы через банальный vector dot


              1. elingur
                04.08.2016 12:47
                +1

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


                1. AlexSerbul
                  04.08.2016 12:49

                  А как простые векторные модели могут сохранить контекст текста до? Рекуррентные сети — могут.


                  1. elingur
                    04.08.2016 12:56

                    ну не совсем простые, на каждое слово вектор, т.е. матрицы сравниваются, типа термы-документы, но уже не разряженые.


                    1. AlexSerbul
                      04.08.2016 12:58

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


                      1. elingur
                        04.08.2016 13:08
                        +1

                        Можно и без SVD, можно и pLSA. А последовательность можно хранить, применив n-gramm, или что-то типа PMI. С предложениями тяжело, конечно, будет. Но их и не нужно. Важны только ключевые термы. То есть, нейросети в чистом виде не очень интересны для языка. Другое дело гибридные, когда какую-нить Байесовскую сеть можно запихнуть для оптимизации результатов CRF. Или CNN для уменьшения размерности параметрического пространства. Мне кажется это перспективнее.


                        1. AlexSerbul
                          04.08.2016 13:43

                          Спасибо, интересно!


        1. AlexSerbul
          04.08.2016 00:27

          Но то, что эта штука поражает — это факт.


  1. AStek
    04.08.2016 00:33
    +2

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


    1. AlexSerbul
      04.08.2016 12:39

      мне одно время назад хорошо помогли справочники по математике Выгодского


    1. bavaria
      04.08.2016 15:26

      mathprofi
      Немного может не подходить под Ваше описание, но в свое время мне эти материалы помогали, весьма доступно написано.


  1. mbait
    04.08.2016 02:20
    +1

    Просто это сейчас тренд со всеми вытекающими. Отмотайте время на 20 лет назад, и увидите как люди сочинают оды изяществу и эффективности ООП (выражение "design pattern" из нарицательного стало чуть ли не собственным), а про e-commerce говорят, что перевернёт мир, магазины закроются, всё будут покупать только в интернете, тысячи уволенных продавцов выйдут на улицу с факелами и вилами. Возникает over 9000 стартапов, которые пытаются вывести всё и вся в онлайн. Мы все знаем, что потом произошло с теми ребятами в марте 2000. Теперь возращайтесь в наше время, выполняйте подстановку ООП -> ФП и e-commerce -> machine learning — ничего не изменилось. Как только машинное обучение перестанет быть на слуху (а для этого обязательно нужно найти замену), всё встанет на свои места. Но скорее всего третьей волны уже не будет.



    1. AlexSerbul
      04.08.2016 12:41

      Да, была AI winter, помним, но с 2006 года прорыв же в качестве моделей случился, машинное зрение стало быстрее и лучше работать и заменять людей и не только в этой области


  1. kvark
    04.08.2016 02:28
    +1

    Если хотите красиво и быстро, есть (была?..) ещё такая штука на Rust: http://autumnai.com/


  1. 0xd34df00d
    04.08.2016 06:52
    +1

    А ещё есть диплёрнинг на хаскеле, как пример.

    А ещё есть просто красивое, изящное и алгебраичное машинное обучение. А раз алгебраичное — то уж сам Ф-р велел тоже писать на хаскеле.

    А ещё можно упороться и вывести байесовский вывод (pun intended) через категориальный подход. Отложи свою линейную алгебру после отложенных танчиков, это куда круче и приятнее.


    1. AlexSerbul
      04.08.2016 12:43

      Да смотрел я haskel, как и Scala — глубоко, серьезно, по-совести. И отложил. На python, да, императивном, извращенном, но тем не менее куча библиотек и графики легко рисовать быстро.


  1. tzps
    04.08.2016 12:14
    +1

    Замечу, DeepLearning4j — это не совсем Java. Все что касается интерфейсов — Java 1.7 и Scala. А все что касается тензоров — C++, с OpenMP и CUDA. И не исключено, что в ближайшем будущем OpenCL может появиться.


    1. tzps
      04.08.2016 12:19
      +2

      P.s. Я — один из разработчиков DL4j/ND4j. Буду рад ответить на вопросы, если таковые у кого появятся.


      1. AlexSerbul
        04.08.2016 12:48

        Добрый день! Хотел спросить как можно просто в DL4j в обучаемом с автоматическим диффиренцированием графе после нейронки и получения на выходе нейронки вектора, выполнить его линейную трансформацию с помощью квадратной матрицы — но так, чтобы веса матрицы обучались.


        1. tzps
          04.08.2016 12:55
          +1

          Начать можно с того, что AD не реализован на данный момент :(

          P.s. В планах — есть. Но не приоритетная задача.


          1. AlexSerbul
            04.08.2016 13:00

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


    1. AlexSerbul
      04.08.2016 12:46

      Да, согласен, вы правы. Но java как платформа со строгой типизацией, отличным jit и великолепной стандартной библиотекой выглядит привлекательно. А вот Scala, как замена python — вот где она мать ее? :-) Spark просиял, Akka — а дальше что? Где фреймворк машинного обучения на ней?


      1. tzps
        04.08.2016 12:50
        +2

        DL4j совместим с Scala, и прямо сейчас переписываются ND4s (Scala версия ND4j) и аналогичные работы по DL4j Scala ведутся :)
        Так что возможно DL4j и станет таким фреймворком. По крайней мере людей использующих Scala я вижу в саппорт чате постоянно.


  1. APXAHGEL
    04.08.2016 12:14

    Народ, может кто кинуть ссылку на какой-нить туториал по свёрточным нейронным сетям для распознавания картинок (MNIST хотя бы), или поиска объекта на изображении, но обязательно на С++, python ради этого не хочется учить. Прям не могу найти, хоть тема и должна бы быть уже избита.


    1. AlexSerbul
      04.08.2016 12:46
      +1

      http://caffe.berkeleyvision.org/


  1. temp
    04.08.2016 13:01
    +5

    Есть опыт работы с ANN в production системах. Текущий подход, где используется обучение с gradient descent, подходит для определенного типа задач. Идея в том, чтобы прогнать множество итераций с обучающим набором, чтобы получить достаточный уровень ошибки. В итоге получим распознавание паттернов, для определенного типа задач. Но проблема в добавлении новых знаний в существующую сеть. Неэффективно прогонять многие итерации обучения, чтобы добавить крупицу нового знания. Пока пытаются решить проблему one shot learning костылями типа Neural Turing Machine, но имхо это забивание гвоздей микроскопом. Более интересно совместить вероятностные подходы с ANN, например с Gaussian Processes и Deep Reinforcement Learning. Это уже применяется в робототехнике, но есть нюансы работы с широкими слоями ANN. Вообще, если следить за темой, то основные идеи меняются не быстро. С другой стороны, на хайпе нейросетей сейчас каждый ученый и его тетя пишут научные статьи, создавая илюзию стремительно меняющейся области. Особенно преуспели в том деле китайские товарищи, выдавая тонны г*вно статей на гора.


    1. AlexSerbul
      04.08.2016 13:05

      Спасибо, интересно!


  1. Vanger13
    04.08.2016 14:23
    +1

    Очень забавный тайминг у статьи :) Как раз пытаюсь подружить как-нибудь Caffe с JVM, причем нужно только «feed forward» — классификация без обучения. И очень желательно дергать её не напрямую а её питоновскую обвязку. Кто-нибудь извращался? :\


    1. AlexSerbul
      04.08.2016 14:25

      Нет, не пробовали. Удачи Вам! :-)


  1. AlexSerbul
    04.08.2016 14:25

    Нет, не пробовали. Удачи Вам! :-)