Цикл статей «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)
ffriend
25.10.2016 12:00-1Непонятно только, почему автор решил назвать эти фреймворки символьными: термин "symbolic AI" имеет совершенно другой смысл и относится скорее к логическому выводу в экспертных системах. Есть подозрение, что вся статья навеяна термином "symbol" в Theano, где он оправдан только наполовину (например, дифференцирование в нём всё-таки автоматическое, а не символьное).
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
ffriend
25.10.2016 13:50В том то и дело, что там есть графы, но не символы :) В TensorFlow, например, граф состоит из переменных и операций, в MXNet — из переменых и слоёв, а термин "символ" встречается для обозначения тех же переменных только в Theano :)
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
Ну то есть под символом понимается вершина графа, которая может быть мат операцией, трансформацией или просто набором данных.
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 или тензоры. Короче это все одно и тоже по разному называется:)
Вот наверное каноническое определение — Wikipediaffriend
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 :))
KvanTTT
25.10.2016 13:01+1Статья о глубоком обучении в блоге Microsoft, а упоминаний о CNTK почему-то нет. Странно.
myrov_vlad
25.10.2016 14:23+1Будет отлично если вместо категориальной оценки будут численные величины, которые информативнее. Насколько «превосходно» лучше «средне» в той же производительности? Лично мне непонятно.
aphex34
25.10.2016 14:28+1Не соглашусь с утверждением об отсутствии поддержки пред-обученных моделей в tensorflow. Есть даже полный аналог ModelZoo, найти его можно в официальном репозитории. Другое дело, что обученные модели на tensorflow в открытом доступе можно встретить нечасто.
Arseny_Info
Хочется добавить, что тот же Keras может использовать в качестве бэкенда и Theano, и Tensorflow.