機器學習
迴圈學習
ML 模型透過多次迴圈資料來訓練。
每次迭代都會調整權重值。
當迭代無法降低成本時,訓練完成。
訓練我找到最佳擬合線
梯度下降
梯度下降是解決 AI 問題的流行演算法。
簡單的線性迴歸模型可用於演示梯度下降。
線性迴歸的目標是將線性圖擬合到一組 (x,y) 點。這可以用數學公式解決。但機器學習演算法也可以解決這個問題。
以上示例就是這樣做的。
它從散點圖和線性模型(y = wx + b)開始。
然後它訓練模型來找到一條適合該圖的線。這是透過更改線的權重(斜率)和偏差(截距)來完成的。
下面是一個可以解決此問題(以及許多其他問題)的Trainer 物件的程式碼。
Trainer 物件
建立一個 Trainer 物件,它可以接受任意數量的 (x,y) 值到兩個陣列(xArr, yArr)中。
將權重設定為零,偏差設定為 1。
必須設定學習常數(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 更新為成本(誤差)更低的那條線。
為此,我們添加了一個 train 函式,該函式會多次遍歷所有資料
this.train = function(iter) {
for (let i = 0; i < iter; i++) {
this.updateWeights();
}
this.cost = this.costError();
}
更新權重函式
上面的 train 函式應該在每次迭代中更新權重和偏差。
移動的方向是使用兩個偏導數計算的
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.00001;
this.weight = 0;
this.bias = 1;
this.cost;
// 成本函式
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;
}
// 訓練函式
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;
}
} // Trainer 物件結束
現在你可以在 HTML 中包含該庫
<script src="myailib.js"></script>