Как создать нейронную сеть на JavaScript всего за 30 строк кода

В этой статье я покажу вам, как создать и обучить нейронную сеть с помощью Synaptic.js, который позволяет выполнять глубокое обучение в Node.js и браузере.

Мы создадим простейшую из возможных нейронную сеть: такую, которая решает уравнение XOR.

Я также создал интерактивное руководство по Scrimba для этого примера, так что посмотрите и его:

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

Или, если вас интересует полный курс нейронных сетей на JavaScript, посетите наш бесплатный курс по Brain.js на Scrimba.

Щелкните изображение, чтобы перейти к курсу

Но прежде чем мы посмотрим на код, давайте рассмотрим самые основы нейронных сетей.

Нейроны и синапсы

Первый строительный блок нейронной сети - это нейроны.

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

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

В кружке ниже изображен сигмовидный нейрон. Его вход есть, 5а его выход есть 1. Стрелки называются синапсами, которые соединяют нейрон с другими слоями сети.

Так почему красный номер 5? Потому что это сумма трех синапсов, которые соединяются с нейроном, как показано тремя стрелками слева. Давай распакуем это.

В крайнем левом углу мы видим два значения плюс так называемое значение смещения . Значения 1и 0- зеленые числа. Значение смещения - -2это коричневое число.

Во- первых, два входа умножаются с их весами , которые 7и , 3как показано синими номерами.

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

Поскольку это сигмовидный нейрон, который сжимает любое значение от 0 до 1, выходной сигнал сжимается до 1.

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

Цель нейронной сети - научить ее выполнять обобщения, такие как распознавание рукописных цифр или электронного спама. А умение обобщать - это вопрос наличия правильных весов и значений смещения по всей сети. Как с синими и коричневыми числами в нашем примере выше.

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

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

Технически, как работает обратное распространение, выходит за рамки этого руководства, но вот три лучших источника, которые я нашел для его понимания:

  • Пошаговый пример обратного распространения ошибки - Мэтт Мазур
  • Руководство для хакеров по нейронным сетям - Андрей Карпатий
  • NeuralNetworksAndDeepLarning - Майкл Нильсен

Код

Теперь, когда у вас есть базовое вступление, давайте перейдем к коду. Первое, что нам нужно сделать, это создать слои. Мы делаем это с помощью new Layer()функции synaptic. Число, переданное в функцию, определяет, сколько нейронов должен иметь каждый слой.

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

const {слой, сеть} = window.synaptic;

var inputLayer = новый слой (2);

var hiddenLayer = новый слой (3);

var outputLayer = новый слой (1);

Далее мы соединим эти слои вместе и создадим новую сеть, например:

inputLayer.project (hiddenLayer);

hiddenLayer.project (outputLayer);

var myNetwork = новая сеть ({

ввод: inputLayer,

скрытый: [hiddenLayer],

вывод: outputLayer

});

Итак, это сеть 2–3–1, которую можно визуализировать следующим образом:

Теперь обучим сеть:

// train the network - learn XOR var learningRate = .3; for (var i = 0; i  0 myNetwork.activate([0,0]); myNetwork.propagate(learningRate, [0]); // 0,1 => 1 myNetwork.activate([0,1]); myNetwork.propagate(learningRate, [1]); // 1,0 => 1 myNetwork.activate([1,0]); myNetwork.propagate(learningRate, [1]); // 1,1 => 0 myNetwork.activate([1,1]); myNetwork.propagate(learningRate, [0]); } 

Здесь мы запускаем сеть 20 000 раз. Каждый раз , когда мы размножать вперед и назад в четыре раза, переходящим в четырех возможных входах для этой сети: [0,0] [0,1] [1,0] [1,1].

Начнем с того myNetwork.activate([0,0]), где [0,0]находится точка данных, которую мы отправляем в сеть. Это прямое распространение, также называемое активацией  сети. После каждого прямого распространения нам необходимо выполнить обратное распространение, при котором сеть обновляет свои собственные веса и смещения.

The backpropagation is done with this line of code: myNetwork.propagate(learningRate, [0]), where the learningRate is a constant that tells the network how much it should adjust its weights each time. The second parameter 0 represents the correct output given the input [0,0].

The network then compares its own prediction to the correct label. This tells it how right or wrong it was.

It uses the comparison as a basis for correcting its own weights and bias values so that it will guess a little bit more correct the next time.

After it has done this process 20,000 times, we can check how well our network has learned by activating the network with all four possible inputs:

console.log(myNetwork.activate([0,0])); // -> [0.015020775950893527] console.log(myNetwork.activate([0,1])); // -> [0.9815816381088985] console.log(myNetwork.activate([1,0])); // -> [0.9871822457132193] console.log(myNetwork.activate([1,1])); // -> [0.012950087641929467] 

If we round these values to the closest integer, we’ll get the correct answers for the XOR equation. Hurray!

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

Наконец, не забудьте поделиться своими знаниями, создав скринкаст Scrimba или написав статью, когда узнаете что-то новое! :)

PS: У нас есть для вас больше бесплатных курсов!

Если вы ищете следующий вызов, у нас есть несколько других бесплатных курсов, которые вы можете посетить на Scrimba.com. Вот три, которые могут быть вам полезны:

  • Нейронные сети в JavaScript
  • Введение в ES6 +
  • Изучите D3 JS

Удачного кодирования!