Back ay4's blog · blog

01 线性回归:用直线建模并预测连续数值

2,200 words 5 min read #机器学习

01 线性回归:用直线建模并预测连续数值

线性回归用来描述变量之间的关系。放到机器学习里,它做的事很直接:给模型一些输入特征,让模型预测一个连续数值。

比如用汽车重量预测油耗。一般来说,车越重,每加仑汽油能跑的英里数越少。线性回归会根据已有数据找一条比较合适的直线,再用这条直线做预测。

汽车重量和油耗数据,以及拟合出来的直线

图 1. 汽车重量(以磅为单位)与每加仑汽油能行驶的英里数评级。汽车越重,每加仑燃油行驶里程数通常越低。

1. 模型长什么样

最简单的一元线性回归就是一条直线:

y = m * x + b

在机器学习里,常写成:

y' = b + w1 * x1

这几个符号可以先这样理解:

  • y':模型预测出来的值。
  • x1:输入特征。
  • w1:这个特征对应的权重,作用接近直线的斜率。
  • b:偏置,作用接近直线的截距。

如果输入里有多个特征,模型可以继续往后加:

y' = b + w1 * x1 + w2 * x2 + ... + wn * xn

还是看油耗预测这个例子。除了车辆重量,模型也可以用发动机排量、加速度、气缸数、马力等信息。每个特征都有一个权重。训练模型,就是让模型从数据里学到这些权重和偏置。

2. 损失:模型差了多少

模型预测值通常不会刚好等于真实值,所以需要一个数来表示差距。这个数叫损失。

损失看的是距离,不看方向。比如模型预测 2,真实值是 5,差值是 -3,但误差大小是 3。计算损失时通常会去掉符号,或者把差值平方。

常见的损失函数有这些:

损失怎么理解公式写法
L1 损失绝对误差之和`sum
MAE平均绝对误差`(1/N) * sum
L2 损失平方误差之和sum (y - y')^2
MSE均方误差(1/N) * sum (y - y')^2
RMSE均方根误差sqrt((1/N) * sum (y - y')^2)

MAE 比较好解释,因为它和预测目标是同一个量纲。MSE 会放大较大的误差,所以离群点对它的影响更明显。

MSE 和 MAE 对离群点的不同反应

图 9. MSE 损失会使模型更接近离群值。

图 10. MAE 损失可使模型远离离群值。

MSE。模型更接近离群点,但距离大多数其他数据点更远。

MAE。模型离离群点的距离更远,但距离大多数其他数据点的距离更近。

选损失函数时可以记住这个区别:如果希望模型更在意离群点,可以用 MSE;如果不想让少数离群点把模型拉偏太多,可以考虑 MAE。

3. 梯度下降:让损失降下来

训练线性回归模型,其实是在找一组合适的权重和偏置,让损失尽量小。梯度下降就是常用的寻找方法。

过程大概是这样:

  1. 先给权重和偏置一个初始值。
  2. 用当前参数做预测,并计算损失。
  3. 判断往哪个方向改参数,损失会变小。
  4. 沿着这个方向走一小步。
  5. 重复前面的步骤,直到损失不再明显下降。

梯度下降的基本流程

下图概述了梯度下降法为找到可生成损失最低的模型的权重和偏差而执行的迭代步骤。

训练时可以看损失曲线。横轴是迭代次数,纵轴是损失。如果曲线一开始下降很快,后面逐渐变平,通常说明模型正在收敛。

模型训练时的损失曲线

图 12. 损失曲线,显示模型在第 1,000 次迭代左右收敛。

您可以看到,在前几次迭代中,损失大幅减少,然后逐渐减少,在第 1,000 次迭代左右趋于平缓。经过 1,000 次迭代后,我们基本上可以确定模型已收敛。

线性回归的损失面通常是凸的,形状有点像碗。只要学习率设置得合理,梯度下降会慢慢走到碗底附近,也就是损失较小的位置。

凸损失面上的梯度下降轨迹

图 18. 损失图,显示了梯度下降点停止在图表最低点的情况。

请注意,黑色损失点会形成损失曲线的确切形状:先是急剧下降,然后逐渐向下倾斜,直到达到损失曲面上的最低点。

4. 学习率:每次走多大一步

学习率决定每次更新参数时走多大一步。它不是模型自己学出来的,而是训练前由我们设置的超参数。

学习率损失曲线一般会怎样可能结果
太小下降很慢训练时间长,可能很久都没收敛
合适先明显下降,再慢慢变平训练比较稳定
太大来回震荡,甚至越来越大模型可能发散

学习率合适时的损失变化

图 20. 损失图,显示了以可快速收敛的学习率训练的模型。

学习率过大时损失可能发散

图 23. 损失图,显示了以过大的学习率训练的模型,其中损失曲线在后来的迭代中急剧增加。

学习率不是越大越好。比较合适的学习率,应该让损失在合理次数内下降,并且后面能稳定下来。

5. 批次大小和 epoch

模型更新参数前,不一定每次都要看完整个训练集。批次大小指的是模型每次更新参数前使用多少个样本。

训练时常见的更新方式如下:

方法每次更新看多少样本特点
全批量梯度下降全部样本梯度比较稳定,但数据量大时会慢
SGD1 个样本更新快,但损失曲线会比较抖
小批量 SGD一小批样本速度和稳定性比较折中,实际更常用

SGD 是 Stochastic Gradient Descent,中文叫随机梯度下降。它每次随机取一个样本来估计下降方向,然后更新参数。这样做会带来噪声,但计算快,尤其适合数据量比较大的情况。

epoch 表示模型完整看完训练集一次。比如训练集有 1000 个样本,批次大小是 100,那么模型需要更新 10 次参数,才算完成 1 个 epoch。

批次大小和 epoch 的关系

批次大小和周期示意图:完整批次包含整个数据集,小批次只包含一部分样本,一个 epoch 由多个小批次组成。

批次大小没有固定答案。它和数据规模、计算资源、训练稳定性都有关系。批次大一些,单个异常样本的影响会小一些,但计算开销也更大;批次小一些,更新更频繁,但曲线会更抖。

6. 快速对照

概念可以怎么理解
特征输入变量,比如汽车重量
标签要预测的真实值,比如油耗
权重某个特征对预测结果的影响程度
偏置模型整体的基础偏移
损失预测值和真实值之间的差距
梯度下降不断调整参数,让损失变小
学习率每次调整参数时走多大一步
批次大小每次更新参数前看多少样本
epoch模型完整看完训练集一次
收敛损失不再明显下降,模型基本稳定

7. 这部分要记住什么

线性回归表面上是在找一条直线,但它把机器学习训练里的几个基础问题都串起来了:

  • 模型怎样表达特征和标签之间的关系。
  • 怎样用损失函数判断模型预测得好不好。
  • 怎样通过梯度下降调整权重和偏置。
  • 学习率、批次大小、epoch 会怎样影响训练。
  • 怎样通过损失曲线判断模型是在收敛、太慢,还是发散了。

把线性回归理解清楚,后面再看更复杂的模型,会更容易看出它们也是在用数据调整参数,只是模型形式更复杂。

Comments

Quiet notes for this article.