В начале статьи я хотел бы остановиться на определении «глубокого обучения», на том, что эта революция привнесет в традиционные вычисления. Фактически, до этой революции узнать что-нибудь о компьютере было все равно, что писать код. Но для этого требуется явное знание инструкций, которые нужно дать этому коду. Однако эту информацию не всегда легко предоставить по определенным сложным предметам, например, для распознавания содержимого изображения или понимания разговорной речи. Революция в области глубокого обучения заключается в обучении на примерах. Например, показывая алгоритмы изображения с кошкой, а затем с собакой и сигнализируя каждый раз, когда ожидается правильный ответ, компьютер учится распознавать кошек и собак из библиотеки изображений. После определенного количества изображений система начинает обобщать и знает, как распознать животное на фотографиях, которых он никогда не видел.

Прежде чем начать, давайте объясним, в чем разница между глубоким обучением и машинным обучением. Фактически, при машинном обучении в рабочих нагрузках преобладают коммуникационные данные и множество операций ввода-вывода. Тогда сокращение объема общения - это первая забота разработчика. Но глубокое обучение обычно выполняется в гораздо меньшем кластере. Поэтому ему нужно больше вычислительной мощности и меньше памяти. Для ускорения «обучения» глубокого обучения рекомендуется использовать ускорители GPU (графические процессоры). Когда вам нужно сделать выбор между машинным обучением или глубоким обучением, спросите себя, можете ли вы использовать высокопроизводительный графический процессор. и иметь большой объем помеченных данных. Если у вас нет ни одного из этих элементов, вероятно, лучше использовать машинное обучение вместо глубокого обучения.

Сферы применения обширны и разнообразны, мы можем перечислить их в качестве примеров: автоматизированное вождение, аэрокосмическая и оборонная промышленность, медицинские исследования, промышленная автоматизация, электроника ... Хотя первые теории, касающиеся глубокого обучения, относятся к 1980-м годам, это произошло лишь недавно. стал пригодным для эксплуатации. Причины очевидны:

  1. Для глубокого обучения требуется большой набор помеченных данных.
  2. Глубокое обучение требует значительной вычислительной мощности.

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

  1. Обучение с нуля: вам нужно собрать очень большой объем помеченных данных и спроектировать сетевую архитектуру, которая будет изучать функции и модель. Это метод, подходящий для новых приложений или тех, которые позволят получить результаты многих категорий. Этот подход не является широко распространенным, поскольку из-за большого объема данных и скорости обучения обучение сети можно легко распределить на несколько дней или даже недель.
  2. Передаточное обучение. Большинство приложений для глубокого обучения используют переносное обучение или переносное обучение, которое включает в себя разработку предварительно обученной модели. Процесс начинается с существующей сети, такой как AlexNet или GoogLeNet, которую необходимо обогатить новыми данными, содержащими классы, ранее неизвестные сети. После того, как вы внесли некоторые изменения в сеть, вы можете выполнить новую задачу, например распределить по категориям только собак или кошек, вместо 1000 различных объектов. Этот метод также имеет то преимущество, что для него требуется гораздо меньший объем данных (нужно обрабатывать тысячи изображений, а не миллионы), что делает расчет делом часов или минут.
  3. Извлечение функций. Менее частый и специализированный подход к глубокому обучению заключается в использовании сети в качестве средства извлечения функций. Поскольку все слои отвечают за изучение определенных характеристик из изображений, мы можем получить эти характеристики из сети в любой момент в процессе обучения. Затем можно использовать эти характеристики в качестве входных данных для модели машинного обучения, такой как SVM.

В этом руководстве мы поговорим о том, как обучить модель глубокого обучения с нуля. В 2017 году появилось много работ, касающихся глубокого обучения и распространения этих методов лечения в распределенной среде. Tensorflow и Pytorch - две самые популярные библиотеки с открытым исходным кодом для глубокого обучения. В этом уроке я покажу вам, как использовать их оба! Давайте познакомимся с этими двумя фреймворками.

TensorFlow был разработан Google и используется в их системе распознавания речи, в новом продукте Google Фото, Gmail, поиске Google и многом другом. Компании, использующие Tensorflow, включают AirBnb, Airbus, Ebay, Intel, Uber и многие другие. Theano - еще одна библиотека глубокого обучения с открытым исходным кодом. По функциональности он очень похож на Tensorflow, но, тем не менее, мы его рассмотрим. Keras - великолепная библиотека для реализации моделей глубокого обучения. Он действует как оболочка для Theano и Tensorflow. Благодаря Керасу мы можем создавать мощные и сложные модели глубокого обучения с помощью всего нескольких строк кода. Это то, что позволит нам иметь глобальное видение того, что вы создаете. Благодаря этой библиотеке все, что мы делаем, будет выглядеть настолько четким и структурированным, что вы действительно получите интуицию и понимание того, что мы делаем.

Чтобы установить эти инструменты:

pip install theano
pip install tensorflow
pip install keras
conda update — all

Как и машинное обучение, глубокое обучение можно обучать двумя способами:

  1. контролируемое глубокое обучение
  2. неконтролируемое глубокое обучение

В этом руководстве я объясню контролируемые алгоритмы глубокого обучения. Я оставлю неконтролируемое глубокое обучение в следующем уроке.

Раздел I: контролируемое глубокое обучение:

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

  • Искусственные нейронные сети
  • Сверточные нейронные сети
  • Рекуррентные нейронные сети

Далее в этом разделе я объясню интуицию каждого из этих методов и покажу вам, как создавать обучающие модели глубокого обучения с библиотекой TensorFrames (TensorFlow on Spark Dataframes) в искровом кластере.

  1. Искусственные нейронные сети (ИНС):

Основные принципы ИНС подробно описаны в статье этого университета. Изобретатель первого нейрокомпьютера, доктор Роберт Хехт-Нильсен, определяет нейронную сеть как … вычислительную систему, состоящую из ряда простых, тесно связанных между собой обрабатывающих элементов, которые обрабатывают информацию в соответствии с их динамическим откликом состояния на внешние входы .

Идея ИНС основана на убеждении, что работу человеческого мозга можно имитировать, используя кремний и провода в качестве живых нейронов и дендритов. Человеческий мозг состоит из 86 миллиардов нервных клеток, называемых нейронами. Они связаны с другими тысячами клеток с помощью аксонов. Стимулы из внешней среды или сигналы от органов чувств принимаются дендритами. . Эти входы создают электрические импульсы, которые быстро проходят через нейронную сеть. Затем нейрон может отправить сообщение другому нейрону для решения проблемы или не отправить его вперед.

ИНС состоят из множества узлов, которые имитируют биологические нейроны человеческого мозга. Нейроны связаны звеньями и взаимодействуют друг с другом. Узлы могут принимать входные данные и выполнять простые операции с данными. Результат этих операций передается другим нейронам. Выходные данные каждого узла называются его активацией или значением узла. Каждая ссылка связана с весом. ИНС способны к обучению, которое происходит путем изменения значений веса. На следующем рисунке показана простая ИНС.

Обратное распространение - распространенный метод обучения нейронной сети. Обратное распространение создается для обновления веса ИНС, чтобы минимизировать функцию стоимости (ошибка между выходным значением ИНС и фактическим значением). Чтобы минимизировать эту функцию, можно использовать градиентный спуск, но он требует, чтобы функция стоимости была выпуклой (функция имеет только 1 глобальный минимум). Когда функция стоимости не является выпуклой, спуск стохастического градиента может быть хорошим вариантом. Разница между градиентным спуском Betch и стохастическим градиентным спуском очень интуитивна: для пакетного градиентного спуска мы берем все данные для расчета и минимизируем функцию стоимости. С другой стороны, стохастический градиентный спуск, мы берем данные построчно.

Создать модель ИНС с помощью keras очень просто, шаблон как обычно:

  • Этап 1 - предварительная обработка данных: на этом этапе выполняется весь процесс подготовки данных для использования модели. Это включает в себя импорт данных и библиотек, очистку данных (отсутствующие, выбросы, вредоносные и т. Д.), Кодирование категориальных данных, разделение набора данных на обучающий набор и набор тестов, а также масштабирование функций.
  • Этап 2: После того, как данные готовы, пора сделать модель ИНС. Давай сделаем это.

Первым шагом является импорт библиотек и пакетов Keras.

import keras
from keras.models import Sequential
from keras.layers import Dense

Следующим шагом будет инициализация ИНС и добавление слоев ИНС.

# Initialising the ANN
classifier = Sequential()
# Input layer and the first hidden layer
classifier.add(Dense(units = 6, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim = 11))
# Then Adding the second hidden layer
classifier.add(Dense(units = 6, kernel_initializer = ‘uniform’, activation = ‘relu’))
# and the output layer
classifier.add(Dense(units = 6, kernel_initializer = ‘uniform’, activation = ‘relu’))

Наконец, этап - это компиляция ИНС и подгонка ИНС к обучающему набору.

classifier.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)
  • Этап 3: последний этап - сделать прогноз с помощью модели и оценить его.
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

2. Сверточные нейронные сети:

Сверточные нейронные сети (CNN) - это категория нейронных сетей, которые широко используются в таких областях, как распознавание и классификация изображений. Сети CNN оказались очень эффективными в распознавании лиц, объектов и дорожных знаков, помимо обеспечения зрения в роботах и ​​беспилотных автомобилях.

CNN очень похожи на обычные ANN (объяснено ранее): они состоят из нейронов, основанных на обновлении весов. Каждый нейрон получает какие-то входные данные, выполняет набор операций и выдает результат.

Архитектура CNN проиллюстрирована на следующем изображении и состоит из 4 концепций. Для этого мы должны помнить, что каждое изображение может быть представлено в виде матрицы значений пикселей. Изображение со стандартной цифровой камеры будет иметь три канала - красный, зеленый и синий - вы можете представить их как три 2d-матрицы, наложенные друг на друга (по одной для каждого цвета), каждая из которых имеет значения пикселей в диапазоне от 0 до 255. На следующей картинке представлены сцены телеканалов CNN.

i. Свертка: Слой Conv - это основной строительный блок сети CNN, который выполняет большую часть тяжелой вычислительной работы. Основная цель этапа свертки - извлечение деталей из изображения. Полезно сохранять пространственные отношения между пикселями, изучая особенности изображения с использованием небольших квадратов входных данных. Я не буду здесь вдаваться в математические детали концепции свертки, но попытаюсь объяснить, как это работает. Целью свертки является уменьшение размера матрицы и сохранение пространственных характеристик путем свертывания этой матрицы на другую матрицу 3 x 3. Дополнительная операция, называемая ReLU, использовалась после каждой операции свертки. ReLU расшифровывается как Rectified Linear Unit и представляет собой нелинейную операцию.

ii. Объединение: Пространственное объединение (также называемое субдискретизацией или понижающей выборкой) заключается в уменьшении размерности каждой карты объектов, но при этом сохраняется наиболее важная информация. Пространственный пул может быть разных типов: Макс, Среднее, Сумма и т. Д.

iii. Сглаженные: состоят для преобразования результатов матрицы предыдущего слоя в вектор. Последний будет входом для слоя нейронной сети, подобного ANN.

iv. Полностью связанный: термин Полностью связанный означает, что каждый нейрон предыдущего слоя связан с каждым нейроном следующего слоя. Я рекомендую прочитать этот пост, если вы не знакомы с многослойными персептронами.

Для построения модели CNN первым этапом после этапа предварительной обработки данных (это общий этап для всех моделей данных) является построение архитектуры CNN. по этим шагам

Первый шаг - импортировать библиотеки и пакеты Keras.

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

Следующим шагом будет инициализация CNN и добавление слоев:

# Initialising the CNN :
classifier = Sequential()

Затем построил архитектуру CNN.

# Step 1 — Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = ‘relu’))
# Step 2 — Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = ‘relu’))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 — Flattening
classifier.add(Flatten())
# Step 4 — Full connection
classifier.add(Dense(units = 128, activation = ‘relu’))
classifier.add(Dense(units = 1, activation = ‘sigmoid’))

Теперь модель CNN готова к установке.

# Compiling the CNN
classifier.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
# Fitting the CNN to the images
classifier.fit_generator(training_set,
 steps_per_epoch = 8000,
 epochs = 25,
 validation_data = test_set,
 validation_steps = 2000)

3. Рекуррентные нейронные сети (RNN)

RNN - популярные модели, которые показали себя многообещающими во многих задачах НЛП. RRN основаны на простой идее, заключающейся в использовании последовательной информации. В традиционной нейронной сети мы предполагаем, что все входы (и выходы) независимы друг от друга. Но для многих задач (например, данных временных рядов) это очень плохая идея. Если вы хотите предсказать следующее слово в предложении, вам лучше знать, какие слова были перед ним. RNN называются повторяющимися, потому что они выполняют одну и ту же задачу для каждого элемента последовательности, а результат зависит от предыдущих вычислений. Еще один способ думать о RNN - это то, что у них есть «память», которая фиксирует информацию о том, что было рассчитано на данный момент. Теоретически RNN могут использовать информацию в произвольно длинных последовательностях, но на практике они ограничиваются просмотром только нескольких шагов (подробнее об этом позже).

Идея RNN состоит в том, чтобы рассмотреть классические ANN, и мы объединили их вместе. все нейроны по-прежнему остаются, но представляют, что мы видим это насквозь. Чтобы упростить представление, я решил сделать вертикальное представление с петлей синего цвета для настройки временного измерения.

Обучение RNN аналогично работе с традиционной ANN, но с небольшой поправкой. Мы также используем алгоритм обратного распространения ошибки для обновления параметров. Как поясняется на следующем рисунке, параметры RNN являются общими для всех временных шагов в сети, градиент на каждом выходе зависит не только от вычислений текущего временного шага, но и от предыдущих временных шагов.

А пока я должен упомянуть, что классические RNN испытывают трудности с изучением долгосрочных зависимостей (например, зависимостей между шагами, которые находятся далеко друг от друга) из-за того, что называется проблемой исчезающего градиента. Давайте тогда объясним, что это значит. Проблема исчезающего градиента была первоначально открыта Зеппом Хохрайтером в 1991 году и в последнее время вновь привлекает внимание из-за все более широкого применения глубинных архитектур.

Помните, что наша цель - вычислить градиенты ошибки относительно наших параметров, а затем изучить хорошие параметры с помощью стохастического градиентного спуска. Простое дифференциальное построение показывает, что градиент ошибки в момент t зависит от значения Wrec. Математическая формула этого градиента: написано на предыдущем рисунке. Это объясняет причину возникновения проблемы исчезновения / взрыва. Фактически, если мы начнем обучение с маленькими коэффициентами Wrec, возникнет проблема исчезновения, потому что градиент будет стремиться к нулю очень быстро, и если мы начнем обучение с большим Wrec, градиент будет иметь тенденцию к infiny, поэтому возникнет проблема взрыва. Более подробную информацию о проблеме исчезновения можно найти по этой ссылке ».

Популярным решением этой проблемы является использование архитектуры Long Short-Term Memory (LSTM) или Gated Recurrent Unit (GRU). LSTM были впервые предложены в 1997 году и сегодня являются, пожалуй, наиболее широко используемыми моделями в НЛП. ГРУ, впервые предложенные в 2014 году, представляют собой упрощенные версии LSTM. Обе эти архитектуры RNN были специально разработаны для работы с исчезающими градиентами и эффективного изучения дальнодействующих зависимостей. В этом руководстве я объясню LSTM.

LSTM не имеют принципиально отличной архитектуры от RNN, но они используют другую функцию для вычисления скрытого состояния (x_t). Память в LSTM называется ячейками, и вы можете думать о них как о черных ящиках, которые принимают в качестве входных данных предыдущее и текущее состояние. Эти клетки внутренне решают, что оставить (а что стереть) в памяти. Затем они объединяют предыдущее состояние, текущую память и ввод. Оказывается, эти типы модулей очень эффективны при фиксации долгосрочных зависимостей. Этот pos t является отличным объяснением LSMT.

Давайте теперь объясним, как построить RNN:

Мы всегда начинаем с импорта необходимых библиотек и пакетов.

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

Затем инициализируем RNN:

regressor = Sequential()

Затем создайте архитектуру LSTM:

# Adding the first LSTM layer and some Dropout regularisation
regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
# Adding a second LSTM layer and some Dropout regularisation
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
# Adding a third LSTM layer and some Dropout regularisation
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
# Adding a fourth LSTM layer and some Dropout regularisation
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
# Adding the output layer
regressor.add(Dense(units = 1))

Когда архитектура будет готова, нам нужно будет скомпилировать и подогнать модель RNN.

# compile the RNN model
regressor.compile(optimizer = ‘adam’, loss = ‘mean_squared_error’)
#Finaly fitting the RNN to the training set
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)

Подводя итог, в этой статье мы рассмотрели три основные модели контролируемого глубокого обучения (ANN, CNN, RNN) и учебное пособие, чтобы объяснить, как построить с нуля эти три модели на основе keras, tensorflow и theano. Надеюсь, этот урок был вам полезен и до встречи в разделе las :)