Давайте построим простую нейронную сеть полностью с нуля.

Вступление

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

Что такое перцептрон?

Персептроны - изобретенные Фрэнком Розенблаттом в 1958 году, представляют собой простейшую нейронную сеть, состоящую из n количества входов, только одного нейрона и один выход, где n - количество функций в нашем наборе данных.

Следовательно, наш однослойный перцептрон состоит из следующих компонентов.

  1. входной слой (x)
  2. выходной слой (ŷ)
  3. Набор весов (w) и смещения (b) между этими два слоя
  4. функция активации (σ) для выходного слоя. В этом руководстве мы будем использовать функцию активации сигмоида.

Наша нейронная сеть называется однослойным персептроном (SLP), поскольку нейронная сеть имеет только один слой нейронов. Нейронные сети с более чем одним слоем нейронов называются многослойным персептроном (MLP).

(примечание эпоха относится к одному циклу через полный набор обучающих данных)

Прежде, чем мы начнем

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

Первоначально веса нейронной сети устанавливаются на случайные значения с плавающей запятой от 0 до 1, а смещение установлено на ноль.

Прямое распространение

Процесс передачи данных через нейронную сеть известен как прямое распространение или прямой проход. Выход перцептрона:

Вкратце, скалярное произведение вектора веса (w) и входного вектора (x) добавляется с смещением (b), а сумма передается через функцию активации. Выходной сигнал функции активации сигмовидной кишки будет от 0 до 1.

Алгоритм обучения

Алгоритм обучения состоит из двух частей - обратного распространения ошибки и оптимизации.

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



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

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

(чтобы получить эти выражения, посмотрите мою статью, в которой я кратко объяснил математические концепции, лежащие в основе нейронных сетей)

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

Скорость обучения (α) - это гиперпараметр, который используется для контроля степени изменения весов и смещения. Однако в этом руководстве мы не будем использовать l доход.

Сборка деталей

Теперь давайте потренируемся и сделаем прогнозы из нашей нейронной сети на основе следующих данных. Данные имеют три входа и только один выход, принадлежащий двум классам (0 и 1). Следовательно, данные можно обучать на нашем однослойном персептроне.

Как видите, выход Y зависит только от входа X1. Теперь мы обучим нашу нейронную сеть на приведенных выше данных и проверим, как она работает после 1000 эпох. Чтобы делать прогнозы, нам нужно просто выполнить прямое распространение с тестовыми входными данными.

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

Что дальше?

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

  • Проверьте свои собственные данные
  • Попробуйте другие функции активации помимо сигмовидной функции.
  • Рассчитывать MSE после каждой эпохи
  • Попробуйте другие функции ошибок помимо MSE.
  • Попробуйте создать многослойный перцептрон.

Последние мысли

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

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel