线性回归:梯度下降算法#
原页面: https://developers.google.com/machine-learning/crash-course/linear-regression/gradient-descent
梯度下降算法#
「梯度下降(Gradient descent)」是一种数学技术,它通过迭代寻找能够使模型损失最小的权重和偏置。梯度下降会按照用户定义的迭代次数重复以下过程,从而找到最优的权重和偏置。
模型开始训练时,会将权重和偏置初始化为零附近的随机值,然后重复以下步骤:
MLWM: 对于模型的初始化权重参数,不同的初始化策略(随机分布、正态分布、xavier等)有不同的侧重点,初始化为零附近的随机值是一种常见的策略。相关内容可以参见「参数初始化方法:Xavier、Kaiming与正交初始化」 。
-
使用当前的权重和偏置计算损失。
-
确定权重和偏置应该朝哪个方向移动才能减小损失。
-
朝着能够减小损失的方向,将权重和偏置移动一小步。
-
返回第一步,重复上述过程,直到模型无法继续减小损失。
下图概括了梯度下降为找到使模型损失最小的权重和偏置而执行的迭代步骤。
点击了解梯度下降背后的数学原理
具体来说,我们可以使用下面这个包含 7 个样本的小型燃油效率数据集,并使用「均方误差(MSE)」 作为损失指标,演示梯度下降的各个步骤:
| 重量(千磅)(特征) | 每加仑英里数(标签) |
|---|---|
| 3.5 | 18 |
| 3.69 | 15 |
| 3.44 | 18 |
| 3.43 | 16 |
| 4.34 | 15 |
| 4.42 | 14 |
| 2.37 | 24 |
- 将权重和偏置设置为 0,开始训练模型: $$\text{Weight: } 0 $$ $$\text{Bias: } 0 $$ $$y = 0 + 0(x_1)$$
- 使用当前模型参数计算 MSE 损失: $$\text{Loss} = \frac{(18-0)^2 + (15-0)^2 + (18-0)^2 + (16-0)^2 + (15-0)^2 + (14-0)^2 + (24-0)^2}{7} $$ $$\text{Loss}= 303.71 $$
- 计算损失函数在权重和偏置处的切线斜率: $$\text{Weight slope: } -119.7$$ $$\text{Bias slope: } -34.3$$
点击了解如何计算斜率
为了得到权重和偏置处切线的斜率,我们分别对损失函数关于权重和偏置求导,然后解方程。
我们将预测方程写为:$ f_{w,b}(x) = (w*x)+b $,将实际值记为:$ y $。
MSE 的计算公式为:
$$ \frac{1}{M} \sum_{i=1}^{M} (f_{w,b}(x_{(i)}) - y_{(i)})^2 $$其中,$i$ 表示第 $i$ 个训练样本,$M$ 表示样本数量。
权重导数#
损失函数关于权重的导数写为:
$$ \frac{\partial }{\partial w} \frac{1}{M} \sum_{i=1}^{M} (f_{w,b}(x_{(i)}) - y_{(i)})^2 $$其结果为:
$$ \frac{1}{M} \sum_{i=1}^{M} (f_{w,b}(x_{(i)}) - y_{(i)}) * 2x_{(i)} $$首先,将每个预测值减去实际值,再将结果乘以特征值的两倍,然后除以样本数量。结果就是权重处切线的斜率。
如果将权重和偏置都设为 0 并解这个方程,得到的切线斜率为 -119.7。
偏置导数#
损失函数关于偏置的导数写为:
$$ \frac{\partial }{\partial b} \frac{1}{M} \sum_{i=1}^{M} (f_{w,b}(x_{(i)}) - y_{(i)})^2 $$其结果为:
$$ \frac{1}{M} \sum_{i=1}^{M} (f_{w,b}(x_{(i)}) - y_{(i)}) * 2 $$首先,将每个预测值减去实际值,再将结果乘以 2,然后除以样本数量。结果就是偏置处切线的斜率。
如果将权重和偏置都设为 0 并解这个方程,得到的切线斜率为 -34.3。
- 沿着负斜率的方向移动一小步,得到下一组权重和偏置。现在先暂时将“小步长”定义为 0.01:
使用新的权重和偏置重新计算损失,并重复这个过程。完成 6 次迭代后,我们会得到下面的权重、偏置和损失:
| 迭代次数 | 权重 | 偏置 | 损失(MSE) |
|---|---|---|---|
| 1 | 0 | 0 | 303.71 |
| 2 | 1.20 | 0.34 | 170.84 |
| 3 | 2.05 | 0.59 | 103.17 |
| 4 | 2.66 | 0.78 | 68.70 |
| 5 | 3.09 | 0.91 | 51.13 |
| 6 | 3.40 | 1.01 | 42.17 |
可以看到,随着权重和偏置不断更新,损失会逐渐降低。在这个示例中,我们迭代 6 次后就停止了。实际训练模型时,模型会一直训练到「收敛」。当模型收敛时,继续迭代也无法进一步降低损失,因为梯度下降已经找到了使损失接近最小值的权重和偏置。
如果模型在收敛之后继续训练,损失会随着模型不断在最低值附近更新参数而出现小幅波动。这会使我们难以判断模型是否真的已经收敛。为了确认模型已经收敛,需要继续训练,直到损失稳定下来。
更多与梯度下降原理相关的内容可以参见文章「梯度下降推导:线性回归参数迭代求解过程」。
模型收敛与损失曲线#
训练模型时,我们通常会查看「损失曲线」来判断模型是否已经收敛。损失曲线展示了模型在训练过程中损失值随迭代次数的变化情况。下面是一条典型的损失曲线,纵轴表示损失,横轴表示迭代次数:
可以看到,损失在前几次迭代中大幅下降,随后逐渐减小,并在第 1,000 次迭代左右趋于平缓。迭代 1,000 次之后,我们基本可以确定模型已经收敛。
下面的几张图展示了训练过程中3个时间点的模型状态:开始阶段、中间阶段和结束阶段。观察训练过程中的模型状态有助于理解更新权重和偏置、降低损失与模型收敛之间的关系。
在这些图中,我们使用特定迭代次数下计算出的权重和偏置来表示模型。在包含数据点和模型状态的图中,从模型指向数据点的蓝色损失线表示损失大小。损失线越长,损失就越大。
从下图可以看出,在大约第 2 次迭代时,由于损失很大,模型还不适合用于进行预测。
在大约第 400 次迭代时,可以看到梯度下降已经找到了能够产生更好模型的权重和偏置。
在大约第 1,000 次迭代时,可以看到模型已经收敛,并得到了损失值尽可能低的模型。
练习:检查你的理解#
梯度下降在线性回归中起什么作用?
-
A. 梯度下降是一个迭代过程,它会找到能够最小化损失的最优权重和偏置。
-
B. 梯度下降有助于确定训练模型时应该使用哪种损失函数,例如 $L_1$ 或 $L_2$。
-
C. 梯度下降会从数据集中移除异常值,以帮助模型做出更好的预测。
点击查看答案
B. 选择训练模型的损失函数并不涉及梯度下降。
C. 梯度下降不会改变数据集。
收敛与凸函数#
线性模型的损失函数总是会产生一个 「凸(Convex)」 曲面。由于这一特性,当线性回归模型收敛时,我们就知道模型已经找到了能够产生最低损失的权重和偏置。
如果绘制只有一个特征的模型损失曲面,就可以看到它的凸形。下面是假设的燃油效率数据集的损失曲面:横轴表示权重,纵轴表示偏置,z 轴表示损失。
在这个示例中,权重为 -5.44、偏置为 35.94 时,产生的最低损失为 5.54:
当线性回归模型找到最小损失时,就表示它已经收敛。如果绘制梯度下降过程中权重和偏置的各个点,这些点看起来就像一个从山上滚下来的球,最终停在没有向下斜率的位置。
注意: 模型几乎从来不会找到使损失最小的精确权重和偏置值,而是会找到非常接近它们的值。
可以看到,黑色损失点准确勾勒出了损失曲线的形状:先陡峭下降,然后逐渐变缓,直到到达损失曲面的最低点。
注意: 这个点表示模型的最小损失,通常大于 0。损失为 0 意味着模型精确拟合了每一个数据点,这通常是过拟合的信号(也就是说,模型过于复杂或强大)。关于过拟合的更多内容,可参见「过拟合处理方法:常见原因、表现与正则化实战」。
使用产生最低损失值时的权重和偏置值——本例中权重为 -5.44、偏置为 35.94——我们可以绘制模型图,观察它与数据的拟合程度:
这将是通过该数据集训练得到的最佳模型,因为不存在其他权重和偏置值能够产生更低的损失。
关键术语: