加权交叉熵损失函数
时间: 2025-05-24 07:11:13 浏览: 12
### 加权交叉熵损失函数的定义
加权交叉熵损失函数是一种改进版的交叉熵损失函数,主要用于处理类别不平衡的数据集。它通过对不同类别的样本赋予不同的权重来调整模型的学习过程[^1]。具体来说,加权交叉熵损失函数可以表示为:
\[ L = -\frac{1}{N} \sum_{i=1}^{N} w_i \left[ y_i \log(p_i) + (1-y_i) \log(1-p_i) \right] \]
其中 \( N \) 是样本数量,\( w_i \) 表示第 \( i \) 个样本的权重,\( y_i \) 是真实标签(0 或 1),而 \( p_i \) 则是模型预测的概率。
这种形式允许对少数类分配更高的权重,从而使得模型更加关注这些难以学习的样本。
---
### 使用场景
加权交叉熵损失函数广泛应用于解决类别分布不均衡的问题。例如,在图像分类任务中,如果某些类别的数据远少于其他类别,则可以通过设置较高的权重让模型更重视这些稀有类别[^3]。类似的例子还包括医疗诊断中的疾病检测、金融领域中的欺诈识别等场景。
在实际应用中,当发现某一特定类型的错误成本较高时(比如误诊癌症患者),也可以利用该机制增加对此种情况的关注程度。
---
### 实现方法
以下是基于 TensorFlow 的一种实现方式:
```python
import tensorflow as tf
def weighted_cross_entropy_loss(y_true, y_pred, weights):
"""
计算加权交叉熵损失
参数:
y_true: 真实标签 tensor, shape=(batch_size,)
y_pred: 预测概率 tensor, shape=(batch_size,)
weights: 权重列表或张量, length=batch_size
返回:
平均加权交叉熵损失值
"""
epsilon = 1e-7 # 数值稳定性常数
y_pred_clipped = tf.clip_by_value(y_pred, epsilon, 1. - epsilon)
loss_per_sample = -(weights * (
y_true * tf.math.log(y_pred_clipped) +
(1 - y_true) * tf.math.log(1 - y_pred_clipped))
)
return tf.reduce_mean(loss_per_sample)
```
此代码片段展示了如何自定义一个支持动态权重调节功能的加权交叉熵损失计算工具。用户只需传入相应的 `y_true`, `y_pred` 和预设好的 `weights` 即可得到最终的结果。
另外值得注意的是,在 PyTorch 中同样存在简便的方法去构建这样的损失函数:
```python
import torch
import torch.nn.functional as F
def weighted_cross_entropy_loss_pytorch(preds, targets, weight=None):
"""
在PyTorch框架下实现加权交叉熵损失.
参数:
preds: 模型输出 logits Tensor 形状 [batch_size, num_classes].
targets: 目标索引 Tensor 形状 [batch_size], 类型 long.
weight: 可选参数; 如果提供的话应是一个长度等于num_classes的一维Tensor.
返回:
标量平均损失值.
"""
return F.cross_entropy(input=preds, target=targets, weight=weight)
```
这里的关键在于传递给 `F.cross_entropy()` 函数的额外参数——`weight` ,它可以用来指定每种类别对应的惩罚系数[^2]。
---
阅读全文
相关推荐


















