交叉熵损失函数用于回归
交叉熵损失函数在回归问题中的应用
对于回归问题,通常不采用交叉熵损失函数而更倾向于均方误差(MSE)或其他类型的损失函数。然而,在某些特殊情况下,可以考虑使用经过调整后的交叉熵形式来处理连续值的预测。
调整后的交叉熵用于回归
一种方法是通过将目标变量离散化成多个区间,从而转换为多类别分类任务,再利用广义版本的交叉熵计算方式:
[ L(y, \hat{y}) = -\sum_{i=1}^{n}\left[y_i*\log(\sigma (\hat{y}_i))+(1-y_i)*\log(1-\sigma (\hat{y}_i))\right] ]
其中 ( y \in [0,1]),表示实际观测到的概率分布;( \hat{y} ) 是模型输出的估计概率向量;( n ) 表示数据集大小;( \sigma() )代表Sigmoid激活函数[^1]。
但是需要注意的是这种方法并不常见,并且可能会引入额外复杂度以及潜在的信息丢失风险因为原始数值被映射到了有限数量的离散等级上。
另一种思路是在保持连续输出的同时修改标准的二元或多元交叉熵定义以适应实数范围内的预测值。这可以通过假设一个特定的概率密度函数(PDF),比如高斯分布,然后基于此构建相应的负对数似然(NLL):
[ NLL=-{\frac {(x_{i}-\mu )^{2}}{2\sigma ^{2}}}+\ln({\sqrt {2\pi }}|\Sigma |)]
这里 ( x_i ) 是真实值,( μ ) 和 ( σ ) 分别对应于预测得到的位置参数和尺度参数[^3]。
这种做法实际上已经偏离了传统意义上的“交叉熵”,而是转向了一种更为通用的最大似然框架下的优化策略。尽管如此,有时人们仍然会提到这是某种形式上的“扩展版”交叉熵。
import numpy as np
def gaussian_nll_loss(true_values, pred_means, pred_stds):
"""Calculate the negative log likelihood loss under Gaussian assumption."""
pi = np.pi
term1 = (true_values - pred_means)**2 / (2 * pred_stds**2)
term2 = np.log(np.sqrt(2*pi*pred_stds**2))
return np.mean(term1 + term2)
# Example usage:
np.random.seed(42)
X = np.linspace(-5, 5, num=100).reshape((-1, 1))
Y_true = X ** 2 + np.random.normal(size=(len(X),))
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, Y_true)
Y_pred_mean = model.predict(X)
Y_pred_std = np.ones_like(Y_pred_mean) * np.std(model.residuals_) # Simplified std estimation
loss_value = gaussian_nll_loss(Y_true.flatten(), Y_pred_mean, Y_pred_std)
print(f"Gaussian Negative Log Likelihood Loss: {loss_value}")