Cómo crear una red neuronal en JavaScript en solo 30 líneas de código

En este artículo, le mostraré cómo crear y entrenar una red neuronal usando Synaptic.js, que le permite realizar un aprendizaje profundo en Node.js y el navegador.

Crearemos la red neuronal más simple posible: una que logre resolver la ecuación XOR.

También he creado un tutorial interactivo de Scrimba sobre este ejemplo, así que échale un vistazo también:

En el tutorial de Scrimba, podrás jugar con el código cuando quieras.

O si está interesado en un curso completo sobre redes neuronales en JavaScript, consulte nuestro curso gratuito sobre Brain.js en Scrimba.

Haga clic en la imagen para acceder al curso

Pero antes de mirar el código, repasemos los conceptos básicos de las redes neuronales.

Neuronas y sinapsis

El primer bloque de construcción de una red neuronal son, bueno, las neuronas.

Una neurona es como una función, toma algunas entradas y devuelve una salida.

Hay muchos tipos diferentes de neuronas. Nuestra red utilizará neuronas sigmoides, que toman cualquier número dado y lo reducen a un valor entre 0y 1.

El círculo de abajo ilustra una neurona sigmoidea. Su entrada es 5y su salida es 1. Las flechas se denominan sinapsis, que conectan la neurona con otras capas de la red.

Entonces, ¿ por qué es el número rojo 5? Porque es la suma de las tres sinapsis que se conectan a la neurona como lo muestran las tres flechas a la izquierda. Desempaquetemos eso.

En el extremo izquierdo, vemos dos valores más el llamado valor de sesgo . Los valores son 1y 0cuáles son los números verdes. El valor de sesgo es -2cuál es el número marrón.

Primero, las dos entradas se multiplican por sus pesos , que son 7y 3como se muestra con los números azules.

Finalmente, lo sumamos con el sesgo y terminamos con 5o el número rojo. Esta es la entrada de nuestra neurona artificial.

Como se trata de una neurona sigmoidea que aplasta cualquier valor entre 0 y 1, la salida se reduce a 1.

Si conecta una red de estas neuronas juntas, tiene una red neuronal. Esto se propaga de entrada a salida a través de neuronas que están conectadas entre sí a través de sinapsis. Como en la imagen de abajo:

El objetivo de una red neuronal es entrenarla para hacer generalizaciones, como reconocer dígitos escritos a mano o correo no deseado. Y ser bueno para generalizar es una cuestión de tener las ponderaciones y valores de sesgo adecuados en toda la red. Como con los números azul y marrón en nuestro ejemplo anterior.

Al entrenar la red, simplemente le muestra muchos ejemplos, como dígitos escritos a mano, y hace que la red prediga la respuesta correcta.

Después de cada predicción, calculará qué tan equivocada  fue la predicción y ajustará los pesos y los valores de sesgo para que la red adivine un poco más correctamente la próxima vez. Este proceso de aprendizaje se llama retropropagación. Haga esto miles de veces y su red pronto será buena para generalizar.

El funcionamiento técnico de la retropropagación está fuera del alcance de este tutorial, pero aquí están las tres mejores fuentes que he encontrado para comprenderlo:

  • Un ejemplo de retropropagación paso a paso - por Matt Mazur
  • Guía de hackers sobre redes neuronales - por Andrej Karpathy
  • NeuralNetworksAndDeepLarning - por Michael Nielsen

El código

Ahora que tiene una introducción básica, saltemos al código. Lo primero que debemos hacer es crear las capas. Hacemos esto con la new Layer()función en synaptic. El número pasado a la función dicta cuántas neuronas debe tener cada capa.

Si está confundido acerca de qué es una capa , consulte el screencast de arriba.

const {Capa, Red} = window.synaptic;

var inputLayer = nueva capa (2);

var hiddenLayer = nueva capa (3);

var outputLayer = nueva capa (1);

Next up we’ll connect these layers together and instantiate a new network, like this:

inputLayer.project(hiddenLayer);

hiddenLayer.project(outputLayer);

var myNetwork = new Network({

input: inputLayer,

hidden: [hiddenLayer],

output: outputLayer

});

So this is a 2–3–1 network, which can be visualized like this:

Now let’s train the network:

// 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]); } 

Here we’re running the network 20,000 times. Each time we propagate forward and backwards four times, passing in the four possible inputs for this network: [0,0] [0,1] [1,0] [1,1] .

We start by doing myNetwork.activate([0,0]) , where [0,0] is the data point we’re sending into the network. This is the forward propagation, also called activating  the network. After each forward propagation, we need to do a backpropagation, where the network updates it’s own weights and biases.

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!

Y eso es todo. Aunque acabamos de arañar la superficie de las redes neuronales, esto debería darte lo suficiente para empezar a jugar con Synaptic por ti mismo y seguir aprendiendo por tu cuenta. Su wiki contiene muchos buenos tutoriales.

Finalmente, asegúrese de compartir su conocimiento creando un screencast de Scrimba o escribiendo un artículo cuando aprenda algo nuevo. :)

PD: ¡Tenemos más cursos gratuitos para ti!

Si está buscando su próximo desafío, tenemos varios otros cursos gratuitos que puede consultar en Scrimba.com. Aquí hay tres que podrían ser relevantes para usted:

  • Redes neuronales en JavaScript
  • Introducción a ES6 +
  • Aprenda D3 JS

¡Feliz codificación!