Человек творит по образу и подобию самого себя не одну тысячу лет, поскольку подсматривать у природы — верный способ найти хорошее решение для многих непростых задач. Так случилось и с нейронными сетями. Уже в названии несложно рассмотреть знакомое слово “нейрон” — основополагающую концепцию машинного обучения.
В человеческом мозге содержатся миллиарды нейронов, связанных друг с другом при помощи синапсов, чьё число многократно больше. Именно эта система позволяет нам анализировать, учиться и узнавать новое, однако и ограничивает способность быстро и точно выполнять арифметические и логические операции. Иронично, что для компьютера подобные задачи напротив кажутся относительно простыми, но справиться с анализом разрозненной информации он не способен.
Нейроны
Решение проблемы исходит из математики. По сути, нейронная сеть — это алгоритм, основанный на формулах матанализа и статистики, а также программа, которая реализует этот алгоритм.
Структура искусственной нейронной сети вполне точно повторяет биологический мозг. Она состоит из некоторого (обычно очень большого) числа нейронов, которые соединены друг с другом при помощи связей, которым присвоено число, называемое весом, оно определяет вклад нейрона в общую работу сети, чем больше вес, тем большее влияние он оказывает. Нейрон сам по себе — это также число, которое принято заключать в пределы от 0 до 1.
Слои нейронов
Нейроны объединяются в слои. В простейших нейросетях вы вряд ли найдёте больше трёх-четырёх, на каждом из которых относительно небольшое количество нейронов, однако с возрастанием сложности задачи растут и количества.
На рисунке изображена полносвязная сеть, из каждого узла которой исходит линия, соединяющая его с каждым узлом следующего слоя, однако это не обязательно должно быть так. Вполне нормально пропускать некоторые связи, просто именно такую топологию удобно реализовывать с помощью языков программирования.
Первый слой называется входным и представляет собой данные, с которыми ей придётся работать. Разумеется, сколь бы хитро не была устроена машина, глаз у неё нет, поэтому для того, чтобы передать нейросети какие-либо данные, их необходимо представить в виде, понятном ей. Если на вход подаётся картинка, она разбивается на пиксели, каждому из которых соответствуют три значения цветовых составляющих (красный, зелёный, голубой). Видеоряд, текст, список признаков и прочие данные также необходимо кодировать. Например, нейросети охотно работают с векторами, матрицами и тензорами чисел.
Сигнал от каждого нейрона передаётся дальше при помощи обыкновенного умножения. Чтобы узнать, чему будет равно следующее значение, нужно сложить произведения каждого нейрона предыдущего слоя и соответствующего ему веса. Поскольку входные данные редко содержатся в определённых границах (то есть в интервале от 0 до 1), результат принято пропускать через так называемую функцию активации.
Функция активации
Точно также, как и биологический нейрон, искусственный можно заставить возбуждаться лишь при определённом пороговом значении. Чтобы привести его к такому значению, используется функция активации. Среди наиболее распространённых сигмоида, ReLu и гиперболический тангенс.
Не обращайте внимания на жуткие названия, на самом деле эти функции достаточно просты. Их смысл в том, чтобы нормализовать числа, привести их к единому виду и заключить между 0 и 1.
После того как получен результат, сигнал распространяется дальше вплоть до выходного слоя, который отвечает за принятие итогового решения. Например, определяя, нарисован на картинке круг или квадрат, в двух выходных нейронах, отвечающих каждый за свой тип фигуры, будут содержаться вероятности того, что именно изображено на картинке.
Прямое и обратное распространение
Движение сигнала вперёд по нейросети называется прямым распространением. Однако как она поймёт, соответствует её предположение действительности или нет? А конкретнее, как она обучается?
Для того чтобы научить нейросеть решать какие-либо задачи, нужно найти аналогичные примеры, у которых уже есть ответы. Их следует представить в виде, понятном нейросети, точно также, как и входные данные.
Поскольку решение представляется в виде набора вероятностей, ответ должен быть таким же. Например, если на рисунке изображён квадрат, то нейрону, отвечающему именно за квадраты, присваивается единица, а за круг — ноль.
На начальном этапе нейросеть будет выдавать случайный результат, поскольку веса назначаются так же случайно. Между полученным и желаемым значениями мы можем найти разницу. По сути, цель обучения — минимизация этой разницы, которая называется функцией ошибки. Тут-то и пригодится математика.
Чтобы нейронная сеть начала выдавать какой-то осмысленный результат, необходимо после каждого тренировочного примера подправлять значения всех её весов. В качестве фактической реализации этой идеи используется метод обратного распространения ошибки, основное понятие которого — градиентный спуск. Его сущность заключается в том, чтобы последовательно пройтись по нейронам и оценить их вклад в конечный результат и, как следствие, в общую ошибку.
Определив ошибку конкретного нейрона, мы обновляем его веса и идём таким же образом дальше до самого начала. Именно поэтому метод называется обратным распространением, только здесь распространяется не сигнал, а сведения об ошибке.
После обновления весов процесс прямого и обратного распространения повторяется ещё множество раз, пока нейросеть не обучится достаточно, чтобы выходить за рамки набора тренировочных данных и быть полезной на реальных.
Заключение
Описанный выше алгоритм — это основа, на которой строятся все нейронные сети, однако наряду с ним существуют и множества других, о которых мы рассказываем вот здесь.