最适合网络开发者的网站
人工智能。初学者课程

尿素

机器学习

学习就是循环

ML 模型是 受过训练 经过循环 多次传输数据。

对于每次迭代, 权重值 已调整。

当迭代未能达到以下要求时,训练完成 降低成本.

训练我找到最佳拟合线:

亲自尝试 »


梯度下降

梯度下降 是一种解决人工智能问题的流行算法。

一个简单的 线性回归模型 可用于演示梯度下降。

线性回归的目标是将线性图拟合到一组 (x,y) 点。这可以用数学公式来解决。但 机器学习算法 也可以解决这个问题。

这就是上面的例子所起的作用。

它以散点图和线性模型(y = wx + b)开始。

然后,它会训练模型找到一条适合该图的线。这是通过改变线的权重(斜率)和偏差(截距)来实现的。

下面是 训练师对象 可以解决这个问题(以及许多其他问题)。


训练师对象

创建一个 Trainer 对象,它可以在两个数组 (xArr,yArr) 中获取任意数量的 (x,y) 值。

将权重和偏差都设置为零。

必须设置一个学习常数(learnc),并且必须定义一个成本变量:

例子

函数训练器(xArray,yArray){
这个.xArr = xArray;
这个.yArr = yArray;
这个.points = 这个.xArr.长度;
这个.学习c = 0.00001;
这个.重量=0;
这个.偏见=1;
这个.成本;

成本函数

解决回归问题的标准方法是使用“成本函数”来衡量解决方案的优劣。

该函数使用模型中的权重和偏差(y = wx + b),并根据线与图的拟合程度返回错误。

计算此误差的方法是循环遍历图中的所有 (x,y) 点,并计算每个点的 y 值与线之间的平方距离之和。

最传统的方法是将距离平方(以确保正值)并使误差函数可微。

this.costError = 函数(){
总计=0;
对于(让 i = 0; i < this.points; i++){
总计 += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias))**2;
  }
返回总数/this.points;
}

另一个名字 成本函数误差函数.

该函数中使用的公式实际上是这样的:

公式
  • 是错误(成本)
  • 是观测值(点)的总数
  • 是每个观察的值(标签)
  • X 是每个观测值(特征)
  • 是斜率(权重)
  • b 是截距(偏差)
  • MX + B 是预测
  • 1/N * N∑1 是平方平均值

训练函数

我们现在将进行梯度下降。

梯度下降算法应该使成本函数趋向于最佳直线。

每次迭代都应将 m 和 b 更新为具有较低成本(误差)的线。

为此,我们添加了一个多次循环遍历所有数据的训练函数:

this.train = 函数(iter){
对于(设 i = 0;i < iter;i++){
这个.更新权重();
  }
这个.成本 = 这个.成本错误();
}

更新权重函数

上面的训练函数应该在每次迭代中更新权重和偏差。

使用两个偏导数来计算移动的方向:

this.updateWeights = 函数(){
让 wx;
让 w_deriv = 0;
让 b_deriv = 0;
对于(让 i = 0; i < this.points; i++){
wx = 这个.yArr[i] - (这个.weight * 这个.xArr[i] + 这个.bias);
w_deriv += -2 * wx * this.xArr[i];
b_deriv += -2 * wx;
  }
这个.重量-=(w_deriv / 这个.points)*这个.learnc;
这个.偏差-=(b_deriv/这个.points)*这个.learnc;
}

创建自己的图书馆

图书馆代码

函数训练器(xArray,yArray){
这个.xArr = xArray;
这个.yArr = yArray;
这个.points = 这个.xArr.长度;
这个.学习c = 0.000001;
这个.重量=0;
这个.偏见=1;
这个.成本;

// 成本函数
this.costError = 函数(){
总计=0;
对于(让 i = 0; i < this.points; i++){
总计 += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias))**2;
  }
返回总数/this.points;
}

// 训练函数
this.train = 函数(iter){
对于(设 i = 0;i < iter;i++){
这个.更新权重();
  }
这个.成本 = 这个.成本错误();
}

// 更新权重函数
this.updateWeights = 函数(){
让 wx;
让 w_deriv = 0;
让 b_deriv = 0;
对于(让 i = 0; i < this.points; i++){
wx = 这个.yArr[i] - (这个.weight * 这个.xArr[i] + 这个.bias);
w_deriv += -2 * wx * this.xArr[i];
b_deriv += -2 * wx;
  }
这个.重量-=(w_deriv / 这个.points)*这个.learnc;
这个.偏差-=(b_deriv/这个.points)*这个.learnc;
}

} // 结束训练器对象

现在您可以将该库包含在 HTML 中:

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

亲自尝试 »