НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Штучний інтелект. Уроки для початківців

En

Навчання (тренування) перцептрону

  • Створити об’єкт Perceptron
  • Створити функцію навчання
  • Привчити перцептрон до правильних відповідей

Тренувальне завдання

Уявіть пряму лінію в просторі з розкиданими точками x y.

Навчіть перцептрон класифікувати точки над та під лінією.


Створити об’єкт Perceptron

Створіть об’єкт Perceptron. Назвіть його як завгодно (наприклад, Perceptron).

Нехай перцептрон приймає два параметри:

  1. Кількість вхідних даних (no)
  2. Швидкість навчання (learningRate).

Установіть швидкість навчання за замовчуванням на 0,00001.

Потім створіть випадкові ваги від -1 до 1 для кожного входу.

Приклад

// Об’єкт Perceptron
function Perceptron(no, learningRate = 0.00001) {

// Встановити початкові значення
this.learnc = learningRate;
this.bias = 1;

// Обчислити випадкові ваги
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// Кінець об’єкта Perceptron
}

Випадкові ваги

Перцептрон розпочнеться з випадковою вагою для кожного входу (введення).

Швидкість навчання

Для кожної помилки під час тренування перцептрона ваги коригуватимуться з невеликою часткою.

Ця невелика частка є "швидкістю навчання перцептрона".

В об’єкті Perceptron ми називаємо його learnc.

Упередженість

Іноді, якщо обидва входи дорівнюють нулю, перцептрон може видати неправильне виведення.

Щоб уникнути цього, ми надаємо перцептрону додаткове введення зі значенням 1.

Це називається упередженням.


Додайте функцію активації

Запам’ятайте алгоритм перцептрона:

  • Помножте кожен вхід на ваги перцептрона
  • Підсумуйте результати
  • Обчисліть результат

Приклад

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

Функція активації виведе:

  • 1, якщо сума більша за 0
  • 0, якщо сума менша за 0

Створити функцію навчання

Функція навчання вгадує результат на основі функції активації.

Кожного разу, коли припущення помилкове, перцептрон має коригувати ваги.

Після багатьох припущень і коригувань ваги будуть правильними.

Приклад

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

Спробуйте самі »


Зворотне поширення

Після кожного припущення перцептрон обчислює, наскільки помилковим було припущення.

Якщо припущення неправильне, перцептрон регулює зміщення та ваги, щоб наступного разу припущення було трохи точнішим.

Цей тип навчання називається зворотним поширенням.

Після спроб (кілька тисяч разів) ваш перцептрон надалі стане досить добре вгадувати.


Створити власну бібліотеку

Код бібліотеки

// Об’єкт Perceptron
function Perceptron(no, learningRate = 0.00001) {

// Встановити початкові значення
this.learnc = learningRate;
this.bias = 1;

// Обчислити випадкові ваги
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// Активувати функцію
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}
}

// Функція тренування
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];
    }
  }
}

// Кінець об’єкта Perceptron
}

Тепер ви можете включити бібліотеку в HTML:

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

Використовуйте свою бібліотеку

Приклад

// Ініціалізація значень
const numPoints = 500;
const learningRate = 0.00001;

// Створити плотер
const plotter = new XYPlotter("myCanvas");
plotter.transformXY();
const xMax = plotter.xMax;
const yMax = plotter.yMax;
const xMin = plotter.xMin;
const yMin = plotter.yMin;

// Створити рандомні XY точки
const xPoints = [];
const yPoints = [];
for (let i = 0; i < numPoints; i++) {
  xPoints[i] = Math.random() * xMax;
  yPoints[i] = Math.random() * yMax;
}

// Лінійна функція
function f(x) {
  return x * 1.2 + 50;
}

// Накреслити лінію
plotter.plotLine(xMin, f(xMin), xMax, f(xMax), "black");

// Обчислити бажані відповіді
const desired = [];
for (let i = 0; i < numPoints; i++) {
  desired[i] = 0;
  if (yPoints[i] > f(xPoints[i])) {desired[i] = 1}
}

// Створити перцептрон
const ptron = new Perceptron(2, learningRate);

// Навчити перцептрон
for (let j = 0; j <= 10000; j++) {
  for (let i = 0; i < numPoints; i++) {
    ptron.train([xPoints[i], yPoints[i]], desired[i]);
  }
}

// Відобразити результат
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);
}

Спробуйте самі »