机器学习之梯度下降法

AI 摘要用直线拟合案例讲清梯度下降法的目标、过程与背后的直觉。

背景

我把梯度下降法放到了一道题目中:给出了 20 个点,用一条直线拟合这些点。

const data = [
  { x: -20.000, y: -17.641 }, { x: -15.152, y: -14.381 },
  { x: -10.000, y: -9.327 },  { x: -5.000, y: -4.154 },
  { x: 0.000, y: 2.493 },     { x: 5.000, y: 7.882 },
  { x: 10.000, y: 11.264 },   { x: 12.727, y: 15.819 },
  { x: 15.152, y: 17.147 },   { x: 18.787, y: 20.874 },
  { x: 20.000, y: 22.672 },   { x: -18.787, y: -15.874 },
  { x: -12.323, y: -11.486 }, { x: -7.576, y: -7.148 },
  { x: 2.000, y: 5.293 },     { x: 6.768, y: 9.888 },
  { x: 11.414, y: 13.952 },   { x: 13.535, y: 16.384 },
  { x: 16.364, y: 19.241 },   { x: 19.596, y: 21.328 }
];

思路

用 d3 把这些点画出来,大致是 y = x + 2

直线方程 y = ax + b,不断调度 a 和 b 参数以使效果更好。

损失函数

把量化公式称作损失函数(loss 函数)

均方损失函数的好处:不用考虑正负号;数据偏离越大惩罚越大。

问题转换成:如何找到合理的 a 和 b,让公式有最小值。因为选取的是均方损失函数,只有一个极小值,即导数为零就是最小值。

梯度下降法

如果不直接套公式,计算机可以暴力求解,但效率太低。

对于可导的曲线,越接近极小值,导数越小。基于此,将步长乘上该点的导数(-step * dy),在离极小值点远的时候走的更快。

步长的选取

  • 过小:需要花更多时间到达最小值
  • 过大:在最小值附近反复摇摆

多参数情况(偏微分和梯度)

把其中一个未知数当成常数,对另一个未知数求导,称为偏导

它们的组合就是梯度,梯度是一个矢量,沿梯度方向就是下降最快的方向。

分别对 a 和 b 求微分,每次减少对应的值即可完成梯度下降。

性能优化

本质是在求多个线性方程组,所有计算都可以转成线性代数,使用 GPU.js 来计算。

评论补充

激活函数是神经元内部的非线性处理器(如 ReLU),用于逐层传递信号;损失函数则是整个模型预测结果的误差评估器(如交叉熵),指导参数优化方向。