Treinando um Perceptron

  • Criar um objeto Perceptron
  • Criar uma função de treinamento
  • Treine o perceptron contra as respostas desejadas

Tarefa de treinamento

Imagine uma linha reta em um espaço com pontos xy espalhados.

Treine um perceptron para classificar os pontos acima e abaixo da linha.


Criar um objeto Perceptron

Crie um objeto Perceptron. Nomeie qualquer coisa (como Perceptron).

Deixe o perceptron aceitar dois parâmetros:

  1. O número de entradas (não)
  2. A taxa de aprendizagem (learningRate).

Defina a taxa de aprendizado padrão para 0,00001.

Em seguida, crie pesos aleatórios entre -1 e 1 para cada entrada.

Exemplo

// 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
}

Os pesos aleatórios

O Perceptron iniciará com um peso aleatório para cada entrada.

A Taxa de Aprendizagem

Para cada erro, durante o treinamento do Perceptron, os pesos serão ajustados com uma pequena fração.

Esta pequena fração é a " taxa de aprendizado do Perceptron ".

No objeto Perceptron nós o chamamos de learnc .

O preconceito

Às vezes, se ambas as entradas forem zero, o perceptron pode produzir uma saída correta.

Para evitar isso, damos ao perceptron uma entrada extra com o valor 1.

Isso é chamado de preconceito .


Adicionar uma função de ativação

Lembre-se do algoritmo perceptron:

  • Multiplique cada entrada pelos pesos do perceptron
  • Soma os resultados
  • Calcule o resultado

Exemplo

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}
}

A função de ativação produzirá:

  • 1 se a soma for maior que 0
  • 0 se a soma for menor que 0

Criar uma função de treinamento

A função de treinamento adivinha o resultado com base na função de ativação.

Toda vez que o palpite estiver errado, o perceptron deve ajustar os pesos.

Depois de muitas suposições e ajustes, os pesos estarão corretos.

Exemplo

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


Retropropagação

Após cada palpite, o perceptron calcula o quão errado o palpite estava.

Se o palpite estiver errado, o perceptron ajusta o viés e os pesos para que o palpite seja um pouco mais correto na próxima vez.

Esse tipo de aprendizado é chamado de retropropagação .

Depois de tentar (alguns milhares de vezes), seu perceptron se tornará muito bom em adivinhar.


Crie sua própria biblioteca

Código da 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
}

Agora você pode incluir a biblioteca em HTML:

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

Use sua biblioteca

Exemplo

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