Автор оригинала: FreeCodeCamp Community Member.
В этой статье я покажу вам, как создавать и тренировать нейронную сеть, используя Synaptic.js , что позволяет вам делать глубокое обучение в Node.js и браузере.
Мы будем создавать самую простейшую возможную нейронную сеть: тот, который удается решить Уравнение XOR.
Я также создал интерактивное руководство Scrimba в этом примере, поэтому проверьте это тоже:
Или, если вы заинтересованы в полном курсе по нейронным сетям в JavaScript, пожалуйста, ознакомьтесь с нашими Бесплатный ход на мозгу.js в Scrimba.
Но прежде чем мы посмотрим на код, давайте пройдемся через основные основы нейронных сетей.
Нейроны и синапсы
Первый строительный блок нейронной сети, ну, Нейроны Отказ
Нейрон похож на функцию, требуется несколько входов и возвращает вывод.
Есть много разных типов нейронов. Наша сеть будет использовать Сигмоидные нейроны, которые принимают любое данное количество и выкручивают его на ценность между 0
и 1
Отказ
Круг ниже иллюстрирует сигмоидный нейрон. Его вход – 5
и его выход 1
Отказ Стрелки называются синапсами, которые соединяет нейрон к другим слоям в сети.
Итак, Почему Красный номер 5
? Поскольку это сумма трех синапсов, которые соединяются с нейроном, как показано на трех стрелках слева. Давайте распадаем это.
По данновению мы видим два значения плюс так называемое предвзятость значение. Значения 1
и 0
которые являются зелеными числами. Значение смещения – -2
который является коричневым числом.
Во-первых, два входа умножены со своими Вес , которые являются 7
и 3
Как показано синим номером.
Наконец, мы добавляем его со смещением и в конечном итоге с 5
или красный номер. Это вход для нашего искусственного нейрона.
Поскольку это сигмоидный нейрон, который раздает любое значение от 0 до 1, выход выжимается до 1
Отказ
Если вы подключите сеть этих нейронов вместе, у вас есть нейронная сеть. Это распространяется вперед от ввода на вывод, через нейроны, которые подключены друг к другу через синапсы. Как на изображении ниже:
Целью нейронной сети состоит в том, чтобы тренировать его делать обобщения, такие как распознавание рукописных цифр или по электронной почте SPAM. И быть хорошим в обобщении – вопрос иметь право Вес и предвзятость Значения по сети. Как и с голубыми и коричневыми числами в нашем примере выше.
При обучении сети вы просто показываете его нагрузки на такие примеры, как рукописные цифры, и получать сеть для прогнозирования правильного ответа.
После каждого прогноза вы рассчитаете как неверно Прогноз имел и отрегулировал значения веса и смещения, чтобы сеть будет угадать немного более правильно, в следующий раз. Этот процесс обучения называется обратной проблемой. Делайте это за тысячи раз, и ваша сеть вскоре станет хорошим в обобщении.
Как работает обратная обработка технически за пределами объема этого учебника, но вот три лучших источника, которые я нашел для понимания его:
- Шаг за шагом Пример обратной передачи – по Мэтт Мазур
- Руководство хакеров к нейронным сетянам – по Андрея Карпати
- Neuralnetworksanddeeplarning – по Майкл Нильсен
Код
Теперь, когда вы получили основное введение, давайте прыгнем в код. Первое, что нам нужно сделать, это создать слои. Мы делаем это с Новый слой ()
Функция в синаптике. Число, переданное функцией, диктует, сколько невронов каждый слой должен иметь.
Если вы смущены о том, что a слой есть, проверьте Screencast выше.
const {слой, сеть.synaptic;
VAR слой (2); VAR слой (3); VAR слой (1);
Далее мы соединим эти слои вместе и создали новую сеть, как это:
inputlayer.project (hiddenlayer); hiddenlayer.project (outdlayer);
VAR Network ({Вход: proteglayer, hidden: [hiddenlayer], Выход: outdylayer});
Так что это сеть 2-3-1, которая может быть визуализирована, как это:
Теперь давайте тренируем сеть:
// train the network - learn XOR var learningRate = .3; for (var i = 0; i < 20000; i++) { // 0,0 => 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]
Является ли точка данных, которую мы отправляем в сеть. Это прямое распространение, также называемое Активация сеть. После каждого распространения переднего распространения нам нужно сделать обратное распространение, где сетевая обновляет свои весы и предубеждения.
Отправка выполняется с этой строкой кода: mynetwork.propagate (Унижета, [0])
, где УНИЧЕНИЯ
Это постоянная, которая сообщает сети, насколько она должна регулировать свои веса каждый раз. Второй параметр 0
Представляет правильный выход, учитывая вход [0,0]
Отказ
Затем сеть сравнивает свой прогноз на правильную метку. Это говорит о том, как правильно или неправильно это было.
Он использует сравнение в качестве основы для исправления его собственных весов и значений смещения, чтобы он был догадаться более правильным в следующий раз.
После того, как он сделал этот процесс 20 000 раз, мы можем проверить, насколько хорошо наша сеть изучила, активируя сеть со всеми четырьмя возможными входами:
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]
Если мы округли эти значения к ближайшему целым числу, мы получим правильные ответы на уравнение XOR. Ура!
И это об этом. Несмотря на то, что мы только что поцарапали поверхность нейронных сетей, это должно придать вам достаточно, чтобы начать играть с синаптиком для себя и продолжить обучение самостоятельно. Их вики Содержит много хороших учебников.
Наконец, обязательно поделитесь своими знаниями, создавая Scrimba Screencast или написание статьи, когда вы узнаете что-то новое!:)
PS: У нас есть больше бесплатных курсов для вас!
Если вы ищете свою следующую проблему, у нас есть несколько других бесплатных курсов, которые вы можете проверить на Scrimba.com. Вот три могут быть актуальны для вас:
Счастливое кодирование!