Представляем вам перевод серии статей посвященных глубокому обучению. В первой части описан выбор фреймворка с отрытым кодом для символьного глубокого обучения, между MXNET, TensorFlow, Theano. Автор подробно сравнивает преимущества и недостатки каждого из них. В следующих частях вы узнаете о тонкой настройке глубоких сверточных сетей, а также о сочетании глубокой сверточной нейронной сети с рекуррентной нейронной сетью.



Цикл статей «Deep Learning»


1. Сравнение фреймворков для символьного глубокого обучения.
2. Transfer learning и тонкая настройка глубоких сверточных нейронных сетей.
3. Cочетание глубокой сверточной нейронной сети с рекуррентной нейронной сетью.

Примечание: далее повествование будет вестись от имени автора.

Символьные фреймворки


Фреймворки для символьных вычислений (MXNET, TensorFlow, Theano) характеризуются символьными графами векторных операций, таких как матричное сложение/умножение или свертка. Слой является просто набором таких операций. Благодаря разделению на небольшие составные компоненты (операции) пользователи могут создавать новые сложные типы слоев без использования низкоуровневых языков (как в Caffe).

У меня есть опыт использования различных фреймворков для символьных вычислений. Как оказалось, в устройстве и текущей реализации у них у всех есть как преимущества, так и недостатки, но ни один из них не отвечает в полной мере всем требованиям. Однако в данный момент я отдаю предпочтение Theano.

Далее мы сравним перечисленные фреймворки для символьных вычислений.
Характеристика
Theano
TensorFlow
MXNET
Программное обеспечение Theano TensorFlow MXNET
Автор Монреальский университет Команда Google Brain Сообщество Distributed (Deep) Machine Learning Community
Лицензия на программное обеспечение Лицензия BSD Apache 2.0 Apache 2.0
Открытый исходный код Да Да Да
Платформа Кросс-платформенное решение Linux, Mac OS X, планируется поддержка Windows Ubuntu, OS X, Windows, AWS, Android, iOS, JavaScript
Язык программирования Python C++, Python C++, Python, Julia, Matlab, R, Scala
Интерфейс Python C/C++, Python C++, Python, Julia, Matlab, JavaScript, R, Scala
Поддержка CUDA Да Да Да
Автоматическое дифференцирование Да Да Да
Наличие предварительно обученных моделей С помощью model zoo в Lasagne Нет Да
Рекуррентные сети Да Да Да
Сверточные сети Да Да Да
Ограниченные машины Больцмана/глубокие сети доверия Да Да Да

Сравнение символьных и несимвольных фреймворков


Несимвольные фреймворки


Преимущества:

  • Несимвольные (императивные) фреймворки нейронных сетей, такие как torch и caffe, как правило, имеют очень похожее устройство вычислительной части.
  • С точки зрения выразительности императивные фреймворки устроены достаточно неплохо, в них может быть интерфейс на основе графов (например, torch/nngraph).

Недостатки:

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

Символьные фрейморки


Преимущества:

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

Недостатки:

  • Доступные символьные фреймворки с открытым исходным кодом пока еще недостаточно развиты и уступают императивным по производительности.

Добавление новых операций


Во всех этих фреймворках добавление операций с сохранением приемлемой производительности весьма непросто.
Theano/MXNET TensorFlow
Можно добавлять операции на Python с поддержкой встроенных операторов C. Forward на C++, symbolic gradient на Python.

Многократное использование кода


Для обучения глубоких сетей требуется немало времени. Поэтому Caffe выпустили несколько заранее обученных моделей (model zoo), которые можно было бы использовать в качестве изначальных образцов при передаче обучения или при тонкой настройке глубоких сетей для определенных областей знаний или пользовательских образов.
Theano TensorFlow MXNET
Lasagne — высокоуровневая платформа на основе Theano. В Lasagne очень просто использовать заранее обученные модели Caffe Нет поддержки заранее обученных моделей В MXNET предусмотрен инструмент caffe_converter, предназначенный для преобразования заранее обученных моделей caffe в формат MXNET

Низкоуровневые операторы Tensor


Достаточно эффективная реализация низкоуровневых операторов: их можно использовать в качестве составных компонентов при создании новых моделей, не затрачивая усилия на написание новых операторов.
Theano TensorFlow MXNET
Множество простых операций Вполне хорошо Очень мало

Операторы управления потоком


Операторы управления потоком повышают выразительность и универсальность символьной системы.
Theano TensorFlow MXNET
Поддерживаются В формате эксперимента Не поддерживаются

Высокоуровневая поддержка


Theano TensorFlow MXNET
«Чистый» символьный вычислительный фреймворк. Можно создавать высокоуровневые платформы в соответствии с требованиями. Среди успешных примеров — Keras, Lasagne, blocks Неплохое устройство с точки зрения обучения нейронных сетей, но при этом данный фреймворк не ориентирован исключительно на нейронные сети, что очень хорошо. Можно использовать коллекции графов, очереди и дополнения образов в качестве составных компонентов для высокоуровневых оболочек Помимо символьной части, в MXNET также предусмотрены все необходимые компоненты для классификации образов, от загрузки данных до построения моделей с методами для начала обучения.

Производительность


Измерение производительности Single-GPU


В моих тестах производительность модели LeNet для набора данных MNIST измерена для конфигурации с одним графическим процессором (GPU NVIDIA Quadro K1200).
Theano TensorFlow MXNET
Отлично Средне Превосходно

Память


Объем памяти GPU ограничен, поэтому использование для больших моделей может быть проблематично.
Theano TensorFlow MXNET
Отлично Средне Превосходно

Скорость Single-GPU


Theano очень долго компилирует графы, особенно в сложных моделях. TensorFlow еще немного медленнее.
Theano/MXNET TensorFlow
Сравнимо с CuDNNv4 Примерно вдвое медленнее

Поддержка параллельных и распределенных вычислений


Theano TensorFlow MXNET
Экспериментальная поддержка Multi-GPU Multi-GPU Распределенная

Заключение


Theano (с высокоуровневыми решениями Lasagne и Keras) — это отличный выбор для моделей глубокого обучения. С помощью Lasagne/Keras очень просто создавать новые сети и изменять существующие. Я предпочитаю Python, поэтому выбираю Lasagne/Keras благодаря очень развитому интерфейсу Python. Впрочем, эти решения не поддерживают R. Возможности передачи обучения и тонкой настройки в Lasagne/Keras показывают, что там очень просто модифицировать существующие сети, а также настраивать под предметно-ориентированные пользовательские данные.

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

Если вы увидели неточность перевода, сообщите пожалуйста об этом в личные сообщения.
Поделиться с друзьями
-->

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


  1. Arseny_Info
    25.10.2016 11:51
    +1

    Хочется добавить, что тот же Keras может использовать в качестве бэкенда и Theano, и Tensorflow.


  1. ffriend
    25.10.2016 12:00
    -1

    Непонятно только, почему автор решил назвать эти фреймворки символьными: термин "symbolic AI" имеет совершенно другой смысл и относится скорее к логическому выводу в экспертных системах. Есть подозрение, что вся статья навеяна термином "symbol" в Theano, где он оправдан только наполовину (например, дифференцирование в нём всё-таки автоматическое, а не символьное).


    1. gaploid
      25.10.2016 13:11
      +2

      Возможно понятие «символьные» появилось тут из-за символьных графов — ну или конструкции, которые получаются в ходе разработки на таких фреймворках. К примеру вот — https://1.bp.blogspot.com/-vDKYuCD8Gyg/Vj0B3BEQfXI/AAAAAAAAAyA/9tWmYUOxo0g/s1600/cifar10_2.gif или вот http://deeplearning.net/software/theano/_images/logreg_pydotprint_predict2.png


      1. ffriend
        25.10.2016 13:50

        В том то и дело, что там есть графы, но не символы :) В TensorFlow, например, граф состоит из переменных и операций, в MXNet — из переменых и слоёв, а термин "символ" встречается для обозначения тех же переменных только в Theano :)


        1. gaploid
          25.10.2016 14:12

          Я думаю, что под символьными графами понимают, графы в которых символы могут означать не конкретно цифру/переменную, а операцию или набор операций. Это такой просто уровень абстракции. Вот кажется тут поясняется http://www.sciencedirect.com/science/article/pii/S0747717110001689

          Usually, an attributed graph is considered to be some kind of labelled graph whose labels are
          values of a given data domain. The idea of our approach is to generalize this notion by considering
          that attributed graphs are E-graphs, whose labels are variables, together with a set of conditions or
          formulas that constrain the possible values of these variables. We call these graphs symbolic graphs


          Ну то есть под символом понимается вершина графа, которая может быть мат операцией, трансформацией или просто набором данных.


        1. gaploid
          25.10.2016 14:19

          Вот статья, которая на примере показывает что такое символы в этих фреймворках http://christopher5106.github.io/big/data/2016/03/06/symbolic-computing-and-deep-learning-tutorial-on-theano-and-google-tensorflow.html в тензорфлоу они называются placeholders или тензоры. Короче это все одно и тоже по разному называется:)

          Вот наверное каноническое определение — Wikipedia


          1. ffriend
            25.10.2016 15:59

            Судя по всему, автор статьи как раз и попал в ту терминологическую путаницу, про которую я говорю. Смотрите:


            The second advantage of symbolic computing is the automatic differentiation

            Здесь есть 2 понятия: символьные вычисления и автоматическое дифференцирование.


            Символные вычисления — это очень общее направление в информатике, описывающее вычисления над некоторыми символами. Как вы правильно обратили внимание, выражения, состоящие из переменных и операций могут быть предствлены в виде графа символов. Над этими выражениями можно проводить ряд символьных преобразований (например, упрощать выражения или находить символьные производные), трансформировать в код или план выполнения (как в случае с SQL) или делать логический вывод (как в случае эспертных систем). Графы в Theano и TensorFlow только частично являются символьными, ибо кроме имени символа хранят информацию о типе данных (это важно, см. ниже про символьное дифференцирование).


            Автоматическое дифференцирование (AD) в основном встречается в двух вариантах: forward-mode AD и reverse-mode AD. Forward-mode AD позволяет эффективно вычислять производные функций вида R -> R^n, что в рамках машинного обучения не очень интересно. А вот reverse-mode AD как раз хорошо работает с функциями R^n -> R, т.е. как раз к большинству функций потерь, для которых и требуется вычислить градиент.


            Фишка в том, что reverse-mode AD, вообще говоря, не требует никакого символьного представления. Например, стандартный алгоритм обратного распространения ошибки (backpropagation) — это как раз частный случай reverse-mode AD, но никакого симпольного графа в нём и рядом нет.


            Есть и другое направление — символьное дифференцирование. Чистое символьное дифференцирование, например, используется в Mathematica или SymPy. Пример из последнего:


            >>> diff(cos(x), x)
            -sin(x)

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


            Автоматическое дифференцирование не имеет таких проблем: в нём мы не пытаемся найти единое символьное представление для производной, а только находим её значение в одной конкретной точке, заданной на входе. Это и плюс и минус: с одной стороны, мы можем анализировать голый программный код, с условмиями, циклами, структурами данных и т.д., а с другой, на выходе мы получаем не красивое символьное выражение, а вычислительный граф, работать с которым всё-таки посложней (как минимум, человек не сможет его "прочитать" и вручную закодировать). Кроме того, в reverse-mode AD мы вынуждены сохранять значения промежуточных переменных, а это могут быть тензоры довольно больших размеров.


            Как Theano, так и TensorFlow (про MXNet не знаю) используют reverse-mode AD. Имена переменных (т.е. собственно "символы") при построении графа в них являются опциональными и могут польностью игнорироваться пользователем (сравните это с тем же SymPy или с логическими движками типа Prolog, где пользователя как раз и интересует конкретный символьных результат). Соответсвенно, слово "символьный" в названии, насколько я понимаю, не несёт никакой смысловой нагрузки и "символьное глубокое обучение" ничем не отличается от обычного :)


            (а началось всё с того, что я понадеялся увидеть совмещение современных глубоких сетей и старого доброго символьного AI :))


  1. KvanTTT
    25.10.2016 13:01
    +1

    Статья о глубоком обучении в блоге Microsoft, а упоминаний о CNTK почему-то нет. Странно.


  1. myrov_vlad
    25.10.2016 14:23
    +1

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


    1. alex_justes
      25.10.2016 14:31

      И не просто величины, а ещё методология тестирования и графики.


  1. aphex34
    25.10.2016 14:28
    +1

    Не соглашусь с утверждением об отсутствии поддержки пред-обученных моделей в tensorflow. Есть даже полный аналог ModelZoo, найти его можно в официальном репозитории. Другое дело, что обученные модели на tensorflow в открытом доступе можно встретить нечасто.