机器学习已然成为当今科技发展的重要驱动力之一。如何建立一个系统的机器学习策略,使机器学习项目能够高效推进并取得预期成果,是每一位机器学习从业者都需要思考的问题。每个机器学习项目的核心都涉及到目标设定,模型选择,数据处理和结果评估等多个关键步骤。在这篇博客中,我们将深入讨论这些步骤,特别是关于如何有效地设置机器学习目标,评估模型性能,并进行优化的具体策略和方法。希望通过这篇博客,你能对机器学习项目的整个流程有更深入的理解,并能将这些方法应用到你的项目中,以提升你的模型表现。这篇也是Andrew Ng 深度学习专项课程第三门课的内容,由于这门课的内容较少,因此放在一篇博客中介绍,Lets Go!
一、正交化:理顺目标与手段
正交化(Orthogonalization)是机器学习策略中一个非常重要的概念。它要求我们在优化机器学习系统的多个方面时,让每个方面都专注于一个特定的目标,而不互相干扰。
以调节老式电视机画面的质量为例。旧式电视机通常有多个控制旋钮,每个旋钮只对应图像中的一个属性,如高度、宽度、明暗程度等。这就实现了正交化,使每个旋钮都专注于一个特定的目标,互不干扰,从而简化了对图像质量的调节。如果把多个属性调节混合在一个旋钮上,例如同时调节高度、宽度和明暗程度,将使问题变得很复杂。这就违反了正交化的原则。
在机器学习系统中,我们通常需要调节多个方面来提高系统性能,主要包括:
- 在训练集上表现良好
- 在开发集上表现良好
- 在测试集上表现良好
- 在实际应用中表现良好
这四个目标就像老式电视机上的四个旋钮,每个旋钮应该专注于一个目标。如果模型在训练集上表现不佳,我们应该增大网络规模或调整优化算法等;如果模型在开发集上表现不佳,我们应该调整正则化参数或获取更多训练数据等。按照正交化的思想,每一个调节手段都应该专注于一个特定的目标,而不要混合考虑多个目标,使问题复杂化。这样可以使我们对模型的调优过程更加清晰系统。
正交化的优点在于,它将一个复杂的问题简化成多个相对独立的子问题。在优化每个子问题时,我们可以暂时忽略其他目标,专注于当前的一个目标。最终通过调整这些相对独立的“旋钮”,我们可以更容易地达到整体最优解。正交化也使得团队协作更加高效。我们可以把不同的子任务分配给不同的人或团队去完成,相互间少有干扰。
当然,有些方法如early stopping在一定程度上可能同时影响多个目标。这时就需要权衡不同子任务之间的优先级,确定主要的优化目标。
二、单一评估指标:量化目标
在机器学习中,我们通常需要处理多个性能指标,例如图像分类的准确率、召回率等。但是为了能更高效地评估不同模型的优劣,我们需要设定一个单一的评估指标。
以猫咪图像分类为例,我们关心分类器的精确度(Precision)和召回率(Recall):
- 精确度指被分类器判断为猫的图片中,实际上是猫的比例
- 召回率指实际上是猫的图片中,被正确分类为猫的比例
为了综合考虑这两个指标,一个常用的评估指标是F1 Score,它由精确度和召回率的调和平均数计算得到。如果分类器需要服务多个地区的用户,例如中国、美国、印度等不同地区,我们也可以计算每个地区的F1 Score,再取所有地区F1 Score的平均数,作为评估指标。相比追踪多个指标,单一数字评估指标可以大大简化模型选择。每当我们尝试一个新思路时,就可以立刻用这个指标判断效果好坏,从而提高工作效率。
设定单一评估指标,就像在目标位置上贴上一个“标靶”。机器学习团队可以快速进行试验,判断每种新尝试的效果,看它射击结果是否接近标靶心。当然,我们也要注意评估指标的选取是否能够很好地反映我们真正关心的目标。如果发现指标不太合适,要及时进行调整。例如,如果仅追求测试集准确率,可能导致算法过于依赖特定数据集,无法泛化到其他数据上。这时就需要考虑调整评估指标,或设计其他方法评估模型的泛化能力。
三、满足指标与优化指标:权衡多个目标
在机器学习中,我们经常需要考虑并平衡多个目标。为了应对这种情况,我们可以设置满足指标(Satisficing Metric)和优化指标(Optimizing Metric)。
以图像分类任务为例,我们可能同时关心模型的精确度(例如分类准确率)和模型的运行效率(例如分类速度)。这种情况下,我们可以将分类准确率设定为优化指标,尽量使其达到最高,而将分类速度设定为满足指标,只需确保其低于一个可接受的阈值(例如100毫秒)。
当我们需要考虑的目标数量为N时,我们可以选择一个目标作为优化指标,尽可能地优化这个目标,而将其余的N-1个目标作为满足指标,只要这些指标能够达到某个设定的阈值即可。这样,我们就可以在众多模型中快速并自动地选择出最佳模型:即在满足所有满足指标的前提下,优化指标的表现最优的那个模型。
设置满足指标和优化指标,就像设置“硬性指标”和“软性指标”一样。硬性指标是必须满足的底线,而软性指标则是我们期望尽可能达成的目标。通过合理设置这两类指标,我们可以更好地处理多目标任务。然而,我们也需要注意到,这些指标之间可能存在相互影响。例如在推荐系统中,点击率和转化率可能在一定程度上是矛盾的。如果只追求点击率可能会降低转化率,这时我们就需要根据业务需求,确定主要的优化目标。
四、训练集、开发集、测试集:定义目标阶段
将数据划分为训练集、开发集和测试集是机器学习中一个基本工作。这三个数据集对应的目标阶段各不相同:
- 训练集:用于迭代优化,使得模型在训练集上达到尽可能好的表现。
- 开发集:用于选择模型超参数,达到在开发集上最佳的泛化表现。
- 测试集:用于最后评估模型在真实应用中的泛化能力。
开发集的作用就像给团队设定了一个目标,指明我们期望模型最终能达到的泛化性能水平。一旦确定了开发集和评估指标,团队就可以通过不断尝试新思路、运行实验,在开发集上评估不同模型,选择最佳的一个。
开发集和测试集需要来自同一分布,不然可能导致测试集表现远逊于开发集。以前可能用70%数据做训练集,剩下30%做测试集。但在大数据时代,可以用更多数据(例如98%)做训练集,剩下1%左右的数据做开发和测试。
将数据分为三个目标阶段,使我们可以从不同的视角来优化模型:
- 在训练集阶段,可以使用一些泛化能力较差但训练效果好的技巧,如强正则化、extensive data augmentation等。
- 在开发集阶段,我们需要选择泛化能力更强的模型和超参数。
- 在测试集阶段,我们可以评估模型在真实应用中的泛化能力。
五、何时调整开发集与指标
开发集和评估指标定义了我们的目标。但有时我们会意识到原先的目标设置是不合适的,这时就需要相应调整开发集或指标。例如在猫咪分类任务中,我们发现算法A的错误率较低,但经常把一些不适宜的图片(如色情图片)分类为猫。这时nousy需要调整评估指标,给不适宜图片的错误更高的权重。如果开发集使用的是高质量的网路图片,但实际应用中用户上传的图片质量较差,那么也需要调整开发集,使之更符合实际场景。
即使最初无法完美定义开发集和评估指标,也需要先设定一个,以加快迭代优化的速度。当发现它不再适合时,才需要调整。调整开发集和评估指标就像路上的行人更换导航路径。当发现原先的路径不太合适,不能带我们达到目标时,我们需要重新规划一个更佳的路径。
何时需要调整开发集和评估指标取决于以下情况:
- 当模型在开发集上取得好结果,但在实际使用中表现不佳时
- 当评估指标不能很好反映实际需求时
- 当获取了新数据或发现原开发集存在问题时
- 当业务需求发生变化时
一般来说,如果模型在开发集的表现与最终实际效果存在较大差距,都需要考虑调整开发集或者评估指标。
六、人类表现:评估与优化的基准
近年来,许多机器学习团队会将算法表现与人类水平进行比较。这是因为深度学习进步使得机器学习超越人类成为可能,并且以人类能力为目标的任务设计流程也更高效。我们可以把人类在某个任务上的错误率,看作是贝叶斯最优错误率的一个估计。当算法表现接近人类水平时,进一步提升的难度会变大。 人类的表现水平为我们提供了一个评估与优化的基准。我们可以观察算法相对于人类水平的可避免偏差和方差问题,从而制定更明智的策略。 例如,如果算法训练集错误率远高于人类,那么应该集中精力减小偏差;如果已经接近人类水平,则应该着手减小方差。一旦超越人类表现,算法的可避免偏差和方差都难以准确评估,需要重新思考进一步提升的途径。但目前许多结构化数据学习任务都已超过人类水平。
使用人类表现作为基准具有以下优点:
- 人类表现是对复杂问题的直接度量,不受数据集等条件限制
- 人类表现集成了多个维度的信息,如前期知识、直觉等
- 人类表现反映了一个任务的难易程度
当然,人类表现也有其局限性,主要包括:
- 人类表现可能存在较大方差
- 人类也会受训练时间、注意力等影响
- 人类难以在大规模数据上进行表现
- 人类表现也可能存在认知偏见
综合来看,适当使用人类表现作为基准仍然可以为算法评估和优化提供很好的指导。但也需要注意其限制,保持理性的预期。
七、提升模型性能:错误分析的关键角色
在机器学习的过程中,当模型的表现尚未达到人类水平时,错误分析能起到决定性的作用,帮助我们确定如何更有效地进行优化。假设我们正在构建一个识别猫的图像分类模型,但目前的模型经常将狗误判为猫。许多人的直觉反应可能是搜集更多的狗的训练数据,以提高模型对狗的识别能力。然而,在投入大量时间和资源之前,我们首先需要通过错误分析来验证这个策略的有效性。
具体而言,我们可以从已被错误分类的验证集中随机选取100张图片进行人工检查,并统计其中实际上是狗的图片数量。如果只有5%的错误是由于狗被误判为猫,那么即使我们完全解决了这个问题,错误率也只能从10%降低到9.5%。这说明在这个方向上的改进空间可能是有限的。因此,我们可能需要重新思考,仅仅修正狗的分类问题是否是最有效的使用时间的方法。
事实上,我们可以从多个角度进行错误分析,例如大型猫的识别不准确、图像模糊导致的错误等。我们可以建立一个表格,列出每个错误来源及其对应的错误样本数量,以便判断哪些改进方向更值得投入时间和资源。这种方法为我们提供了对每个优化方向可能达到的性能上限的预测,从而帮助我们决定优先处理哪些问题。需要注意的是,错误分析仅仅提供了潜在的最佳结果,不意味着我们必须沿着这个方向进行优化。在分析过程中,我们可能会发现新的错误类型,需要考虑纳入优化策略。无论如何,错误分析为我们提供了一个量化和比较不同优化策略效果的框架,它是一种强大的工具。
为了进一步提高分析的有效性,我们可以从不同的角度进行错误分析,例如研究被误分类的主要区域、不同模型和模型组合的错误差异等。这样可以帮助我们深入理解错误的根源,找出问题的模式。例如,我们可以在错误的样本中高亮显示被误分类的区域,观察它们主要分布在图像的哪些位置,以此判断模型是否过分依赖局部特征而忽视了全局信息。我们还可以比较不同模型的错误情况,看是否存在系统性的分类偏差,从而为模型集成提供参考。
通过各个维度的定量和定性分析,我们可以更准确地确定下一步优化的重点。错误分析需要耐心和洞察力,但它的回报也是非常值得的。它使我们能够避免盲目的试错,以更有效的方式优化我们的机器学习系统。
八、提高数据质量:对错误标注的清理与管理
在监督学习问题中,训练集由输入特征X和相对应的标签Y组成。然而,在实际应用中,可能会有一部分Y被误标注。对于这些“脏数据”,我们需要在其清理的收益与成本之间做出权衡。虽然深度学习模型对训练集中的随机错误标注具有一定的鲁棒性,但如果错误表现出明显的模式,例如将所有白色的狗都标为猫,那么这将对模型的表现造成重大影响。因此,我们应优先纠正这种系统性的错误标注。对于训练集的错误标注,我们可以根据错误率和数据集的规模来决定是否进行全面的清理。如果数据量大且错误率不高,我们可能不需要花费大量时间处理。然而,开发集和测试集中的错误标注则会影响到我们对模型效果的评估,因此需要被仔细处理。在进行错误分析时,我们可以专门添加一列来记录这种错误,以评估其对性能的影响。如果它们严重影响到我们对结果的判断,那就有必要进行修正。
在清理过程中,我们需要检查预测正确与错误的样本,并处理开发集和测试集中的错误。至于是否对训练集进行全面清理,可以根据实际情况决定。总的来说,清理误标注需要在成本与收益之间进行仔细的权衡。为了确保清理后数据的质量,我们需要进行抽样检查。例如,我们可以从训练集中随机抽取一定数量的样本重新进行标注,然后计算人工标注和原标注之间的一致性。根据一致性水平,我们可以决定是否需要继续进行清理。此外,我们也可以尝试使用无监督学习等方法来自动检测训练集中的异常点,这些可能是被误标注的样本。然而,需要注意的是,真正的离群值也可能被误判。因此,最后仍需要通过人工检查来进行验证。
总的来说,对于不同的数据集,我们需要评估错误标注的类型、规模以及对模型性能的影响,从而制定出既符合成本效益又能确保数据质量的清理策略。这需要数据科学家、领域专家和标注人员的紧密协作,以提高我们的数据质量。
九、高效迭代优化:快速构建模型并不断提升
当我们构建新的机器学习应用时,目标是在确保可靠性的同时快速地获得初步的成果。以语音识别领域为例,我们来探讨如何通过高效的构建和持续的迭代优化来实现一个工作系统。语音识别可以从多个角度进行优化,比如降噪、识别方言以及儿童语音等。面对这么多的优化方向,确定优先级是一个挑战。我们推荐的方法是,首先快速地构建一个基础系统,然后通过偏差分析和错误分析来确定优化的优先级。
具体来说,我们可以先准备一个简易的开发集和评估指标,然后构建一个基础的语音识别系统。接着,通过偏差和方差的分析,结合错误分析,我们可以定位到主要的问题,例如,如果发现大量的错误源自远距离的语音,那么优先解决这个问题可能会得到最大的收益。
快速搭建基础系统的优点在于我们可以尽早建立一个可运行的版本,然后利用这个版本进行各种分析,从而确定后续优化的方向。在构建过程中,我们不必过分纠结于系统的复杂程度,只需要实现一个较为简单的版本即可。当然,如果在该领域已经有丰富的经验或大量的前期研究,我们也可以直接从一个较为复杂的系统开始。但对于新的问题,通常最明智的做法是快速构建一个基础系统并进行迭代,避免过度设计而陷入“分析瘫痪”。在快速构建基础系统之后,我们还需要设定明确的评估指标和迭代目标,这些可以是系统的整体指标,也可以是各个组件的指标。但无论哪种,都必须具体且可量化,这样我们才能比较不同迭代版本的效果。
另外,我们还需要控制每轮迭代的时间,避免陷入无尽的优化过程中。每一轮迭代我们可以首先实现一些改进效果明显的优化,然后再深入进行更高级的优化。快速构建和持续迭代是机器学习工程中一个极其宝贵的能力。
十、处理训练和测试集分布不匹配问题
在深度学习中,我们经常通过收集来自多种渠道的数据,组合成一个训练集,以获取更多的训练数据。然而,这些数据的分布常常与实际应用场景(也就是我们的开发测试数据)的分布有所不同。这种不匹配可能会对模型的泛化能力产生负面影响。在这里,我们将讨论如何分析和处理这一问题。
与平常的做法不同,我们这次需要额外设定一个“训练-开发集”。这个数据集能够反映模型在实际应用场景数据上的泛化能力。如果在训练-开发集上的误差比在训练集上大很多,那么说明模型对实际应用场景数据的泛化能力不足,这主要是由数据分布的不同所导致。
虽然通过增加训练-开发集的数据量可以降低模型的方差,但是对于数据分布不匹配的问题,并没有一种系统的解决方案。常见的处理方法包括:尽量使训练数据接近开发测试数据的分布;收集更多与开发测试数据相似的数据;使用在相关领域预训练过的模型等。举个例子,如果开发集中含有大量的噪声,我们可以通过添加相似的人工合成噪声音频来使训练数据更接近开发数据的分布。在此过程中,合成数据的质量和多样性至关重要,选择合适的生成方式可以帮助我们避免过拟合。
为了直观地分析训练和测试集的分布差异,我们可以进行统计比较,例如,计算数据的各项属性的均值、方差等统计量,看看它们是否存在系统偏差。我们还可以使用可视化工具,如 t-SNE 技术,将高维数据映射到二维平面,看看训练和测试集的数据是否聚成了不同的群。
这些分析可以帮助我们识别是哪些属性导致了分布的不匹配,以及这种不匹配的程度有多大。结合领域知识,我们可以有针对性地解决这些问题。
总的来说,错误分析可以帮助我们识别数据分布不匹配的问题,而人工数据合成则是解决这一问题的有效手段之一。我们需要仔细评估合成数据的有效性,以构建出泛化能力更强的模型。
十一、利用迁移学习和多任务学习提升模型泛化性能
在深度学习领域,我们经常遇到训练数据量有限的问题。面对这种情况,迁移学习和多任务学习两种技术可以帮助我们提升模型的泛化能力。它们可以让我们充分利用与目标任务相关的其他任务的数据。
迁移学习的基本思想是,先在一个任务(源任务)上训练模型,然后将该模型的知识迁移到另一个任务(目标任务)。这种方法非常适用于源任务有大量数据、目标任务数据不足的情况。例如,我们可以先在大规模的图像分类任务上预训练模型,然后将这个模型用于医学图像分析任务。在实施迁移学习时,我们可以选择直接使用源任务的预训练模型,或者仅使用它的部分网络层,或者将源任务的模型作为目标任务的正则项。需要注意的是,直接使用源任务的预训练模型可能会导致过拟合。因此,在很多情况下,我们会选择冻结部分网络层,只对高层部分进行训练。
多任务学习则是训练一个模型来同时处理多个相关的任务。比如,在一个自动驾驶系统中,我们可能需要模型同时进行车辆检测、行人检测、交通灯检测等任务。与独立训练每个任务的模型相比,多任务学习可以让不同任务共享特征,从而提升模型的泛化能力。在实施多任务学习时,我们通常让模型的底层共享特征提取层,然后在顶层独立处理各个任务。我们通过梯度累加的方式训练共享的特征提取层,但需要注意平衡不同任务的损失函数,防止某一个任务主导训练方向。
总的来说,迁移学习和多任务学习是两种强大的工具,可以帮助我们在数据量有限的情况下提升模型的泛化能力。迁移学习更适用于解决目标任务数据量不足的问题,而多任务学习则需要各个任务都有足够的数据来支持模型的训练。我们需要根据实际情况选择最合适的方法。
十二、深度学习中端到端与分步骤方法的选择
端到端深度学习是一种使用单一神经网络将输入直接映射到输出的方法,它简化了传统系统中需要的多个处理步骤。这种方法在很多应用中表现得非常出色,但同时也有其局限性。因此,在选择使用端到端方法还是分步骤方法时,需要根据具体问题的特性进行考量。
端到端学习的一个主要优点是,它能够利用大量的数据来训练复杂的模型,而且完全不需要人为地设计特征,这一切都交由数据自身来完成。这样可以避免人为设计的局限性,同时也简化了处理流程,无需设计和管理大量的中间步骤。但端到端方法的一个主要缺点是,它对数据量的要求非常高。对于数据规模不足的问题,分步骤方法可以通过注入人工先验知识来提高性能。此外,端到端方法也排除了人工设计有效组件的可能性。
因此,并不是所有问题都适合使用端到端深度学习。对于那些复杂但数据有限的问题,分步骤方法可能更为合适。以面部识别的安全检查为例,可能首先需要执行人脸检测,然后再进行面部识别,这样的整体效果可能会更好。在选择使用端到端方法还是分步骤方法时,我们需要考虑任务的复杂性、可获得数据的规模、问题的变化性等多个因素。如果任务相对简单,并且能够容易地获得大量数据,那么端到端方法可能更有优势。
然而,对于更复杂的问题,尤其是需要理解语义信息的问题,由于数据和模型的限制,分步骤方法仍然很有必要。此外,如果问题的域经常变化,那么分步骤方法可能会因其模块化和可解释性而更有优势。
总的来说,选择端到端方法还是分步骤方法需要根据具体问题的特性和可用数据的规模进行。端到端方法并不总是比注入人类专业知识的方法更优。我们需要充分利用数据的规模和学习能力,才能最大限度地发挥深度学习的优势。
总结
通过本篇博客,我们深入讨论了如何有效地设定机器学习项目的目标,评估模型性能,并进行优化。这包括了从任务定义开始,选择适合的评估指标,平衡多目标任务中的不同指标,到数据划分的重要性,以及在何时应该调整开发集和指标。同时,我们还讨论了以人类表现为基准的重要性和意义。
在机器学习中,选择适当的评估指标和数据集,设置合适的优化目标,以及对模型性能的适当评估,都是至关重要的。它们可以帮助我们更好地理解模型的表现,找到模型的不足,以及更有效地进行模型优化。
但是,我们需要记住,机器学习并不是一个静止的领域。随着技术的不断进步和新数据的出现,我们可能需要重新考虑我们的模型,评估指标和优化目标。因此,理解这些基础概念并灵活应用它们是非常重要的。