深度学习实用方法 - 性能度量篇

2024-08-26 08:36

本文主要是介绍深度学习实用方法 - 性能度量篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

在深度学习的广阔领域里,性能度量是连接理论与实践的桥梁,它不仅是评估模型效果的关键指标,也是指导模型优化与改进的重要依据。随着大数据时代的到来和计算能力的提升,深度学习模型在图像识别、自然语言处理、推荐系统等多个领域取得了突破性进展。然而,如何准确、全面地评估这些复杂模型的性能,成为了研究者们面临的重要挑战。性能度量不仅关乎模型预测的准确性,还涉及到稳定性、泛化能力、计算效率等多个维度,为深度学习的发展提供了不可或缺的评估体系。

性能度量

  • 确定目标,即使用什么误差度量,是必要的第一步,因为误差度量将指导接下来的所有工作。同时我们也应该了解大概能得到什么级别的目标性能。
  • 注意,对于大多数应用而言,不可能实现绝对零误差。即使你有无限的训练数据,并且恢复了真正的概率分布,贝叶斯误差仍定义了能达到的最小错误率。这是因为输入特征可能无法包含输出变量的完整信息,或是因为系统可能本质上是随机的。当然我们还会受限于有限的训练数据。
  • 训练数据的数量会因为各种原因受到限制。
    • 当目标是打造现实世界中最好的产品或服务时,通常需要收集更多的数据,但必须确定进一步减少误差的价值,并与收集更多数据的成本做权衡。
    • 数据收集会耗费时间,金钱,或带来痛苦(例如,收集人体医疗测试数据)。
    • 科研中,目标通常是在某个确定基准下探讨哪个算法更好,一般会固定训练集,不能收集更多的数据。
  • 如何确定合理的性能期望?
    • 在学术界,通常我们可以根据先前公布的基准结果来估计预期错误率。
    • 在现实世界中,一个应用的错误率有必要是安全的,具有成本效益的,或吸引消费者的。
    • 一旦你确定了想要达到的错误率,那么你的设计将由如何达到这个错误率来指导。
  • 除了需要考虑性能度量之外,另一个需要考虑的是度量的选择。
    • 我们有几种不同的性能度量,可以用来度量含有机器学习的应用的性能。
    • 这些性能度量通常不同于训练模型的损失函数。
    • 如在学习算法篇 - 性能度量P中所述,我们通常会度量一个系统的准确率,或等价的错误率。
  • 然而,许多应用需要更高级的度量。
  • 有时,一种错误可能会比更一种错误更严重。例如,垃圾邮件检测系统会有两种错误:将正常邮件归为垃圾邮件,将垃圾邮件归为正常邮件。阻止正常消息比通过可疑消息更糟糕。不去度量垃圾邮件分类的错误率,我们希望度量某种形式的总损失,其中拦截正常邮件比通过垃圾邮件的代价更高。
  • 有时,我们需要训练检测某些罕见事件的二元分类器
    • 例如,我们可能会为一种罕见疾病设计医疗测试。假设每一百万人中只有一人患病。
    • 简单地让分类器一直报告没有患者,我们就能在检测任务上实现 99.9999 % 99.9999\% 99.9999% 的正确率。
    • 显然,正确率很差地体现了这种系统的性能。
    • 解决这个问题的方法是度量精度 ( precision \text{precision} precision) 和召回率 ( recall \text{recall} recall)。 精度是模型报告的检测是正确的比率,而召回率则是真实事件被检测到的比率。检测器一只报告没有患者,可能会有一个很高的精度,但召回率为零。而报告每个人都是患者的检测器可能有很高的召回率,但是精度很低(在我们的例子是 0.0001 % 0.0001\% 0.0001%,每一百万人只有一人患病)。
    • 当使用精度和召回率时,通常会画 PR \textbf{PR} PR 曲线 y \text{y} y 轴表示精度, x \text{x} x 轴表示召回率。
      • 如果检测到的事件发生了,那么分类器会返回一个比较高的值。
      • 例如,我们将前馈网络设计为检测一种疾病,估计一个医疗结果由特征 x \text{x} x 表示的人患病的概率为 y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|\boldsymbol{x}) y^=P(y=1∣x)
      • 每当这个值超过某个阈值时,我们报告检测结果。
      • 通过调整阈值,我们能以精度换召回率。
      • 在很多情况下,我们希望用一个数而不是曲线来概括分类器的性能。
      • 要做到这一点,我们可以转换精度 p p p 和召回率 r r r F-score \textbf{F-score} F-score F = 2 p r p + r F=\displaystyle\frac{2pr}{p+r} F=p+r2pr — 公式1 \quad\textbf{---\footnotesize{公式1}} 公式1
        另一种方法是报告 PR \text{PR} PR曲线下方的总面积。
  • 在一些应用中, 机器学习系统可能会拒绝做出判断
    • 机器学习算法能够估计对判断的确信度,会是非常有用的,特别是在错误判断会有严重危害,而人工操作员能够偶尔接管的情况下。
    • 街景转录系统可以作为这种情况的一个示例。该任务是转录照片上的地址号码,以关联到地图上拍摄照片的位置。因为如果地图是不精确的,那么地图的价值会严重下降。因此只在转录正确的情况下添加地址十分重要。
    • 如果机器学习系统认为它不太能像人一样正确地转录,那么最好办法当然是让人来转录照片。当然,我们有必要让机器学习系统大量降低需要人工操作处理的图片,这样它才是有用的。在这种情况下,一种自然的性能度量是覆盖率 ( coverage \text{coverage} coverage)。
    • 覆盖率是机器学习系统能够产生响应的样本所占的比率。有可能以覆盖率换精度。一个系统总可以通过拒绝处理任意样本的方式来达到 100 % 100\% 100% 的精度,但是覆盖率降到了 0 % 0\% 0%。对于街景任务,该项目的目标是达到人类转录的精度,同时保持 95 % 95\% 95% 的覆盖率。这项任务的人类级别性能是 98 % 98\% 98% 的精度。
  • 还有许多其他的性能度量
    • 例如,我们可以度量点击率,收集用户满意度调查,等等。
    • 许多专业的应用领域也有特定于应用的标准。
  • 最重要的是首先要确定改进哪个性能度量,然后集中提高性能度量。如果没有明确的目标,那么我们很难判断机器学习系统上的改动是否有所改进

总结

  • 深度学习中的性能度量是一个多维度、多层次的概念,它要求我们在追求高准确率的同时,也要关注模型的稳定性、鲁棒性、计算效率及可解释性等多方面因素。
  • 通过设计合理的性能评估指标,我们能够更全面地了解模型的优缺点,进而指导模型的优化与改进。
  • 未来,随着深度学习技术的不断演进,性能度量体系也将日益完善,为推动人工智能领域的进一步发展提供有力支撑。在这个过程中,研究者们需要不断探索新的评估方法,以适应日益复杂的任务需求,同时保持对模型性能的全面把控,确保深度学习技术能够在实际应用中发挥更大的价值。

往期内容回顾

应用数学与机器学习基础 - 学习算法篇

这篇关于深度学习实用方法 - 性能度量篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108069

相关文章

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操