SlideShare a Scribd company logo
Machine learning
с использованием
нейронных сетей
Дмитрий Лапин
Data science meetup #1
CVisionLab © март 2017
Фреймворки
Фреймворк Интерфейс Платформа Автор(ы)
Caffe Cmdline, C++, Python Lin / Win / OS X / Mobile Berkley Vision and Learning Center
Theano Python Lin / Win / OS X Université de Montréal
Tensorflow C++, Python Lin / Win / OS X / Mobile Google
Keras Python Lin / Win / OS X François Chollet
Torch Lua Lin / Win / OS X / Mobile Ronan Collobert et al.
CNTK C++, Python Lin / Win Microsoft
MxNet C++, Python, Go, R, Matlab,
Julia…
Lin / Win / OS X / Mobile Deep Machine Learning Community
Chainer Python Lin / OS X Preferred Networks, Inc
Caffe
● Один из первых фреймворков
● Очень популярный, значительная часть исследователей использует
Caffe
● Основной интерфейс — интерфейс командной строки, но есть Python
и C++ интерфейсы.
● “Высокоуровневый” фреймворк — оперирует отдельными слоями
● Плохо документирован, многие слои есть в отдельных форках, часть
слоев не документирована
● Большой репозиторий обученных моделей:
https://github.com/BVLC/caffe/wiki/Model-Zoo
Caffe
● Сложно добавлять новый функционал:
○ Нужно написать код для расчета градиентов
○ Нужно пересобирать всю библиотеку
● С++ библиотека упрощает использование в проектах, но:
○ Проблемы при сборке под мобильные платформы
○ Проблемы при несовпадении версий Protobuf
○ Вызывает abort() при ошибках (например, если не найден файл)
Theano
● Низкоуровневый фреймворк — оперирует отдельными операциями,
понятие слоя как таковое не существует
● При использовании создается символьный граф:
○ Есть отдельный этап оптимизации и компиляции графа
(создается код на C / C++ / Cuda)
○ Компиляция занимает заметное количество времени и требует
наличия компиляторов во время работы
○ Более точный расчет градиентов за счет дифференцирования
аналитических выражений (большинство использует правило
дифференцирования сложной функции — chain rule и считает
градиенты численно)
Theano
# Our data vector
X = T.matrix('X') # matrix of doubles
# Shared variables with initial values. We need to
learn these.
W1 = theano.shared(np.random.randn(nn_input_dim,
nn_hdim), name='W1')
b1 = theano.shared(np.zeros(nn_hdim), name='b1')
W2 = theano.shared(np.random.randn(nn_hdim,
nn_output_dim), name='W2')
b2 = theano.shared(np.zeros(nn_output_dim),
name='b2')
# Note: We are just defining the expressions, nothing
is evaluated here!
z1 = X.dot(W1) + b1
a1 = T.tanh(z1)
z2 = a1.dot(W2) + b2
y_hat = T.nnet.softmax(z2) # output probabilities
Image & code:
http://www.wildml.com/2015/09/speeding-up-your-ne
ural-network-with-theano-and-the-gpu/
Theano
● Редко используется “напрямую”, обычно используется некоторая
более высокоуровневая обертка, например Lasagne или Keras, а
отдельные операции (недоступные в обертках) реализуются
самостоятельно
● В большинстве случаев не требуется явно определять расчет
градиентов для собственных операций (слоев)
● Нет собственного репозитория с моделями, но можно использовать
модели созданные фреймворками на основе Theano
Tensorflow
● Стал публичным сравнительно недавно, до этого несколько лет
развивался как закрытый проект Google Brain
● Активно развивается и обретает популярность
● Содержит как низкоуровневые операции, так и высокоуровненые
операции (и / или обертки)
● Как и theano создает вычислительный граф и в этом смысле довольно
похож — если есть опыт работы с theano то использование tensorflow
не доставляет особых проблем
● В отличие от theano, не выполняет компиляцию графа перед
выполнением, все операции компилируются при сборке tensorflow. В
итоге время на загрузку графа (модели) заметно меньше.
Tensorflow
● Как и в theano, понятие “слоя” фактически не существует
● Хорошо документирован, есть туториалы по использованию, в т.ч. для
тех кто раньше не сталкивался с нейронными сетями, например:
https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0
● Использует собственную систему сборки (Bazel), что не всегда
удобно. Как workaround предлагается использовать альтернативные
системы сборки (CMake, Makefile)
● Основной API — Python, есть C++ API позволяющий выполнять
сохраненный граф (модель)
● Простые средства визуализации и отладки (tensorboard)
● Много пред-обученных моделей, в т.ч. официальный репозиторий:
https://github.com/tensorflow/models
Keras
● Достаточно популярный фреймворк
● Изначально был высокоуровневой оберткой вокруг theano
● Оперирует слоями, но и гораздо менее гибкий чем theano — есть ряд
ограничений выйти за которые довольно сложно
● Поддерживает tensorflow или theano в качестве backend-а
○ Модель созданная с одним backend-ом может быть загружена с
другим
○ Переключение между backend-ами может быть неэффективным
из-за различного внутреннего представления данных в разных
backend-ах
Keras
● Технически позволяет добраться до внутренних объектов
используемого backend-а, чтобы реализовать свой функционал, но
при этом нужно учитывать что backend-ы могут быть разными
● Использует не все возможности tensorflow, поэтому модель может
быть менее эффективной чем модель реализованная на tensorflow
● Хорошая документация
● Нет репозитория с пред-обученными моделями, но есть примеры с
исходным кодом (необходимо обучать):
https://github.com/fchollet/keras/tree/master/examples
Torch
● Основной язык — Lua
● Заявлена поддержка мобильных и встраиваемых платформ (с
использованием LuaJIT)
● Высокоуровневый фреймворк, оперирует слоями
● Довольно развитое сообщество, с большой вероятностью можно
найти решение своей проблемы
CNTK
● Многообещающий фреймворк от Microsoft
● С++ и Python API
● Заявлена высокая производительность,
особенно при распределенных
вычислениях (специальный алгоритм
градиентного спуска)*
● Активно развивается
● Ограниченная поддержка других
платформ
● Относительно недавно лицензия не
позволяла использование в коммерческих
целях*
MxNet
● С++ backend (как в TF), биндинги для нескольких языков: Python, R,
Scala, Julia, Matlab and Javascript
● Заявлена поддержка мобильных и встраиваемых платформ
● Заявлена оптимизация для x86-64, ARMv7, ARM64
● Менее популярный, но встречаются проекты выполненные с его
использованием
● Смешанные символьные / императивные вычисления
● Хорошая масштабируемость*:
http://en.community.dell.com/techcenter/high-performance-computing/b/ge
neral_hpc/archive/2016/11/11/deep-learning-performance-with-p100-gpus
Chainer
● Основное отличие — динамические
графы. Граф может меняться в процессе и
при этом фреймворк поддерживает расчет
градиентов
● Язык — Python
● Довольно гибкий, в то же время довольно
сложные архитектуры могут быть описаны
небольшим кодом, например ResNet-50:
○ 2320 строк в Caffe (prototxt)
○ 100 строк кода Chainer
Сравнение от авторов Chainer
Альтернативное сравнение:
https://github.com/soumith/conv
net-benchmarks
Design decisions
Caffe Theano Tensorflow Torch CNTK MxNet Chainer
Определение
сети
Вн. файл
(protobuf)
Python Python Lua Python,
C++
Python, R,
Matlab, …
Python
Градиенты,
обновление
Внешние Часть
графа
Часть графа Внешние Внешние Внешние Внешние
Параметры Скрытые Явные Явные Скрытые Явные Явные Явные
Создание графа Статич. Статич. Статич. Статич. Статич. Статич. Динамич.
Оптимизация
графа
✘ ✔ ✔ ✘ ? ✘ ✘
Параллелизм Shared* Shared* Distributed Shared* Distributed Distributed Shared*
Основано на материалах AAAI 2017
Другие фреймворки
Рассмотрены далеко не все фреймворки, есть много других.
Вот еще несколько:
● Intel Nervana Neon — оптимизированный фреймворк, показывает
очень хорошую производительность
● Apple BNNS (Basic Neural Network Subroutins) — не совсем
фреймворк, скорее набор функций, оптимизированных для платформ
Apple
● nVidia DIGITS — фреймворк, позволяющий решать довольно
ограниченный круг задач, зато очень простой в использовании. Всё, от
определения архитектуры до использование обученной сети
выполняется из браузера.
Внедрение
Внедрение
Не всегда фреймворк который использовался для обучения и фреймворк
который будет использоваться в production это один и тот же фреймворк.
В большинстве случаев модель можно сконвертировать в формат
целевого фреймворка, при этом могут возникнуть следующие проблемы*:
● Различный формат хранения обрабатываемых данных, например:
(h×w×c) vs (c×h×w)
● Различный формат хранения параметров (например, часто свертки
реализованы как кросс-корреляции)
● Различный набор параметров у одинаковых операций (например,
различные параметры padding у сверток)
● Различный набор операций: может возникнуть необходимость
заменить одну операцию на несколько
Внедрение
Часто при внедрении нужна максимальная производительность, особенно,
если внедрение на мобильную или встраиваемую платформу
● Оптимизация графа
○ После завершения обучения коэффициенты становятся
константами и некоторые операции можно объединить
○ Для уменьшения времени загрузки из графа можно удалить узлы,
которые не нужны для предсказания
○ Для некоторых задач (и целевых платформ) есть смысл
выполнить квантизацию — заменить коэффициенты на их 8-и
битное представление (и выполнять операции в целых числах)
С чего начать?
Используйте обученные модели
● Для многих задач есть готовые модели обученные на огромных
коллекциях данных в течение длительного времени на многих GPU.
● Если задача полностью совпадает с уже решенной или является ее
подмножеством, например, задача классификации изображений:
○ Есть множество архитектур, выбирать нужно исходя из
соотношения качества классификации и требования к ресурсам
○ Даже если сеть обучена классифицировать на большее
количество классов чем нужно для решения задачи нет смысла
обучать заново — накладные расходы, обычно, несущественны
● Другие задачи для которых с большой вероятностью можно найти
готовые сети: детекция, сегментация
До-обучение (fine-tuning)
Если нужно почти то же самое, но другое.
Например, если нужно классифицировать различные виды цветов*:
● В сверточных сетях первые (сверточные) слои выделяют признаки.
Сети обученные на больших коллекциях выделяют хорошие
универсальные признаки
● В таком случае достаточно заново обучить последний —
классификационный слой. Это значительно проще и быстрей.
Хороший (и простой) пример как это делают:
https://codelabs.developers.google.com/codelabs/tensorflow-for-poets
● Это не работает если изображения имеют другой характер (другие
признаки), например, если сеть обучена на фотографиях а должна
работать на карандашных рисунках
Обучение “с нуля”
Типичная причина — не нашлось готовых сетей решающих такую же или
похожую задачу.
Перед тем как продолжить сто́ит попытаться найти еще раз.
Если найти всё-таки не удается, то скорее всего придется погрузиться в
детали того, как работают нейронные сети и как их обучают. Хороший
вводный курс можно найти здесь: http://cs231n.github.io
Неплохой обзор архитектур:
http://www.asimovinstitute.org/neural-network-zoo/
Курс на Coursera: https://www.coursera.org/learn/neural-networks
Спасибо!
Дмитрий Лапин
lapin@cvisionlab.com

More Related Content

PDF
Теория языков программирования некоторые слайды к лекциям
PPTX
Евгений Зуев, С++ в России: Стандарт языка и его реализация
PDF
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
PDF
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
PPTX
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
PPTX
20090720 hpc exercise1
PDF
Лекция 6. Стандарт OpenMP
PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Теория языков программирования некоторые слайды к лекциям
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
20090720 hpc exercise1
Лекция 6. Стандарт OpenMP
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript

What's hot (20)

PDF
Векторизация кода (семинар 1)
PDF
Разница в подходах анализа кода компилятором и выделенным инструментом
PDF
Лекция 4. Производные типы данных в стандарте MPI
PPTX
PVS-Studio, решение для разработки современных ресурсоемких приложений
PPTX
C++ Core Guidelines
PPTX
FreeRTOS
PDF
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
PDF
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
PDF
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PPTX
Modern neural net architectures - Year 2019 version
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
PDF
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
PDF
Лекция 6. Стандарт OpenMP
PDF
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PPTX
Александр Фокин, Рефлексия в C++
PPT
инструменты параллельного программирования
PDF
C++ STL & Qt. Занятие 09.
PDF
Статический анализ: ошибки в медиаплеере и безглючная аська
Векторизация кода (семинар 1)
Разница в подходах анализа кода компилятором и выделенным инструментом
Лекция 4. Производные типы данных в стандарте MPI
PVS-Studio, решение для разработки современных ресурсоемких приложений
C++ Core Guidelines
FreeRTOS
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Modern neural net architectures - Year 2019 version
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Лекция 6. Стандарт OpenMP
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Александр Фокин, Рефлексия в C++
инструменты параллельного программирования
C++ STL & Qt. Занятие 09.
Статический анализ: ошибки в медиаплеере и безглючная аська
Ad

Viewers also liked (20)

PDF
Data scientology starter pack, Сергей Казаков
PDF
Machine learning на примере алгоритма ценообразования, Овсеп Авакян
PDF
Изоморфизм как предметное поле data science, Артем Москалец
PDF
К.В.Воронцов "Статистические (байесовские) методы классификации"
PDF
Особенности тестирования мобильных приложений
PDF
L5: Л5 Байесовские алгоритмы
PDF
Когда тексты —не только слова
PDF
Наивный байесовский классификатор. Дерево решений. Случайный лес.
PDF
Лекция №5 "Обработка текстов, Naive Bayes"
PDF
Организация тестирования в Inostudio
PPS
Presença virtual
DOCX
Aptitud y Actitud
DOCX
Trabajos tercera parcial
PPTX
Pre-Collegiate - Rising Seniors, Day 1
PDF
Про git чуть больше, чем нужно
DOCX
Trabajos tercera parcial de deontologia
PPTX
MPA November 3, 2015
PPT
тригон. функції
PPTX
Deontologia procedimiento diapositivas
DOCX
Windows power management basic knowledge
Data scientology starter pack, Сергей Казаков
Machine learning на примере алгоритма ценообразования, Овсеп Авакян
Изоморфизм как предметное поле data science, Артем Москалец
К.В.Воронцов "Статистические (байесовские) методы классификации"
Особенности тестирования мобильных приложений
L5: Л5 Байесовские алгоритмы
Когда тексты —не только слова
Наивный байесовский классификатор. Дерево решений. Случайный лес.
Лекция №5 "Обработка текстов, Naive Bayes"
Организация тестирования в Inostudio
Presença virtual
Aptitud y Actitud
Trabajos tercera parcial
Pre-Collegiate - Rising Seniors, Day 1
Про git чуть больше, чем нужно
Trabajos tercera parcial de deontologia
MPA November 3, 2015
тригон. функції
Deontologia procedimiento diapositivas
Windows power management basic knowledge
Ad

Similar to Machine learning c использованием нейронных сетей, Дмитрий Лапин (20)

PDF
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
PDF
Введение в архитектуры нейронных сетей / HighLoad++ 2016
PPT
Deep convolution networks with caffe
PDF
Сверточные нейронные сети
PPTX
ML on the Edge - Highload++ Siberia 2019
PDF
Python + GPGPU
PPT
CUDA & CAFFE
PDF
Ml and its bright future
PDF
Mihail Zachepilo - WebAssembly powered Machine Learning
PDF
Mihail Zachepilo - WebAssembly powered Machine Learning
PDF
Data Science Weekend 2017. 1С-Битрикс. Чатбот для подсказки ответов на вопросы
PPTX
Deep Learning Course Introduction
PDF
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
PPTX
Машинное обучение в электронной коммерции — практика использования и подводны...
PPTX
Опыт моделеварения от команды ComputerVision Mail.ru
PDF
Введение в Deep Learning
PPTX
Deep Learning and Convolutional Networks
PPTX
Introduction to Deep Learning
PPT
Пути увеличения эффективности реализации алгоритмов машинного обучения
PPTX
Нейронные сети: быстрый инференс на GPU с помощью TensorRT (демо) / Дмитрий К...
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
Введение в архитектуры нейронных сетей / HighLoad++ 2016
Deep convolution networks with caffe
Сверточные нейронные сети
ML on the Edge - Highload++ Siberia 2019
Python + GPGPU
CUDA & CAFFE
Ml and its bright future
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
Data Science Weekend 2017. 1С-Битрикс. Чатбот для подсказки ответов на вопросы
Deep Learning Course Introduction
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
Машинное обучение в электронной коммерции — практика использования и подводны...
Опыт моделеварения от команды ComputerVision Mail.ru
Введение в Deep Learning
Deep Learning and Convolutional Networks
Introduction to Deep Learning
Пути увеличения эффективности реализации алгоритмов машинного обучения
Нейронные сети: быстрый инференс на GPU с помощью TensorRT (демо) / Дмитрий К...

More from IT61 (20)

PDF
Александр Шорин - Как перестать гоняться за кандидатом и начать жить?
PDF
Нина Марменкова - Найти себя и нАЙТИ своих
PDF
Павел Седаков - Performance review: теория и практика оценки эффективности ра...
PPTX
Дмитрий Костюк - Необходимые инструменты и качества для роста менеджера
PPTX
Константин Гуфан - Чем должны заниматься менеджеры и чем они на самом деле за...
PDF
Ольга Стратанович - Менеджер будущего
PDF
Константин Гуфан - Сколько лет живет любовь к работе?
PDF
Нагрузочное тестирование API. Как летать, а не ползать?
PPTX
Calabash. Автоматизированное тестирование мобильных приложений
PDF
Параллельное управление, Елена Сибилева (Жмек дизайн)
PDF
Эффективный отдел техподдержки сайтов без вашего участия, Максим Мул (Рабочие...
PDF
Тренды в процессах разработки, Константин Иванов (TradingView)
PDF
Амина Прима - Ой, все! Я ухожу
PDF
Как перестать беспокоиться и начать тестировать или это волшебное слово Agile
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PDF
Стратегия тестирования - больше чем просто план
PPT
Основы Symfony и отличия Sf 3.x от Sf 2.x
PDF
Тенденции развития DDoS-атак: к чему нужно быть готовым
PDF
Отдаем страницы быстрее или как вписаться в требования Google
PDF
Автоматизированное тестирование UI в мобильных OC
Александр Шорин - Как перестать гоняться за кандидатом и начать жить?
Нина Марменкова - Найти себя и нАЙТИ своих
Павел Седаков - Performance review: теория и практика оценки эффективности ра...
Дмитрий Костюк - Необходимые инструменты и качества для роста менеджера
Константин Гуфан - Чем должны заниматься менеджеры и чем они на самом деле за...
Ольга Стратанович - Менеджер будущего
Константин Гуфан - Сколько лет живет любовь к работе?
Нагрузочное тестирование API. Как летать, а не ползать?
Calabash. Автоматизированное тестирование мобильных приложений
Параллельное управление, Елена Сибилева (Жмек дизайн)
Эффективный отдел техподдержки сайтов без вашего участия, Максим Мул (Рабочие...
Тренды в процессах разработки, Константин Иванов (TradingView)
Амина Прима - Ой, все! Я ухожу
Как перестать беспокоиться и начать тестировать или это волшебное слово Agile
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Стратегия тестирования - больше чем просто план
Основы Symfony и отличия Sf 3.x от Sf 2.x
Тенденции развития DDoS-атак: к чему нужно быть готовым
Отдаем страницы быстрее или как вписаться в требования Google
Автоматизированное тестирование UI в мобильных OC

Machine learning c использованием нейронных сетей, Дмитрий Лапин

  • 1. Machine learning с использованием нейронных сетей Дмитрий Лапин Data science meetup #1 CVisionLab © март 2017
  • 2. Фреймворки Фреймворк Интерфейс Платформа Автор(ы) Caffe Cmdline, C++, Python Lin / Win / OS X / Mobile Berkley Vision and Learning Center Theano Python Lin / Win / OS X Université de Montréal Tensorflow C++, Python Lin / Win / OS X / Mobile Google Keras Python Lin / Win / OS X François Chollet Torch Lua Lin / Win / OS X / Mobile Ronan Collobert et al. CNTK C++, Python Lin / Win Microsoft MxNet C++, Python, Go, R, Matlab, Julia… Lin / Win / OS X / Mobile Deep Machine Learning Community Chainer Python Lin / OS X Preferred Networks, Inc
  • 3. Caffe ● Один из первых фреймворков ● Очень популярный, значительная часть исследователей использует Caffe ● Основной интерфейс — интерфейс командной строки, но есть Python и C++ интерфейсы. ● “Высокоуровневый” фреймворк — оперирует отдельными слоями ● Плохо документирован, многие слои есть в отдельных форках, часть слоев не документирована ● Большой репозиторий обученных моделей: https://github.com/BVLC/caffe/wiki/Model-Zoo
  • 4. Caffe ● Сложно добавлять новый функционал: ○ Нужно написать код для расчета градиентов ○ Нужно пересобирать всю библиотеку ● С++ библиотека упрощает использование в проектах, но: ○ Проблемы при сборке под мобильные платформы ○ Проблемы при несовпадении версий Protobuf ○ Вызывает abort() при ошибках (например, если не найден файл)
  • 5. Theano ● Низкоуровневый фреймворк — оперирует отдельными операциями, понятие слоя как таковое не существует ● При использовании создается символьный граф: ○ Есть отдельный этап оптимизации и компиляции графа (создается код на C / C++ / Cuda) ○ Компиляция занимает заметное количество времени и требует наличия компиляторов во время работы ○ Более точный расчет градиентов за счет дифференцирования аналитических выражений (большинство использует правило дифференцирования сложной функции — chain rule и считает градиенты численно)
  • 6. Theano # Our data vector X = T.matrix('X') # matrix of doubles # Shared variables with initial values. We need to learn these. W1 = theano.shared(np.random.randn(nn_input_dim, nn_hdim), name='W1') b1 = theano.shared(np.zeros(nn_hdim), name='b1') W2 = theano.shared(np.random.randn(nn_hdim, nn_output_dim), name='W2') b2 = theano.shared(np.zeros(nn_output_dim), name='b2') # Note: We are just defining the expressions, nothing is evaluated here! z1 = X.dot(W1) + b1 a1 = T.tanh(z1) z2 = a1.dot(W2) + b2 y_hat = T.nnet.softmax(z2) # output probabilities Image & code: http://www.wildml.com/2015/09/speeding-up-your-ne ural-network-with-theano-and-the-gpu/
  • 7. Theano ● Редко используется “напрямую”, обычно используется некоторая более высокоуровневая обертка, например Lasagne или Keras, а отдельные операции (недоступные в обертках) реализуются самостоятельно ● В большинстве случаев не требуется явно определять расчет градиентов для собственных операций (слоев) ● Нет собственного репозитория с моделями, но можно использовать модели созданные фреймворками на основе Theano
  • 8. Tensorflow ● Стал публичным сравнительно недавно, до этого несколько лет развивался как закрытый проект Google Brain ● Активно развивается и обретает популярность ● Содержит как низкоуровневые операции, так и высокоуровненые операции (и / или обертки) ● Как и theano создает вычислительный граф и в этом смысле довольно похож — если есть опыт работы с theano то использование tensorflow не доставляет особых проблем ● В отличие от theano, не выполняет компиляцию графа перед выполнением, все операции компилируются при сборке tensorflow. В итоге время на загрузку графа (модели) заметно меньше.
  • 9. Tensorflow ● Как и в theano, понятие “слоя” фактически не существует ● Хорошо документирован, есть туториалы по использованию, в т.ч. для тех кто раньше не сталкивался с нейронными сетями, например: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0 ● Использует собственную систему сборки (Bazel), что не всегда удобно. Как workaround предлагается использовать альтернативные системы сборки (CMake, Makefile) ● Основной API — Python, есть C++ API позволяющий выполнять сохраненный граф (модель) ● Простые средства визуализации и отладки (tensorboard) ● Много пред-обученных моделей, в т.ч. официальный репозиторий: https://github.com/tensorflow/models
  • 10. Keras ● Достаточно популярный фреймворк ● Изначально был высокоуровневой оберткой вокруг theano ● Оперирует слоями, но и гораздо менее гибкий чем theano — есть ряд ограничений выйти за которые довольно сложно ● Поддерживает tensorflow или theano в качестве backend-а ○ Модель созданная с одним backend-ом может быть загружена с другим ○ Переключение между backend-ами может быть неэффективным из-за различного внутреннего представления данных в разных backend-ах
  • 11. Keras ● Технически позволяет добраться до внутренних объектов используемого backend-а, чтобы реализовать свой функционал, но при этом нужно учитывать что backend-ы могут быть разными ● Использует не все возможности tensorflow, поэтому модель может быть менее эффективной чем модель реализованная на tensorflow ● Хорошая документация ● Нет репозитория с пред-обученными моделями, но есть примеры с исходным кодом (необходимо обучать): https://github.com/fchollet/keras/tree/master/examples
  • 12. Torch ● Основной язык — Lua ● Заявлена поддержка мобильных и встраиваемых платформ (с использованием LuaJIT) ● Высокоуровневый фреймворк, оперирует слоями ● Довольно развитое сообщество, с большой вероятностью можно найти решение своей проблемы
  • 13. CNTK ● Многообещающий фреймворк от Microsoft ● С++ и Python API ● Заявлена высокая производительность, особенно при распределенных вычислениях (специальный алгоритм градиентного спуска)* ● Активно развивается ● Ограниченная поддержка других платформ ● Относительно недавно лицензия не позволяла использование в коммерческих целях*
  • 14. MxNet ● С++ backend (как в TF), биндинги для нескольких языков: Python, R, Scala, Julia, Matlab and Javascript ● Заявлена поддержка мобильных и встраиваемых платформ ● Заявлена оптимизация для x86-64, ARMv7, ARM64 ● Менее популярный, но встречаются проекты выполненные с его использованием ● Смешанные символьные / императивные вычисления ● Хорошая масштабируемость*: http://en.community.dell.com/techcenter/high-performance-computing/b/ge neral_hpc/archive/2016/11/11/deep-learning-performance-with-p100-gpus
  • 15. Chainer ● Основное отличие — динамические графы. Граф может меняться в процессе и при этом фреймворк поддерживает расчет градиентов ● Язык — Python ● Довольно гибкий, в то же время довольно сложные архитектуры могут быть описаны небольшим кодом, например ResNet-50: ○ 2320 строк в Caffe (prototxt) ○ 100 строк кода Chainer Сравнение от авторов Chainer Альтернативное сравнение: https://github.com/soumith/conv net-benchmarks
  • 16. Design decisions Caffe Theano Tensorflow Torch CNTK MxNet Chainer Определение сети Вн. файл (protobuf) Python Python Lua Python, C++ Python, R, Matlab, … Python Градиенты, обновление Внешние Часть графа Часть графа Внешние Внешние Внешние Внешние Параметры Скрытые Явные Явные Скрытые Явные Явные Явные Создание графа Статич. Статич. Статич. Статич. Статич. Статич. Динамич. Оптимизация графа ✘ ✔ ✔ ✘ ? ✘ ✘ Параллелизм Shared* Shared* Distributed Shared* Distributed Distributed Shared* Основано на материалах AAAI 2017
  • 17. Другие фреймворки Рассмотрены далеко не все фреймворки, есть много других. Вот еще несколько: ● Intel Nervana Neon — оптимизированный фреймворк, показывает очень хорошую производительность ● Apple BNNS (Basic Neural Network Subroutins) — не совсем фреймворк, скорее набор функций, оптимизированных для платформ Apple ● nVidia DIGITS — фреймворк, позволяющий решать довольно ограниченный круг задач, зато очень простой в использовании. Всё, от определения архитектуры до использование обученной сети выполняется из браузера.
  • 19. Внедрение Не всегда фреймворк который использовался для обучения и фреймворк который будет использоваться в production это один и тот же фреймворк. В большинстве случаев модель можно сконвертировать в формат целевого фреймворка, при этом могут возникнуть следующие проблемы*: ● Различный формат хранения обрабатываемых данных, например: (h×w×c) vs (c×h×w) ● Различный формат хранения параметров (например, часто свертки реализованы как кросс-корреляции) ● Различный набор параметров у одинаковых операций (например, различные параметры padding у сверток) ● Различный набор операций: может возникнуть необходимость заменить одну операцию на несколько
  • 20. Внедрение Часто при внедрении нужна максимальная производительность, особенно, если внедрение на мобильную или встраиваемую платформу ● Оптимизация графа ○ После завершения обучения коэффициенты становятся константами и некоторые операции можно объединить ○ Для уменьшения времени загрузки из графа можно удалить узлы, которые не нужны для предсказания ○ Для некоторых задач (и целевых платформ) есть смысл выполнить квантизацию — заменить коэффициенты на их 8-и битное представление (и выполнять операции в целых числах)
  • 22. Используйте обученные модели ● Для многих задач есть готовые модели обученные на огромных коллекциях данных в течение длительного времени на многих GPU. ● Если задача полностью совпадает с уже решенной или является ее подмножеством, например, задача классификации изображений: ○ Есть множество архитектур, выбирать нужно исходя из соотношения качества классификации и требования к ресурсам ○ Даже если сеть обучена классифицировать на большее количество классов чем нужно для решения задачи нет смысла обучать заново — накладные расходы, обычно, несущественны ● Другие задачи для которых с большой вероятностью можно найти готовые сети: детекция, сегментация
  • 23. До-обучение (fine-tuning) Если нужно почти то же самое, но другое. Например, если нужно классифицировать различные виды цветов*: ● В сверточных сетях первые (сверточные) слои выделяют признаки. Сети обученные на больших коллекциях выделяют хорошие универсальные признаки ● В таком случае достаточно заново обучить последний — классификационный слой. Это значительно проще и быстрей. Хороший (и простой) пример как это делают: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets ● Это не работает если изображения имеют другой характер (другие признаки), например, если сеть обучена на фотографиях а должна работать на карандашных рисунках
  • 24. Обучение “с нуля” Типичная причина — не нашлось готовых сетей решающих такую же или похожую задачу. Перед тем как продолжить сто́ит попытаться найти еще раз. Если найти всё-таки не удается, то скорее всего придется погрузиться в детали того, как работают нейронные сети и как их обучают. Хороший вводный курс можно найти здесь: http://cs231n.github.io Неплохой обзор архитектур: http://www.asimovinstitute.org/neural-network-zoo/ Курс на Coursera: https://www.coursera.org/learn/neural-networks