题外话:因为重复看GDBT和XGboost,所以很多东西容易恍惚,今天才发现一个问题梯度提升和梯度下降不是一回事?♀️,那就开始整理。
梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。(此处忽略了斜率--导数--方向导数的内容,真正理解梯度需要完全理解其三步内容?♀️)
梯度的意义
从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。
梯度提升和梯度下降的区别和联系(之前都没仔细发现这四个字不一样?♀️)
表是梯度提升算法和梯度下降算法的对比情况。可以发现,两者都是在每 一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
梯度下降
梯度下降法用于求解无约束最优化问题: 记第 次迭代值为 ,初始值为 。更新公式:是 在点 的梯度。 是学习率或步长,可以是定值,也可以是使得 下
降最大的那个步长:
通常的理解是,更新公式中的 是模型参数 ,但其实 可以不仅仅可以是模型参数。 梯度提升给定训练集 ,任务是训练一个函数 来拟合这个数据,损失函数是平方误差:
一开始,训练了一个函数 ,赋给 , 。每个样本产生的误差,也叫残差(residual),是 。接下来,要优化 ,条件是不能改变 已有的内容,只能往 上继续添加函数。再训练一个函数 来填补误差,即 的目标从 变成了 。然后把 添加到 , 。然后误差变为新的 。
以此类推,每次迭代都训练一个新的函数 ,目标是误差 ,然后把新的函数 添加到 。
停止迭代后, 就是若干个函数的和:
这就是梯度提升的直观例子,每次迭代训练一个弱学习器,目标是误差,最后将若干个弱学习器加到一起,作为最终的模型。
梯度提升和梯度下降的关系
从梯度下降法角度来看这个例子。令优化目标为
优化变量为:
对照上节的符号, 是 , 的第 个元素是 。 可以不仅可以是模型参数,还可以直接是模型输出。
梯度是一个向量,第 维是 对 的偏导数:
梯度更新:
时,有
同样,有一个条件是不改变 已有的内容,只能往 上继续添加函数,所以不能把 消掉。这个更新公式的意思是,把函数的输出再加上一个误差。为了达到这个目的,就需要新训练一个函数来拟合误差,然后将函数加到 上。也就是说,损失函数为二分之一平方误差,步长为1时,梯度下降法跟梯度提升是等价的。