Использование нейронных сетей для распознавания рукописных цифр Часть 1

в 8:49, , рубрики: python, математика, машинное обучение, распознавание текста

Привет! В этой серии статей приведу краткий перевод с английского языка первой главы книги Майкла Нильсона «Neural Networks and Deep Learning».

Перевод я разбил на несколько статей на хабре, чтобы было удобнее читать:
Часть 1) Введение в нейронные сети
Часть 2) Построение и градиентный спуск
Часть 3) Реализация сети для распознавания цифр
Часть 4) Немного о глубоком обучении

Введение

Человеческая визуальная система — одна из самых удивительных на свете. В каждом полушарии нашего мозга есть зрительная кора, содержащая 140 млн. нейронов с десятками млрд. связей между ними, но такая кора не одна, их несколько, и вместе они образуют настоящий суперкомпьютер в нашей голове, лучшим образом адаптированный в ходе эволюции под восприятие визуальной составляющей нашего мира. Но трудность распознавания визуальных образов становится очевидной, если вы попытаетесь написать программу для распознавания, скажем, рукописных цифр.
image
Простую интуицию — «у 9-тки есть петля сверху, и вертикальный хвост внизу» не так просто реализовать алгоритмически. Нейронные сети используют примеры, выводят некоторые правила и учатся на них. Более того чем больше примеров мы покажем сети, тем больше она узнает о рукописных цифрах, следовательно классифицирует их с большей точностью. Мы напишем программу в 74 строчки кода, которая будет определять рукописные цифры с точностью >99%. Итак, поехали!

Персептрон

Что такое нейронная сеть? Для начала объясню модель искусственного нейрона. Персептрон был разработан в 1950 г. Фрэнком Розенблатом, и сегодня мы будем использовать одну из основных его моделей — сигмоидный персептрон. Итак, как он работает? Персепрон принимает на вход вектор $inline$bar{x} = left { x_{1}, x_{2}, x_{3}, ..., x_{N} right }, x_{i} in mathbb{R}$inline$ и возвращает некоторое выходное значение $inline$output in mathbb{R}$inline$.

image

Розенблат предложил простое правило для вычисления выходного значения. Он ввел понятие «значимости», далее «веса» каждого входного значения $inline$bar{w} = left { w_{1}, w_{2}, w_{3}, ..., w_{N} right }, w_{i} in mathbb{R}$inline$. В нашем случае $inline$output$inline$ будет зависеть от того, будет ли $inline$sum_{i=1}^{N} x_{i}w_{i}$inline$ больше или меньше некоторого порогового значения $inline$threshold in mathbb{R}$inline$.

$$display$$output = begin{cases} 0 & text{ if } sum_{i=1}^{N} x_{i}w_{i} leq threshold \ 1 & text{ if } sum_{i=1}^{N} x_{i}w_{i} > threshold end{cases}$$display$$

И это все, что нам нужно! Варьируя $inline$threshold$inline$ и вектор весов $inline$bar{w}$inline$, можно получить совершенно разные модели принятия решения. Теперь вернемся к нейронной сети.

image

Итак, мы видим, что сеть состоит из нескольких слоев нейронов. Первый слой называется входным слоем или рецепторами ($inline$Receptors, InputLayer$inline$), следующий слой — скрытый ($inline$HiddenLayer$inline$), и последний — выходной слой ($inline$OutputLayer$inline$). Условие $inline$sum_{i=1}^{N} x_{i}w_{i} > threshold$inline$ довольно громоздко, давайте заменим $inline$sum_{i=1}^{N} x_{i}w_{i}$inline$ на скалярное произведение векторов $inline$bar{x} cdot bar{w}$inline$. Далее положим $inline$b = -threshold$inline$, назовем его смещением персептрона или $inline$bias$inline$ и перенесем $inline$b$inline$ в левую часть. Получим:

$$display$$output = begin{cases} 0 & text{ if } bar{x} cdot bar{w} + b leq 0 \ 1 & text{ if } bar{x} cdot bar{w} + b > 0 end{cases}$$display$$

Проблема обучения

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

Использование нейронных сетей для распознавания рукописных цифр Часть 1 - 4

Если бы это было возможно, то мы могли бы манипулировать весами в выгодную нам сторону и постепенно обучать сеть, но проблема состоит в том, что при некотором изменение веса конкретного нейрона — его выход может полностью «перевернуться» с 0 на 1. Это может привести к большой ошибке прогноза всей сети, но есть способ обойти эту проблему.

Сигмоидный нейрон

Мы можем преодолеть эту проблему, введя новый тип искусственного нейрона, называемый сигмоидным нейроном. Сигмоидные нейроны подобны персептронам, но модифицированы так, что небольшие изменения в их весах и смещении вызывают лишь небольшое изменение на их выходе. Структура сигмоидного нейрона аналогичная, но теперь на вход он может принимать $inline$0 leq x_{i} leq 1,forall x_{i} in bar{x}$inline$, а на выходе выдавать $inline$sigma(bar{x} cdot bar{w} + b)$inline$, где

$$display$$ begin{eqnarray} sigma(z) = frac{1}{1+e^{-z}}. end{eqnarray} $$display$$

Казалось бы, совершенно разные случаи, но я вас уверяю, что персептрон и сигмоидный нейрон имеют много общего. Допустим, что $inline$z = bar{x} cdot bar{w} + b rightarrow infty$inline$, тогда $inline$e^{-z} rightarrow 0$inline$ и, следовательно $inline$sigma(z) rightarrow 1$inline$. Верно и обратное, если $inline$z = bar{x} cdot bar{w} + b rightarrow -infty$inline$, то $inline$e^{-z} rightarrow infty$inline$ и $inline$sigma(z) rightarrow 0$inline$. Очевидно, что работая с сигмоидным нейроном мы имеем более сглаженный персептрон. И действительно:

$$display$$Delta output approx sum_{i=1}^{N}frac{partial output}{partial w_{i}} Delta w_{i} + frac{partial output}{partial b} Delta b$$display$$

Архитектура нейронных сетей

Проектирование входных и выходных слоев нейросети — достаточно просто занятие. Для примера, предположим, что мы пытаемся определить, изображена ли рукописная «9» на изображении или нет. Естественным способом проектирования сети является кодирование интенсивностей пикселей изображения во входные нейроны. Если изображение имеет размер $inline$64 cdot 64$inline$, то мы имеем $inline$4,096 = 64 cdot 64$inline$ входных нейрона. Выходной слой имеет один нейрон, который содержит выходное значение, если оно больше, чем 0.5, то на изображении «9», иначе нет. В то время как проектирование входных и выходных слоев — достаточно простая задача, выбор архитектуры скрытых слоев — искусство. Исследователи разработали множество эвристик проектирования скрытых слоев, например такие, которые помогают скомпенсировать количество скрытых слоев против времени обучения сети.

До сих пор мы использовали нейронные сети, в которых выход из одного слоя — использовался как сигнал для следующего, такие сети называются прямыми нейронными сетями или сетями прямого распространения($inline$FeedForward$inline$). Однако существуют и другие модели нейронных сетей, в которых возможны петли обратной связи. Эти модели называются рекуррентными нейронными сетями($inline$Recurrent Neural Network$inline$). Рекуррентные нейронные сети были менее влиятельными, чем сети с прямой связью, отчасти потому, что алгоритмы обучения для рекуррентных сетей (по крайней мере на сегодняшний день) менее эффективны. Но рекуррентные сети по-прежнему чрезвычайно интересны. Они гораздо ближе по духу к тому, как работает наш мозг, чем сети с прямой связью. И вполне возможно, что повторяющиеся сети могут решать важные проблемы, которые могут быть решены с большим трудом с помощью сетей прямого доступа.

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

Автор: leszla

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js