深度学习第三课 结构化机器学习项目

结构化机器学习项目

week1 机器学习策略1

1.1 为什么是ML策略

image-20240709174609130

1.2 正交化

image-20240709181741397

正交化指的是电视设计师设计这样的旋钮,使得每个旋钮都只调整一个性质,这样调整电视图像就容易得多,就可以把图像调到正中。

想象一下,如果有人这么造车,造了个游戏手柄,手柄的一个轴控制的是 0.3∗ 转向角-速度,然后还有一个轴控制的是 2 ∗ 转向角 + 0.9 ∗ +0.9∗ 车速,理论上来说,通过调整这两个旋钮你是可以将车子调整到你希望得到的角度和速度,但这样比单独控制转向角度,分开独立的速度控制要难得多。

然而正交化之后,正交意味着互成90度。设计出正交化的控制装置,最理想的情况是和你实际想控制的性质一致,这样你调整参数时就容易得多。可以单独调整转向角,还有你的油门和刹车,令车子以你想要的方式运动。

image-20240709182018400

1.3 单一数字评估指标

查准率:在你的分类器标记为猫的例子中,有多少真的是猫。所以如果分类器 A 有95%的查准率,这意味着你的分类器说这图有猫的时候,有95%的机会真的是猫。

查全率:对于所有真猫的图片,你的分类器正确识别出了多少百分比。如果分类器 A 查全率是90%,这意味着对于所有的图像,比如说你的开发集都是真的猫图,分类器 A 准确地分辨出了其中的90%。

查准率和查全率之间往往需要折衷,两个指标都要顾及到。

image-20240709183001598

在机器学习文献中,结合查准率和查全率的标准方法是所谓的 $F_1 \(分数,\)F_1 $分数的细节并不重要。但非正式的,你可以认为这是查准率 P 和查全率 R 的平均值。正式来看, \(F_1\) 分数的定义是这个公式: $ \frac2{\frac1P+\frac1R}$

在数学中,这个函数叫做查准率 P 和查全率 R 的调和平均数

1.4 满足和优化指标

image-20240709183436694

假设你已经决定你很看重猫分类器的分类准确度,这可以是\(F_1\)分数或者用其他衡量准确度的指标。但除了准确度之外,我们还需要考虑运行时间,就是需要多长时间来分类一张图。分类器 A 需要80毫秒, B 需要95毫秒, C 需要1500毫秒,就是说需要1.5秒来分类图像。

你可以这么做,将准确度和运行时间组合成一个整体评估指标。所以成本,比如说,总体成本是 cost=accuracy-0.5*runningTime ,这种组合方式可能太刻意,只用这样的公式来组合准确度和运行时间,两个数值的线性加权求和。

你还可以做其他事情,就是你可能选择一个分类器,能够最大限度提高准确度,但必须满足运行时间要求,就是对图像进行分类所需的时间必须小于等于100毫秒。所以在这种情况下,我们就说准确度是一个优化指标,因为你想要准确度最大化,你想做的尽可能准确,但是运行时间就是我们所说的满足指标,意思是它必须足够好,它只需要小于100毫秒,达到之后,你不在乎这指标有多好,或者至少你不会那么在乎。所以这是一个相当合理的权衡方式,或者说将准确度和运行时间结合起来的方式。实际情况可能是,只要运行时间少于100毫秒,你的用户就不会在乎运行时间是100毫秒还是50毫秒,甚至更快。

image-20240709183718043

所以更一般地说,如果你要考虑 N个指标,有时候选择其中一个指标做为优化指标是合理的。所以你想尽量优化那个指标,然后剩下 N − 1 个指标都是满足指标,意味着只要它们达到一定阈值,例如运行时间快于100毫秒,但只要达到一定的阈值,你不在乎它超过那个门槛之后的表现,但它们必须达到这个门槛。

1.5 训练/开发/测试集划分

在这个视频中,我想集中讨论如何设立开发集和测试集,开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集(hold out cross validation set)。

image-20240709184346035

将所有数据随机洗牌,放入开发集和测试集,所以开发集和测试集都有来自八个地区的数据,并且开发集和测试集都来自同一分布,这分布就是你的所有数据混在一起。

1.6 开发集和测试集的大小

image-20240709184912533

小样本:60%训练集,20%开发集,20%测试集。70/30或者60/20/20分的经验法则是相当合理的。

大样本:8%作为训练集,1%开发集,1%测试集

image-20240709185033084

对于某些应用,你也许不需要对系统性能有置信度很高的评估,也许你只需要训练集和开发集。我认为,不单独分出一个测试集也是可以的。

1.7 开发集和测试集的大小

image-20240709185422657

image-20240709185557773

我们将这个称为 $w^{(i)} $,其中如果图片 $x^{(i)} \(不是色情图片,则\)w{(i)}=1$。如果$x\(是色情图片,\)w^{(i)}$可能就是10甚至100,这样你赋予了色情图片更大的权重,让算法将色情图分类为猫图时,错误率这个项快速变大。这个例子里,你把色情图片分类成猫这一错误的惩罚权重加大10倍。

实际上要使用这种加权,你必须自己过一遍开发集和测试集,在开发集和测试集里,自己把色情图片标记出来,这样你才能使用这个加权函数。

image-20240709185930667

如果你发现你的开发测试集都是这些高质量图像,但在开发测试集上做的评估无法预测你的应用实际的表现。因为你的应用处理的是低质量图像,那么就应该改变你的开发测试集,让你的数据更能反映你实际需要处理好的数据。

1.8 为什么是人的表现

image-20240709190413352

所以贝叶斯最优错误率一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个 x 到 y 的函数,让它能够超过一定的准确度。

image-20240709190613437

事实证明,机器学习的进展往往相当快,直到你超越人类的表现之前一直很快,当你超越人类的表现时,有时进展会变慢。我认为有两个原因,为什么当你超越人类的表现时,进展会慢下来。一个原因是人类水平在很多任务中离贝叶斯最优错误率已经不远了,人们非常擅长看图像,分辨里面有没有猫或者听写音频。所以,当你超越人类的表现之后也许没有太多的空间继续改善了。但第二个原因是,只要你的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能。一旦你超越了人类的表现,这些工具就没那么好用了。

1.9 可避免误差

image-20240709191102964贝叶斯错误率的估计和训练错误率之间的差值称为可避免偏差,你可能希望一直提高训练集表现,直到你接近贝叶斯错误率,但实际上你也不希望做到比贝叶斯错误率更好,这理论上是不可能超过贝叶斯错误率的,除非过拟合。

而这个训练错误率和开发错误率之前的差值,就大概说明你的算法在方差问题上还有多少改善空间。

1.10 理解人的表现

image-20240709191522547

那么在这个背景下,我就可以用0.5%估计贝叶斯错误率。所以我将人类水平定义为0.5%

image-20240709192456622

1.11 超过人的表现

所以在这个例子中,一旦你超过这个0.5%的门槛,要进一步优化你的机器学习问题就没有明确的选项和前进的方向了。这并不意味着你不能取得进展,你仍然可以取得重大进展。但现有的一些工具帮助你指明方向的工具就没那么好用了。

image-20240709192902032

image-20240709192918843

请注意这四个例子,所有这四个例子都是从结构化数据中学习得来的,这里你可能有个数据库记录用户点击的历史,你的购物历史数据库,或者从A到B需要多长时间的数据库,以前的贷款申请及结果的数据库,这些并不是自然感知问题,这些不是计算机视觉问题,或语音识别,或自然语言处理任务。人类在自然感知任务中往往表现非常好,所以有可能对计算机来说在自然感知任务的表现要超越人类要更难一些。

那四个应用中,最好的系统看到的数据量可能比任何人类能看到的都多,所以这样就相对容易得到超越人类水平的系统。现在计算机可以检索那么多数据,它可以比人类更敏锐地识别出数据中的统计规律。

1.12 改善你的模型表现

image-20240709193412837

首先,你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低。还有第二件事你可以做好的是,在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大

训练错误率和贝叶斯错误率估计值之间的距离,让你知道可避免偏差有多大。换句话说,就是你觉得还能做多好,你对训练集的优化还有多少空间。

然后看看你的开发错误率和训练错误率之间的距离,就知道你的方差问题有多大。换句话说,你应该做多少努力让你的算法表现能够从训练集推广到开发集,算法是没有在开发集上训练的。

image-20240709193608337

week2 机器学习策略2

2.1 进行误差分析

如果你希望让学习算法能够胜任人类能做的任务,但你的学习算法还没有达到人类的表现,那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么。这个过程称为错误分析

image-20240709201818490

但如果你要搭建应用系统,那这个简单的人工统计步骤,错误分析,可以节省大量时间,可以迅速决定什么是最重要的,或者最有希望的方向。实际上,如果你观察100个错误标记的开发集样本,也许只需要5到10分钟的时间,亲自看看这100个样本,并亲自统计一下有多少是狗。根据结果,看看有没有占到5%、50%或者其他东西。这个在5到10分钟之内就能给你估计这个方向有多少价值,并且可以帮助你做出更好的决定,是不是把未来几个月的时间投入到解决错误标记的狗图这个问题。

image-20240709201959745

有时你在做错误分析时,也可以同时并行评估几个想法,比如,你有几个改善猫检测器的想法,也许你可以改善针对狗图的性能,或者有时候要注意,那些猫科动物,如狮子,豹,猎豹等等,它们经常被分类成小猫或者家猫,所以你也许可以想办法解决这个错误。或者也许你发现有些图像是模糊的,如果你能设计出一些系统,能够更好地处理模糊图像。也许你有些想法,知道大概怎么处理这些问题,要进行错误分析来评估这三个想法。

image-20240710104430020

最后,这组图像过了一遍之后,我可以统计这些算法(错误)的百分比,或者这里每个错误类型的百分比,有多少是狗,大猫或模糊这些错误类型。所以也许你检查的图像中8%是狗,可能43%属于大猫,61%属于模糊。这意味着扫过每一列,并统计那一列有多少百分比图像打了勾。

也许你可以选择其中两个,或者你的团队成员足够多,也许你把团队可以分成两个团队,其中一个想办法改善大猫的识别,另一个团队想办法改善模糊图片的识别。但这个快速统计的步骤,你可以经常做,最多需要几小时,就可以真正帮你选出高优先级任务,并了解每种手段对性能有多大提升空间。

所以总结一下,进行错误分析,你应该找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型,就像我们看到的那样。如果你过了一遍错误样本,然后说,天,有这么多Instagram滤镜或Snapchat滤镜,这些滤镜干扰了我的分类器,你就可以在途中新建一个错误类型。总之,通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

2.2 清除标注错误的数据

image-20240709202437920

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

你还可以统计因为标签错误所占的百分比,你的开发集里的 y 值是错的,这就解释了为什么你的学习算法做出和数据集里的标记不一样的预测1。

如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。

image-20240709202622258

如果你打算修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。

修正训练集中的标签其实相对没那么重要,你可能决定只修正开发集和测试集中的标签,因为它们通常比训练集小得多,你可能不想把所有额外的精力投入到修正大得多的训练集中的标签,所以这样其实是可以的。

2.3 快速搭建你的第一个系统,并进行迭代

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

image-20240709202815474

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

2.4 使用来自不同分布的数据,进行训练和测试

image-20240709203027652

训练集,比如说还是205,000张图片,我们的训练集是来自网页下载的200,000张图片,然后如果需要的话,再加上5000张来自手机上传的图片。然后对于开发集和测试集,这数据集的大小是按比例画的,你的开发集和测试集都是手机图。而训练集包含了来自网页的20万张图片,还有5000张来自应用的图片,开发集就是2500张来自应用的图片,测试集也是2500张来自应用的图片。这样将数据分成训练集、开发集和测试集的好处在于,现在你瞄准的目标就是你想要处理的目标,你告诉你的团队,我的开发集包含的数据全部来自手机上传,这是你真正关心的图片分布。

image-20240709203425945

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

2.5 数据不匹配时,偏差和方差的分析

但是,当你的训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样,我们来看为什么。

image-20240709204355829

你可能会说,这里存在很大的方差问题,你的算法不能很好的从训练集出发泛化,它处理训练集很好,但处理开发集就突然间效果很差了。

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

image-20240709204837518

但为了分辨清楚两个因素的影响,定义一组新的数据是有意义的,我们称之为训练-开发集,所以这是一个新的数据子集。我们应该从训练集的分布里挖出来,但你不会用来训练你的网络。

低可避免偏差情况下:

  • 如果train-dev的误差也很高,说明确实有高方差

  • 但是如果train-dev的误差很低,说明是数据集的问题,data-mismatch

高可避免偏差情况下:

  • 如果有高方差和数据不匹配问题

image-20240710090553656

如果出现这种情况,那么其实是训练数据比开发集和测试集难识别

image-20240710091151727

2.6 处理数据不匹配问题

image-20240710091727500

如果是语音的话,你可能要听一下来自开发集的样本,尝试弄清楚开发集和训练集到底有什么不同。

当你了解开发集误差的性质时,你就知道,开发集有可能跟训练集不同或者更难识别,那么你可以尝试把训练数据变得更像开发集一点,或者,你也可以收集更多类似你的开发集和测试集的数据。

如果你的目标是让训练数据更接近你的开发集,你可以利用的其中一种技术是人工合成数据(artificial data synthesis)。但是通过人工数据合成,你可以快速制造更多的训练数据,就像真的在车里录的那样,那就不需要花时间实际出去收集数据。

image-20240710092417879

人工数据合成有一个潜在问题,比如说,你在安静的背景里录得10,000小时音频数据,然后,比如说,你只录了一小时车辆背景噪音,那么,你可以这么做,将这1小时汽车噪音回放10,000次,并叠加到在安静的背景下录得的10,000小时数据。如果你这么做了,人听起来这个音频没什么问题。但是有一个风险,有可能你的学习算法对这1小时汽车噪音过拟合。

2.7 迁移学习

image-20240710093152385

如果你的放射科数据集很小,你可能只需要重新训练最后一层的权重,就是\(w^{[L]}\)\(b^{[L]}\)并保持其他参数不变。如果你有足够多的数据,你可以重新训练神经网络中剩下的所有层。

如果你有很多数据那么也许你可以重新训练网络中的所有参数。如果你重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练(pre-training),因为你在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果你以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调(fine tuning)。

假设你已经训练出一个语音识别系统,现在 x 是音频或音频片段输入,而 y 是听写文本,现在我们说你想搭建一个“唤醒词”或“触发词”检测系统,要做到这点,你可能需要去掉神经网络的最后一层,然后加入新的输出节点,但有时你可以不只加入一个新节点,或者甚至往你的神经网络加入几个新层,然后把唤醒词检测问题的标签 y 喂进去训练。再次,这取决于你有多少数据,你可能只需要重新训练网络的新层,也许你需要重新训练神经网络中更多的层。

image-20240710094336974

迁移学习起作用的场合:

  • 在迁移来源问题中你有很多数据,但迁移目标问题你没有那么多数据。
  • 相同的输入
  • 迁移来源的数据可以对迁移目标问题有益

迁移学习可能就没有意义:

比如,你用100张图训练图像识别系统,然后有100甚至1000张图用于训练放射科诊断系统,人们可能会想,为了提升放射科诊断的性能,假设你真的希望这个放射科诊断系统做得好,那么用放射科图像训练可能比使用猫和狗的图像更有价值所以这里(100甚至1000张图用于训练放射科诊断系统)的每个样本价值比这里(100张图训练图像识别系统)要大得多

2.8 多任务学习

image-20240710095611628

如果这是输入图像$ x{(i)}$,那么**这里不再是一个标签$y$ ,而是有4个标签。**在这个例子中,没有行人,有一辆车,有一个停车标志,没有交通灯。然后如果你尝试检测其他物体,也许\(y^{(i)}\)的维数会更高,现在我们就先用4个吧,所以$ y^{(i)}\(是个4×1向量。如果你从整体来看这个训练集标签和以前类似,我们将训练集的标签水平堆叠起来,像这样\) y^{(1)}$一直到 $y^{(m)} $

\[\mathrm{Y}=\left[\begin{array}{ccccc} \mid & \mid & \mid & \cdots & \mid \\ \mathrm{y}^{(1)} & \mathrm{y}^{(2)} & \mathrm{y}^{(3)} & \cdots & \mathrm{y}^{(\mathrm{m})} \\ \mid & \mid & \mid & \cdots & \mid \end{array}\right] \]

对于整个训练集的平均损失:

\[\frac{1}{m}\sum_{i=1}^{m} \sum_{j=1}^{4}L(\hat{y}^{(i)},y_j^{(i)}) \]

\[L(\hat{y}^{(i)},y_j^{(i)}) = -y_j^{(i)}log \hat{y}_j^{(i)}-(1-y_j^{(i)})log(1-\hat{y}_j^{(i)}) \]

整个训练集的平均损失和之前分类猫的例子主要区别在于,现在你要对 j = 1 到 4 求和,这与softmax回归的主要区别在于,与softmax回归不同,softmax将单个标签分配给单个样本。

image-20240710100431904

即使是这样的数据集,你也可以在上面训练算法,同时做四个任务,即使一些图像只有一小部分标签,其他是问号或者不管是什么。然后你训练算法的方式,即使这里有些标签是问号,或者没有标记,这就是对 j 从1到4求和,你就只对带0和1标签的 j 值求和,所以当有问号的时候,你就在求和时忽略那个项,这样只对有标签的值求和,于是你就能利用这样的数据集。

image-20240710101017353

多任务学习什么时候有意义:

第一,如果你训练的一组任务,可以共用低层次特征。对于无人驾驶的例子,同时识别交通灯、汽车和行人是有道理的,这些物体有相似的特征,也许能帮你识别停车标志,因为这些都是道路上的特征。

第二,所以如果任务 A 有1百万个样本,任务 B 只有1000个样本,那么你从这1百万个样本学到的知识,真的可以帮你增强对更小数据集任务 B 的训练。

2.9 什么是端到端的深度学习

image-20240710101744077

端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。

所以当你的数据集较小的时候,传统流水线方法其实效果也不错,通常做得更好。你需要大数据集才能让端到端方法真正发出耀眼光芒。

image-20240710102246838为什么两步法更好呢?实际上有两个原因。一是,你解决的两个问题,每个问题实际上要简单得多。但第二,两个子任务的训练数据都很多。具体来说,有很多数据可以用于人脸识别训练,对于这里的任务1来说,任务就是观察一张图,找出人脸所在的位置,把人脸图像框出来,所以有很多数据,有很多标签数据 ( x , y ) ,其中 x 是图片, y是表示人脸的位置,你可以建立一个神经网络,可以很好地处理任务1。然后任务2,也有很多数据可用,今天,业界领先的公司拥有,比如说数百万张人脸照片,所以输入一张裁剪得很紧凑的照片,比如这张红色照片,下面这个,今天业界领先的人脸识别团队有至少数亿的图像,他们可以用来观察两张图片,并试图判断照片里人的身份,确定是否同一个人,所以任务2还有很多数据。相比之下,如果你想一步到位,这样 ( x , y )的数据对就少得多,其中 x 是门禁系统拍摄的图像, y 是那人的身份,因为你没有足够多的数据去解决这个端到端学习问题,但你却有足够多的数据来解决子问题1和子问题2。

实际上,把这个分成两个子问题,比纯粹的端到端深度学习方法,达到更好的表现。不过如果你有足够多的数据来做端到端学习,也许端到端方法效果更好。但在今天的实践中,并不是最好的方法。

2.10 是否要使用端到端的深度学习

image-20240710103229631

好处:

首先端到端学习真的只是让数据说话。所以如果你有足够多的 ( x , y ) 数据,那么不管从 x 到 y 最适合的函数映射是什么,如果你训练一个足够大的神经网络,希望这个神经网络能自己搞清楚,而使用纯机器学习方法,直接从 x 到 y 输入去训练的神经网络,可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见。

第二个好处,所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能,手工设计这些中间表示方式。

缺点:

它可能需要大量的数据

它排除了可能有用的手工设计组件。机器学习研究人员一般都很鄙视手工设计的东西,但如果你没有很多数据,你的学习算法就没办法从很小的训练集数据中获得洞察力。

posted @ 2024-07-10 11:03  记录学习Blog  阅读(13)  评论(0编辑  收藏  举报