O‘rganish
O‘rganish — bu sikl
ML modeli ma’lumotlar ustida ko‘p marta sikl bajarish orqali o‘qitiladi.
Har bir iteratsiyada vazn qiymatlari tuzatiladi.
Iteratsiyalar endi xarajatni kamaytira olmay qolganda o‘qitish yakunlanadi.
Eng mos chiziqni topish uchun meni o‘qiting:
Gradiyent tushish (Gradient Descent)
Gradiyent tushish — sun’iy intellekt masalalarini yechishda keng qo‘llaniladigan algoritm.
Gradiyent tushishni namoyish qilish uchun oddiy chiziqli regressiya modelidan foydalanish mumkin.
Chiziqli regressiyaning maqsadi — (x,y) nuqtalar to‘plamiga chiziqli grafikni moslashtirish. Buni matematik formula bilan hal qilish mumkin. Ammo buni mashinali o‘rganish algoritmi ham hal qila oladi.
Yuqoridagi misol aynan shuni bajaradi.
U nuqtali diagramma va chiziqli modeldan (y = wx + b) boshlanadi.
So‘ngra diagrammaga mos keladigan chiziqni topish uchun modelni o‘qitadi. Bu chiziqning vazni (qiyaligi) va siljishini (kesishmasini) o‘zgartirish orqali amalga oshiriladi.
Quyida bu masalani (va boshqa ko‘plab masalalarni) hal qila oladigan Trainer obyekti kodi keltirilgan.
Trainer obyekti
Ikkita massivda (xArr,yArr) istalgan miqdordagi (x,y) qiymatlarini qabul qila oladigan Trainer obyektini yarating.
Vaznni nolga, siljishni esa 1 ga teng qilib belgilang.
O‘rganish konstantasi (learnc) belgilanishi va xarajat (cost) o‘zgaruvchisi e’lon qilinishi kerak:
Misol
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;
Xarajat funksiyasi (Cost Function)
Regressiya masalasini yechishning standart usuli — yechim qanchalik yaxshi ekanini o‘lchaydigan "xarajat funksiyasi"dan (Cost Function) foydalanish.
Funksiya modeldagi (y = wx + b) vazn va siljishdan foydalanadi hamda chiziq diagrammaga qanchalik yaxshi mos kelishiga qarab xatolikni qaytaradi.
Bu xatolikni hisoblash uchun diagrammadagi barcha (x,y) nuqtalar bo‘ylab sikl bajariladi va har bir nuqtaning y qiymati bilan chiziq orasidagi masofalar kvadratlari qo‘shib chiqiladi.
Eng keng tarqalgan usul — masofalarni kvadratga oshirish (qiymatlar musbat bo‘lishi uchun) va shu bilan xatolik funksiyasini differensiallanuvchi qilish.
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;
}
Xarajat funksiyasining boshqa nomi — xatolik funksiyasi (Error Function).
Funksiyada ishlatilgan formula aslida quyidagicha:
- E — xatolik (xarajat)
- N — kuzatuvlarning (nuqtalarning) umumiy soni
- y — har bir kuzatuvning qiymati (yorlig‘i)
- x — har bir kuzatuvning qiymati (belgisi)
- m — qiyalik (vazn)
- b — kesishma (siljish)
- mx + b — bashorat
- 1/N * N∑1 — o‘rtacha kvadratik qiymat
O‘qitish funksiyasi
Endi gradiyent tushishni ishga tushiramiz.
Gradiyent tushish algoritmi xarajat funksiyasini eng yaxshi chiziq tomon yo‘naltirishi kerak.
Har bir iteratsiya m va b ni xarajati (xatoligi) kamroq bo‘lgan chiziq tomon yangilashi kerak.
Buning uchun barcha ma’lumotlar bo‘ylab ko‘p marta sikl bajaradigan o‘qitish funksiyasini qo‘shamiz:
this.train = function(iter) {
for (let i = 0; i < iter; i++) {
this.updateWeights();
}
this.cost = this.costError();
}
Vaznlarni yangilash funksiyasi
Yuqoridagi o‘qitish funksiyasi har bir iteratsiyada vaznlar va siljishlarni yangilashi kerak.
Harakat yo‘nalishi ikkita xususiy hosila yordamida hisoblanadi:
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;
}
O‘z kutubxonangizni yarating
Kutubxona kodi
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;
// 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
Endi kutubxonani HTML’ga ulashingiz mumkin:
<script src="myailib.js"></script>
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
