Deep Learning — что же делать, кого бить

    Нигде, наверно, нет такой насущной необходимости в синергии знаний разных областей науки — как в области машинного обучения и 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 и с неплохими показателями качества модели :-)

    Всем удачи, вдохновения, энергии и новых, интересных задач и красивых, эффективных решений!
    1С-Битрикс
    73.74
    Компания
    Share post

    Comments 52

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

      Особенно порадовал вывод в секции «Что же делать?» в стиле лабораторной работы, и совет завязывать с танками, пост написан танкистом в завязке?
        0
        О чем статья? О бардаке и перетягивании одеяла :-) Хочется надеяться, что ситуация выровняется в лучшую сторону.
          0

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


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


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


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

            0
            Спасибо! Пишите вопросы, постараюсь подсказать.
        0
        Это статья — крик души. Печаль… У других работает, а самому тяжело вникнуть. Прям по классике — «Лисица и Виноград»
          +2
          Обижаете. У нас тоже работает и нет проблем с пониманием темы. Проблематика в другом немного, жаль что не удалось ее донести.
          +1
          постоянно учиться и приобретать смежные знания

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


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

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

              Спасибо.

                0
                Не думаю, что там то, о чём спрашивалось, потому что в этом курсе как раз на обычном персептроне все и заканчивается, а свёрточных цепей там нет.
                  0
                  А рекуррентных? :-)
                  0
                  Этот курс требует от слушателя определенного начального уровня вхождения, причем не маленького. Инженер вряд ли врубится с ходу.
                    0
                    Так посоветуйте что-нибудь для инженеров.
                      0
                      http://colah.github.io/ — самое имхо лучшее
                  +1
                  Возможно, заинтересует книжка «Построение систем машинного обучения на языке Python» 2016 года, авторы Луис Педро Коэльо и Вилли Ричарт
                  0

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

                    0
                    Сомневаюсь что это возможно, хотя… :-)
                      +2
                      http://karpathy.github.io/2015/05/21/rnn-effectiveness/ (пролистайте в середину)
                        +1
                        А я такую штуку поднимал и код Битрикс на ней генерил, а также «Войну и мир» и «Преступление и наказание» :-) Проблема пока в том, что какой бы тип ячейки рекуррентной сети вы бы не выбрали (LTSM, GRU, plain RNN), сколько бы слоев не ставили — такие модели хреново пока генерят последовательности на основе созданной языковой модели. Об этой проблемке пишет сотрудник Google Brain Team.
                          0
                          все верно, с языком сети не будут хорошо работать. Ибо нужно сравнивать не «образы слов» (лексики и ее всевозможных грамматических атрибутов), а семантических образов. А для этого пока есть только одно решение — онтологии. Но и оно пока неподъемно в общем случае. Поэтому если и пытаться запихивать язык в нейросети, то не лоб, а каким-то особым извращенным способом (типа через LDA/LSA и подобное).
                            +1
                            А можно же так:
                            1) Из слов сделать эмбеддинги низкой размерости — т.е. соединить близкие слова по контексту
                            2) Пропустить набор эмбеддингов через рекуррентную сетку для получения семантического образа фразы
                            3) Затем сравнить семант. образ фразы (вектор), после линейной трансформации (размерность остается той же), с аналогично пропущенной через рекуррентную нейронку фразой из параллельного корпуса
                            4) Найти близкие фразы через банальный vector dot
                              +1
                              Это понятно. Но тут как бы и нейросети и не нужны. Простые векторные модели это неплохо делают. А графические еще лучше. Т.е. получив «близкие слова», дальше уже масса вариантов их использования. Но вот получить их получается только «под задачу» — зависит от корпуса. А хочется «как в жизни»…
                                0
                                А как простые векторные модели могут сохранить контекст текста до? Рекуррентные сети — могут.
                                  0
                                  ну не совсем простые, на каждое слово вектор, т.е. матрицы сравниваются, типа термы-документы, но уже не разряженые.
                                    0
                                    А, после SVD которые? Ну там синонимы или близкие слова становятся одной колоночкой. Но контекст именно предложения они хранят как бы статически — т.е. набором слов. Ну можно еще завернуть на них сверточную сеть (фильтры) — но эта будет статика как не крути. А рекуррентные нейронки могут строить внутри себя смысловое представление последовательности предложений, прикольная возможность.
                                      +1
                                      Можно и без SVD, можно и pLSA. А последовательность можно хранить, применив n-gramm, или что-то типа PMI. С предложениями тяжело, конечно, будет. Но их и не нужно. Важны только ключевые термы. То есть, нейросети в чистом виде не очень интересны для языка. Другое дело гибридные, когда какую-нить Байесовскую сеть можно запихнуть для оптимизации результатов CRF. Или CNN для уменьшения размерности параметрического пространства. Мне кажется это перспективнее.
                                        0
                                        Спасибо, интересно!
                          0
                          Но то, что эта штука поражает — это факт.
                      +2
                      Пользуясь случаем хочу попросить посоветовать онлайн курсы по математике, где-то институтского уровня но «для чяйников». Желательно такие где можно материалы проходить не по календарю а по наличию времени. Заранее спасибо.
                        0
                        мне одно время назад хорошо помогли справочники по математике Выгодского
                          0
                          mathprofi
                          Немного может не подходить под Ваше описание, но в свое время мне эти материалы помогали, весьма доступно написано.
                          +1

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

                          +1

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

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

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

                            А ещё можно упороться и вывести байесовский вывод (pun intended) через категориальный подход. Отложи свою линейную алгебру после отложенных танчиков, это куда круче и приятнее.
                              0
                              Да смотрел я haskel, как и Scala — глубоко, серьезно, по-совести. И отложил. На python, да, императивном, извращенном, но тем не менее куча библиотек и графики легко рисовать быстро.
                              +1
                              Замечу, DeepLearning4j — это не совсем Java. Все что касается интерфейсов — Java 1.7 и Scala. А все что касается тензоров — C++, с OpenMP и CUDA. И не исключено, что в ближайшем будущем OpenCL может появиться.
                                +2
                                P.s. Я — один из разработчиков DL4j/ND4j. Буду рад ответить на вопросы, если таковые у кого появятся.
                                  0
                                  Добрый день! Хотел спросить как можно просто в DL4j в обучаемом с автоматическим диффиренцированием графе после нейронки и получения на выходе нейронки вектора, выполнить его линейную трансформацию с помощью квадратной матрицы — но так, чтобы веса матрицы обучались.
                                    +1
                                    Начать можно с того, что AD не реализован на данный момент :(

                                    P.s. В планах — есть. Но не приоритетная задача.
                                      0
                                      Видимо тогда можно попробовать решить через сукблассирование слоя обычной однослойной сети без сигмоида на выходе.
                                  0
                                  Да, согласен, вы правы. Но java как платформа со строгой типизацией, отличным jit и великолепной стандартной библиотекой выглядит привлекательно. А вот Scala, как замена python — вот где она мать ее? :-) Spark просиял, Akka — а дальше что? Где фреймворк машинного обучения на ней?
                                    +2
                                    DL4j совместим с Scala, и прямо сейчас переписываются ND4s (Scala версия ND4j) и аналогичные работы по DL4j Scala ведутся :)
                                    Так что возможно DL4j и станет таким фреймворком. По крайней мере людей использующих Scala я вижу в саппорт чате постоянно.
                                  0
                                  Народ, может кто кинуть ссылку на какой-нить туториал по свёрточным нейронным сетям для распознавания картинок (MNIST хотя бы), или поиска объекта на изображении, но обязательно на С++, python ради этого не хочется учить. Прям не могу найти, хоть тема и должна бы быть уже избита.
                                    +1
                                    http://caffe.berkeleyvision.org/
                                    +5
                                    Есть опыт работы с ANN в production системах. Текущий подход, где используется обучение с gradient descent, подходит для определенного типа задач. Идея в том, чтобы прогнать множество итераций с обучающим набором, чтобы получить достаточный уровень ошибки. В итоге получим распознавание паттернов, для определенного типа задач. Но проблема в добавлении новых знаний в существующую сеть. Неэффективно прогонять многие итерации обучения, чтобы добавить крупицу нового знания. Пока пытаются решить проблему one shot learning костылями типа Neural Turing Machine, но имхо это забивание гвоздей микроскопом. Более интересно совместить вероятностные подходы с ANN, например с Gaussian Processes и Deep Reinforcement Learning. Это уже применяется в робототехнике, но есть нюансы работы с широкими слоями ANN. Вообще, если следить за темой, то основные идеи меняются не быстро. С другой стороны, на хайпе нейросетей сейчас каждый ученый и его тетя пишут научные статьи, создавая илюзию стремительно меняющейся области. Особенно преуспели в том деле китайские товарищи, выдавая тонны г*вно статей на гора.
                                      0
                                      Спасибо, интересно!
                                      +1
                                      Очень забавный тайминг у статьи :) Как раз пытаюсь подружить как-нибудь Caffe с JVM, причем нужно только «feed forward» — классификация без обучения. И очень желательно дергать её не напрямую а её питоновскую обвязку. Кто-нибудь извращался? :\
                                        0
                                        Нет, не пробовали. Удачи Вам! :-)
                                        0
                                        Нет, не пробовали. Удачи Вам! :-)
                                          0

                                          Работает не трогай. Вы код ядра линукс видели? А mysql? Индустрия слишком молодая. Технический долг отдадут когда закрепятся на рынке

                                          Only users with full accounts can post comments. Log in, please.