Рубрики
Без рубрики

Нейронные сети в JavaScript с Brain.js

Автор оригинала: Scott Robinson.

Вступление

За последние несколько лет, особенно, нейронные сети (NNS) действительно снимались как практичный и эффективный способ решения проблем, которые нельзя легко решить алгоритмом, как обнаружение лица, распознавание голоса и медицинскую диагностику. Это во многом благодаря недавним открытиям о том, как лучше тренироваться и настроить сеть, а также увеличение скорости компьютеров.

Совсем недавно студент в Imperial College London создал NNS, называемые Жираф Это может быть обучено всего в 72 часах, чтобы играть в шахматы на том же уровне, что и Fide International Master. Компьютеры, играющие в шахматы на этом уровне, не совсем новы, но, как была создана эта программа это новый. Эти программы обычно занимают годы, чтобы построить и настраиваются с помощью настоящего гроссмейстера, а жираф, с другой стороны, был построен просто используя глубокую нейронную сеть, какое-то творчество и огромный набор данных шахматных игр. Это еще один пример обещательных нейронных сетей недавно показал, и они только собираются улучшить.

Мозги.js.

Недостатком до ННС и искусственный интеллект в целом, заключается в том, что поле очень математика, которое имеет тенденцию отпугивать людей от того, как они даже начнутся. Высокотехнический характер NNS и весь жаргон, который идет вместе с этим, делает его трудно для неиниктированного, чтобы воспользоваться преимуществами. Это где Мозги.js приходит играть в игру. Brain.js делает отличную работу, упрощая процесс создания и обучения NN, используя простоту использования JavaScript и ограничивая API только к нескольким вызовам и опциям метода.

Не поймите меня неправильно, вам все еще нужно знать некоторые понятия позади NNS, но это упрощение делает его намного менее пугающим.

Например, тренировать сеть до приближения Хор Функция (которая является одним из стандартных примеров NN), все, что вам нужно:

var brain = require('brain');

var net = new brain.NeuralNetwork();

net.train([{input: [0, 0], output: [0]},
           {input: [0, 1], output: [1]},
           {input: [1, 0], output: [1]},
           {input: [1, 1], output: [0]}]);

var output = net.run([1, 0]);  // [0.933]

Этот код просто создает новую сеть ( net ), Поезд S сеть, используя массив примеров, а затем Беги S сеть с входом [1, 0] , что правильно приводит к [0,933] (ака 1 ).

В то время как Brain.js не имеет тонны параметров, чтобы позволить вам настроить свои сети, API принимает достаточно параметров, чтобы сделать его полезным для простых приложений. Вы можете установить номер и размер ваших скрытых слоев, порогового значения ошибок, скорость обучения и более:

var net = new brain.NeuralNetwork({
	hiddenLayers: [128,64]
});

net.train({
	errorThresh: 0.005,  // error threshold to reach before completion
	iterations: 20000,   // maximum training iterations 
	log: true,           // console.log() progress periodically 
	logPeriod: 10,       // number of iterations between logging 
	learningRate: 0.3    // learning rate 
});

Смотрите документацию для полного списка опций.

Хотя вы ограничены в типах сетей, которые вы можете построить, это не значит, что вы не можете сделать что-то значимое. Возьми Этот проект Например. Автор собрал кучу изображений CAPTCHA для его набора данных, использовал некоторую простую обработку изображений для предварительного обработки изображений, а затем использовал Brain.js для создания нейронной сети, которая идентифицирует каждый отдельный характер.

Преимущества

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

Высокоузначные/вычислительные библиотеки, написанные в JavaScript, как это, как правило, получают критиковал довольно сильно Но лично я думаю, что Brain.js имеет свое место в JS до тех пор, пока у вас есть правильные ожидания и применение. Например, JS является доминирующим (только?) Язык работает на стороне клиента в браузере, поэтому почему бы не воспользоваться этой библиотекой для таких вещей, как в браузерах, размещение рекламы (скучно, я знаю) или распознавание персонажей?

Недостатки

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

Вероятно, моя самая большая жалоба состоит в том, что библиотека написана в чистый JavaScript. Обучение NN является медленным процессом, который может принимать тысячи итераций (означающих миллионы или миллиарды операций) для обучения на миллионах точек данных. JavaScript не является быстрым языком любыми средствами и надо иметь Аддоны Для таких вещей, чтобы ускорить вычисления во время обучения. CAPTCHA Cracker сверху принял удивительно низкое время обучения 20 минут, но все, что нужно, это еще несколько входов, а некоторые больше данных для увеличения времени обучения на несколько часов или даже дней, как вы увидите в моем примере ниже.

К сожалению, эта библиотека уже оставлена его автором (описание GitHub предложено «[ненаправленным]»). Пока я получу, что это может быть трудно поддерживать требования популярной библиотеки с открытым исходным кодом, она все еще разочаровывает, и мы можем только надеяться, что кто-то Квалифицированные может заполнить пустоту. Я уверен, что есть хорошая вилка уже в работах, но может принять некоторые поиски, чтобы найти его.

Пример

Здесь я покажу вам немного большего вовлеченного примера того, как использовать мозг. В этом примере я создал NN, который может распознать одну рукописную цифру (0-9). Набор данных, который я использую, является популярным Мнист DataSet, который содержит более 50 000 образцов рукописных цифр. Эта проблема известна как распознавание оптического характера ( OCR ), что является популярным применением NNS.

Распознавание работает, принимая во внимание 28×28 графического изображения рукописной цифры и выводит цифру, которую сеть считает ее «пилой». Это означает, что у нас будет 784 входов (один для каждого пикселя) со значениями от 0 до 555, и будет 10 выходов (по одному для каждой цифры). Каждый выход будет иметь значение 0-1, по сути, действующему как уровень доверия, что конкретная цифра является правильным ответом. Самая высокая доверительная стоимость тогда наш ответ.

На код:

var brain = require('brain');
var fs = require('fs');

var getMnistData = function(content) {
	var lines = content.toString().split('\n');

	var data = [];
	for (var i = 0; i < lines.length; i++) {
		var input = lines[i].split(',').map(Number);

		var output = Array.apply(null, Array(10)).map(Number.prototype.valueOf, 0);
		output[input.shift()] = 1;

		data.push({
			input: input,
			output: output
		});
	}

	return data;
};

fs.readFile(__dirname + '/train.csv', function (err, trainContent) {
	if (err) {
		console.log('Error:', err);
	}

	var trainData = getMnistData(trainContent);

	console.log('Got ' + trainData.length + ' samples');

	var net = new brain.NeuralNetwork({hiddenLayers: [784, 392, 196]});

	net.train(trainData, {
		errorThresh: 0.025,
		log: true,
		logPeriod: 1,
		learningRate: 0.1
	});
});

rain.csv Файл – это просто CSV с одним изображением в строке. Первое значение – это цифра, показанная на изображении, а следующие значения 784 являются данными пикселей.

Количество слоев и узлов, которые я выбрал, был немного произвольным, и, вероятно, излишне высоким для этого приложения OCR. Однако, когда вы не можете воспользоваться такими вещами, как SoftMaxes или объединение, вам может возникнуть удачи пристройку количества слоев и количество узлов.

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

Чтобы проверить сеть, я загрузил другой файл, test.csv и использовал это как базовый уровень для сравнения сетях. Таким образом, мы получаем лучшее представление о производительности, поскольку мы тестируем входы, которые сеть еще не обучена.

Вот как я проверил сеть (я показываю только соответствующие части):

// Require packages...

fs.readFile(__dirname + '/test.csv', function (err, testContent) {
	if (err) {
		console.log('Error:', err);
	}

	// Load training data...

	// Train network...

	// Test it out
	var testData = getMnistData(testContent);

	var numRight = 0;

	console.log('Neural Network tests:');
	for (i = 0; i < testData.length; i++) {
		var resultArr = net.run(testData[i].input);
		var result = resultArr.indexOf(Math.max.apply(Math, resultArr));
		var actual = testData[i].output.indexOf(Math.max.apply(Math, testData[i].output));

		var str = '(' + i + ') GOT: ' + result + ', ACTUAL: ' + actual;
		str += result === actual ? '' : ' -- WRONG!';

		numRight += result === actual ? 1 : 0;

		console.log(str);
	}

	console.log('Got', numRight, 'out of 350, or ' + String(100*(numRight/350)) + '%');
});

Заключение

Хотя есть некоторые недостатки, в целом, я думаю, Brain.js может быть очень полезен и добавить много ценного для приложений JavaScript/Node. Его простое использование должно позволить практически никто начать с нейронных сетей.

Если вы хотите что-то с большей гибкостью, или вы беспокоитесь о отсутствии поддержки Mink.js, посмотрите на Синаптический , который позволяет гораздо больше настроить в вашей сетевой архитектуре. У него нет достаточно популярности/внимания, который имеет мозг, но кажется, что следующий лучший выбор для нейронных сетей в JavaScript.

Какой твой опыт работы с Brain.js? Есть ли другие пакеты AI, которые вы рекомендуете? Дайте нам знать об этом в комментариях!