损失函数(待更新)

  • 损失函数区别于代价函数,损失函数是针对一个样本/数据而言的(参考自吴恩达深度学习&神经网络课程),而代价函数是对整个数据集而言的,通常代价函数是损失函数的算数平均值(可能乘上某些系数)

交叉熵损失函数

L ( y , y ^ ) = − y ∗ l o g ( y ^ ) − ( 1 − y ) ∗ l o g ( 1 − y ^ ) L(y, \hat{y})=-y*log(\hat{y})-(1-y)*log(1-\hat{y}) L(y,y^)=ylog(y^)(1y)log(1y^)

  • 交叉熵损失函数本质上是极大似然估计。当输出值位于0到1之间时,认为输出是取某一类的概率,通过对数函数的性质可以知道,交叉损失函数可以理解成:根据输入准确得到输出的概率的负对数,对数不改变函数的单调性,通过负号将函数单调性改变
  • 在tensorflow的用法:
tf.keras.losses.CategoricalCrossentropy(
    from_logits=False, label_smoothing=0, reduction=losses_utils.ReductionV2.AUTO,
    name='categorical_crossentropy'
)
  • 此处还有疑问/不确定:为什么使用对数函数,是根据熵的概念(概率的对数)吗?交叉熵损失函数中的“熵”是由此得名吗?那么“交叉”来自哪?

平方误差损失函数

  • 个人认为不应该称为均方误差损失函数,而应该称为均方误差代价函数,因为均方误差是描述整个数据集上的代价

### 自定义或调整深度学习中的损失函数深度学习中,损失函数是一个核心组件,它决定了模型如何根据预测值与真实值之间的差异进行优化[^4]。然而,在许多情况下,默认的损失函数可能无法完全满足特定的应用场景需求。因此,自定义或调整损失函数成为一种常见做法。 #### 1. **理解损失函数的作用** 损失函数的核心作用是量化模型预测值与真实值之间的差距,并提供一个可微分的目标供优化器(如梯度下降)使用。通过调整损失函数,可以改变模型的学习动态和最终性能。 #### 2. **为何需要自定义损失函数** 尽管有许多现成的损失函数可供选择,但在某些特殊场景下,它们可能不足以捕捉到数据的真实特性或业务目标。以下是几个典型原因: - 数据分布复杂:例如存在长尾分布或异常值的情况[^5]。 - 特定业务需求:当模型的优化目标与实际业务指标不一致时,可以通过设计损失函数来更好地反映这些目标。 - 提升泛化能力:通过引入正则项或其他约束条件,使模型能够更好地应对未知数据。 #### 3. **自定义损失函数的方法** ##### (1) 修改现有损失函数 可以在现有的损失函数基础上增加额外的惩罚项或权重因子。例如,对于分类问题中的交叉熵损失函数 \( \text{CE}(y, \hat{y}) \),可以通过加权的方式解决类别不平衡问题: ```python import torch.nn as nn import torch class WeightedCrossEntropyLoss(nn.Module): def __init__(self, weights=None): super().__init__() self.weights = weights def forward(self, y_pred, y_true): loss_fn = nn.CrossEntropyLoss(weight=self.weights) return loss_fn(y_pred, y_true) ``` 这里 `weights` 是一个张量,表示不同类别的相对重要性。 ##### (2) 定义全新的损失函数 如果现有损失函数都无法满足需求,则可以从头构建一个新的损失函数。以下是一个简单的例子,展示了一个基于绝对差值的自定义损失函数: ```python def custom_loss_function(y_pred, y_true): diff = torch.abs(y_pred - y_true) weighted_diff = diff * (1 + torch.exp(-diff)) # 添加非线性调节 return torch.mean(weighted_diff) ``` 这种形式可以根据具体任务的需求灵活调整。 ##### (3) 结合多个损失函数 有时单一类型的损失函数难以全面描述复杂的任务关系。此时可以组合多种损失函数,赋予每种不同的权重系数。例如,在图像分割任务中,既可以考虑像素级的二元交叉熵损失,也可以加入Dice系数作为补充: ```python class CombinedLoss(nn.Module): def __init__(self, alpha=0.5): super().__init__() self.alpha = alpha self.bce_loss = nn.BCEWithLogitsLoss() def dice_coefficient(self, pred, target): smooth = 1e-7 intersection = torch.sum(pred * target) union = torch.sum(pred) + torch.sum(target) return 1 - ((2. * intersection + smooth) / (union + smooth)) def forward(self, y_pred, y_true): bce_part = self.bce_loss(y_pred, y_true) dice_part = self.dice_coefficient(torch.sigmoid(y_pred), y_true) return self.alpha * bce_part + (1 - self.alpha) * dice_part ``` 上述代码展示了如何将两种不同类型的距离度量结合起来形成复合型损失函数。 #### 4. **注意事项** - **可导性**:任何自定义的损失函数都应保持连续性和可微性以便于反向传播计算梯度。 - **数值稳定性**:避免因极端输入而导致溢出或者下溢现象发生;必要时可通过裁剪操作限制范围。 - **超参数调优**:新引入的因素往往伴随着更多待设定的超参,需借助验证集仔细调试其取值区间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值