Представляем вам перевод серии статей посвященных глубокому обучению. В первой части описан выбор фреймворка с отрытым кодом для символьного глубокого обучения, между 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). Из-за этого будет сложно не только модифицировать существующие сети обучения, но и настраивать под предметно-ориентированные пользовательские данные.
Если вы увидели неточность перевода, сообщите пожалуйста об этом в личные сообщения.
Автор: Microsoft