Автор:Зенков Д.А., Ананьевский М.С.
Источник: Санкт-Петербургский государственный университет, математико-механическии факультет, кафедра исследование операций
Рассматривалась общая задача распознавания рукописного текста, апробация происходила на базе данных рукописных цифр MNIST1. MNIST представляется из себя переработку оригинального набора чёрно-белых образцов NIST с добавленными образцами написанными студентами.
В статье [3] В. А. Якубовича, рассматривалась задача распознавания рукописных цифр. Современный подход решения данной задачи основанный на сверточных нейронных сетях базируется на статье [8] Yann Lecun и др. Я решил задачу распознавания рукописных цифр с помощью свёрточной нейронной сети.
Преимущества такой модели:
В работе рассказано с помощью каких операций производится обучение свёрточной нейронной сети и показывается дальнейшее распознавание ею объектов из MNIST.
http://yann.lecun.com/exdb/mnist/
Рассмотрим задачу классификации с учителем.
? — множество объектов распознавания.
? ? — объект распознавания.
g : ? > , = {1, 2, . . . , } — индикаторная функция, разбивающая пространство образов на непересекающихся классов ?1, ?2, . . . , ?.
— пространство наблюдений (признаки).
: ? > — функция, ставящая в соответствие каждому объекту точку () в пространстве наблюдений. Вектор () — это образ объекта, воспринимаемый наблюдателем.
^g: > – решающее правило (оценка для g() на основании ()).
Пусть = (), = (), = 1, 2 . . . , — доступная информация о функциях g() и (), сами функции неизвестны. Тогда (g, ), = 1, 2 . . . , — множество прецендентов.
Задача: построить решающее правило ^g(), чтобы распознавание проводилось с минимальным числом ошибок на заданном множестве.
? (, ) = 1, 2 . . . , g ^g
Ставилась задача распознавания рукописных цифр от 0 до 9. Для апробации был использован стандартный набор данных MNIST (42000 изображений обучающей выборки, 28000 изображений тестовой выборки). Программе представлялась картинка с изображением одной из 10 цифр 0, 1,. . . , 9. Программа должна была правильно распознать, что за цифра нарисована на картинке.
Имеем:
Изображение задавалось 28 x 28 пикселями, в 256 оттенках серого цвета (цветовой режим Greyscale, значение 0 представляет чёрный цвет, а значение 255 — белый).
Цель: распознать рукописную цифру на тестовых изображениях (выбрать правильную метку от 0 до 9).
Метрика качества: Процент правильно распознанных цифр (Accuracy).
Свёрточные нейронные сети показывают хороший результат в работе с изображениями. В их основе лежит идея выделения признаков исходного изображения. Такое выделение признаков позволяют делать операции свертки и субдискретизации (pooling). Также я применил dropout регуляризацию, чтобы увеличить способность нейронной сети выделять признаки.
Получившиеся количество настраиваемых параметров нейронной сети: 3199106.
Свертка (взаимнокорреляционная функция) — основная операция свёрточной нейронной сети, позволяющая выделять признаки изображения. Свертку задается формулой:
Ядро перемещается над двумерным изображением, поэлементно выполняя операцию умножения с той частью входных данных, над которой оно сейчас находится, затем суммирует все полученные значения в один выходной пиксель. Таких ядер в одном слое сети может быть несколько (настраиваемый пользователем параметр) и зависит от того, сколько признаков в изображении пользователь хочет выделить. Выход такой функции называется картой признака.
Количество настраиваемых параметров у свертки заметно меньше, чем на полносвязном слое. Если обозначить — количество карт признаков подающихся на вход, , — высота и ширина ядра соответственно, а — количество карт признаков на выходе. Тогда количество параметров свертки можно вычислить по формуле:
Суть субдискретизации заключается в нелинейном уплотнении карты признаков, группа пикселей уплотняется до одного пикселя, проходя нелинейное преобразование. Такое преобразование уменьшает количество параметров нейронной сети в дальнейшем, оставляя при этом выделенные признаки.
Мною была выбрана операция субдискретизации с функцией максимума (max-pooling), как наиболее предпочтительная из статьи [6]. Формула субдискретизации с функцией максимума:
Dropout регуляризация избавляет от взаимоадаптации нейронов во время обучения нейронной сети.
Во время обучения производится выключение (dropping out) нейронов с вероятностью , таким образом, а вероятность, что нейрон останется включенным, составляет 1?. Выключение нейрона означает, что при любых входных данных или параметрах он возвращает 0.
На каждом шаге обучения генерируется вектор случайных величин = (1, . . . , 1) распределенный по закону Бернулли, где 1 — количество нейронов в слое, к которому применяется dropout. Этот вектор показывает какие нейроны выключатся, а какие останутся включенными на данном шаге обучения.
Главной задачей функции активации внести нелинейность в нейронную сеть.
Функция активации ReLU (Rectified Linear Unit) начала использоваться относительно недавно и приобрела широкое распространение.
К преимуществам такой функции активации можно отнести:
Единственный недостаток, что при большом градиенте функции нейрон может больше никогда не обновляться, но это проблема решается посредством выбора надлежащей скорости обучения.
Функция активации softmax используется на последнем слое нейронной сети. Представляет собой обобщение логистической функции для большей размерности. Размерность вектора преобразованного функцией остается той же. Компоненты вектора принимают значения в интервале (0, 1). Сумма компонент вектора равна 1.
() = exp() / ?? exp()
Выходы функции можно интерпретировать как меру принадлежности к каждому классу.
Главная задача нейронной сети минимизировать функционал качества. Функционал качества зависит от объекта, который подали на вход в нейронную сеть, и от параметров нейронной сети . Минимизация функционала качества (argmin ()) производится за счет автоматического изменения весов в нейронной сети по такому алгоритму:
Значения задаются из непрерывного равномерного распределения.
Все параметры, кроме — скорость обучения, были взяты как оптимальные параметры найденные в ходе экспериментов из статьи [3]. Параметр был взят с учетом данной задачи.
Подсчет градиента функции производится с помощью метода обратного распространения ошибки. Он поочередно от последнего слоя к первому вычисляет градиент функционала качества по параметрам текущего слоя. Это вычисление возможно так как, нейронная сеть представляет собой композицию функций, для которой можно использовать правило дифференцирования сложной функции.
Нейронная сеть была написана на python 3.6 с использованием библиотеки pytorch. Из-за большого количества данных, не помещающихся в оперативную память компьютера, в нейронную сеть загружались за раз 100 изображений из обучающей выборки. Все изображения прошли 40 раз через свёрточную нейронную сеть.
Выбор метки для объекта прошедшего нейронную сеть, осуществлялся выбором номера наибольшей компоненты выходного вектора нейронной сети.
На тестовом наборе данных процент правильно распознанных цифр составляет 99.385%. Получившаяся нейронная сеть попала в топ 25% на соревновании kaggle Digit Recognizer, из более чем 3000 участников.