на главную ] 

О технических средствах
для реализации методов Deep Learning.

Е.С.Борисов

четверг, 27 октября 2016 г.

В этой статье мы поговорим о методах построения интеллектуальных систем Deep Learning, об аппаратной части и программных инструментах для реализации этих методов.

1. Введение.

Математические модели биологического нейрона появились ещё в середине прошлого века [1]. Потом были первые модели нейронных сетей с одним обрабатывающим слоем, возможности которых были ограничены проблемой линейной неразделимости. Позже появился метод обратного распространения [2] -- способ позволяющий эффективно обучать нейронные сети с одним или двумя скрытыми слоями.

Многослойный перцептрон с тремя обрабатывающими слоями имеет возможность строить в пространстве признаков поверхности практически любой формы. Однако трёхслойный перцептрон уступал по эффективности другим методам машинного обучения. Предполагалось, что его результаты можно улучшить увеличив число слоёв. До недавнего времени не удавалось эффективно обучать нейронные сети с числом скрытых слоёв более двух. Как выяснилось, одной из причин является проблема "исчезающего" градиента (vanishing gradient) [3] -- при вычислении градиента (направления наибольшего роста ошибки сети в пространстве весовых коэффициентов) методом обратного распространения происходит его уменьшение по мере прохождения от выходного слоя сети к входному.

Эту проблему пытались решать разными способами - увеличивать количество циклов обучения, увеличивая размеры учебного набора, сокращая количество связей сети, инициализируя матрицы весов специальным образом и т.п. Наращивание вычислительных возможностей с помощью технологий параллельных вычислений (GPU) давало дополнительные возможности исследователям.

В результате этих усилий в середине 2000-х годов появилась концепция Deep Learning [4](глубокое или глубинное обучение). Deep Learning [5] рассматривает многоуровневые (представленные несколькими слоями) модели интеллектуальных систем, такие как искусственные нейронные сети. Кратко это можно описать следующим образом - много данных через большое количество слоёв с большим количеством нейронов.

В рамках концепции Deep Learning были созданы различные модели искусственных нейронных сетей [6,7].
В этой статье мы не будем разбирать их подробно, но рассмотрим стек технологий, который позволяет удобно и эффективно реализовывать модели Deep Learning. Рассматриваемые технические средства можно представить как многослойную модель, состоящую из программной и аппаратной части (рис.1).

прикладные программные средства
вычислительные библиотеки
программный интерфейс с аппаратурой
аппаратные вычислительные средства
Рис.1: общая схема стека технологий Deep Learning

Начнём обзор с аппаратной части и далее будем подниматься выше по стеку.

2. Основа для вычислений.

Использование Deep Learning предполагает наличие достаточно большого объёма данных для обучения. Приведём примеры наборов данных для обучения глубоких сетей. Кроме этого, сами глубокие нейронные сети могут иметь сложную архитектуру [6,7], которая требует значительных вычислительных ресурсов.

Все эти условия требуют использования систем высокой производительности. Поэтому, для обучения глубоких сетей используют технологии вычислений на GPU (graphics processing units). Этот класс технологий получил название GPGPU (General-Purpose Graphics Processing Units) - использование графического процессора для общего назначения[8,9].

Сегодня несколько производителей предлагают устройства GPGPU и программное обеспечение к ним, основные это NVIDIA, AMD и Intel. При этом для задач Deep Learning обычно используют программно-аппаратные решения на NVIDIA CUDA [8], другие технологии высокопроизводительных вычислений пользуются гораздо меньшей популярностью и программного обеспечения Deep Learning для них написано меньше.

Помимо отдельных устройств с поддержкой CUDA (GeForce, Titan, Quadra, Tesla) и технологии NCCL для распределённого GPU компьютинга, NVIDIA разрабатывает библиотеку cuDNN специально для задач Deep Learning, менеджер мамяти CNMeM, а так же выпускает комплексные решения для задач Deep Learning, такие как серверы NVIDIA DGX и платформу для встраиваемых систем (роботов) NVIDIA Jetson TK.

Программно-аппаратную платформу NVIDIA для задач Deep Learning можно описать следующей схемой (рис.2).

прикладные программные средства
cuBLAS, cuDNN, CNMeM, NCCL
CUDA
NVIDIA GPU
Рис.2: схема стека технологий Deep Learning на аппаратуре NVIDIA

Далее рассмотрим прикладное программное обеспечение для Deep Learning.

3. Прикладное программное обеспечение.

Можно писать реализации моделей Deep Learning самостоятельно, например на C++ используя программно-аппаратную платформу CUDA упомянутую выше. Однако, при отсутствии опыта, эта работа может оказаться долгой и утомительной, а результат - мало эффективным. Удобней использовать специальные программные средства. Существует немало таких пакетов, здесь мы рассмотрим следующий набор: Caffe, Theano, TensorFlow, Keras, а также дополнительные средства обработки данных, которые связанны с этими пакетами.

3.1 Caffe и DIGITS

Caffe (http://caffe.berkeleyvision.org) является системой моделирования свёрточных сетей, она имеет интерфейсы для нескольких популярных языков программирования и может использовать для вычислений GPU. Caffe была разработана Berkeley Vision and Learning Center (http://bvlc.eecs.berkeley.edu), существует так же несколько модифицированных версий этого пакета для разных целей, например nv-caffe (https://github.com/NVIDIA/caffe), все эти пакеты можно свободно скачать с сайта разработчиков.

Для того чтобы построить и обучить сеть с помощью Caffe вообще не обязательно писать программный код, достаточно описать модель в спецификации. Для спецификаций используется язык protobuf (Google Protocol Buffers – http://developers.google.com/protocol-buffers/ ). Пример использования Caffe для моделирования свёрточной сети можно найти в [6].

Вместе с Caffe можно использовать DIGITS - Deep Learning GPU Training System (https://developer.nvidia.com/digits). Этот пакет разрабатывается NVIDIA и предоставляет веб-интерфейс для Caffe.

3.2 Язык Python и его инструменты для обработки данных.

В этом разделе мы поговорим об программных инструментах для реализации методов обработки данных, основанных на языке Python.

Язык высокого уровня Python (https://www.python.org) является универсальным инструментом разработчика, на нём можно писать программы различного назначения - от системы управления контентом вебсайта до научных и инженерных расчётов, требующих высокой производительности. Ниже кратко опишем Python-пакеты для расчётов и анализа данных.

 

Все упомянутые в этом разделе пакеты и сама реализация языка Python являются открытым программным обеспечением, их можно свободно скачать с сайтов разработчиков и/или установить из Python-репозитория с помощью утилиты pip (http://pip.pypa.io).

 

3.3 Theano

В этом разделе мы поговорим о Theano (http://deeplearning.net/software/theano/) - библиотеке языка Python, с помощью которой можно создавать реализации методов Deep Learning.

Theano это пакет языка Python предназначенный для символьных вычислений (symbolic computation). Первые его версии были разработаны Университетом Монреаля (Université de Montréal) и он является свободным програмным обеспечением, каждый желающий может скачать его с сайта разработчиков (https://github.com/theano) или установить из Python-репозитория с помощью утилиты pip.

В отличии численных расчётов, которые работают непосредственно с данными в памяти, символьные вычисления работают с алгебраическими выражениями. Для решения задач машинного обучения у Theano есть несколько очень полезных свойств.

Ниже приведём пример реализации с помощью Theano классификатора на основе логистической регрессии [11], результаты работы этой программы приведены на рис.5.

import theano import theano.tensor as T # определяем символические переменные (Theano symbolic variables) x = T.matrix("x") # вход классификатора y = T.vector("y") # результат rng = np.random # генератор случайных значений # определяем и инициализируем глобальные (общие) переменные # для использования функциями обучения (train) и прогнозирования (predict) w = theano.shared(rng.randn(feats).astype(theano.config.floatX), name="w") # вектор весов b = theano.shared(np.asarray(0., dtype=theano.config.floatX), name="b") # сдвиг # определяем выражения (Theano expression graph) # классификатор, вероятность принадлежности к классу p_1 = 1.0 / (1.0 + T.exp(-T.dot(x, w)-b)) prediction = p_1 > 0.5 # прогнозирование, ответ классификатора xent = -y*T.log(p_1) - (1-y)*T.log(1-p_1) # функция ошибки (cross-entropy) # функция стоимости (с регуляризацией), общая ошибка для всех точек набора cost = xent.mean() + 0.01*(w**2).sum() gw,gb = T.grad(cost, [w,b]) # градиент функции стоимости # компилируем функцию обучения train = theano.function( inputs=[x,y], # вход, учебный набор outputs=cost, # выход, текущее значение функции стоимости # изменение параметров, в соответствии с методом градиентного спуска updates=[(w, w-learn_rate*gw), (b, b-learn_rate*gb)], name = "train")
Листинг 5: пример использования Theano

Полный текст можно скачать [здесь].


Рис.5: логистическая регрессия с помощью Theano

Этот код без изменений может выполняться как на CPU

# THEANO_FLAGS=mode=FAST_RUN,device=сpu,floatX=float32 python main.py

так и с использованием ускорителей GPU.

# THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python main.py

Параметры по умолчанию для Theano можно задать с помощью конфигурационного файла ~/.theanorc.
Например так:

[global] floatX = float32 device = cpu [blas] ldflags = "-L/usr/lib/ -lblas"

Далее мы рассмотрим похожий функциональности на Theano пакет - TensorFlow.

 

3.4 TensorFlow

В этом разделе мы поговорим о TensorFlow (https://www.tensorflow.org) - пакете для языка Python, с помощью которого можно создавать реализации методов Deep Learning.

TensorFlow был разработан в компании Google и является открытым программным обеспечением. Как и Theano, TensorFlow позволяет конструировать математические выражения и потом их обрабатывать аналитически. Такая программа состоит из двух частей - построение математических выражений в виде графа вычислений и выполнение программы, описанной этим графом. Для ускорения вычислений TensorFlow может использовать GPU. Пакет так же содержит TensorBoard - инструмент для визуализации графа вычислений.

Ниже представлен пример (Листинг 6) реализации регрессии [10] с помощью TensorFlow, результаты работы этой программы приведены на рис.6.

# коэффициенты регрессии W = tf.Variable(tf.random_normal([xp.shape[1],1]), name='weight') b = tf.Variable(tf.zeros([1]), name='bias') Y_pred = tf.add(tf.matmul(X, W), b) # линейная регрессия # функция стоимости cost = tf.reduce_sum(tf.pow(Y_pred - Y, 2)) / (n_observations - 1) Learning_rate = 0.001 # скорость обучения # минимизация функции стоимости методом градиентного спуска optimizer = tf.train.GradientDescentOptimizer(Learning_rate).minimize(cost)
Листинг 6: пример использования TensorFlow

Полный текст можно скачать [здесь].


Рис.6: полиномиальная регрессия с помощью TensorFlow

Далее мы рассмотрим пакет Keras, который представляет собой надстройку над TensorFlow и Theano.  

 

3.5 Keras

Первая версия пакета Keras была разработана французским программистом François Chollet (https://www.linkedin.com/in/fchollet), это пакет можно свободно скачать с сайта разработчиков или установить с помощью утилиты pip.

Keras представляет собой инструмент для реализации моделей Deep Leaning и использует Theano или ThensorFlow в качестве основы (backend), которая назначается в конфигурационном файле ~/.keras/keras.json.

Ниже приведём пример (Листинг 7) реализации свёрточной сети, для классификации изображений цифр из набора MNIST (рис.7).

from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Convolution2D, MaxPooling2D model = Sequential() # инициализируем модель # первый свёрточный слой model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='valid', input_shape=input_shape)) model.add(Activation('relu')) # активация свёрточного слоя # второй свёрточный слой model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1])) model.add(Activation('relu')) # активация свёрточного слоя model.add(MaxPooling2D(pool_size=pool_size)) # слой выборки model.add(Dropout(0.25)) # применяем dropout (отключение случайно выбранных нейронов) model.add(Flatten()) # разворачиваем карты в вектор model.add(Dense(128)) # слой MLP model.add(Activation('relu')) # активация слоя MLP model.add(Dropout(0.5)) # применяем dropout (отключение случайно выбранных нейронов model.add(Dense(nb_classes)) # выходной слой model.add(Activation('softmax')) # активация выходного слоя softmax model.summary() # печатаем описание сети # сохраняем описание сети with open("result/model.yaml", 'w') as f: f.write(model.to_yaml()) # компилируем модель model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy']) # запускаем обучение model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, validation_data=(X_valid, Y_valid)) # сохраняем веса model.save_weights("result/weights.h5") # оценка результатов score = model.evaluate(X_test, Y_test, verbose=0)
Листинг 7: код свёрточной сети на Keras

Полный текст программы можно скачать [здесь].


Рис.7: примеры из набора MNIST

Данные MNIST для классификатора можно скачать с сайта http://yann.lecun.com/exdb/mnist/.

Заключение

В этой статье мы рассмотрели набор технологий для реализации интеллектуальных систем, и схему их взаимодействия между собой (рис.8). В одной статье трудно охватить все возможные инструменты, и хотя список рассмотренных пакетов не является полным, но пожалуй самым часто используемым.

CaffeKeras
Theano, TensorFlow
cuBLAS, cuDNN, CNMeM, NCCL
CUDA
NVIDIA GPU
Рис.8: схема стека технологий Deep Learning
на аппаратуре NVIDIA, включая прикладное ПО
 

 

Список литературы

  1. Е.С.Борисов Основные модели и методы теории искусственных нейронных сетей.
    -- http://mechanoid.kiev.ua/neural-net-base.html
  2. Е.С.Борисов О методах обучения многослойных нейронных сетей прямого распространения.
    -- http://mechanoid.kiev.ua/neural-net-backprop.html
  3. Павел Нестеров Предобучение нейронной сети с использованием ограниченной машины Больцмана.
    -- https://habrahabr.ru/post/163819/
  4. G.E.Hinton and R.R.Salakhutdinov Reducing the Dimensionality of Data with Neural Networks. 28 JULY 2006 VOL 313 SCIENCE. -- http://www.cs.toronto.edu/~hinton/science.pdf
  5. Deep Learning -- http://deeplearning.net
  6. Е.С.Борисов Классификатор изображений на основе свёрточной сети.
    -- http://mechanoid.kiev.ua/ml-lenet.html
  7. Е.С.Борисов Методы обучения нейронных сетей с большим количеством скрытых слоёв.
    -- http://mechanoid.kiev.ua/neural-net-mlp-Deep.html
  8. Е.С.Борисов Технология параллельного программирования CUDA.
    -- http://mechanoid.kiev.ua/parallel-cuda.html
  9. Е.С.Борисов Технология параллельного программирования OpenCL.
    -- http://mechanoid.kiev.ua/parallel-opencl.html
  10. Е.С.Борисов Модели математической регрессии.
    -- http://mechanoid.kiev.ua/ml-regression.html
  11. Е.С.Борисов Классификатор на основе логистической регрессии.
    -- http://mechanoid.kiev.ua/ml-regression-class.html
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.