Entrenamiento de un perceptrón

  • Crear un objeto perceptrón
  • Crear una función de entrenamiento
  • Entrena al perceptrón contra las respuestas deseadas

Tarea de entrenamiento

Imagina una línea recta en un espacio con puntos xy dispersos.

Entrena un perceptrón para clasificar los puntos por encima y por debajo de la línea.


Crear un objeto perceptrón

Cree un objeto Perceptrón. Nómbralo como quieras (como Perceptron).

Deje que el perceptrón acepte dos parámetros:

  1. El número de entradas (no)
  2. La tasa de aprendizaje (learningRate).

Establezca la tasa de aprendizaje predeterminada en 0,00001.

Luego cree pesos aleatorios entre -1 y 1 para cada entrada.

Ejemplo

// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {

// Set Initial Values
this.learnc = learningRate;
this.bias = 1;

// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// End Perceptron Object
}

Los pesos aleatorios

El Perceptron comenzará con un peso aleatorio para cada entrada.

La tasa de aprendizaje

Por cada error, mientras se entrena el Perceptron, los pesos se ajustarán con una pequeña fracción.

Esta pequeña fracción es la " tasa de aprendizaje de Perceptron ".

En el objeto Perceptron lo llamamos learnc .

el sesgo

A veces, si ambas entradas son cero, el perceptrón puede producir una salida incorrecta.

Para evitar esto, le damos al perceptrón una entrada extra con el valor de 1.

Esto se llama un sesgo .


Agregar una función de activación

Recuerda el algoritmo del perceptrón:

  • Multiplique cada entrada con los pesos del perceptrón
  • Suma los resultados
  • Calcular el resultado

Ejemplo

this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs[i] * this.weights[i];
  }
  if (sum > 0) {return 1} else {return 0}
}

La función de activación generará:

  • 1 si la suma es mayor que 0
  • 0 si la suma es menor que 0

Crear una función de entrenamiento

La función de entrenamiento adivina el resultado en función de la función de activación.

Cada vez que la conjetura es incorrecta, el perceptrón debe ajustar los pesos.

Después de muchas conjeturas y ajustes, los pesos serán correctos.

Ejemplo

this.train = function(inputs, desired) {
  inputs.push(this.bias);
  let guess = this.activate(inputs);
  let error = desired - guess;
  if (error != 0) {
    for (let i = 0; i < inputs.length; i++) {
      this.weights[i] += this.learnc * error * inputs[i];
    }
  }
}


retropropagación

Después de cada suposición, el perceptrón calcula qué tan equivocada fue la suposición.

Si la suposición es incorrecta, el perceptrón ajusta el sesgo y los pesos para que la suposición sea un poco más correcta la próxima vez.

Este tipo de aprendizaje se llama retropropagación .

Después de intentarlo (unos cuantos miles de veces), su perceptrón se volverá bastante bueno para adivinar.


Crea tu propia biblioteca

Código de biblioteca

// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {

// Set Initial Values
this.learnc = learningRate;
this.bias = 1;

// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// Activate Function
this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs[i] * this.weights[i];
  }
  if (sum > 0) {return 1} else {return 0}
}

// Train Function
this.train = function(inputs, desired) {
  inputs.push(this.bias);
  let guess = this.activate(inputs);
  let error = desired - guess;
  if (error != 0) {
    for (let i = 0; i < inputs.length; i++) {
      this.weights[i] += this.learnc * error * inputs[i];
    }
  }
}

// End Perceptron Object
}

Ahora puede incluir la biblioteca en HTML:

<script src="myperceptron.js"></script>

Usa tu biblioteca

Ejemplo

// Initiate Values
const numPoints = 500;
const learningRate = 0.00001;

// Create a Plotter
const plotter = new XYPlotter("myCanvas");
plotter.transformXY();
const xMax = plotter.xMax;
const yMax = plotter.yMax;
const xMin = plotter.xMin;
const yMin = plotter.yMin;

// Create Random XY Points
const xPoints = [];
const yPoints = [];
for (let i = 0; i < numPoints; i++) {
  xPoints[i] = Math.random() * xMax;
  yPoints[i] = Math.random() * yMax;
}

// Line Function
function f(x) {
  return x * 1.2 + 50;
}

//Plot the Line
plotter.plotLine(xMin, f(xMin), xMax, f(xMax), "black");

// Compute Desired Answers
const desired = [];
for (let i = 0; i < numPoints; i++) {
  desired[i] = 0;
  if (yPoints[i] > f(xPoints[i])) {desired[i] = 1}
}

// Create a Perceptron
const ptron = new Perceptron(2, learningRate);

// Train the Perceptron
for (let j = 0; j <= 10000; j++) {
  for (let i = 0; i < numPoints; i++) {
    ptron.train([xPoints[i], yPoints[i]], desired[i]);
  }
}

// Display the Result
for (let i = 0; i < numPoints; i++) {
  const x = xPoints[i];
  const y = yPoints[i];
  let guess = ptron.activate([x, y, ptron.bias]);
  let color = "black";
  if (guess == 0) color = "blue";
  plotter.plotPoint(x, y, color);
}