Skip to content

Losses — 损失函数 API

MSELoss

src/nn/losses/mseLoss.py

均方误差损失,用于回归任务。

构造函数

python
MSELoss()

无参数。

forward()

python
def forward(self, predictions: np.ndarray, targets: np.ndarray) -> float
参数类型形状说明
predictionsnp.ndarray任意模型预测值
targetsnp.ndarray与 predictions 一致真实目标值
返回float平均均方误差

数学公式

L=1Mi=1M(y^iyi)2

其中 M 是张量的总元素数。

异常

  • ValueErrorpredictionstargets 是标量
  • ValueError — 两者形状不一致
  • ValueError — 张量为空

backward()

python
def backward(self) -> np.ndarray
返回类型形状说明
gradientnp.ndarray与 predictions 一致Ly^

数学公式

Ly^=2M(y^y)

前置条件:必须先调用 forward()


CrossEntropyLoss

src/nn/losses/crossEntropyLoss.py

交叉熵损失,内置 Softmax,用于分类任务。

构造函数

python
CrossEntropyLoss(epsilon: float = 1e-12)
参数类型默认值说明
epsilonfloat1e-12防止 log(0) 的裁剪下界

forward()

python
def forward(self, logits: np.ndarray, targetLabels: np.ndarray) -> float
参数类型形状说明
logitsnp.ndarray(N,C)模型输出的原始 logits(未经 Softmax)
targetLabelsnp.ndarray(N,)真实类别索引(整数,范围 [0,C)
返回float平均交叉熵损失

内部计算步骤

  1. 数值稳定:shifted = logits - max(logits, axis=1)
  2. Softmax:pi=eshiftedi/jeshiftedj
  3. 取真实类别概率:p_true = p[np.arange(N), targetLabels]
  4. 裁剪到 [epsilon, 1.0]
  5. 交叉熵:1Nlog(ptrue)

异常

  • ValueErrorlogits 不是二维数组
  • ValueErrortargetLabels 不是一维数组
  • ValueError — batch size 为 0
  • ValueErrortargetLabels 不是整数类型
  • ValueError — 存在超出 [0,C) 范围的标签

backward()

python
def backward(self) -> np.ndarray
返回类型形状说明
gradientnp.ndarray(N,C)Lz

数学公式

Lzn,c=1N(pn,cδc,yn)

其中 pn,c 是 softmax 概率,δc,yn 仅在真实类别位置为 1。

实现

python
inputGradient = self.probabilities.copy()
inputGradient[np.arange(batchSize), targetLabels] -= 1.0
inputGradient /= batchSize

对比

特性MSELossCrossEntropyLoss
任务类型回归分类
输入要求与目标同形状二维 logits
目标格式连续值整数类别索引
内部是否有 softmax
数值稳定技巧logit-shift + epsilon clip
梯度形状与输入一致(N,C)