一 前言引入
1. 回归定义及应用场景
我们知道机器学习的过程其实就是一个找函数的过程,通过不断的训练我们最终得到一个函数映射,给定函数(网络)一个输入,函数(网络)会给出相应输出,若输出的是一个数值(scatter),我们可以将这一类机器学习的问题称为回归问题(Regression)举例如下:
上图中第一个例子为股票指数预测,函数输入为今天的股票数据信息,输出为明天可能的股票指数信息;第二个例子为自动驾驶,输入为传感器获得的各种信号,输出为方向盘旋转的角度;第三个例子为自动推荐系统,输入为使用者以及正在浏览的商品类型,输出为该用户购买此商品的可能性。
此次阐述回归问题我们采用神奇宝贝的进化CP值为例进行说明:
如下图所示,输入为进化前妙蛙种子的基本信息,包括CP值
X
c
p
X_{cp}
Xcp、物种
X
s
X_{s}
Xs、生命值
X
h
p
X_{hp}
Xhp、体重
X
w
{X_{w}}
Xw、身高
X
h
X_{h}
Xh,输出为妙蛙种子进化后的CP值。我们要做的就是找到这样的一个函数能够帮助我们根据当前神奇宝贝的各种信息预测进化后的CP值。
2. 解决步骤
面对回归问题,通常分三步解决,第一步:选定使用的model,即确定函数模型是一次函数 y = w ∗ x + b y = w * x + b y=w∗x+b,还是二次函数 y = a ∗ x 2 + b ∗ x + c y = a * x^{2} + b * x + c y=a∗x2+b∗x+c,甚至是更高的三次四次或者五次函数。第二步:确定模型的损失函数loss function。第三步:采用梯度下降,优化损失函数 (可以使用梯度下降的前提是损失函数可微分,换句话说只要损失函数是可微分的,那么就可以使用梯度下降法)。
为了方便阐述,这里我们使用一次函数,即线性回归 Linear Regression(再次强调一下线性回归的定义: 若函数可以写成 y = b + ∑ w i ∗ x i y = b + \sum{w_i * x_i} y=b+∑wi∗xi的形式,虽然自变量x的个数不止一个,但是次幂都是一次,我们就称之为线性回归),并且只考虑一个自变量 X c p X_{cp} Xcp也就是进化前的CP值,剩下的自变量暂时不考虑,对应图像如下:
之后确定模型的损失函数,显然损失函数是关于参数W和b的函数,不断调整W和b的值,使得损失函数的值尽可能的小。
之后使用梯度下降的方式进行参数更新,更新的方程为:
W
i
+
1
=
W
i
−
η
∗
d
L
d
W
∣
w
=
w
i
W^{i + 1} = W^{i} - \eta* \frac{dL}{dW}|_{w = w^i}
Wi+1=Wi−η∗dWdL∣w=wi,其中
η
\eta
η就是我们所说的学习率,这里插一句话,之前小编一直以为学习率决定了参数调整的步长,但是现在才注意到微分结果本身也会影响步长,若当前微分结果较大,即图像在此处越陡峭,则前进的步长会更大。
关于梯度下降这里再补充一些:1. 观察上面的loss图像,我们知道一开始随机取的值比较重要,若一开始我们的取的W的值接近导数为0的点,那么训练的时间就会大大减少;同时若一开始W的取值不同,最终收敛时W的值可能不一致,因为存在局部最优解 local optimal 和全局最优解 global optimal ,有时候我们得到的函数并不是最优的函数,具体的示意图如下:
从上图可知,不同的出发点通过梯度下降,最终收敛时候的值不一样,那么该怎么办?我们在做线性回归问题的时候会不会遇到局部最优解的情况呢?
答案是:若我们的回归是线性回归,则其loss函数的最优解只有一个,不存在局部最优解的情况,如上图右部所示,从任何一个地方出发,最终都会得到最优的解,所以对于线性回归问题,可以放心大胆的使用梯度下降,而对于非线性回归,就会存在局部最优解的情况,需要进一步操作。
3. 过拟合和解决方法
上一部分说明了求解回归问题的基本步骤,那么按照这样的步骤,我们假设不同的模型函数,最终得到训练好的不同函数,针对不同的函数,我们在测试集上的结果如下:
![]() |
![]() |
我们可看到,越复杂的模型在训练集上训练的结果就越优秀,但是放在测试集上测试之后,我们会发现测试的结果反而越不好,这就是过拟合现象,所以我们需要选择合适的模型。
关于过拟合现象,常见的防止过拟合现象的手段有:L1正则、L2正则、Dropout 等,这里就不再细说。
至此,关于回归问题的一些基本知识,我们就回顾到这里,接下来再深入说一说。
二 回归问题再理解
1. 问题提出
我们知道神奇宝贝进化前后CP值的变化是由一个函数控制的,我们假设为
F
^
\hat{F}
F^,这个函数在编写游戏代码的时候就设定好了,现在我们要做的是收集神奇宝贝的数据,然后根据这些数据训练出一个函数,假设训练出的函数为
F
∗
F^{*}
F∗,显然
F
∗
F^*
F∗和
F
^
\hat{F}
F^不会完全一样,训练得到的函数想要和真实的函数完全一样是很难的,只能尽可能的接近。那么
F
∗
F^*
F∗和
F
^
\hat{F}
F^之间的误差来自哪里呢?答案就是来自于bias + variance,至于这里的bias和variance分别指什么呢,我们接下来讨论。
2. 问题解决
现在我们多次重复实验,首先我们假设模型函数是一个一次函数: y = w ∗ x + b y = w * x + b y=w∗x+b,第一次实验我们抓到了10只神奇宝贝,知道了他们的进化前后的CP值(就是10组训练数据,每一组数据包含神奇宝贝进化前后的CP值),训练之后我们可以得到一个函数,假设为 y = w 1 ∗ x + b 1 y = w1 * x + b1 y=w1∗x+b1。之后我们进行第二次实验,实验过程和第一次实验一样抓到了另外10只神奇宝贝,训练后得到的函数为 y = w 2 ∗ x + b 2 y = w2 * x + b2 y=w2∗x+b2,就这样不断重复实验,每一次实验我们都可以得到一个一次函数,将所有的一次函数都在同一个坐标系上画出来。
重新选定模型函数,假设是一个二次函数: y = a ∗ x 2 + b ∗ x + c y = a * x^2 + b * x + c y=a∗x2+b∗x+c,重复和上面一样的步骤,之后将所有的二次函数都在同一个坐标系上画出来。同理选定模型函数是三次、四次、五次等等,我们看看结果。
由上图可以看出,越简单的函数,画出来的图像越集中,越复杂的函数,画出来的图像越发散。出现这样的原因是越简单的model受数据的影响就越小,以上图为例,当我们改变
X
c
p
X_{cp}
Xcp的值时,一次函数的函数值变化量相对五次函数的函数值变化量就小很多,我们考虑一种极端情况,当函数是一个常数
y
=
c
y = c
y=c 时,此是函数是最简单的形式,函数值根本不会受到自变量的影响。这里体现的是variance的大小,若variance越大,则越发散、若variance越小,则越集中。
观察了函数图像的集中和发散,我们再来看一下函数求均值后的结果,首先我们假设真实的函数 F ^ \hat{F} F^图像如下左图所示,我们对重复实验求出来的所有函数图像取平均值,然后画出平均函数 F ˉ \bar{F} Fˉ的图像。
![]() |
![]() |
真实函数的图像如左图图像所示,而主要观察的是右侧的图像,右侧图像从右上角、左侧、右下角的三幅图片组成,分别对应的是一次函数、三次函数、五次函数;图像中黑色曲线是真实函数的图像 F ^ \hat{F} F^ 、红色部分是针对同一模型函数重复实验得到的所有的函数、黑色部分是对所有的函数求平均值之后得到的平均函数 F ˉ \bar{F} Fˉ。仔细观察我们发现,越复杂的函数,其平均函数和真实函数更加的接近、越简单的函数,其平均函数拟合真实函数拟合的越不好。这里拟合的好坏就是bias,bias越大则拟合的越不好、bias越小则拟合的越好。
为了更好的理解,我们以开枪打靶为例,示意图如下:
假设靶的中心就是我们的真实函数
F
^
\hat{F}
F^,我们根据训练样本进行训练得到的函数是
F
∗
F^*
F∗,多次重复实验,对每一次实验得到的
F
∗
F^*
F∗累加然后求平均值,得到的平均函数为
F
ˉ
\bar{F}
Fˉ。
F
ˉ
\bar{F}
Fˉ和
F
^
\hat{F}
F^之间的距离就是Bias,
F
ˉ
\bar{F}
Fˉ和
F
∗
F^*
F∗之间的距离就是Variance。
对于很复杂的函数模型而言,Bias很小,但是Variance很大;对于简单的函数模型,Bias很大,但是Variance很小。用打靶的语言来说,复杂函数模型打靶瞄的很准(bias小),但是压枪不好,打的很分散(variance很大);简单函数模型打靶瞄的不准(bias大)但是很集中(variance小)。理想的情况就是瞄的又准、打的又集中,换句话说就是bias和variance都越小越好。
但是很多时候很难如我们所愿,我们需要的bias和variance之间做一个权衡,如下图所示:
若模型太简单,则Bias很大,欠拟合 underfitting,若模型太复杂,则Variance很大,过拟合 overfitting。所以我们需要找到合适的模型。那么当我们遇到Bias或者Variance很大的时候,我们应该怎么做去减少error的出现呢?
当bias很大的时候,这说明提出的模型欠拟合,我们需要:
1. 考虑更多的特征作为函数的一部分
2. 更换模型,提出一个更复杂的模型
当Variance很大的时候,模型的复杂度和学习能力是足够的,但仍存在很大的错误,因此我们要做的是:
1. 增加训练集和测试集的大小,也就是要更多的数据
2. 正则化 Regularization,将参数作为损失函数的一部分,防止参数过大 (参数越接近0,函数图像越平滑,模型对于数据越不敏感,噪声数据对模型的影响较小)
![]() |
![]() |
至此关于回归问题的进一步了解就结束了。
三 结束语
- 本文中的所有图片均来自于台湾大学李宏毅教授 2020 machine learning 课程中的PPT。
- 小编目前毕竟还是本科生,若文章有问题,欢迎大家在评论区中指出。
- 文章编写不易,若对您有帮助,希望您可以点一个小小的赞。路漫漫其修远兮,吾将上下而求索,与君共勉 !!!