📽️📽️上期我们介绍了损失函数,这期我们主要掌握损失函数的优化算法以及回归问题的评估,简单来说就是测评模型预估的好坏
首先,我们有一个 可微分的函数 。这个函数就代表着一座山。
我们的目标就是找到 这个函数的最小值 ,也就是山底。最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是 找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数值变化最快的方向。 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程
🏷️我们对这个公式稍作解释 ,下文我们还会继续讨论他的推到流程
1.α是什么含义?
✒️在梯度下降算法中被称作为 学习率 或者 步长 ,意味着我们可以通过α来控制每一步走的距离,控制参数不要走太快,错过了使损失函数取最小值的点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
2.为什么梯度要乘以一个负号?
✒️ 梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。
📖首先我们回想一下一些概念,步长,步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度;特征,指的是样本中输入部分;假设函数,在监督学习中,为了拟合输入样本,而使用的假设函数;损失函数,为了评估模型拟合的好坏, 通常用损失函数来度量拟合的程度,损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。
比如对于线性回归,假设函数表示为
,其中,
为模型参数,
为每个样本的n个特征值。这个表示可以简化,我们增加一个特征
,这样:
同样是线性回归,对应于上面的假设函数,损失函数为:
在没有任何先验知识的时候,可以将所有的θ初始化为0, 将步长初始化为1。在调优的时候再 优化。
即为最终结果。否则进入步骤4.
,对于
,其更新表达式如下。更新完毕后继续转入步骤1。
下面用线性回归的例子来具体描述梯度下降。假设我们的样本是:
损失函数如前面先决条件所述:
则在算法过程步骤1中对于
的偏导数计算如下:
由于样本中没有
上式中令所有的
为1.
步骤4中
的更新表达式如下:
从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加
是为了好理解。由于步长也为常数,他们的乘积也为常数,所以这里
可以用一个常数表示。
✏️这里介绍四种梯度下降算法,不做其他要求,了解即可
全梯度下降算法(FGD)-----每次迭代时, 使用全部样本的梯度值
批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。
计算训练集所有样本误差,对其求和再取平均值作为目标函数。
其是在整个训练数据集上计算损失函数关于参数θ的梯度:
图像表达可能会更清晰:
注意,我们在执行时不能在新更新模型,在运行的过程中,不能增加新的样本,且全梯度下降无法处理超出内存容量限制的数据集。
💡💡公式概念引入: 每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。
此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为:
由于每次只食用一个样本迭代,若遇到噪音则很容易陷入局部最优解。
Sklearn提供了随机梯度下降的API:
from sklearn.linear_model import SGDRegressor
概念:每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重,被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。
公式:
💡💡通过公式我们不难看出,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG
随机平均梯度下降算法(SAG)
在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。
随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。
如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。
其迭代形式为:
✒️不同于类别预测,不能苛刻回归预测的数值结果要严格的和真实值一致。一般情况下,我们希望衡量预测值和真实值之间的差距。因此,可以通过多种测评函数进行评价。
为预测值
Sklearn中的MAE的API:
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)
为预测值
Sklearn 中MAE的API:
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)
为预测值
💗💗大多数情况下RMSE的值要大于MAE,在RMSE中有一个平方项,大的误差会被平方,会增加RMSE的值,可以得出结论,RMSE 会放大预测误差较大的样本对结果的影响,而 MAE 只是给出了平均误差,RMSE对于某些数据集中的少数异常点通常表现得比较敏感,那么是不是代表RMSE是更好的指标呢?注意哦✒️是少数异常点✒️。但其实并不是这样:
二者的优缺点这样一比较也就很明显,MAE 不能体现出误差大的数据点,RMSE虽然会加放大大误差的数据点对指标的影响, 但是对异常数据比较敏感
接下来我们简单介绍R²:
R²代表了预测值和真实值拟合的拟合程度,既考虑了预测值与真实值的差异,同时也兼顾了真实值的离散程度
R²的表达式:
上面的公式中y = 真实值,
= 模型预测值,
= 真实值的平均值
Sklearn 中R-Squared 的API:
from sklearn.metrics import r2_score
r2_score(y_test,y_predict)
R² 只能代表拟合的强弱,但不能说R² 越大模型越好,理论上存在R²<0的情况,但是只出现在模型特别差的情况