共计 1767 个字符,预计需要花费 5 分钟才能阅读完成。
信息论视角下的交叉熵
交叉熵 $H(p,q)=-\sum p(x)\log q(x)$ 衡量两个概率分布的差异。在二分类问题中:

- $p(x)$ 是真实分布(标签 0 /1)
- $q(x)$ 是预测分布(sigmoid 输出)
与 MSE 损失相比:
- MSE 对离群点敏感(梯度包含 $(y-\hat{y})$ 项)
- MSE 在概率边界处梯度消失(sigmoid 导数特性)
- 交叉熵梯度包含 $\frac{1}{\hat{y}(1-\hat{y})}$ 项,天然适配概率输出
论文关键证明解析
参考论文《A note on the evaluation of generative models》(arXiv:1511.01844):
当预测概率 $\hat{y}$ 接近 0 或 1 时,传统 BCE 损失会出现梯度消失:
$$
\frac{\partial L}{\partial z} = \hat{y} – y
$$
但由于 $\hat{y}=\sigma(z)$,当 $z$ 极大时 $\frac{\partial \hat{y}}{\partial z}\approx 0$,导致梯度消失。论文提出 log-sum-exp 技巧:
$$
L = -[y\log\sigma(z) + (1-y)\log(1-\sigma(z))]
$$
可重写为:
$$
L = \max(z,0) – zy + \log(1+e^{-|z|})
$$
PyTorch 实现剖析
BCEWithLogitsLoss核心实现:
def bce_with_logits(logits: torch.Tensor, targets: torch.Tensor) -> torch.Tensor:
# 数值稳定实现
max_val = (-logits).clamp(min=0)
loss = logits - logits * targets + max_val \
+ ((-max_val).exp() + (-logits - max_val).exp()).log()
return loss.mean()
关键设计:
- 通过 max_val 避免指数爆炸
- 分解计算项保持数值精度
- 内置 sigmoid 计算节省内存
完整代码示例
基础实现对比
# 手动实现
def naive_bce(pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
eps = 1e-8 # 防除零
return -(target * torch.log(pred + eps) + \
(1-target) * torch.log(1-pred + eps)).mean()
# PyTorch 官方版本注意事项
bce_loss = nn.BCELoss()
# 必须手动 sigmoid!output = torch.sigmoid(model(input))
loss = bce_loss(output, target)
标签平滑实现
def label_smooth_bce(
logits: torch.Tensor,
targets: torch.Tensor,
smoothing=0.1
) -> torch.Tensor:
with torch.no_grad():
targets = targets * (1 - smoothing) + 0.5 * smoothing
return F.binary_cross_entropy_with_logits(logits, targets)
性能优化建议
- 批量计算:
- 使用
torch.nn.BCEWithLogitsLoss(reduction='mean')自动批处理 -
避免循环内逐样本计算
-
混合精度:
- 启用
amp.scale_loss(loss, optimizer) - 检查 logits 范围是否超出 fp16 表示范围
生产环境避坑指南
概率截断问题
- 切忌将 sigmoid 输出截断到[0.01, 0.99]
- 会导致梯度信息丢失
- 正确做法:调整学习率或使用标签平滑
多标签处理
# 多标签归一化
loss = nn.BCEWithLogitsLoss(reduction='none')
output = loss(pred, target)
# 按样本维度求平均
output = output.mean(dim=1) # 保持 batch 维度
开放性问题
在正负样本比 1:100 的场景下:
- BCE 需要配合 class weighting
- Dice Loss 能缓解样本不平衡
- 最新研究建议 BCE+Dice 联合损失
关键权衡点:
- BCE 保持概率校准性
- Dice 优化 IoU 指标
- 联合损失的超参数敏感度
正文完
