Losses — 损失函数 API
MSELoss
src/nn/losses/mseLoss.py
均方误差损失,用于回归任务。
构造函数
python
MSELoss()无参数。
forward()
python
def forward(self, predictions: np.ndarray, targets: np.ndarray) -> float| 参数 | 类型 | 形状 | 说明 |
|---|---|---|---|
predictions | np.ndarray | 任意 | 模型预测值 |
targets | np.ndarray | 与 predictions 一致 | 真实目标值 |
| 返回 | float | — | 平均均方误差 |
数学公式:
其中
异常:
ValueError—predictions或targets是标量ValueError— 两者形状不一致ValueError— 张量为空
backward()
python
def backward(self) -> np.ndarray| 返回 | 类型 | 形状 | 说明 |
|---|---|---|---|
gradient | np.ndarray | 与 predictions 一致 |
数学公式:
前置条件:必须先调用 forward()。
CrossEntropyLoss
src/nn/losses/crossEntropyLoss.py
交叉熵损失,内置 Softmax,用于分类任务。
构造函数
python
CrossEntropyLoss(epsilon: float = 1e-12)| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
epsilon | float | 1e-12 | 防止 |
forward()
python
def forward(self, logits: np.ndarray, targetLabels: np.ndarray) -> float| 参数 | 类型 | 形状 | 说明 |
|---|---|---|---|
logits | np.ndarray | 模型输出的原始 logits(未经 Softmax) | |
targetLabels | np.ndarray | 真实类别索引(整数,范围 | |
| 返回 | float | — | 平均交叉熵损失 |
内部计算步骤:
- 数值稳定:
shifted = logits - max(logits, axis=1) - Softmax:
- 取真实类别概率:
p_true = p[np.arange(N), targetLabels] - 裁剪到
[epsilon, 1.0] - 交叉熵:
异常:
ValueError—logits不是二维数组ValueError—targetLabels不是一维数组ValueError— batch size 为 0ValueError—targetLabels不是整数类型ValueError— 存在超出范围的标签
backward()
python
def backward(self) -> np.ndarray| 返回 | 类型 | 形状 | 说明 |
|---|---|---|---|
gradient | np.ndarray |
数学公式:
其中
实现:
python
inputGradient = self.probabilities.copy()
inputGradient[np.arange(batchSize), targetLabels] -= 1.0
inputGradient /= batchSize对比
| 特性 | MSELoss | CrossEntropyLoss |
|---|---|---|
| 任务类型 | 回归 | 分类 |
| 输入要求 | 与目标同形状 | 二维 logits |
| 目标格式 | 连续值 | 整数类别索引 |
| 内部是否有 softmax | 否 | 是 |
| 数值稳定技巧 | 无 | logit-shift + epsilon clip |
| 梯度形状 | 与输入一致 |