如何计算对数损失的梯度和粗麻布?(问题基于来自 xgboost 的 github 存储库的 numpy 示例脚本)

机器算法验证 损失函数 衍生物 坡度 助推
2022-03-17 10:02:50

我想了解如何在xgboost 示例脚本中计算 logloss 函数的梯度和粗麻布。

我已经简化了获取 numpy 数组的函数,并生成了这些数组y_haty_true它们是脚本中使用的值的示例。

这是简化的示例:

import numpy as np


def loglikelihoodloss(y_hat, y_true):
    prob = 1.0 / (1.0 + np.exp(-y_hat))
    grad = prob - y_true
    hess = prob * (1.0 - prob)
    return grad, hess

y_hat = np.array([1.80087972, -1.82414818, -1.82414818,  1.80087972, -2.08465433,
                  -1.82414818, -1.82414818,  1.80087972, -1.82414818, -1.82414818])
y_true = np.array([1.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.])

loglikelihoodloss(y_hat, y_true)

对数损失函数是和,其中yln(p)+(1y)ln(1p)p=1(1+ex)

梯度(相对于 p)然后是但是在代码中它的py(p1)ppy

同样的二阶导数(关于 p)是 但是在代码中是(yp)p+y(p1)(p1)2p2p(1p)

方程如何相等?

1个回答

导数是关于(或在代码中)而不是xy_hatp

正如你已经得出的(编辑:正如 Simon.H 提到的,因为实际损失应该是对数似然,所以我改变了你的结果的符号) sigmoid的导数 所以 二阶导数

fp=py(1p)p,
px=p(1p),
fx=fppx=py,
2fx2=x(fx)=x(py)=px=p(1p).