Машинное обучение
Обучение зацикливается
Модель ML обучается путем многократного повторения данных.
Для каждой итерации корректируются значения веса .
Обучение завершается, когда итерации не приводят к снижению стоимости .
Научите меня находить линию наилучшего соответствия:
Градиентный спуск
Градиентный спуск — популярный алгоритм для решения задач ИИ.
Для демонстрации градиентного спуска можно использовать простую модель линейной регрессии .
Цель линейной регрессии — подогнать линейный график к набору (x, y) точек. Это можно решить с помощью математической формулы. Но алгоритм машинного обучения также может решить эту проблему.
Это то, что делает приведенный выше пример.
Он начинается с точечной диаграммы и линейной модели (y = wx + b).
Затем он обучает модель находить линию, соответствующую графику. Это делается путем изменения веса (наклона) и смещения (пересечения) линии.
Ниже приведен код для объекта 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) на графике и суммировать квадратные расстояния между значением 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 - значение (признак) каждого наблюдения
- м уклон (вес)
- b - перехват (смещение)
- mx + b — прогноз
- 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>