交叉熵的公式是 − Σ k K p ( y k ) log p ( y ^ k ) -\Sigma_k^{K}p(y_k)\log p(\hat{y}_k) −ΣkKp(yk)logp(y^k),
对 y ^ \hat{y} y^ 求导后得到 − Σ k K p ( y k ) p ( y ^ k ) -\Sigma_k^{K}\frac{p(y_k)}{ p(\hat{y}_k)} −ΣkKp(y^k)p(yk)
体现在这个公式中:
numpy_ml.trees.losses.CrossEntropyLoss.grad
def grad(self, y, y_pred):
eps = np.finfo(float).eps # 对y_pred求导
return -y * 1 / (y_pred + eps)
注意到,对于分类任务,如果有 K K K个类,本质上是训练 K K K个树,然后用OHE将类别 y ∈ [ 0 , K ) y \in [0,K) y∈[0,K)处理为k个0,1的列向量。所以对于第k个分量,交叉熵退化为 − p ( y ) log p ( y ^ ) -p(y)\log p(\hat{y}) −p(y)logp(y^) 。
每步决策树拟合的负梯度: p ( y ) p ( y ^ ) \frac{p(y)}{ p(\hat{y})} p(y^)p(y)
y = 0 y=0 y=0 | y = 1 y=1 y=1 | |
---|---|---|
y ^ = 0 \hat{y}=0 y^=0 | 0 | ∞ \infin ∞ |
y ^ = 1 \hat{y}=1 y^=1 | 0 | 1 |