Huấn luyện Perceptron

  • Tạo một đối tượng Perceptron
  • Tạo một chức năng đào tạo
  • Huấn luyện perceptron với các câu trả lời mong muốn

Nhiệm vụ đào tạo

Hãy tưởng tượng một đường thẳng trong không gian có các điểm xy nằm rải rác.

Huấn luyện một perceptron để phân loại các điểm trên và dưới dòng.


Tạo một đối tượng Perceptron

Tạo một đối tượng Perceptron. Đặt tên cho nó là bất kỳ thứ gì (như Perceptron).

Hãy để perceptron chấp nhận hai tham số:

  1. Số lượng đầu vào (không)
  2. Tỷ lệ học tập (learningRate).

Đặt tốc độ học mặc định thành 0,00001.

Sau đó, tạo trọng số ngẫu nhiên từ -1 đến 1 cho mỗi đầu vào.

Thí dụ

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

Trọng lượng ngẫu nhiên

Perceptron sẽ bắt đầu với trọng số ngẫu nhiên cho mỗi đầu vào.

Tỷ lệ học tập

Đối với mỗi sai lầm, trong khi huấn luyện Perceptron, trọng lượng sẽ được điều chỉnh lại với một phần nhỏ.

Phần nhỏ này là " tốc độ học tập của Perceptron ".

Trong đối tượng Perceptron, chúng tôi gọi nó là learningnc .

Sự thiện vị

Đôi khi, nếu cả hai đầu vào đều bằng 0, thì perceptron có thể tạo ra một đầu ra đúng.

Để tránh điều này, chúng tôi cung cấp cho perceptron một đầu vào bổ sung với giá trị 1.

Đây được gọi là sự thiên vị .


Thêm một chức năng kích hoạt

Hãy nhớ thuật toán perceptron:

  • Nhân từng đầu vào với trọng số của perceptron
  • Tính tổng kết quả
  • Tính toán kết quả

Thí dụ

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

Chức năng kích hoạt sẽ xuất ra:

  • 1 nếu tổng lớn hơn 0
  • 0 nếu tổng nhỏ hơn 0

Tạo một chức năng đào tạo

Chức năng huấn luyện đoán kết quả dựa trên chức năng kích hoạt.

Mỗi khi đoán sai, perceptron nên điều chỉnh trọng số.

Sau nhiều lần đoán và điều chỉnh, các quả cân sẽ chính xác.

Thí dụ

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


Lan truyền ngược

Sau mỗi lần đoán, perceptron sẽ tính toán mức độ sai của đoán.

Nếu đoán sai, perceptron sẽ điều chỉnh độ lệch và trọng số để lần sau đoán sẽ đúng hơn một chút.

Kiểu học tập này được gọi là truyền bá ngược ( backpropagation ).

Sau khi thử (vài nghìn lần) perceptron của bạn sẽ trở nên khá giỏi trong việc đoán.


Tạo thư viện của riêng bạn

Mã thư viện

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

Bây giờ bạn có thể bao gồm thư viện trong HTML:

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

Sử dụng thư viện của bạn

Thí dụ

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