Nauczanie maszynowe

Nauka jest zapętlona

Model ML jest szkolony przez wielokrotne zapętlanie danych.

Dla każdej iteracji dopasowywane są wartości wagi .

Szkolenie jest zakończone, gdy iteracje nie pozwalają zredukować kosztów .

Wytrenuj mnie, aby znaleźć linię najlepiej dopasowaną:


Zejście gradientowe

Gradient Descent to popularny algorytm rozwiązywania problemów AI.

Prosty model regresji liniowej może być użyty do zademonstrowania spadku gradientowego.

Celem regresji liniowej jest dopasowanie wykresu liniowego do zbioru (x,y) punktów. Można to rozwiązać za pomocą wzoru matematycznego. Ale algorytm uczenia maszynowego również może rozwiązać ten problem.

To właśnie robi powyższy przykład.

Zaczyna się od wykresu punktowego i modelu liniowego (y = wx + b).

Następnie trenuje model, aby znaleźć linię pasującą do fabuły. Odbywa się to poprzez zmianę wagi (nachylenia) i odchylenia (przecięcia) linii.

Poniżej znajduje się kod dla obiektu trenera , który może rozwiązać ten problem (i wiele innych problemów).


Obiekt trenera

Utwórz obiekt Trainer, który może przyjmować dowolną liczbę wartości (x,y) w dwóch tablicach (xArr,yArr).

Ustaw zarówno wagę, jak i odchylenie na zero.

Należy ustawić stałą uczenia (learnc) oraz zdefiniować zmienną kosztową:

Przykład

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;

Funkcja kosztów

Standardowym sposobem rozwiązania problemu regresji jest „funkcja kosztu”, która mierzy, jak dobre jest rozwiązanie.

Funkcja wykorzystuje wagę i odchylenie z modelu (y = wx + b) i zwraca błąd na podstawie tego, jak dobrze linia pasuje do wykresu.

Sposobem na obliczenie tego błędu jest wykonanie pętli przez wszystkie (x,y) punkty na wykresie i zsumowanie odległości kwadratowych między wartością y każdego punktu a linią.

Najbardziej konwencjonalnym sposobem jest kwadratura odległości (aby zapewnić wartości dodatnie) i różniczkowalność funkcji błędu.

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

Inną nazwą funkcji kosztów jest funkcja błędu .

Formuła użyta w funkcji jest w rzeczywistości następująca:

Formuła
  • E to błąd (koszt)
  • N to całkowita liczba obserwacji (punktów)
  • y to wartość (etykieta) każdej obserwacji
  • x to wartość (cecha) każdej obserwacji
  • m to nachylenie (waga)
  • b to przechwycenie (bias)
  • mx + b to przewidywanie
  • 1/N * N∑1 is the squared mean value

The Train Function

We will now run a gradient descent.

The gradient descent algorithm should walk the cost function towards the best line.

Each iteration should update both m and b towards a line with a lower cost (error).

To do that, we add a train function that loops over all the data many times:

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

An Update Weights Function

The train function above should update the weights and biases in each iteration.

The direction to move is calculated using two partial derivatives:

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

Create Your Own Library

Library Code

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

Now you can include the library in HTML:

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