Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Привет. Меня зовут Андрей, я фронтенд-разработчик и хочу поговорить с вами на такую тему, как нейронные сети.

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

  1. Возьмем Tensorflow
  2. Создание нейронной сети
Более подробная информация разбросана кусками по всему Интернету.

Поэтому я постарался собрать это воедино и представить в этой статье.

Сразу оговорюсь, я не специалист ни в ОД, ни в биологии, поэтому могу быть кое-где не точен.

В таком случае буду рад вашим комментариям.

Пока я писал эту статью, я понял, что создаю довольно объёмный лонгрид, поэтому решил разбить его на несколько частей.

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

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

Итак, давайте начнем.

Нейронная сеть своими руками с нуля.

Часть 2. Реализация Нейронная сеть своими руками с нуля.

Часть 3. Грустно или радостно?



Для чего нужны нейронные сети?

Нейронные сети встречаются повсюду.

Их основная функция – управление различными частями тела в зависимости от изменения условий внешней среды.

В качестве примера можно рассмотреть механизм сужения и расширения зрачка в зависимости от уровня освещенности.

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

Они преобразуют эту информацию в электрические импульсы и передают их прикрепленным к ним нервным окончаниям.

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

света .

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

И таких механизмов в организме любого живого существа, имеющего нервную систему, огромное количество.





Нейронное устройство

Нейронные сети встречаются в природе в виде нервной системы существа.

В зависимости от функции и расположения они подразделяются на различные отделы и органы, например головной, спинной мозг и различные проводящие структуры.

Но всех их объединяет одно – они состоят из взаимосвязанных структурных и функциональных единиц – нейронных клеток.

Нейрон можно условно разделить на три части: тело нейрона и его отростки — дендриты и аксон.



Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

Дендриты нейрона создают дендритное дерево, размер которого зависит от количества контактов с другими нейронами.

Это своего рода входные каналы нервной клетки.

Именно с их помощью нейрон получает сигналы от других нейронов.

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

.

Аксон — это выходной интерфейс нейрона.

Он прикрепляется так называемыми синапсами к дендриту другого нейрона, и через него сигнал, выходящий из тела нейрона, поступает в следующую клетку нашей нейронной сети.



Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">



Нейронные сети в ИТ

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

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

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

И, наконец, у нас есть выходные нейроны.

По поступающим от них сигналам мы можем судить о решении, принятом нейросетью.



Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

Эта простейшая версия нейронной сети называется перцептроном, и именно ее мы попытаемся воссоздать.

Все нейроны по сути одинаковы и принимают решения о том, какую мощность сигнала передавать дальше, используя один и тот же алгоритм.

Этот алгоритм называется функция активации .

Он получает на вход сумму значений входных сигналов и передает на выход значение выходного сигнала.

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

Таким образом, мы могли бы заменить всю нашу сеть одним нейроном.

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

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

И тут мы подходим к самому интересному.

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

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

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

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





Добавим немного математики.

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

Для нашего примера мы возьмем сигмовидную.

Он существует на интервале от минус бесконечности до бесконечности, плавно меняется от 0 до 1 и имеет значение 0,5 в точке 0. Идеальный кандидат. Это выглядит так:

Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

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

Итак, давайте рассмотрим пример с рассмотренной выше топологией сети.

У нас есть три входных нейрона со значениями ИСТИНА, ЛОЖЬ и ИСТИНА соответственно, два нейрона в среднем слое нейронной сети (эти слои еще называют скрытыми) и один выходной нейрон, который сообщит нам о принятом решении.

нейронная сеть.

Поскольку наша сеть еще не обучена, значения весов на входах нейронов будем принимать случайными в диапазоне от -0,5 до 0,5. Таким образом, сумма входных значений первого нейрона скрытого слоя будет равна 1 * 0,43 + 0 * 0,18 + 1 * -0,21 = 0,22 Передав это значение в функцию активации, мы получим значение, которое наш нейрон передаст дальше по сети на следующий слой.

сигмоид (0,22) = 1/(1 + е^-0,22) = 0,55 Аналогичные операции проделываем для второго нейрона скрытого слоя и получаем значение 0,60. И, наконец, мы повторяем эти операции для одного нейрона выходного слоя нашей нейронной сети и получаем значение 0,60, которое мы договорились считать истинным.



Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

Пока что это полностью случайная величина, поскольку веса мы выбрали случайным образом.

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

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

Прежде всего, посчитаем ошибку на выходе сети.

Делается это довольно просто, нам всего лишь нужно получить разницу между полученным значением и ожидаемым.

ошибка = 0,60 - 0 = 0,60 Чтобы узнать, насколько нам нужно изменить веса нашего нейрона, нам нужно умножить значение ошибки на производную нашей функции активации в этой точке.

К счастью, производная сигмовидной довольно проста.



Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

Таким образом, наши дельта-веса будут равны дельта = 0,60 * (1 – 0,60) = 0,24 Новый вес входа нейрона рассчитывается по формуле вес = вес - выход * дельта * скорость обучения Где вес — текущий вес, выход — значение на выходе предыдущего нейрона, дельта — это дельта весов, которые мы рассчитали ранее, а скорость обучения — значение, подобранное экспериментально, от которого зависит скорость обучения нейронной сети.

зависит от. Если он слишком мал, нейронная сеть будет более чувствительна к деталям, но будет обучаться слишком медленно, и наоборот. Например, возьмем скорость обучения равной 0,3. Таким образом, новый вес для первого входа выходного нейрона будет равен: ш = 0,22 - 0,55 * 0,24 * 0,3 = 0,18 Аналогично вычисляем новый вес для второго входа выходного нейрона: ш = 0,47 - 0,60 * 0,24 * 0,3 = 0,43

Нейронная Сеть Своими Руками С Нуля. Часть 1. Теория

Часть 1. Теория" alt="Нейронная сеть своими руками с нуля.

Часть 1. Теория">

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

Это делается не так очевидно, как для выходного нейрона, но тоже довольно просто.

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

Таким образом, ошибка первого нейрона скрытого слоя равна: ошибка = 0,18 * 0,24 = 0,04 Теперь, зная ошибку нейрона, мы можем выполнить все те же операции, которые мы выполняли ранее, и скорректировать его веса.

Этот процесс называется обратным распространением ошибки.

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

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

Теги: #Популярная наука #программирование #нейронные сети #JavaScript #ml

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2012-04-12 14:51:55
Баллов опыта: 542
Всего постов на сайте: 1
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.