xgboost梯度计算的过程
之前对xgboost梯度计算过程有误区,这里纠正一下,并mark,提醒自己一下
泰勒公式的二阶展开形式如下:
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
f
′
(
x
)
Δ
x
+
f
′
′
(
x
)
Δ
x
2
f(x+\Delta{x}) \approx f(x)+f^{\prime}(x)\Delta{x}+f^{\prime\prime}(x)\Delta{x}^{2}
f(x+Δx)≈f(x)+f′(x)Δx+f′′(x)Δx2
回到我们的问题上来,f(x)对应我们的损失函数l(),x对应我们的t-1棵树的预测值,
Δ
x
\Delta{x}
Δx对应我们正在训练的第t棵树。
首先我们定义损失函数l()关于
y
^
(
t
−
1
)
\hat{y}^{(t-1)}
y^(t−1)的一阶偏导数和二阶偏导数:
g
i
=
∂
y
^
(
t
−
1
)
l
(
y
i
,
y
^
(
t
−
1
)
)
,
h
i
=
∂
y
^
(
t
−
1
)
2
l
(
y
i
,
y
^
(
t
−
1
)
)
g_i=\partial_{\hat{y}^{(t-1)}}l(y_i,\hat{y}^{(t-1)}),h_i=\partial^{2}_{\hat{y}^{(t-1)}}l(y_i,\hat{y}^{(t-1)})
gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1))
这里插一句,如果就是平方损失(比较常用),
l
(
y
i
,
y
i
^
)
=
(
y
i
−
y
i
^
)
2
l(y_i,\hat{y_i})=(y_i-\hat{y_i})^{2}
l(yi,yi^)=(yi−yi^)2
那么,
g
i
=
∂
y
^
(
t
−
1
)
l
(
y
i
,
y
^
(
t
−
1
)
)
=
2
(
y
i
−
y
i
^
(
t
−
1
)
)
,
h
i
=
∂
y
^
(
t
−
1
)
2
l
(
y
i
,
y
^
(
t
−
1
)
)
=
−
2
g_i=\partial_{\hat{y}^{(t-1)}}l(y_i,\hat{y}^{(t-1)})=2(y_i-\hat{y_i}^{(t-1)}),\\ h_i=\partial^{2}_{\hat{y}^{(t-1)}}l(y_i,\hat{y}^{(t-1)})=-2
gi=∂y^(t−1)l(yi,y^(t−1))=2(yi−yi^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1))=−2
这样对吗?
(注意xgb梯度计算中用到的是上一次的预测值,
这里就有一个问题,那么对于第一次计算梯度时,根本没有上一次的预测值怎么办?所以才有了一个全局偏置的超参,base_score:初始化预测分数,全局偏置。用于提供第一次梯度的计算。
xgb梯度计算中用到的不是本轮的预测值,而是利用上一轮的预测值来计算一阶导和二阶导的,所以对于分裂点计算前,各样本的一阶导和二阶导都是计算好的)