资讯详情

第二周:机器学习策略(2)(ML Strategy (2))

第二周:机器学习策略(2)(ML Strategy (2))

文章目录

    • 第二周:机器学习策略(2)(ML Strategy (2))
      • 2.1 误差分析(Carrying out error analysis)
      • 2.2 清除标记错误的数据(Cleaning up Incorrectly labeled data)
      • 2.3 快速构建您的第一个系统并迭代(Build your first system quickly, then iterate)
      • 2.4 使用不同分布的数据进行训练和测试(Training and testing on different distributions)
      • 2.5 当数据分布不匹配时,分析偏差和方差(Bias and Variance with mismatched data distributions)
      • 2.6 处理数据不匹配的问题(Addressing data mismatch)
      • 2.7 迁移学习(Transfer learning)
      • 2.8 多任务学习(Multi-task learning)
      • 2.9 端到端深度学习是什么?(What is end-to-end deep learning?)
      • 2.10 端到端深度学习应该使用吗?(Whether to use end-to-end learning?)

2.1 误差分析(Carrying out error analysis)

你好,欢迎回来。如果你想让学习算法胜任人类能做的任务,但你的学习算法还没有达到人类的表现,那么手动检查你的算法错误可能会让你知道下一步该做什么。这个过程被称为错误分析。让我们从一个例子开始。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-bok6sSJw-1611928569080)(…/images/a1e634aa2ebe9336bf161f10d676928f.png)]

假设你正在调试猫分类器,然后你获得了90%的准确性,相当于10%的错误,在你的开发集中这样做,离你想要的目标还很远。也许你的团队成员看了算法分类错误的例子,并注意到算法将一些狗分类为猫。看看这两只狗,它们看起来有点像猫,至少乍一看。所以也许你的队友会给你一个建议,如何优化狗的图片算法。想象一下,你可以为狗收集更多的狗图,或者设计一些只处理狗的算法功能。为了让你的猫分类器在狗图上做得更好,算法不再把狗分类成猫。所以问题是,你应该开始做一个专门处理狗的项目吗?这个项目可能需要几个月的时间来减少算法在狗的图片上犯更少的错误?或者与其花几个月的时间做这个项目,最终可能会发现这样没用。这里有一个错误的分析过程,可以让你很快知道这个方向是否值得努力。

这是我建议你做的,首先,收集一下,比如说100个错误标记的开发集样本,然后手动检查,一次只看一个,看看你的开发集里有多少错误标记的样本是狗。现在,假设事实上,你的100个错误标记样本中只有5%是狗,也就是说,在100个错误标记的开发集中,有5个是狗。这意味着100个样本,即使你完全解决了狗的问题,你也只能纠正100个错误中的5个。换句话说,如果只有5%的错误是狗的图片,如果你花了很多时间在狗的问题上,你只能希望你的错误率从10%降低到9.5%,对吧?错误率相对下降5%(总体下降0.5%,100错误样本,错误率为10%,样本为1000),即10%降至9%.5%。可以肯定这样花时间不好,或者可能要花时间,但至少这个分析给出了上限。如果你继续处理狗的问题,可以提高算法性能的上限,对吗?在机器学习中,有时我们称之为性能上限,这意味着完全解决狗的问题对你有多大帮助。

但现在,假设发生了另一件事。假设我们观察这100个错误标记的开发集样本,你会发现50张照片实际上是狗,所以50%是狗的照片。现在花时间解决狗的问题可能会有很好的效果。在这种情况下,如果你真的解决了狗的问题,你的错误率可能会从10%下降到5%。然后你可能会觉得减半错误率的方向值得一试,可以集中精力减少错误标记的狗图。

我知道在机器学习中,有时我们鄙视手动操作,或者使用太多的人为值。然而,如果你想建立一个应用程序系统,这个简单的人工统计步骤和错误分析可以节省很多时间,并迅速决定什么是最重要或最有希望的方向。事实上,如果你观察100个错误标记的开发集样本,你可能只需要5到10分钟就可以看到100个样本,并计算有多少是狗。根据结果,看看是否占5%、50%或其他东西。这可以在5到10分钟内估计这个方向的价值,并帮助你做出更好的决定,是否把未来几个月的时间花在解决错误标记的狗图上。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-j6ZPqJn9-1611928569083)(…/images/ef3a1a483263b2693ecb6c7c1aecc565.png)]

在这个幻灯片中,我们需要描述如何使用错误的分析来评估狗的问题是否值得解决。有时候,当你做错误分析时,你也可以同时评估几个想法。例如,你有几个改进猫探测器的想法。也许你可以提高狗地图的性能,或者有时你应该注意那些猫,如狮子、豹子、猎豹等,它们经常被分类为小猫或家猫,所以你可以找到解决这个错误的方法。也许你会发现有些图像是模糊的,如果你能设计出一些系统,就能更好地处理模糊的图像。也许你有一些想法,知道如何处理这些问题,并进行错误的分析来评估这三个想法。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-K3DdLb4V-1611928569085)(…/images/4502737a321a0f6269ee11cb8f140827.png)]

我所做的就是建立这样一个表格,我通常使用电子表格,但普通文本文件也可以。在最左边,如果你观察100张图片,你想手动分析的图像集可能是从1到100。电子表格的列表对应于你想要评估的想法,所以我通常会在电子表格中留下空间来写评论,比如狗、猫和模糊图像。因此,请记住,在错误分析的过程中,您可以查看算法识别错误的开发集样本。如果你发现第一张识别错误的图片是狗的图片,那么我会在那里勾选。为了帮助我记住这些图片,有时我会在评论中注释。也许这是一张比特狗的照片。假如第二张照片很模糊,也记下来。如果第三张是下雨天动物园里的狮子,被认定为猫,那就是大型猫科动物,图片模糊。评论部分写动物园下雨天,让图像模糊。最后,在这组图像之后,我可以计算这些算法(错误)的百分比,或者每个错误类型的百分比,有多少是狗,大猫或模糊这些错误类型。所以也许你检查的图像中8%是狗,可能43%属于大猫,61%属于模糊。这意味着扫过每一列,统计那一列有多少百分比图像被勾住。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-9ySCUNAk-1611928569088)(…/images/d8f6d23ebbf3031932034f29f1630dc2.png)]

当这一步达到一半时,有时你可能会发现其他错误的类型,比如你可能会发现滤镜,那些花哨的图像滤镜,干扰了你的分类器。在这种情况下,实际上可以在错误的分析中添加这样的列,如多色滤镜 滤镜和过滤器,然后再次计算这些问题,并确定新的错误类型占多少百分比。这个分析步骤的结果可以估计是否值得处理每个不同的错误类型。

例如,在这个样本中,有许多来自模糊图片和大猫图片的错误类型。因此,这种分析的结果并不意味着你必须处理模糊图片。这种分析没有给你一个严格的数学公式,告诉你应该做什么,但它可以让你对应该选择哪些方法有一个概念。它还告诉你,例如,无论你对狗的照片还是在这些例子中,你最多只能提高8%或12%的性能。在大猫图片这种类型中,你可以做得更好。或者模糊图像,这些类型有改进的潜力。在这些类型中,性能提高的上限空间要大得多。因此,这取决于你提高性能的想法,比如提高大猫图片或模糊图片的性能。也许你可以选择其中两个,或者你有足够的团队成员,也许你可以把团队分成两个团队,一个试图改善大猫的识别,另一个试图改善模糊图片的识别。但是你可以经常做这个快速统计步骤,最多需要几个小时才能真正帮助你选择高优先级任务,了解每种方法有多大的提高性能的空间。

所以综上所述,如果你进行了错误的分析,你应该找到一组错误的样本,可能在你的开发集或测试集中开发集或测试集中查看假阳性样本()和假阴性(),统计不同错误类型的错误数量。在这个过程中,你可能会受到启发,总结出新的错误类型,正如我们所看到的。如果你通过了错误的样本,然后说,天哪,有这么多滤镜或过滤器,这些过滤器干扰了我的分类器,你可以在路上创建一个错误的类型。简而言之,通过统计不同错误标记类型占总数的百分比,你可以帮助你找到需要优先解决的问题,或者给你一个新的优化方向的灵感。错误分析的时候,有时你会注意到开发集里有些样本被错误标记了,这时应该怎么做呢?我们下一个视频来讨论。

2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)

你的监督学习问题的数据由输入 x x x和输出标签 y y y 构成,如果你观察一下你的数据,并发现有些输出标签 y y y 是错的。你的数据有些标签是错的,是否值得花时间去修正这些标签呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RWWii7um-1611928569092)(…/images/56f907e76f4fc8f589f1930128f77a98.png)]

我们看看在猫分类问题中,图片是猫, y = 1 y=1 y=1;不是猫, y = 0 y=0 y=0。所以假设你看了一些数据样本,发现这(倒数第二张图片)其实不是猫,所以这是标记错误的样本。我用了这个词,“标记错误的样本”来表示你的学习算法输出了错误的 y y y 值。但我要说的是,对于标记错误的样本,参考你的数据集,在训练集或者测试集 y y y 的标签,人类给这部分数据加的标签,实际上是错的,这实际上是一只狗,所以 y y y 其实应该是0,也许做标记的那人疏忽了。如果你发现你的数据有一些标记错误的样本,你该怎么办?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPgU4Ppq-1611928569092)(…/images/a9cd24c7602100aaa8fb69eb03a3c47c.png)]

首先,我们来考虑训练集,事实证明,深度学习算法对于训练集中的随机错误是相当健壮的()。只要你的标记出错的样本,只要这些错误样本离随机错误不太远,有时可能做标记的人没有注意或者不小心,按错键了,如果错误足够随机,那么放着这些错误不管可能也没问题,而不要花太多时间修复它们。

当然你浏览一下训练集,检查一下这些标签,并修正它们也没什么害处。有时候修正这些错误是有价值的,有时候放着不管也可以,只要总数据集总足够大,实际错误率可能不会太高。我见过一大批机器学习算法训练的时候,明知训练集里有 x x x个错误标签,但最后训练出来也没问题。

我这里先警告一下,深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。所以比如说,如果做标记的人一直把白色的狗标记成猫,那就成问题了。因为你的分类器学习之后,会把所有白色的狗都分类为猫。但随机错误或近似随机错误,对于大多数深度学习算法来说不成问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZgrnxpk-1611928569093)(…/images/e5c7f1005d695914f4a2fc988aa46821.png)]

现在,之前的讨论集中在训练集中的标记出错的样本,那么如果是开发集和测试集中有这些标记出错的样本呢?如果你担心开发集或测试集上标记出错的样本带来的影响,他们一般建议你在错误分析时,添加一个额外的列,这样你也可以统计标签 y = 1 y=1 y=1错误的样本数。所以比如说,也许你统计一下对100个标记出错的样本的影响,所以你会找到100个样本,其中你的分类器的输出和开发集的标签不一致,有时对于其中的少数样本,你的分类器输出和标签不同,是因为标签错了,而不是你的分类器出错。所以也许在这个样本中,你发现标记的人漏了背景里的一只猫,所以那里打个勾,来表示样本98标签出错了。也许这张图实际上是猫的画,而不是一只真正的猫,也许你希望标记数据的人将它标记为 y = 0 y=0 y=0,而不是 y = 1 y=1 y=1,然后再在那里打个勾。当你统计出其他错误类型的百分比后,就像我们在之前的视频中看到的那样,你还可以统计因为标签错误所占的百分比,你的开发集里的 y y y 值是错的,这就解释了为什么你的学习算法做出和数据集里的标记不一样的预测1。

所以现在问题是,是否值得修正这6%标记出错的样本,我的建议是,如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。

我给你看一个样本,解释清楚我的意思。所以我建议你看3个数字来确定是否值得去人工修正标记出错的数据,我建议你看看整体的开发集错误率,在我们以前的视频中的样本,我们说也许我们的系统达到了90%整体准确度,所以有10%错误率,那么你应该看看错误标记引起的错误的数量或者百分比。所以在这种情况下,6%的错误来自标记出错,所以10%的6%就是0.6%。也许你应该看看其他原因导致的错误,如果你的开发集上有10%错误,其中0.6%是因为标记出错,剩下的占9.4%,是其他原因导致的,比如把狗误认为猫,大猫图片。所以在这种情况下,我说有9.4%错误率需要集中精力修正,而标记出错导致的错误是总体错误的一小部分而已,所以如果你一定要这么做,你也可以手工修正各种错误标签,但也许这不是当下最重要的任务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEjAqTcn-1611928569094)(…/images/fc5d8fbd1124120e01fc4287896faa44.png)]

我们再看另一个样本,假设你在学习问题上取得了很大进展,所以现在错误率不再是10%了,假设你把错误率降到了2%,但总体错误中的0.6%还是标记出错导致的。所以现在,如果你想检查一组标记出错的开发集图片,开发集数据有2%标记错误了,那么其中很大一部分,0.6%除以2%,实际上变成30%标签而不是6%标签了。有那么多错误样本其实是因为标记出错导致的,所以现在其他原因导致的错误是1.4%。当测得的那么大一部分的错误都是开发集标记出错导致的,那似乎修正开发集里的错误标签似乎更有价值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDExq0gU-1611928569094)(…/images/08c2b44a5718781eb81fe4d0a2bccdde.png)]

如果你还记得设立开发集的目标的话,开发集的主要目的是,你希望用它来从两个分类器 A A A和 B B B中选择一个。所以当你测试两个分类器 A A A和 B B B时,在开发集上一个有2.1%错误率,另一个有1.9%错误率,但是你不能再信任开发集了,因为它无法告诉你这个分类器是否比这个好,因为0.6%的错误率是标记出错导致的。那么现在你就有很好的理由去修正开发集里的错误标签,因为在右边这个样本中,标记出错对算法错误的整体评估标准有严重的影响。而左边的样本中,标记出错对你算法影响的百分比还是相对较小的。

现在如果你决定要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,这里还有一些额外的方针和原则需要考虑。首先,我鼓励你不管用什么修正手段,都要同时作用到开发集和测试集上,我们之前讨论过为什么,开发和测试集必须来自相同的分布。开发集确定了你的目标,当你击中目标后,你希望算法能够推广到测试集上,这样你的团队能够更高效的在来自同一分布的开发集和测试集上迭代。如果你打算修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。所以我们雇佣了一个人来仔细检查这些标签,但必须同时检查开发集和测试集。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2JTuH4V-1611928569095)(…/images/9d5b710121594f5a1e1bc5e901be52a8.png)]

其次,我强烈建议你要考虑同时检验算法判断正确和判断错误的样本,要检查算法出错的样本很容易,只需要看看那些样本是否需要修正,但还有可能有些样本算法判断正确,那些也需要修正。如果你只修正算法出错的样本,你对算法的偏差估计可能会变大,这会让你的算法有一点不公平的优势,我们就需要再次检查出错的样本,但也需要再次检查做对的样本,因为算法有可能因为运气好把某个东西判断对了。在那个特例里,修正那些标签可能会让算法从判断对变成判断错。这第二点不是很容易做,所以通常不会这么做。通常不会这么做的原因是,如果你的分类器很准确,那么判断错的次数比判断正确的次数要少得多。那么就有2%出错,98%都是对的,所以更容易检查2%数据上的标签,然而检查98%数据上的标签要花的时间长得多,所以通常不这么做,但也是要考虑到的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WqPMlML0-1611928569096)(…/images/55478871edfd7d384494967008c96972.png)]

最后,如果你进入到一个开发集和测试集去修正这里的部分标签,你可能会,也可能不会去对训练集做同样的事情,还记得我们在其他视频里讲过,修正训练集中的标签其实相对没那么重要,你可能决定只修正开发集和测试集中的标签,因为它们通常比训练集小得多,你可能不想把所有额外的精力投入到修正大得多的训练集中的标签,所以这样其实是可以的。我们将在本周晚些时候讨论一些步骤,用于处理你的训练数据分布和开发与测试数据不同的情况,对于这种情况学习算法其实相当健壮,你的开发集和测试集来自同一分布非常重要。但如果你的训练集来自稍微不同的分布,通常这是一件很合理的事情,我会在本周晚些时候谈谈如何处理这个问题。

最后我讲几个建议:

首先,深度学习研究人员有时会喜欢这样说:“我只是把数据提供给算法,我训练过了,效果拔群”。这话说出了很多深度学习错误的真相,更多时候,我们把数据喂给算法,然后训练它,并减少人工干预,减少使用人类的见解。但我认为,在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统,尽管深度学习的研究人员不愿意承认这点。

其次,不知道为什么,我看一些工程师和研究人员不愿意亲自去看这些样本,也许做这些事情很无聊,坐下来看100或几百个样本来统计错误数量,但我经常亲自这么做。当我带领一个机器学习团队时,我想知道它所犯的错误,我会亲自去看看这些数据,尝试和一部分错误作斗争。我想就因为花了这几分钟,或者几个小时去亲自统计数据,真的可以帮你找到需要优先处理的任务,我发现花时间亲自检查数据非常值得,所以我强烈建议你们这样做,如果你在搭建你的机器学习系统的话,然后你想确定应该优先尝试哪些想法,或者哪些方向。

这就是错误分析过程,在下一个视频中,我想分享一下错误分析是如何在启动新的机器学习项目中发挥作用的。

2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)

如果你正在开发全新的机器学习应用,我通常会给你这样的建议,你应该尽快建立你的第一个系统原型,然后快速迭代。

让我告诉你我的意思,我在语音识别领域研究了很多年,如果你正在考虑建立一个新的语音识别系统,其实你可以走很多方向,可以优先考虑很多事情。

比如,有一些特定的技术,可以让语音识别系统对嘈杂的背景更加健壮,嘈杂的背景可能是说咖啡店的噪音,背景里有很多人在聊天,或者车辆的噪音,高速上汽车的噪音或者其他类型的噪音。有一些方法可以让语音识别系统在处理带口音时更健壮,还有特定的问题和麦克风与说话人距离很远有关,就是所谓的远场语音识别。儿童的语音识别带来特殊的挑战,挑战来自单词发音方面,还有他们选择的词汇,他们倾向于使用的词汇。还有比如说,说话人口吃,或者说了很多无意义的短语,比如“哦”,“啊”之类的。你可以选择很多不同的技术,让你听写下来的文本可读性更强,所以你可以做很多事情来改进语音识别系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUdhFjdr-1611928569097)(…/images/9a5fd355b0d3a39a021ded507178343d.png)]

一般来说,对于几乎所有的机器学习程序可能会有50个不同的方向可以前进,并且每个方向都是相对合理的可以改善你的系统。但挑战在于,你如何选择一个方向集中精力处理。即使我已经在语音识别领域工作多年了,如果我要为一个新应用程序域构建新系统,我还是觉得很难不花时间去思考这个问题就直接选择方向。所以我建议你们,如果你想搭建全新的机器学习程序,就是快速搭好你的第一个系统,然后开始迭代。我的意思是我建议你快速设立开发集和测试集还有指标,这样就决定了你的目标所在,如果你的目标定错了,之后改也是可以的。但一定要设立某个目标,然后我建议你马上搭好一个机器学习系统原型,然后找到训练集,训练一下,看看效果,开始理解你的算法表现如何,在开发集测试集,你的评估指标上表现如何。当你建立第一个系统后,你就可以马上用到之前说的偏差方差分析,还有之前最后几个视频讨论的错误分析,来确定下一步优先做什么。特别是如果错误分析让你了解到大部分的错误的来源是说话人远离麦克风,这对语音识别构成特殊挑战,那么你就有很好的理由去集中精力研究这些技术,所谓远场语音识别的技术,这基本上就是处理说话人离麦克风很远的情况。

建立这个初始系统的所有意义在于,它可以是一个快速和粗糙的实现(),你知道的,别想太多。初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX3TTzzc-1611928569097)(…/images/4307a97cb4f2e2d6abc7b8ff28b0ca87.png)]

所以回顾一下,我建议你们快速建立你的第一个系统,然后迭代。不过如果你在这个应用程序领域有很多经验,这个建议适用程度要低一些。还有一种情况适应程度更低,当这个领域有很多可以借鉴的学术文献,处理的问题和你要解决的几乎完全相同,所以,比如说,人脸识别就有很多学术文献,如果你尝试搭建一个人脸识别设备,那么可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。但如果你第一次处理某个新问题,那我真的不鼓励你想太多,或者把第一个系统弄得太复杂。我建议你们构建一些快速而粗糙的实现,然后用来帮你找到改善系统要优先处理的方向。我见过很多机器学习项目,我觉得有些团队的解决方案想太多了,他们造出了过于复杂的系统。我也见过有限团队想的不够,然后造出过于简单的系统。平均来说,我见到更多的团队想太多,构建太复杂的系统。

所以我希望这些策略有帮助,如果你将机器学习算法应用到新的应用程序里,你的主要目标是弄出能用的系统,你的主要目标并不是发明全新的机器学习算法,这是完全不同的目标,那时你的目标应该是想出某种效果非常好的算法。所以我鼓励你们搭建快速而粗糙的实现,然后用它做偏差/方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的方向。

2.4 使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)

深度学习算法对训练数据的胃口很大,当你收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。在深度学习时代,越来越多的团队都用来自和开发集、测试集分布不同的数据来训练,这里有一些微妙的地方,一些最佳做法来处理训练集和测试集存在差异的情况,我们来看看。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NgazeilQ-1611928569098)(…/images/9a6cbca750b289408a25789e224aeefc.png)]

假设你在开发一个手机应用,用户会上传他们用手机拍摄的照片,你想识别用户从应用中上传的图片是不是猫。现在你有两个数据来源,一个是你真正关心的数据分布,来自应用上传的数据,比如右边的应用,这些照片一般更业余,取景不太好,有些甚至很模糊,因为它们都是业余用户拍的。另一个数据来源就是你可以用爬虫程序挖掘网页直接下载,就这个样本而言,可以下载很多取景专业、高分辨率、拍摄专业的猫图片。如果你的应用用户数还不多,也许你只收集到10,000张用户上传的照片,但通过爬虫挖掘网页,你可以下载到海量猫图,也许你从互联网上下载了超过20万张猫图。而你真正关心的算法表现是你的最终系统处理来自应用程序的这个图片分布时效果好不好,因为最后你的用户会上传类似右边这些图片,你的分类器必须在这个任务中表现良好。现在你就陷入困境了,因为你有一个相对小的数据集,只有10,000个样本来自那个分布,而你还有一个大得多的数据集来自另一个分布,图片的外观和你真正想要处理的并不一样。但你又不想直接用这10,000张图片,因为这样你的训练集就太小了,使用这20万张图片似乎有帮助。但是,困境在于,这20万张图片并不完全来自你想要的分布,那么你可以怎么做呢?

这里有一种选择,你可以做的一件事是将两组数据合并在一起,这样你就有21万张照片,你可以把这21万张照片随机分配到训练、开发和测试集中。为了说明观点,我们假设你已经确定开发集和测试集各包含2500个样本,所以你的训练集有205000个样本。现在这么设立你的数据集有一些好处,也有坏处。好处在于,你的训练集、开发集和测试集都来自同一分布,这样更好管理。但坏处在于,这坏处还不小,就是如果你观察开发集,看看这2500个样本其中很多图片都来自网页下载的图片,那并不是你真正关心的数据分布,你真正要处理的是来自手机的图片。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dh2z1Krw-1611928569099)(…/images/9a6cbca750b289408a25789e224aeefc.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61o70XxC-1611928569100)(…/images/57c4cad6f0df4dc06ecf90c4f2d81a68.png)]

所以结果你的数据总量,这200,000个样本,我就用 200 k 200k 200k缩写表示,我把那些是从网页下载的数据总量写成 210 k 210k 210k,所以对于这2500个样本,数学期望值是: 2500 × 200 k 210 k = 2381 2500\times \frac{200k}{210k} =2381 2500×210k200k​=2381,有2381张图来自网页下载,这是期望值,确切数目会变化,取决于具体的随机分配操作。但平均而言,只有119张图来自手机上传。要记住,设立开发集的目的是告诉你的团队去瞄准的目标,而你瞄准目标的方式,你的大部分精力都用在优化来自网页下载的图片,这其实不是你想要的。所以我真的不建议使用第一个选项,因为这样设立开发集就是告诉你的团队,针对不同于你实际关心的数据分布去优化,所以不要这么做。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dszLpMq-1611928569101)(…/images/eb0178687dedc450e1c184b958adeef3.png)]

我建议你走另外一条路,就是这样,训练集,比如说还是205,000张图片,我们的训练集是来自网页下载的200,000张图片,然后如果需要的话,再加上5000张来自手机上传的图片。然后对于开发集和测试集,这数据集的大小是按比例画的,你的开发集和测试集都是手机图。而训练集包含了来自网页的20万张图片,还有5000张来自应用的图片,开发集就是2500张来自应用的图片,测试集也是2500张来自应用的图片。这样将数据分成训练集、开发集和测试集的好处在于,现在你瞄准的目标就是你想要处理的目标,你告诉你的团队,我的开发集包含的数据全部来自手机上传,这是你真正关心的图片分布。我们试试搭建一个学习系统,让系统在处理手机上传图片分布时效果良好。缺点在于,当然了,现在你的训练集分布和你的开发集、测试集分布并不一样。但事实证明,这样把数据分成训练、开发和测试集,在长期能给你带来更好的系统性能。我们以后会讨论一些特殊的技巧,可以处理 训练集的分布和开发集和测试集分布不一样的情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpURmr10-1611928569102)(…/images/53d43ef349533237ceff7efac6341046.png)]

我们来看另一个样本,假设你正在开发一个全新的产品,一个语音激活汽车后视镜,这在中国是个真实存在的产品,它正在进入其他国家。但这就是造一个后视镜,把这个小东西换掉,现在你就可以和后视镜对话了,然后只需要说:“亲爱的后视镜,请帮我找找到最近的加油站的导航方向”,然后后视镜就会处理这个请求。所以这实际上是一个真正的产品,假设现在你要为你自己的国家研制这个产品,那么你怎么收集数据去训练这个产品语言识别模块呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZLfzFVo-1611928569103)(…/images/50c5e70da71a16f0af95b3be038488a9.png)]

嗯,也许你已经在语音识别领域上工作了很久,所以你有很多来自其他语音识别应用的数据,它们并不是来自语音激活后视镜的数据。现在我讲讲如何分配训练集、开发集和测试集。对于你的训练集,你可以将你拥有的所有语音数据,从其他语音识别问题收集来的数据,比如这些年你从各种语音识别数据供应商买来的数据,今天你可以直接买到成 x x x, y y y对的数据,其中 x x x是音频剪辑, y y y是听写记录。或者也许你研究过智能音箱,语音激活音箱,所以你有一些数据,也许你做过语音激活键盘的开发之类的。

举例来说,也许你从这些来源收集了500,000段录音,对于你的开发集和测试集也许数据集小得多,比如实际上来自语音激活后视镜的数据。因为用户要查询导航信息或试图找到通往各个地方的路线,这个数据集可能会有很多街道地址,对吧?“请帮我导航到这个街道地址”,或者说:“请帮助我导航到这个加油站”,所以这个数据的分布和左边大不一样,但这真的是你关心的数据,因为这些数据是你的产品必须处理好的,所以你就应该把它设成你的开发和测试集。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f5UrNApi-1611928569104)(…/images/ca34742f5f0b19239de5779dc80ad4d9.png)]

在这个样本中,你应该这样设立你的训练集,左边有500,000段语音,然后你的开发集和测试集,我把它简写成 D D D和 T T T,可能每个集包含10,000段语音,是从实际的语音激活后视镜收集的。或者换种方式,如果你觉得不需要将20,000段来自语音激活后视镜的录音全部放进开发和测试集,也许你可以拿一半,把它放在训练集里,那么训练集可能是51万段语音,包括来自那里的50万段语音,还有来自后视镜的1万段语音,然后开发集和测试集也许各自有5000段语音。所以有2万段语音,也许1万段语音放入了训练集,5000放入开发集,5000放入测试集。所以这是另一种将你的数据分成训练、开发和测试的方式。这样你的训练集大得多,大概有50万段语音,比只用语音激活后视镜数据作为训练集要大得多。

所以在这个视频中,你们见到几组样本,让你的训练集数据来自和开发集、测试集不同的分布,这样你就可以有更多的训练数据。在这些样本中,这将改善你的学习算法。

现在你可能会问,是不是应该把收集到的数据都用掉?答案很微妙,不一定都是肯定的答案,我们在下段视频看看一个反例。

2.5 数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)

估计学习算法的偏差和方差真的可以帮你确定接下来应该优先做的方向,但是,当你的训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样,我们来看为什么。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXtBpYBI-1611928569106)(…/images/5cbede5222b199f84dc491e0550435b6.png)]

我们继续用猫分类器为例,我们说人类在这个任务上能做到几乎完美,所以贝叶斯错误率或者说贝叶斯最优错误率,我们知道这个问题里几乎是0%。所以要进行错误率分析,你通常需要看训练误差,也要看看开发集的误差。比如说,在这个样本中,你的训练集误差是1%,你的开发集误差是10%,如果你的开发集来自和训练集一样的分布,你可能会说,这里存在很大的方差问题,你的算法不能很好的从训练集出发泛化,它处理训练集很好,但处理开发集就突然间效果很差了。

但如果你的训练数据和开发数据来自不同的分布,你就不能再放心下这个结论了。特别是,也许算法在开发集上做得不错,可能因为训练集很容易识别,因为训练集都是高分辨率图片,很清晰的图像,但开发集要难以识别得多。所以也许软件没有方差问题,这只不过反映了开发集包含更难准确分类的图片。所以这个分析的问题在于,当你看训练误差,再看开发误差,有两件事变了。首先算法只见过训练集数据,没见过开发集数据。第二,开发集数据来自不同的分布。而且因为你同时改变了两件事情,很难确认这增加的9%误差率有多少是因为算法没看到开发集中的数据导致的,这是问题方差的部分,有多少是因为开发集数据就是不一样。

为了弄清楚哪个因素影响更大,如果你完全不懂这两种影响到底是什么,别担心我们马上会再讲一遍。但为了分辨清楚两个因素的影响,定义一组新的数据是有意义的,我们称之为训练-开发集,所以这是一个新的数据子集。我们应该从训练集的分布里挖出来,但你不会用来训练你的网络。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-erSPFCtC-1611928569107)(…/images/66fcfec7152b504adb2e6124291f4a68.png)]

我的意思是我们已经设立过这样的训练集、开发集和测试集了,并且开发集和测试集来自相同的分布,但训练集来自不同的分布。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-En4TIhc8-1611928569107)(…/images/8826bdf0014f196aa9b512db2262898b.png)]

我们要做的是随机打散训练集,然后分出一部分训练集作为训练-开发集(training-dev),就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V18aN1Rp-1611928569108)(…/images/6a3c48f8a71b678c2769165f38523635.png)]

但不同的地方是,现在你只在训练集训练你的神经网络,你不会让神经网络在训练-开发集上跑后向传播。为了进行误差分析,你应该做的是看看分类器在训练集上的误差,训练-开发集上的误差,还有开发集上的误差。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvWfPmTW-1611928569109)(…/images/c5d2293143857294c49859eb875272f5.png)]

比如说这个样本中,训练误差是1%,我们说训练-开发集上的误差是9%,然后开发集误差是10%,和以前一样。你就可以从这里得到结论,当你从训练数据变到训练-开发集数据时,错误率真的上升了很多。而训练数据和训练-开发数据的差异在于,你的神经网络能看到第一部分数据并直接在上面做了训练,但没有在训练-开发集上直接训练,这就告诉你,算法存在方差问题,因为训练-开发集的错误率是在和训练集来自同一分布的数据中测得的。所以你知道,尽管你的神经网络在训练集中表现良好,但无法泛化到来自相同分布的训练-开发集里,它无法很好地泛化推广到来自同一分布,但以前没见过的数据中,所以在这个样本中我们确实有一个方差问题。

我们来看一个不同的样本,假设训练误差为1%,训练-开发误差为1.5%,但当你开始处理开发集时,错误率上升到10%。现在你的方差问题就很小了,因为当你从见过的训练数据转到训练-开发集数据,神经网络还没有看到的数据,错误率只上升了一点点。但当你转到开发集时,错误率就大大上升了,所以这是数据不匹配的问题。因为你的学习算法没有直接在训练-开发集或者开发集训练过,但是这两个数据集来自不同的分布。但不管算法在学习什么,它在训练-开发集上做的很好,但开发集上做的不好,所以总之你的算法擅长处理和你关心的数据不同的分布,我们称之为数据不匹配的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jnTKezap-1611928569110)(…/images/b997fa8695062ca7332b18d51767b7df.png)]

我们再来看几个样本,我会在下一行里写出来,因上面没空间了。所以训练误差、训练-开发误差、还有开发误差,我们说训练误差是10%,训练-开发误差是11%,开发误差为12%,要记住,人类水平对贝叶斯错误率的估计大概是0%,如果你得到了这种等级的表现,那就真的存在偏差问题了。存在可避免偏差问题,因为算法做的比人类水平差很多,所以这里的偏差真的很高。

最后一个例子,如果你的训练集错误率是10%,你的训练-开发错误率是11%,开发错误率是20%,那么这其实有两个问题。第一,可避免偏差相当高,因为你在训练集上都没有做得很好,而人类能做到接近0%错误率,但你的算法在训练集上错误率为10%。这里方差似乎很小,但数据不匹配问题很大。所以对于这个样本,我说,如果你有很大的偏差或者可避免偏差问题,还有数据不匹配问题。

我们看看这张幻灯片里做了什么,然后写出一般的原则,我们要看的关键数据是人类水平错误率,你的训练集错误率,训练-开发集错误率,所以这分布和训练集一样,但你没有直接在上面训练。根据这些错误率之间差距有多大,你可以大概知道,可避免偏差、方差数据不匹配问题各自有多大。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKIjx4zq-1611928569111)(…/images/5bbfa44bc294dd33f01346b1aa87d930.png)]

我们说人类水平错误率是4%的话,你的训练错误率是7%,而你的训练-开发错误率是10%,而开发错误率是12%,这样你就大概知道可避免偏差有多大。因为你知道,你希望你的算法至少要在训练集上的表现接近人类。而这大概表明了方差大小,所以你从训练集泛化推广到训练-开发集时效果如何?而这告诉你数据不匹配的问题大概有多大。技术上你还可以再加入一个数字,就是测试集表现,我们写成测试集错误率,你不应该在测试集上开发,因为你不希望对测试集过拟合。但如果你看看这个,那么这里的差距就说明你对开发集过拟合的程度。所以如果开发集表现和测试集表现有很大差距,那么你可能对开发集过拟合了,所以也许你需要一个更大的开发集,对吧?要记住,你的开发集和测试集来自同一分布,所以这里存在很大差距的话。如果算法在开发集上做的很好,比测试集好得多,那么你就可能对开发集过拟合了。如果是这种情况,那么你可能要往回退一步,然后收集更多开发集数据。现在我写出这些数字,这数字列表越往后数字越大。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QDsAgUxd-1611928569111)(…/images/5bbfa44bc294dd33f01346b1aa87d930.png)]

这里还有个例子,其中数字并没有一直变大,也许人类的表现是4%,训练错误率是7%,训练-开发错误率是10%。但我们看看开发集,你发现,很意外,算法在开发集上做的更好,也许是6%。所以如果你见到这种现象,比如说在处理语音识别任务时发现这样,其中训练数据其实比你的开发集和测试集难识别得多。所以这两个(7%,10%)是从训练集分布评估的,而这两个(6%,6%)是从开发测试集分布评估的。所以有时候如果你的开发测试集分布比你应用实际处理的数据要容易得多,那么这些错误率可能真的会下降。所以如果你看到这样的有趣的事情,可能需要比这个分析更普适的分析,我在下一张幻灯片里快速解释一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZkhbYv1G-1611928569112)(…/images/347df851fe3809b308850a9e14cfdbb0.png)]

所以,我们就以语音激活后视镜为例子,事实证明,我们一直写出的数字可以放到一张表里,在水平轴上,我要放入不同的数据集。比如说,你可能从一般语音识别任务里得到很多数据,所以你可能会有一堆数据,来自小型智能音箱的语音识别问题的数据,你购买的数据等等。然后你收集了和后视镜有关的语音数据,在车里录的。所以这是表格的 x x x轴,不同的数据集。在另一条轴上,我要标记处理数据不同的方式或算法。

首先,人类水平,人类处理这些数据集时准确度是多少。然后这是神经网络训练过的数据集上达到的错误率,然后还有神经网络没有训练过的数据集上达到的错误率。所以结果我们上一张幻灯片说是人类水平的错误率,数字填入这个单元格里(第二行第二列),人类对这一类数据处理得有多好,比如来自各种语音识别系统的数据,那些进入你的训练集的成千上万的语音片段,而上一张幻灯片中的例子是4%。这个数字(7%),可能是我们的训练错误率,在上一张幻灯片中的例子中是7%。是的,如果你的学习算法见过这个样本,在这个样本上跑过梯度下降,这个样本来自你的训练集分布或一般的语音识别数据分布,你的算法在训练过的数据中表现如何呢?然后这就是训练-开发集错误率,通常来自这个分布的错误率会高一点,一般的语音识别数据,如果你的算法没在来自这个分布的样本上训练过,它的表现如何呢?这就是我们说的训练-开发集错误率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVathxoq-1611928569113)(…/images/ee5988fbe0d84a4e3a3546b547bdd9fa.png)]

如果你移到右边去,这个单元格是开发集错误率,也可能是测试集错误,在刚刚的例子中是6%。而开发集和测试集,实际上是两个数字,但都可以放入这个单元格里。如果你有来自后视镜的数据,来自从后视镜应用在车里实际录得的数据,但你的神经网络没有在这些数据上做过反向传播,那么错误率是多少呢?

我们在上一张幻灯片作的分析是观察这两个数字之间的差异(),还有这两个数字之间(),这两个数字之间()。这个差距()衡量了可避免偏差大小,这个差距)衡量了方差大小,而这个差距()衡量了数据不匹配问题的大小。

事实证明,把剩下的两个数字(),也放到这个表格里也是有用的。如果结果这也是6%,那么你获得这个数字的方式是你让一些人自己标记他们的后视镜语音识别数据,看看人类在这个任务里能做多好,也许结果也是6%。做法就是,你收集一些后视镜语音识别数据,把它放在训练集中,让神经网络去学习,然后测量那个数据子集上的错误率,但如果你得到这样的结果,好吧,那就是说你已经在后视镜语音数据上达到人类水平了,所以也许你对那个数据分布做的已经不错了。

当你继续进行更多分析时,分析并不一定会给你指明一条前进道路,但有时候你可能洞察到一些特征。比如比较这两个数字(),告诉我们对于人类来说,后视镜的语音数据实际上比一般语音识别更难,因为人类都有6%的错误,而不是4%的错误,但看看这个差值,你就可以了解到偏差和方差,还有数据不匹配这些问题的不同程度。所以更一般的分析方法是,我已经用过几次了。我还没用过,但对于很多问题来说检查这个子集的条目,看看这些差值,已经足够让你往相对有希望的方向前进了。但有时候填满整个表格,你可能会洞察到更多特征。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2J47wlsQ-1611928569114)(…/images/347df851fe3809b308850a9e14cfdbb0.png)]

最后,我们以前讲过很多处理偏差的手段,讲过处理方差的手段,但怎么处理数据不匹配呢?特别是开发集、测试集和你的训练集数据来自不同分布时,这样可以用更多训练数据,真正帮你提高学习算法性能。但是,如果问题不仅来自偏差和方差,你现在又有了这个潜在的新问题,数据不匹配,有什么好办法可以处理数据不匹配的呢?实话说,并没有很通用,或者至少说是系统解决数据不匹配问题的方法,但你可以做一些尝试,可能会有帮助,我们在下一个视频里看看这些尝试。

所以我们讲了如何使用来自和开发集、测试集不同分布的训练数据,这可以给你提供更多训练数据,因此有助于提高你的学习算法的性能,但是,潜在问题就不只是偏差和方差问题,这样做会引入第三个潜在问题,数据不匹配。如果你做了错误分析,并发现数据不匹配是大量错误的来源,那么你怎么解决这个问题呢?但结果很不幸,并没有特别系统的方法去解决数据不匹配问题,但你可以做一些尝试,可能会有帮助,我们来看下一段视频。

2.6 处理数据不匹配问题(Addressing data mismatch)

如果您的训

标签: 传感器bc5

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台