赞
踩
“梯度提升”与“梯度下降”中的“梯度”是什么?梯度是损失函数对需要求解的模型参数的导数。梯度方向是参数导数中绝对值最大的方向,因此梯度方向有两个,一个是梯度最大方向,另一个是梯度最小方向。
“梯度”是目标函数在当前点的梯度(不是参数的梯度),因此有了目标函数、样本点,才会有梯度。
在参数空间中,梯度下降是指目标函数在当前点的取值下降(最小化目标函数),参数自身沿着负梯度的方向下降。因此梯度下降,是目标函数对最优参数的搜索,其变量是参数。
梯度下降通常用来求解这种无约束最优化问题,它是一种迭代方法:初选取参数初值(还包括算法终止距离参数和学习率参数),不断迭代,更新参数的值,进行损失函数的最小化。
为什么梯度的负方向是函数局部下降最快的方向?下面开始证明。
假设迭代公式为:
θ
t
=
θ
t
−
1
+
Δ
θ
\theta_{t}=\theta_{t-1}+\Delta \theta
θt=θt−1+Δθ,将
L
(
θ
t
)
L\left(\theta_{t}\right)
L(θt)在
θ
t
−
1
\theta_{t-1}
θt−1处进行泰勒展开:
L
(
θ
t
)
=
L
(
θ
t
−
1
+
Δ
θ
)
≈
L
(
θ
t
−
1
)
+
L
′
(
θ
t
−
1
)
Δ
θ
故:
L
(
θ
t
−
1
+
Δ
θ
)
−
L
(
θ
t
−
1
)
≈
L
′
(
θ
t
−
1
)
Δ
θ
L\left(\theta_{t-1}+\Delta \theta\right)-L\left(\theta_{t-1}\right) \approx L^{\prime}\left(\theta_{t-1}\right) \Delta \theta
L(θt−1+Δθ)−L(θt−1)≈L′(θt−1)Δθ
则
L
′
(
θ
t
−
1
)
Δ
θ
L^{\prime}\left(\theta_{t-1}\right) \Delta \theta
L′(θt−1)Δθ是函数值的变化量,因为
L
′
(
θ
t
−
1
)
和
Δ
θ
L^{\prime}\left(\theta_{t-1}\right)和 \Delta \theta
L′(θt−1)和Δθ均为向量,因此
L
′
(
θ
t
−
1
)
Δ
θ
L^{\prime}\left(\theta_{t-1}\right) \Delta \theta
L′(θt−1)Δθ是两个向量进行点积,而向量进行点积绝对值最大时,是两者共线的时候。故
L
′
(
θ
t
−
1
)
和
Δ
θ
L^{\prime}\left(\theta_{t-1}\right)和 \Delta \theta
L′(θt−1)和Δθ方向相同,点积正方向最大;若
L
′
(
θ
t
−
1
)
和
Δ
θ
L^{\prime}\left(\theta_{t-1}\right)和 \Delta \theta
L′(θt−1)和Δθ反向,点积负方向最大。
因此,梯度的负方向是局部下降最快的方向,反之,梯度(正)方向是函数局部上升最快的方向。
所以,
Δ
θ
=
−
α
L
′
(
θ
t
−
1
)
\Delta \theta=-\alpha L^{\prime}\left(\theta_{t-1}\right)
Δθ=−αL′(θt−1),此时
α
\alpha
α是学习率(也称为步长)。
对于最终的最优解
θ
∗
\theta^{*}
θ∗,
θ
∗
=
∑
t
=
0
T
α
t
∗
[
−
δ
L
(
θ
)
δ
θ
]
θ
=
θ
t
−
1
\theta^{*}=\sum_{t=0}^{T} \alpha_{t} *\left[-\frac{\delta L(\theta)}{\delta \theta}\right]_{\theta=\theta_{t-1}}
θ∗=∑t=0Tαt∗[−δθδL(θ)]θ=θt−1。
在函数空间中,可以借鉴梯度下降的思想,进行最优函数的搜索。梯度提升实际仍是指对于模型的目标函数在当前点的取值提升(有说梯度提升仅指GBDT,对“新函数求导”,让“新函数”沿着梯度方向变化)。
同样,
f
t
(
x
)
=
−
α
t
g
t
(
x
)
=
−
α
t
∗
[
δ
L
(
y
,
F
(
x
)
)
δ
F
(
x
)
]
F
(
x
)
=
F
t
−
1
(
x
)
f_{t}(x)=-\alpha_{t} g_{t}(x)=-\alpha_{t} *\left[\frac{\delta L(y, F(x))}{\delta F(x)}\right]_{F(x)=F_{t-1}(x)}
ft(x)=−αtgt(x)=−αt∗[δF(x)δL(y,F(x))]F(x)=Ft−1(x)。
可以看出,这个梯度变量是一个函数,通过当前函数的负梯度方向来更新函数以修正模型,是模型更优,最后累加(加法模型)的模型为近似最优函数。
梯度提升原理:
假设已经有T(0≤t≤T)个不完美的模型
F
t
−
1
F_{t-1}
Ft−1。梯度提升算法不改变
F
t
−
1
F_{t-1}
Ft−1,而是通过增加估计其f构建新的模型
F
t
(
x
)
=
F
t
−
1
(
x
)
+
f
(
x
)
F_{t}(x) = F_{t-1}(x)+f(x)
Ft(x)=Ft−1(x)+f(x)来提高整体模型的效果。如何找到最优的f(x)呢?最好的f(x)应该使得
F
t
(
x
)
=
F
t
−
1
(
x
)
+
f
(
x
)
=
y
F_{t}(x)=F_{t-1}(x)+f(x)=y
Ft(x)=Ft−1(x)+f(x)=y,或者等价于
f
(
x
)
=
y
−
F
t
−
1
(
x
)
f(x)=y-F_{t-1}(x)
f(x)=y−Ft−1(x)。
因此梯度提升算法是将
f
f
f与残差
y
−
F
t
−
1
(
x
)
y-F_{t-1}(x)
y−Ft−1(x)拟合。可以观察到,残差
y
−
F
t
−
1
(
x
)
y-F_{t-1}(x)
y−Ft−1(x)是损失函数
1
/
2
(
y
−
F
t
−
1
(
x
)
)
2
1/2(y-F_{t-1}(x))^2
1/2(y−Ft−1(x))2的负梯度方向,因此可以将其推广到其他不是平方误差(分类或者排序问题)的损失函数。也就是说,梯度提升算法实际上也是一种梯度下降算法,只需要更改损失函数和梯度就可以将其推广。
当采用平方误差损失函数时,
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y, f(x))=(y-f(x))^{2}
L(y,f(x))=(y−f(x))2,其损失函数变为:
L
(
y
,
f
t
(
x
)
)
=
L
(
y
,
f
t
−
1
(
x
)
+
T
(
x
;
θ
t
)
)
=
(
y
−
f
t
−
1
(
x
)
−
T
(
x
;
θ
t
)
)
2
=
(
r
−
T
(
x
;
θ
t
)
)
2
其中
r
−
T
(
x
;
θ
t
)
{r-T\left(x ; \theta_{t}\right)}
r−T(x;θt)是当前模型拟合数据的残差。
在使用更一般的损失函数时,利用损失函数的负梯度在当前模型的值
−
[
δ
L
(
y
,
F
(
x
)
)
δ
F
(
x
)
]
F
(
x
)
=
F
t
−
1
(
x
)
-\left[\frac{\delta L(y, F(x))}{\delta F(x)}\right]_{F(x)=F_{t-1}(x)}
−[δF(x)δL(y,F(x))]F(x)=Ft−1(x)作为提升树算法中残差的近似值,拟合一个梯度提升模型。下面开始证明。
对函数
f
(
x
)
f(x)
f(x)在
x
=
x
t
−
1
x=x_{t-1}
x=xt−1处的泰勒展开式为:
f
(
x
)
≈
f
(
x
t
−
1
)
+
f
′
(
x
t
−
1
)
(
x
−
x
t
−
1
)
f(x) \approx f(x_{t-1})+f^{\prime}(x_{t-1})(x-x_{t-1})
f(x)≈f(xt−1)+f′(xt−1)(x−xt−1),因此,损失函数
L
(
y
,
F
(
x
)
)
L(y,F(x))
L(y,F(x))在
F
(
x
)
=
F
t
−
1
(
x
)
F(x)=F_{t-1}(x)
F(x)=Ft−1(x)处的泰勒展开式为:
L
(
y
,
F
(
x
)
)
≈
L
(
y
,
F
t
−
1
(
x
)
)
+
[
δ
L
(
y
,
F
(
x
)
)
δ
F
(
x
)
]
F
(
x
)
=
F
t
−
1
(
x
)
(
F
(
x
)
−
F
t
−
1
(
x
)
)
L(y, F(x)) \approx L(y, F_{t-1}(x))+\left[\frac{\delta L(y, F(x))}{\delta F(x)}\right]_{F(x)=F_{t-1}(x)}(F(x)-F_{t-1}(x))
L(y,F(x))≈L(y,Ft−1(x))+[δF(x)δL(y,F(x))]F(x)=Ft−1(x)(F(x)−Ft−1(x))
将
F
(
x
)
=
F
t
(
x
)
F(x)=F_t(x)
F(x)=Ft(x)带入上式,可得:
L
(
y
,
F
t
(
x
)
)
≈
L
(
y
,
F
t
−
1
(
x
)
)
+
[
δ
L
(
y
,
F
(
x
)
)
δ
F
(
x
)
]
F
(
x
)
=
F
t
−
1
(
x
)
(
F
t
(
x
)
−
F
t
−
1
(
x
)
)
L(y, F_{t}(x)) \approx L(y, F_{t-1}(x))+\left[\frac{\delta L(y, F(x))}{\delta F(x)}\right]_{F(x)=F_{t-1}(x)}(F_{t}(x)-F_{t-1}(x))
L(y,Ft(x))≈L(y,Ft−1(x))+[δF(x)δL(y,F(x))]F(x)=Ft−1(x)(Ft(x)−Ft−1(x))
因此,
−
[
δ
L
(
y
,
F
(
x
)
)
δ
F
(
x
)
]
F
(
x
)
=
F
t
−
1
(
x
)
-\left[\frac{\delta L(y, F(x))}{\delta F(x)}\right]_{F(x)=F_{t-1}(x)}
−[δF(x)δL(y,F(x))]F(x)=Ft−1(x)应该对应于平方误差损失函数中的
y
−
F
t
−
1
(
x
)
y-F_{t-1}(x)
y−Ft−1(x),故对于平方损失函数拟合的是残差,对于一般损失函数,拟合的是残差的近似值。
1、参数与模型
梯度提升与梯度下降算法,都是指每一轮迭代中,利用目标函数相对于模型的负梯度方向的信息来对当前模型进行更新,只是在梯度下降中,函数是以参数化形式表示,参数的更新等价于模型的更新;而在梯度提升中,模型直接定义在函数空间中,函数的优化等价于模型的优化,大大扩展了可以使用的模型种类。
2、近似残差
在平方误差损失函数和指数损失函数中,损失函数的负梯度在当前模型的值作为梯度提升算法中的残差,而在其他一般损失函数中,残差
y
−
F
t
−
1
(
x
)
y-F_{t-1}(x)
y−Ft−1(x)是目标函数
1
/
2
(
y
−
F
t
−
1
(
x
)
)
2
1/2(y-F_{t-1}(x))^2
1/2(y−Ft−1(x))2的负梯度方向,因此可以将其推广到其他不是平方误差的目标函数。
梯度提升算法是一种梯度下降算法,不同之处在于更改损失函数和求其负梯度就能将其推广,即可以将结论推广为对于一般损失函数也可以利用损失函数的负梯度近似拟合残差。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。