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:
- El número de entradas (no)
- 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);
}