当前位置: 首页 > news >正文

深度学习基础理论————常见评价指标以及Loss Function

评价指标

准确率/精确率/召回率

Positive (预测到的正例) Negative (预测到的反例)

True (预测结果为真) TP TN

False (预测结果为假) FP FN

争对正案例的计算:

1、准确率计算方式(ACC):

2、精确率计算方式(Precision):

3、召回率计算方式(Recall):

4、F1计算方式:

指标 优点 缺点

准确率 - 直观且易理解 - 在类别不平衡的情况下可能误导模型评估

精确率 - 衡量预测为正类的样本中,实际为正类的比例;适用于避免假阳性 - 可能忽视召回率,导致漏掉正类样本(假阴性)

召回率 - 衡量模型对正类样本的识别能力;适用于避免假阴性 - 可能导致精确率较低,增加误报(假阳性)

F1 分数 - 平衡精确率和召回率,适用于不平衡的任务 - 不能单独反映精确率或召回率,可能不适用于需要单独关注某一项的场景

BLEU

BLEU 采用一种N-gram的匹配规则,原理比较简单,就是比较译文和参考译文之间n组词的相似的一个占比

原文:今天天气不错

机器译文:It is a nice day today

人工译文:Today is a nice day

1-gram:

命中5个词,那么计算得到匹配度为:

3-gram:

计算得到匹配度为:

在通过结合召回率和惩罚因子之后得到BLEU计算公式为:

使用例子,直接使用第三方库sacrebleu

import sacrebleu

hyps = ['我有一个帽衫', '大大的帽子']

refs = ['你好,我有一个帽衫', '帽子大大的']

bleu = sacrebleu.corpus_bleu(hyps, [refs], tokenize='zh')

print(float(bleu.score))

# 59.809989126151606

Loss Function

Cross-Entropy Loss(交叉熵损失)

交叉熵损失用于分类任务,它度量的是预测概率分布与真实标签分布之间的差异。通常用于多分类问题。交叉熵损失公式(多分类)如下:

其中

为类别数量,

真实标签数据,

模型预测概率。二分类交叉熵损失为:

在pytorch中对于交叉熵损失函数主要参数:

1、label_smoothing (float, optional):通过平滑标签的方式来避免模型过度自信,提高模型的泛化能力并缓解类别不平衡问题的技术。假设模型有 C 个类别,标签为 y,真实标签的平滑值为 ε,则:对于真实类别 y = 1,标签值变为 1 - ε;对于其他类别 y ≠ 1,标签值变为 ε / (C - 1)

2、ignore_index (int, optional):忽略某些特定的标签,通常用于标记某些数据的特殊情况,如填充(padding)区域、无效标签或其他不需要参与损失计算的标签

3、reduction (str, optional):'none'、'mean' 和 'sum'分别表示对最后 不汇总、平均值、求和

4、weight:相当于在计算损失过程中给每一个标签额外补充一个权重

对于交叉熵损失计算从代码角度出发需要考虑的就是输入数据格式:

InputShape:

或者

。Target:

或者

其中 C代表类别,N代表batch_size。从数据格式上可以看出也就是保证N、C在同一维度即可

⭐值得注意的是,在pytorch的交叉熵损失里面已经计算了softmax/sigmoid,所以模型输出如果用交叉熵损失函数就不需要用softmax/sigmoid处理

Mean Squared Error(均方误差)

均方误差损失用于回归任务,度量预测值与真实值之间的差异。MSE 计算的是预测值和实际值的平方误差的平均值。MSE 公式:

其中

为类别数量,

真实标签数据,

模型预测概率。例子:比如说预测类别(假设为3),模型输出之后通过sigmoid/softmax处理之后得到:

预测 真实

0.3 0.3 0.4 0 0 1 (A)

0.3 0.4 0.3 0 1 0 (B)

0.1 0.2 0.7 1 0 0 (C)

均方误差计算:

交叉熵计算:

Focal Loss

Focal Loss主要用于处理样本失衡问题(样本里面标签不平衡问题,比如说分类任务标签大部分是类别A只有少部分是标签B),其原理也很简单可以直接在原交叉熵基础上补充一个 因子即可。

:调节因子,用于控制对易分类样本的惩罚程度。它是一个非负实数,通常设置为大于 0 的值。当

>0 时,随着

的增加,

的值会迅速减小,从而降低易分类样本的损失值。这样可以使得模型更加关注那些难以分类的样本。(换言之,如果样本里面大部分都是A那么计算得到

也就会越大,那么可以增加

值来减小这部分值对于损失值的影响)

: 平衡因子,用于调整正类和负类之间的权重。它是一个可调参数,通常设置为

对于正类和 1−

对于负类。当数据集中正负样本数量不均衡时,可以通过调整

来平衡两类样本的贡献。例如,在一个正负样本比例为 1:9 的数据集中,可以将

设置为 0.9,以增加正类样本的权重(一般而言对于这个参数直接使用我的标签权重即可)

import torch

import torch.nn as nn

import torch.nn.functional as F

class FocalLoss(nn.Module):

"""Focal Loss implementation."""

def __init__(self, gamma=1.5, alpha=0.25):

super().__init__()

self.gamma = gamma

self.alpha = alpha

def forward(self, pred, label, mask_labels=None):

"""Calculates focal loss with optional mask_labels."""

loss = F.binary_cross_entropy_with_logits(pred, label, reduction='none')

pred_prob = pred.sigmoid()

p_t = label * pred_prob + (1 - label) * (1 - pred_prob)

loss *= (1.0 - p_t) ** self.gamma

if self.alpha > 0:

loss *= label * self.alpha + (1 - label) * (1 - self.alpha)

if mask_labels is not None:

loss *= mask_labels.float()

return loss.sum() / mask_labels.sum()

return loss.mean()

if __name__ == '__main__':

h, w = 500, 500

labels_parent = torch.randint(0, 2, (h, w), dtype=torch.float32)

tmp_labels = torch.zeros(1000, 1000)

tmp_labels[:h, :w] = labels_parent

tmp_labels_mask = torch.zeros(1000, 1000)

tmp_labels_mask[:h, :w] = 1

pred = torch.randn(1, 1000, 1000)

focal_loss = FocalLoss()

loss = focal_loss(pred, tmp_labels.unsqueeze(0), tmp_labels_mask)

print(loss)

对于 FocalLoss另外一个改进为:CB Loss用于改进样本分布不均衡问题:

L1 loss

L1 loss:算预测值与真实值之间的绝对差值来衡量模型的预测误差,公式为:

Huber Loss

Huber Loss用于回归任务的损失函数,它结合了均方误差(MSE)和绝对误差(MAE)的优点,可以减少对异常值(outliers)的敏感性,同时保持较好的梯度性质

http://www.cnnetsun.cn/news/40986.html

相关文章:

  • FFmpeg开发笔记(八十七)采用Kotlin的手机开源播放器VLC-Android
  • PostgreSQL实时数据同步:5分钟掌握pg_replicate终极指南
  • Monkey‘s Audio(无损音频压缩器)
  • ChatPDF终极指南:5分钟学会与PDF文档智能对话
  • 如何快速解决ComfyUI-SeedVR2依赖冲突:完整避坑指南
  • Java并发编程利器:从ConcurrentHashMap到Fork/Join的奇幻之旅
  • 5分钟掌握IOPaint集成:从零部署到深度定制全攻略
  • 汽车变速器电控系统Simulink模型:从原理到实现
  • Atmosphere自定义固件终极指南:从安装到故障排除
  • docker网络模式详解
  • 永磁同步电机基于非线性磁链观测器的转子位置估计策略:SCI一区顶刊复现与SIMULINK仿真
  • 异步电机直接转矩控制算法模型在R2016b版本及以上的正常运行
  • 从前端体验到后端架构:Airbnb全栈SDET面试深度解析
  • rtpengine作为媒体代理的一个问题
  • Caesium图像压缩器高级配置与定制化指南
  • Graphiti时序知识图谱:5大革新策略重塑动态知识管理
  • CMATH:如何5分钟掌握小学数学计算能力评估
  • 使用RNNoise进行音频降噪
  • 风储模型中的功率分配模型
  • 眼见非实(Bugku杂项入门)
  • 毕方Talon:鸿蒙开发的编译时安全守护神
  • 创客匠人峰会新解:高势能 IP 打造 ——AI 时代知识变现的十倍增长密码
  • Java线程池与Executor框架完全指南:一看就会,一看就懂!
  • 随机图床 _
  • PETools 逆向工程工具完整使用指南
  • 改善深层神经网络 第一周:深度学习的实践(四)其他缓解过拟合的方法
  • 品牌营销 深度心智方法论
  • STM32之使用DWT外设编写延时函数
  • 选择中国优化路线的美国独立服务器的8大好处
  • Abaqus三维纤维复合材料Vumat子程序:弹性层压板+Hashin损伤(纤维)+Puck损...