О технических средствах
для реализации методов 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 предполагает
наличие достаточно большого объёма данных для обучения.
Приведём примеры наборов данных для обучения глубоких сетей.
- набор для с изображениями цифр MNIST содержит 70000 примеров и занимает 53MB
(http://yann.lecun.com/exdb/mnist/),
- набор картинок CIFAR-10 содержит 60000 примеров и занимает 163MB
(http://www.cs.utoronto.ca/~kriz/cifar.html),
- набор изображений PASCAL-2011 содержит 11530 примеров и занимает 2GB
(http://host.robots.ox.ac.uk/pascal/VOC/)
- набор изображений ILSVRC-2015: CLS-LOC содержит 100 тыс примеров и занимает 155GB
(http://image-net.org/challenges/LSVRC/2015/)
Кроме этого, сами глубокие нейронные сети могут иметь сложную архитектуру
[
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-пакеты для расчётов и анализа данных.
- NumPy (http://www.numpy.org) - библиотека реализующая операции с многомерными масивами и методы линейной алгебры.
Приведём простой пример использования NumPy (Листинг 1).
import numpy as np # подгружаем модуль numpy
# генерируем матрицы 8х3 из случайных чисел на отрезке от 0 до 1
A = np.random.rand(8,3)
B = np.random.rand(8,3)
C = A.T.dot( B ) # транспонируем матрицу A и умножаем на матрицу B
# система линейных уравнений
a = np.array([[1.0, 2.0], [3.0, 4.0]])
y = np.array([[5.], [7.]])
s = np.linalg.solve(a, y) # решение
Листинг 1: пример использования NumPy
Полный текст можно скачать [здесь].
- Matplotlib (http://matplotlib.org) - пакет для построения различных графиков и диаграмм.
Приведём пример использования Matplotlib (Листинг 2),
результат представлен на рис.3.
import matplotlib.pyplot as plt # подгружаем модуль matplotlib
X = np.linspace(0, np.pi*2.0,1000) # набор из 1000 точек на отрезке от 0 до 2Пи
Y = np.sin(X**2) - X # задаём функцию для построения графика
plt.plot(X, Y, '-', linewidth=2) # рисуем график
plt.savefig('result/plot1.png', dpi=100) # сохраняем результат
Листинг 2: пример использования Matplotlib
Полный текст можно скачать [здесь].
Рис.3: результат использования Matplotlib
Параметры по умолчанию для Matplotlib можно задать в конфигурационном файле
~/.config/matplotlib/matplotlibrc.
Например, для использования библиотеки в пакетном режиме (без запуска GUI) необходимо записать
в matplotlibrc строку "backend : Agg", иначе в процессе выполнения программы могут возникать ошибки.
- Pandas (http://pandas.pydata.org) - библиотека для обработки данных в таблицах, обладает функциональностью SQL,
выполняет чтение из различных форматов, условную выборку данных, обработку пропусков в данных и др.
Приведём пример использования Pandas (Листинг 3).
import pandas as pd # подгружаем модуль pandas
df = pd.read_csv('data/tips_cor.csv') # загружаем данные
res = df[ (df['time'] != 'Dinner') & (df['tip'] > 5.00) ] # выборка (sql select)
res = df.isnull().sum() # количество NaN (пропуски данных) ячеек для каждого столбца
res = df.dropna(how='all') # удалить пустые строки (которые содержат только NaN)
res = df.fillna(method='ffill') # заменить ячейки с NaN значением из предыдущей строки
Листинг 3: пример использования Pandas
Полный текст можно скачать [здесь].
- Scikit-Learn (http://scikit-learn.org) - большая библиотека "классических" методов машинного обучения,
содержит реализации методов кластеризации, классификации и др.
Приведём пример решения задачи регрессии [10] с помощью Scikit-Learn (Листинг 4),
результат представлен на рис.4.
from sklearn.linear_model import LinearRegression
regr = LinearRegression() # регрессия
regr = regr.fit(X, y) # строим линейную регрессию
y_lin_fit = regr.predict(X_fit) # результат на тестовом наборе
Листинг 4: пример использования Scikit-Learn
Полный текст можно скачать [здесь].
Рис.4: регрессия с помощью Scikit-Learn
Все упомянутые в этом разделе пакеты и сама реализация языка 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 может выполнять аналитическое дифференцирование и оптимизацию описанных пользователем функций.
Это сильно упрощает реализацию градиентных методов оптимизации [2],
которые широко используются для решения задач машинного обучения.
-
Theano позволяет компилировать и выполнять заданные пользователем функций в машинный код для CPU и/или GPU.
Это позволяет существенно повысить скорость выполнения программ.
Ниже приведём пример реализации с помощью 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).
В одной статье трудно охватить все возможные инструменты,
и хотя список рассмотренных пакетов не является полным, но пожалуй самым часто используемым.
Caffe | Keras |
Theano, TensorFlow |
cuBLAS, cuDNN, CNMeM, NCCL |
CUDA |
NVIDIA GPU |
Рис.8: схема стека технологий Deep Learning
на аппаратуре NVIDIA, включая прикладное ПО
Список литературы
- Е.С.Борисов Основные модели и методы теории искусственных нейронных сетей.
-- http://mechanoid.kiev.ua/neural-net-base.html
- Е.С.Борисов О методах обучения многослойных нейронных сетей прямого распространения.
-- http://mechanoid.kiev.ua/neural-net-backprop.html
- Павел Нестеров Предобучение нейронной сети с использованием ограниченной машины Больцмана.
-- https://habrahabr.ru/post/163819/
- 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
- Deep Learning -- http://deeplearning.net
- Е.С.Борисов Классификатор изображений на основе свёрточной сети.
-- http://mechanoid.kiev.ua/ml-lenet.html
- Е.С.Борисов Методы обучения нейронных сетей с большим количеством скрытых слоёв.
-- http://mechanoid.kiev.ua/neural-net-mlp-Deep.html
- Е.С.Борисов Технология параллельного программирования CUDA.
-- http://mechanoid.kiev.ua/parallel-cuda.html
- Е.С.Борисов Технология параллельного программирования OpenCL.
-- http://mechanoid.kiev.ua/parallel-opencl.html
- Е.С.Борисов Модели математической регрессии.
-- http://mechanoid.kiev.ua/ml-regression.html
- Е.С.Борисов Классификатор на основе логистической регрессии.
-- http://mechanoid.kiev.ua/ml-regression-class.html
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.