梯度下降法(Gradient Descent)是一种非常重要的优化算法,常用于机器学习中,用来寻找函数的最小值。它的核心思想很简单:就像一个人下山一样,每一步都朝着当前位置最陡峭的方向(即梯度的反方向)走,最终就能走到山谷的最低点。
梯度(Gradient)是什么?
要理解梯度下降,首先要明白“梯度”这个概念。
- 梯度是一个向量,它指向函数值增长最快的方向。
- 梯度的大小表示函数在该方向上的变化率。
- 对于一个多元函数(有多个输入变量),梯度向量的每个分量是函数对相应变量的偏导数。
例如,对于一个简单的函数 \(J(w, b) = w^2 + b^2\):
- 函数对 \(w\) 的偏导数是 \(\frac{\partial J}{\partial w} = 2w\)。
- 函数对 \(b\) 的偏导数是 \(\frac{\partial J}{\partial b} = 2b\)。
- 梯度向量就是 \((\frac{\partial J}{\partial w}, \frac{\partial J}{\partial b}) = (2w, 2b)\)。
这个向量 \((2w, 2b)\) 就指明了在任意点 \((w, b)\) 函数值增长最快的方向。
梯度下降的数学原理
在机器学习中,我们的目标是最小化损失函数(Loss Function)\(J(w)\),它衡量了模型的预测值与真实值之间的差距。这里的 \(w\) 就是模型的参数(比如线性回归中的系数和截距)。
梯度下降法的基本思想是迭代地更新参数 \(w\),使其沿着损失函数梯度的反方向移动。
每次迭代的更新公式可以表示为:
\[w := w - \alpha \nabla J(w)
\]
我们来分解一下这个公式:
- \(w\):需要优化的参数。
- \(:=\):表示赋值操作,即用右侧计算出的新值来更新左侧的变量。
- \(\alpha\):这被称为学习率(Learning Rate),是一个很小的正数。它控制着我们每一步移动的步长。
- 如果 \(\alpha\) 太大,可能会跳过最小值点,导致算法不收敛。
- 如果 \(\alpha\) 太小,算法会收敛得非常慢。
- \(\nabla J(w)\):这是损失函数 \(J(w)\) 的梯度。它告诉我们当前参数 \(w\) 所在位置,函数值增长最快的方向。
- \(-\alpha \nabla J(w)\):这部分是参数的更新量。因为梯度指向增长最快的方向,所以我们沿着其反方向走,才能到达函数的最小值。
梯度下降的步骤
- 初始化参数:随机选择一组参数 \(w\) 的初始值。
- 计算梯度:计算损失函数在当前参数 \(w\) 上的梯度 \(\nabla J(w)\)。
- 更新参数:利用更新公式 \(w := w - \alpha \nabla J(w)\) 来更新参数。
- 重复:重复步骤2和3,直到满足某个停止条件(例如,梯度非常小、损失函数变化很小或达到最大迭代次数)。
线性回归中的梯度下降
以最简单的线性回归为例,其损失函数是均方误差(Mean Squared Error, MSE):
\[J(w) = \frac{1}{2n} \sum_{i=1}^{n}(y_i - (w_0 + w_1x_i))^2
\]
为了使用梯度下降法,我们需要计算 \(J(w)\) 对参数 \(w_0\) 和 \(w_1\) 的偏导数:
\[\frac{\partial J}{\partial w_0} = -\frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)
\]
\[\frac{\partial J}{\partial w_1} = -\frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)x_i
\]
然后,我们就可以根据这些梯度来迭代更新 \(w_0\) 和 \(w_1\):
\[w_0 := w_0 - \alpha (-\frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i))
\]
\[w_1 := w_1 - \alpha (-\frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)x_i)
\]
通过不断重复这个过程,参数 \(w_0\) 和 \(w_1\) 就会逐渐接近使得损失函数最小的最优解。
总结
梯度下降法通过迭代地朝着损失函数梯度的反方向移动,来逐步逼近最优参数,从而最小化损失函数。它是一种通用且强大的优化工具,是许多复杂机器学习模型训练的基础。