Давайте построим простую нейронную сеть полностью с нуля.
Вступление
В этом руководстве мы построим простую нейронную сеть (однослойный перцептрон) на языке Go полностью с нуля. Мы также обучим его на выборочных данных и сделаем прогнозы. Создание собственной нейронной сети с нуля поможет вам лучше понять, что происходит внутри нейронной сети, и как работают алгоритмы обучения.
Что такое перцептрон?
Персептроны - изобретенные Фрэнком Розенблаттом в 1958 году, представляют собой простейшую нейронную сеть, состоящую из n количества входов, только одного нейрона и один выход, где n - количество функций в нашем наборе данных.
Следовательно, наш однослойный перцептрон состоит из следующих компонентов.
- входной слой (x)
- выходной слой (ŷ)
- Набор весов (w) и смещения (b) между этими два слоя
- функция активации (σ) для выходного слоя. В этом руководстве мы будем использовать функцию активации сигмоида.
Наша нейронная сеть называется однослойным персептроном (SLP), поскольку нейронная сеть имеет только один слой нейронов. Нейронные сети с более чем одним слоем нейронов называются многослойным персептроном (MLP).
(примечание эпоха относится к одному циклу через полный набор обучающих данных)
Прежде, чем мы начнем
Мы создадим собственные функции для следующих математических операций - сложение векторов, скалярное произведение векторов и умножение скалярных матриц.
Первоначально веса нейронной сети устанавливаются на случайные значения с плавающей запятой от 0 до 1, а смещение установлено на ноль.
Прямое распространение
Процесс передачи данных через нейронную сеть известен как прямое распространение или прямой проход. Выход перцептрона:
Вкратце, скалярное произведение вектора веса (w) и входного вектора (x) добавляется с смещением (b), а сумма передается через функцию активации. Выходной сигнал функции активации сигмовидной кишки будет от 0 до 1.
Алгоритм обучения
Алгоритм обучения состоит из двух частей - обратного распространения ошибки и оптимизации.
Обратное распространение, сокращение от обратное распространение ошибок, относится к алгоритму вычисления градиента функции потерь по отношению к весам. Однако этот термин часто используется для обозначения всего алгоритма обучения.
функция потерь используется для оценки того, насколько мы далеки от желаемого решения. Обычно в качестве функции потерь для задач регрессии выбирается среднеквадратичная ошибка, а для задач классификации - кросс-энтропия. Для простоты мы будем использовать среднеквадратичную ошибку в качестве функции потерь. Кроме того, мы не будем вычислять MSE, а будем вычислять его градиент напрямую.
Градиент функции потерь рассчитывается с использованием цепного правила. Градиенты функции потерь относительно весов и смещения рассчитываются следующим образом.
(чтобы получить эти выражения, посмотрите мою статью, в которой я кратко объяснил математические концепции, лежащие в основе нейронных сетей)
Оптимизация - это выбор лучших весов и смещения перцептрона для получения желаемых результатов. Давайте выберем градиентный спуск в качестве нашего алгоритма оптимизации. Веса и смещение обновляются следующим образом до сходимости.
Скорость обучения (α) - это гиперпараметр, который используется для контроля степени изменения весов и смещения. Однако в этом руководстве мы не будем использовать l доход.
Сборка деталей
Теперь давайте потренируемся и сделаем прогнозы из нашей нейронной сети на основе следующих данных. Данные имеют три входа и только один выход, принадлежащий двум классам (0 и 1). Следовательно, данные можно обучать на нашем однослойном персептроне.
Как видите, выход Y зависит только от входа X1. Теперь мы обучим нашу нейронную сеть на приведенных выше данных и проверим, как она работает после 1000 эпох. Чтобы делать прогнозы, нам нужно просто выполнить прямое распространение с тестовыми входными данными.
Когда мы сравниваем предсказанные значения с фактическими значениями, мы видим, что наш обученный однослойный персептрон работает хорошо. Мы успешно создали нейронную сеть и обучили ее добиваться желаемых результатов.
Что дальше?
Теперь вы создали собственную нейронную сеть полностью с нуля. Вот несколько вещей, которые вы должны попробовать дальше.
- Проверьте свои собственные данные
- Попробуйте другие функции активации помимо сигмовидной функции.
- Рассчитывать MSE после каждой эпохи
- Попробуйте другие функции ошибок помимо MSE.
- Попробуйте создать многослойный перцептрон.
Последние мысли
Надеюсь, вы многому научились, создав собственную нейронную сеть на Go. Я буду больше писать по темам, связанным с машинным обучением и глубоким обучением, и, надеюсь, расскажу о многослойном перцептроне в своей следующей статье.
Получите доступ к экспертному обзору - Подпишитесь на DDI Intel