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

En

Машинне навчання

Навчання відбувається за циклом

Модель МН навчається шляхом багаторазового циклічного перегляду даних.

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

Навчання завершено, якщо ітерації не вдається зменшити вартість.

Навчи мене знаходити лінію, яка найкраще підходить:

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


Градієнтне зменшення

Градієнтне зменшення — це популярний алгоритм для розв’язання проблем ШІ.

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

Метою лінійної регресії є підгонка лінійного графіка до набору (x,y) точок. Це можна вирішити за допомогою математичної формули. Але Алгоритм машинного навчання також може розв’язати цю проблему.

Це робить наведений вище приклад.

Починається з точкової діаграми (розсіювання) та лінійної моделі (y = wx + b).

Потім він навчає модель знаходити лінію, яка відповідає сюжету. Це робиться шляхом зміни ваги (нахилу) та зсуву (перехоплення) лінії.

Нижче наведено код для Trainer Object, який може розв’язати цю проблему (і багато інших проблем).


Об’єкт Trainer

Створіть об’єкт Trainer, який може приймати будь-яку кількість значень (x,y) у двох масивах (xArr,yArr).

Встановіть вагу та зсув на нуль.

Потрібно встановити константу навчання (learnc) і визначити змінну вартості:

Приклад

function Trainer(xArray, yArray) {
  this.xArr = xArray;
  this.yArr = yArray;
  this.points = this.xArr.length;
  this.learnc = 0.00001;
  this.weight = 0;
  this.bias = 1;
  this.cost;

Функція вартості

Стандартним способом розв’язання проблеми регресії є "функція вартості", яка вимірює, наскільки хорошим є рішення.

Функція використовує вагу та зміщення з моделі (y = wx + b) і повертає помилку на основі того, наскільки добре лінія відповідає графіку.

Спосіб обчислення цієї похибки полягає в тому, щоб прокрутити всі точки (x,y) на графіку та підсумувати квадрати відстаней між значенням кожної точки та лінією.

Найзвичайнішим способом є зведення відстаней у квадрат (щоб забезпечити додатні значення) і зробити функцію помилки диференційованою.

this.costError = function() {
  total = 0;
  for (let i = 0; i < this.points; i++) {
    total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
  }
  return total / this.points;
}

Інша назва функції витратфункція помилок.

Формула, яка використовується у функції, насправді така:

Формула функції помилок
  • E - це помилка (вартість)
  • N - загальна кількість спостережень (балів)
  • y - це значення (мітка) кожного спостереження
  • x - є значенням (ознакою) кожного спостереження
  • m - це нахил (вага)
  • b - перехоплення (упередження)
  • mx + b - це передбачення
  • 1/N * N∑1 - це квадрат середнього значення

Тренувальна функція

Зараз ми запустимо градієнтне зменшення.

Алгоритм градієнтного зменшення має спрямовувати функцію вартості до найкращої лінії.

Кожна ітерація має оновлювати як m, так і b до рядка з меншою вартістю (помилкою).

Для цього ми додаємо функцію тренування, яка багато разів переглядає (перебирає) всі дані:

this.train = function(iter) {
  for (let i = 0; i < iter; i++) {
    this.updateWeights();
  }
  this.cost = this.costError();
}

Функція оновлення ваг

Наведена вище тренувальна функція має оновлювати ваги та зміщення в кожній ітерації.

Напрямок руху обчислюється за допомогою двох частинних похідних:

this.updateWeights = function() {
  let wx;
  let w_deriv = 0;
  let b_deriv = 0;
  for (let i = 0; i < this.points; i++) {
    wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
    w_deriv += -2 * wx * this.xArr[i];
    b_deriv += -2 * wx;
  }
  this.weight -= (w_deriv / this.points) * this.learnc;
  this.bias -= (b_deriv / this.points) * this.learnc;
}

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

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

function Trainer(xArray, yArray) {
  this.xArr = xArray;
  this.yArr = yArray;
  this.points = this.xArr.length;
  this.learnc = 0.000001;
  this.weight = 0;
  this.bias = 1;
  this.cost;

// Cost Function
this.costError = function() {
  total = 0;
  for (let i = 0; i < this.points; i++) {
    total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
  }
  return total / this.points;
}

// Train Function
this.train = function(iter) {
  for (let i = 0; i < iter; i++) {
    this.updateWeights();
  }
  this.cost = this.costError();
}

// Update Weights Function
this.updateWeights = function() {
  let wx;
  let w_deriv = 0;
  let b_deriv = 0;
  for (let i = 0; i < this.points; i++) {
    wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
    w_deriv += -2 * wx * this.xArr[i];
    b_deriv += -2 * wx;
  }
  this.weight -= (w_deriv / this.points) * this.learnc;
  this.bias -= (b_deriv / this.points) * this.learnc;
}

} // End Trainer Object

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

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

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