После одного семестра изучения нейронных сетей в университете понимания как они работают у меня не было. Давайте разберем устройство нейронных сетей и устройство обучения, чтобы у тех кто желает начать двигаться в данном направлении было от чего оттолкнуться.
На рисунке 1 показана нейронная сеть. Я не буду использовать научные термины в данной статье, чтобы не грузить. Моя цель - донести понимания, а не загрузить вас непонятными терминами.
Красные точки - входные данные, желтые точки - нейроны, выполняющие расчеты, голубая точка - результат. Как же это работает?
На вход нейронной сети подаются сигналы (от 0 до 1) , далее они корректируются весами, веса устанавливаются случайным образом и после уже корректируются. В процессе обучения у нас есть результат который мы должны получить и есть определенный набор входных данных. Как же это выглядит?
Для понимания устройства я хотел бы разобрать простейшую нейронную сеть, которую мы научим конвертировать валюты. Ниже я привел код на python, чтобы уже более наглядно рассказывать.
Самой первой строкой мы инициализируем веса, в нашем случае это просто 0,5, но при больших объемах обычно используется функция рандома.
Структура нейронной сети такая: на вход подается сигнал в виде единицы, это количество рублей в данном случае, а на выходе наш ожидаемый результат равен 68.
Теперь будем разбирать по порядку выполнения кода. При запуске программы, после инициализации весов у нас выполняется процедура main(). Внутри данной процедуры мы инициализируем входные данные (input_date) и ожидаемый результат (expectedResult), после инициализации мы вызываем процедуру обучения, но при выполнении условия, что ошибка является менее допустимой, (lastError > 0.001).
Теперь давайте рассмотрим процедуру обучения (def Train()). Мы сразу берем переменные вес и ошибка (weight и lastError). Следом мы начинаем обучать. В переменную актуального результат мы записываем результат произведения входных данных и веса. actualResult - данная переменная будет показывать результат работы нейронной сети. Следом мы высчитываем ошибку (lastError) - это разница ожидаемого результата и актуального результата работы сети. Дальше (на 15 строке) и происходит обучение - это расчет коррекции весов. Веса будут подстраиваться и тем самым нейронная сеть будет обучаться. Ошибку поделив на актуальный результат мы получаем коррекцию, но она минимальна и поэтому нам необходима переменная смещения (smooth), чтобы обучение шло быстрее. Важно понимать, чем больше шаг смещения тем меньше точность, под нашу задачу шага в 0,0001 было достаточно. В конце мы подстраиваем веса нашей сети прибавляя число коррекции.
Поле выполнения процедуры обучения у нас опять вызывается процедура main() и так будет до тех пор пока ошибка не будет меньше 0,001, это та ошибка которую мы можем позволить в расчетах.
Дальше нам остается только вызывать раннее написанные процедуры для конвертирования валюты (строки 5 и 7). Поскольку веса у нас подстроены под наши задачи (конвертация валюты из рублей в доллары). Данный пример и статься нацелены не обучить нейронным сетям, цель добиться понимания у читателя как устроены нейронные сети и их основной принцип. Понимая принцип, можно будет углубляться дальше в изучения нейронных сетей и писать нейронные сети уже не с одним входом.