Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Общие сведения о наиболее распространенных библиотеках ИНС



Глубокое обучение приобрело популярность в середине 2000-х годов, когда мощности компьютеров возросли достаточно для обучения больших нейронных сетей, наборы данных стали достаточно объёмными, а теория искусственных нейронных сетей получила новый толчок в развитии. В настоящие время разработано множество библиотек для работы с глубоким обучением. Рассмотрим основные библиотеки для создания искусственных нейронных сетей от ведущих мировых разработчиков.

1. Theano (официального сайта нет)

Разработчик: Монреальский университет. С 28 сентября 2017 года прекращены работы по развитию.

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

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

1. TensorFlow (официальный сайт: https: //www.tensorflow.org/)

Разработчик: Google Brain

TensorFlow является разработкой компании Google и ранее использовался для внутренних задач. Библиотека производит числовые вычисления с помощью графов потоков данных. Тензоры (многомерные массивы данных) – ветви графа, а узлы – математические операции. Имеется возможность развертывания на несколько ЦП, или GPU. Универсальный API позволяет переносить между настольными компьютерами, мобильными устройствами, серверами.

Основные преимущества:

· огромная популярность и большое количество обучающих материалов, решенных проблем;

· возможность вычисления на графических процессорах;

· большое количество поддерживаемых языков программирования.

При этом следует отметить, что данная библиотека не работает 32-разрядных операционных системах.

2. Caffe (официальный сайт: http: //caffe.berkeleyvision.org/)

Разработчик: Berkeley Vision and Learning Center.

В отличии от вышеописанных библиотек требует использования низкоуровневых языков. Изначально библиотека создавалась для проектов машинного зрения, но с тех пор развился и теперь применяется и для других задач, в том числе для распознавания речи и работы с мультимедиа.

Главное преимущество Caffe — скорость. Библиотека целиком написана на С++ и, при необходимости, переключает поток обработки между процессором и видеокартой. В пакет поставки входит моделей для стандартных задач по классификации. Также немало моделей создано сообществом пользователей Caffe.

3. Torch (официальный сайт: http: //torch.ch/)

Разработчик: Idiap Research Institute, New York University и NEC Laboratories America, начиная с 2000г., распространяется под лицензией BSD.

Библиотека реализована на языке Lua с использованием C и CUDA. На данный момент поддерживаются операционные системы Linux, FreeBSD, Mac OS X. Основные модули также работают и на Windows. В зависимостях Torch находятся пакеты imagemagick, gnuplot, nodejs, npm и другие. Библиотека состоит из набора модулей, каждый из которых отвечает за различные стадии работы с нейросетями. Так, например, модуль nn обеспечивает конфигурирование нейросети (определению слоев, и их параметров), модуль optim содержит реализации различных методов оптимизации, применяемых для обучения, а gnuplot предоставляет возможность визуализации данных (построение графиков, показ изображений и т.д.).

Torch позволяет создавать сложные нейросети с помощью механизма контейнеров. Контейнер — это класс, объединяющий объявленные компоненты нейросети в одну общую конфигурацию, которая в дальнейшем может быть передана в процедуру обучения. Компонентом нейросети могут быть не только полносвязные или сверточные слои, но и функции активации или ошибки, а также готовые контейнеры.

4. Microsoft Cognitive Toolkit или CNTK (официальный сайт: https: //www.microsoft.com/en-us/cognitive-toolkit/)

Разработчик: Microsoft Research

Microsoft Cognitive Toolkit (прежнее название — CNTK) — это унифицированный набор инструментов для глубокого обучения, который представляет нейронные сети как серию вычислительных действий через направленный граф. В графе листья представляют входные значения или параметры сети, а другие узлы — операции матрицы в ответ на входные значения. Набор инструментов позволяет легко реализовывать и комбинировать популярные типы моделей, например, упреждающие глубокие нейронные сети, сверточные нейронные сети, рекуррентные нейронные сети (RNN) и сети с долгой краткосрочной памятью (LSTM). Он реализует обучение по принципу стохастического градиентного спуска (SGD, обратное распространение ошибки) с автоматической дифференциацией и распараллеливанием по нескольким графическим процессорам и серверам. Библиотека доступна по лицензии на ПО с открытым исходным кодом с апреля 2015 года.

5. Метабиблиотека Keras (официальный сайт: https: //keras.io)

Данная библиотека является надстройкой, над библиотеками TensorFlow, Theano и CNTK и предоставляет разработчику удобный инструментарий для доступа к функциональным возможностям указанных библиотек. Основным достоинством использования Keras является возможность использования различных «бэкендов» для решения одной и той же задачи. То есть написанный код можно скомпилировать, используя, например, TensorFlow, а затем CNTK. Помимо этого, данная библиотека предоставляет возможность достаточно высокоуровневого описания различных слоев нейронной сети с возможностью их гибкой настройки. Также Keras содержит достаточно большое количество алгоритмов обучения созданных нейросетей, а также наборы данных для их предварительного обучения.

Ниже речь пойдет об установке и использовании библиотеки Keras с использованием в качестве «бэкенда» TensorFlow на языке Python.

Основные объекты Keras

Слои [1, 2]

Отличительной особенностью искусственных нейронных сетей является их многослойность, поэтому разработчики библиотеки определили класс Layer одним из базовых объектов Keras. На настоящий момент разработано и реализовано достаточно большое количество типов слоев, применяемых для решения различных задач, также поддерживается работа с слоями, разработанными пользователем. Описание методов, аргументов и принципов работы различных слоев и вообще библиотеки Keras достаточно полно изложено на официальном сайте и поэтому не приводится в данном пособии. Здесь мы остановимся на описании только трех, наиболее часто применяемых на практике типов слоев.

Базовым типом слоев в Keras является полносвязный слой типа Dense. Слой такого типа является однослойным персептроном, где каждый из нейронов связан с каждым из входов и имеет при этом некоторое смещение. Таким образом, если количество входов равно некоторому числу n, а количество нейронов равно m, то количество настраиваемых параметров для слоя такого типа будет равно (m+1)n. Основными параметрами при создании слоя такого типа служат:

1. Количество нейронов в слое, units

2. Применяемая функция активации activation;

3.  Остальные параметры, такие как методы инициализации матрицы весов и смешения, ограничения, накладываемые на веса в процессе обучения и др.

Другим важным типом слоев являются слои свертки типа Convolution. Поясним причины появления слоев такого типа на следующем примере: пусть имеются фотографии, размером 1200 на 600 пикселей с цветовой моделью RGB, отправляемые на вход нейронной сети. Тогда количество входов для полносвязного слоя будет 1200*600*3=2160000, а количество настаиваемых параметров, соответственно в n раз больше (здесь n – количество нейронов). Учитывая тот факт, что при таком количестве входов, приемлемая величина ошибки обучения будет достигаться далеко не на двух слоях, можно предположить, что обучение такой сети займет очень продолжительное время. Для того чтобы уменьшить пространство признаков применяют, так называемую операцию свертки, которая схематично представлена на рисунке 12.

Рис. 12. Схема операции свёртки

Здесь I – входная матрица, K – ядро свертки, I*K – свёрнутая матрица, называемая еще картой признаков. При этом все нейроны слоя свёртки имеют одни и те же веса (так реализуется принцип разделяемых весов). Таким образом, карта признаков, полученная на выходе из слоя свёртки, является, по сути, свёрткой входной матрицы с применением некоторого фильтра, коэффициенты которого и подвергаются обучению. Отметим, что слои такого типа очень часто применяются при решении задач распознавания изображений.

Основными параметрами при создании слоя свертки являются:

· filters – размерность выходного пространства (то есть размерность выходной матрицы);

· kernel_ size – размер ядра свертки;

· strides – размер шага свертки (определяет на сколько ячеек смещается ядро свёртки);

· padding – специальный параметр, позволяющий при необходимости дополнять выходную матрицу нулями, для того чтобы вход и выход слоя совпадали по размерности, может принимать значения " valid", " causal" или " same";

· иные параметры, описанные в документации Keras.

Следующий тип слоев, часто применяемых на практике это слой субдискретизации типа Pooling. Слой такого типа выполняет функцию подобную слою свёртки – а именно, уменьшает пространство признаков путем применения некоторой нелинейной операции к исходной матрице. Схематично операция субдискретизации представлена на рисунке ниже.

Рис. 13. Схема операции субдискретизации (пуллинга)

В данном случае на рисунке изображена операция MaxPooling, осуществляющая разбиение исходной матрицы на блоки, называемые «окно пуллинга», и поиск максимального значения в каждом из блоков. Составленная таким образом матрица является выходом для слоя субдискретизации. В библиотеке Keras реализовано четыре вида пуллинга:

· MaxPooling– выбирается максимальное число в окне пуллинга;

· AveragePooling– рассчитывается среднее арифметическое по окну пуллинга;

· GlobalMaxPooling – выбирается максимальное значение по всему входному пространству

· GlobalAveragePooling – рассчитывается среднее арифметическое по всему входному пространству.

Основным параметром при создании слоя субдискретизации является pool_size – число, определяющее во сколько раз, будут уменьшены входные данные относительно выходных, другие параметры слоя типа Pooling описаны в документации Keras.

Также в библиотеке Keras реализованы такие виды слоев как: рекурентный слой (SimpleRNN), слой с краткосрочной памятью (LSTM), локально-связанный слой (LocallyConnected) и многие другие. Все указанные типы слоев также применяются на практике и достаточно подробно описаны в документации Keras.

Модель [1, 2]

Ядром структуры данных в Keras является модель. Простейшим её видом является последовательная модель Sequential, в которой реализуется линейный стек слоев (данного типа моделей достаточно для большинства практических задач). Однако библиотека поддерживает, и пользовательские архитектуры слоев при этом необходимо использовать модель типа Keras API.

При создании модели указываются основные параметры сети, а именно, слои, с указанием их типа, количества нейронов в слое, типе функции активации. Еще одним немаловажным моментом, является указание для первого слоя формы данных, которая поступит на вход. По этой причине первый слой в последовательной модели (и только первый, поскольку последующие слои могут делать автоматический вывод формы) должен получать информацию о своей входной форме, то есть иметь представление о размерности поступающих данных. Есть несколько возможных способов сделать это:

1. Передать аргумент input_shape первому слою. Это кортеж формы (кортеж целых чисел или записей None, где None указывает, что можно ожидать любое положительное целое число).

2. Некоторые слои, такие как Dense, поддерживают спецификацию своей формы ввода через аргумент input_dim.

Таким образом, для создания простейшей модели необходимо записать следующий код:

model = Sequential([

Dense(32, input_shape=(784, )),

Activation('relu'),

Dense(10),

Activation('softmax'),

])

Созданная модель содержит два полносвязных слоя, имеющих в своем составе 32 и 10 нейронов. Первый слой имеет функцию активации ReLu и параметр input_shape=(784, ), который означает, что входной вектор имеет размерность 784× 1. Второй слой имеет 10 нейронов и функцию активации Softmax. Выходом данной сети будет вектор 10× 1.

К созданной модели можно добавить дополнительные слои, используя метод add, например, слой свертки:

model.add(Conv2D(128, (3, 3), padding=" same" ))

model.add(Activation('relu'))

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

Компиляция модели

Перед обучением модели необходимо настроить данный процесс, что выполняется в Keras с помощью метода Compilation, который имеет три важнейших параметра:

· optimizer– определяет непосредственно метод обучения сети;

· loss– определяет минимизируемую функцию в процессе обучения;

· metrics – определяет функцию, с помощью которой также оценивается качество обучения, однако значение данной функции не влияет на процесс обучения.

Рассмотрим, значения, которые может принимать каждый из указанных параметров более подробно.

Методы обучения

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

1. Перемешать примеры из обучающей выборки;

2. Выбрать случайным образом один из примеров обучающей выборки;

3. Выполнить одну итерацию изменения весов, аналогично методу обратного распространения ошибки;

4. Повторять шаги 1-3 до тех пор, пока не будет получено приемлемое качество обучения.

Основным параметром данного метода является скорость обучения lr, обычно принимаемая равной 0, 01. Отметим при этом, что данный параметр настраивается исследователем исходя из конкретной задачи и общих рекомендаций при его назначении не существует.

Еще одним параметром данного алгоритма является значение импульса momentum. По умолчанию, данный параметр равен нулю, однако в том случае если он отличен от нуля, алгоритм SDG реализует так называемый алгоритм «тяжелого шарика». Данный алгоритм использует идею движения шарика по некоторой поверхности в поле тяжести. Понятно, что при движении шарика вниз по некоторой поверхности он будет накапливать энергию, то есть двигаться с ускорением, за счет чего может достигаться 10-кратное увеличение скорости обучения. Еще одним достоинством данного метода является то, что за счет накопленной инерции он может «проскакивать» некоторые локальные минимумы [5]. Для данного метода формула изменения весов будет иметь следующий вид:

где  – значение градиента целевой функции. Обычно значение параметра momentum принимают равным от 0, 8 до 0.9.

Параметр decay задает значение, на которое будет уменьшаться скорость обучения lr на каждой итерации.

Наконец, последний параметр данного метода nesterov, может принимать значения истина или ложь и означает применение расчета моментов по методу Нестерова. Данный метод является развитием метода «тяжелого шарика», позволяющим достигать точки экстремума еще быстрее.

Формула изменения весов в данном случае может быть записана как:

То есть вычисление градиента происходит в точке уже с учетом импульса. Данная модификация позволяет добиться более чем 20-кратного преимущества в скорости по сравнению с классическим градиентным методом [6].

Другие методы обучения, представленные в библиотеке Keras, также являются градиентными, однако имеют некоторые особенности.

Adagrad, метод адаптивного градиента, идея которого заключается в том, что если вес обновляется чаще, то скорость его обучения должна быть меньше и наоборот. То есть данный метод обновит вес редко используемого синапса на большую величину, чем вес часто используемого. Для реализации такого подхода применяется техника накопления квадратов изменения веса, что позволяет выделить специфические признаки классифицируемых объектов.

RMSprop или метод среднеквадратичного градиента, использует похожую идею, что и Adagrad, с той лишь разницей, что здесь используется накопление не квадратов изменений веса, а скользящее среднее по истории обновлений.

Adadelta является модификацией метода Adagrad, который адаптирует скорости обучения на основе движущегося окна обновлений градиентов, а не накапливает все прошлые изменения градиента. Таким образом, Adadelta продолжает учиться, даже если было сделано много обновлений.

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

Adamax и Nadam модификации метода Adam, первый их которых при обновлении оценки импульса выбирает максимальное из возможных значений обновления, а второй использует формулу Нестерова для вычисления оценки импульса.

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


Поделиться:



Последнее изменение этой страницы: 2019-10-24; Просмотров: 193; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.033 с.)
Главная | Случайная страница | Обратная связь