3-2 Coursera吴恩达《构建机器学习项目》 第二周课程笔记-机器学习策略(2)

本文介绍了构建机器学习项目时采用的各种策略和技术,包括误差分析、数据清理、系统迭代、处理数据分布差异、迁移学习、多任务学习及端到端深度学习等,旨在帮助读者提升项目构建效率。

上节课3-1 Coursera吴恩达《构建机器学习项目》 第一周课程笔记-机器学习策略(1)我们主要介绍了一些优化机器学习的策略和方法,包括正交化、评估指标、数据集的划分、贝叶斯错误率和可避免偏差等等。这节课继续介绍机器学习策略和方法,希望能帮助我们更好地构建机器学习项目,提高完成项目的效率,那我们开始吧。

目录

《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 distribution

《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 deep learning

Summary

《2.1 进行误差分析》Carrying out error analysis

当你的学习算法还没有达到人类的表现,那么人工检查一下算法犯的错误也许可以让你了解接下来应该做什么。这个过程称为错误分析(error analysis),看下面一个例子。

假设你正在调试猫分类器,然后你取得了90%准确率,相当于10%错误,在你的开发集(dev sets)上做到这样,这离你希望的目标还有很远。注意到算法将一些狗分类成猫,可能有人建议针对狗的图片进行优化,例如收集更多的狗图,问题在于,你是不是应该去开始做一个项目专门处理狗?花费几个月的时间值得吗?这时有个错误分析流程,可以让你很快知道这个方向是否值得努力。首先,人工收集一下开发集有多少错误标记的样本是狗,假设100个错误样本中只有5个是狗,如果你在狗的问题上花了很多时间,那么你最多能将错误率从10%下降到9.5%。在机器学习中,称这种能够改善算法性能的上限为性能上限(the ceiling on performance),就意味着,最好能到哪里,完全解决狗的问题可以对你有多少帮助。现在,假设发生了另一件事(上图右侧),实际上50%都是狗的照片,现在花时间去解决狗的问题可能效果更好,错误率可能从10%下降到5%,值得一试。

在机器学习中,有时候我们很鄙视手工操作,或者使用了太多人为数值。但如果你要搭建应用系统,那这个简单的人工统计步骤,错误分析,可以节省大量时间,可以迅速决定什么是最重要的,或者最有希望的方向。

下面看如何使用错误分析来评估某个想法,比如上述狗的问题是否值得解决。

有时你在做错误分析时,也可以同时并行评估几个想法,比如,你有几个改善猫检测器的想法,(1)也许你可以改善针对狗图的性能,(2)或者有时候要注意,那些猫科动物,如狮子,豹,猎豹等等,它们经常被分类成小猫或者家猫,所以你也许可以想办法解决这个错误。(3)或者也许你发现有些图像是模糊的,如果你能设计出一些系统,能够更好地处理模糊图像。可以建立一个表格或者普通文本文件,人工地一张一张检查每张图片,每一列是可能的问题,最后一列可以备注,最后统计这些算法(错误)的百分比。在这个例子中8%是狗,43%是大猫,61%属于模糊,12%是Instagram滤镜。这样的分析结果没有给你一个严格的数学公式(mathematical formula),但是可以知道哪些问题有改进的潜力。在这里,改善大猫和模糊图片的识别对性能提高的上限空间会大得多。

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

《2.2 清除标注错误的数据》 Cleaning up incorrectly labeled data

在监督学习中,数据由输入x和输出标签y构成,如果发现一些y标注错误,是否值得花时间去修正这些标签呢?

在猫分类问题中,发现这(倒数第二张图片)其实不是猫,所以这是标记错误的样本(incorrectly labeled data)。事实证明,深度学习算法对于训练集中的随机错误是相当健壮的(robust)。如果错误足够随机(random),那么放着这些错误不管可能也没问题,只要总数据集总足够大,实际错误率可能不会太高。注意一下,深度学习算法对随机误差很健壮,随机错误或近似随机错误对大多数深度学习算法来说不成问题,但对系统性的错误就没那么健壮了。那么如果在开发集和测试集中有错误标记的样本呢?

一般建议在错误分析时,增加一列,统计标签错误的样本数。Andrew建议如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。我们看一个样本(上图下方左),关注整体的开发集错误率,系统90%准确率,有10%错误率,同时6%的错误来着标记,那么关注错误标记引起的错误的数量或者百分比,在这里6%*10%=0.6%,意味着开发集的错误中0.6%是标记出错,剩下9.4%是其他原因导致的,所以在这种情况下,应该集中精力修正9.4%的错误。再看另一个样本(上图下方右),假设你在学习问题上取得了很大进展,所以现在错误率不再是10%了,假设你把错误率降到了2%,但总体错误中的0.6%还是标记出错导致的。则0.6%/2%=30%,占比较高,所以现在其他原因导致的错误是1.4%。当测得的那么大一部分的错误都是开发集标记出错导致的,那似乎修正开发集里的错误标签似乎更有价值(worthwhile)。因此,现在你就有很好的理由去修正开发集里的错误标签,因为在右边这个样本中,标记出错对算法错误的整体评估标准有严重的影响。而左边的样本中,标记出错对你算法影响的百分比还是相对较小的。

还有一些额外的方针和原则要考虑:

(1)开发集和测试集必须来自相同的分布。如果你打算修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。(2)同时检验算法判断正确和判断错误的样本,因为算法有可能因为运气好把某个东西判断对了。(3)修正训练集中的标签其实相对没那么重要,你可能决定只修正开发集和测试集中的标签,因为它们通常比训练集小得多,你可能不想把所有额外的精力投入到修正大得多的训练集中的标签,所以这样其实是可以的。

最后,Andrew给了几个建议:首先,在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统;其次,花时间亲自检查数据非常值得。

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

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

如果你正在开发全新的机器学习应用,Andrew通常建议,尽快建立你的第一个系统原型,然后快速迭代。在语音识别领域,如果你正在考虑建立一个新的语音识别系统,其实你可以走很多方向,可以优先考虑很多事情。例如,善于处理嘈杂的背景,处理带口音时更加健壮等。一般来说,对于几乎所有的机器学习程序可能会有50个不同的方向可以前进,并且每个方向都是相对合理的可以改善你的系统。但挑战在于,你如何选择一个方向集中精力处理。

Andrew建议快速设立开发集和测试集还有指标,这样就决定了你的目标所在,如果你的目标定错了,之后改也是可以的。但一定要设立某个目标,然后马上搭好一个机器学习系统原型,然后找到训练集,训练一下,看看效果,开始理解你的算法表现如何,在开发集测试集,评估指标上表现如何。当建立第一个系统后,你就可以马上用到之前说的偏差方差分析,还有之前最后几个视频讨论的错误分析。建立这个初始系统的所有意义在于,它可以是一个快速和粗糙的实现(quick and dirty implementation)。

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

《2.4 使用来自不同分布的数据进行训练和测试》 Training and testing on different distribution

深度学习对训练数据的胃口很大,当你收集到足够多的带标签的数据构成训练集时,算法效果最好,这导致很多算法团队想尽一切办法去收集数据,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。下面介绍一些最佳做法(best practices)来处理训练集和测试集存在差异的情况。

假设你在开发一个识别猫的手机应用,有两个数据来源:一个是你真正关心的数据分布,来自应用上传的数据(右边),一般更业余,有些甚至很模糊,有1万张;另一个数据来源是爬取网页,可以下载很多取景专业、高分辨率、拍摄专业的猫图片,有20万张。而你真正关心的算法表现是你的最终系统处理来自应用程序的这个图片分布时效果好不好,因为最后你的用户会上传类似右边这些图片,你的分类器必须在这个任务中表现良好。那么现在的困境在于,这20万张图片并不完全来自你想要的分布,那么你可以怎么做呢?

第一种选择是将两组数据合并在一起,这样就有21万张照片,把这21万张照片随机分配到训练、开发和测试集中。假设你已经确定开发集和测试集各包含2500个样本,所以训练集有205000个样本。现在这么设立你的数据集有一些好处,也有坏处。好处(advantage)在于,训练集、开发集和测试集都来自同一分布,这样更好管理。但坏处(disadvantage)在于,这坏处还不小,就是开发集中2500个样本其中很多图片(2500*200/210=2381)都来自网页下载的图片,平均而言,只有119张图来自手机上传,那并不是你真正关心的数据分布,你真正要处理的是来自手机的图片。要记住,设立开发集的目的是告诉你的团队去瞄准的目标,而第一种样本处理方式中你目标的方式和大部分精力都用在优化来自网页下载的图片,这其实不是你想要的。所以Andrew真的不建议使用第一个选项。

还有第二种选择,设置你的开发集和测试集都是手机图。而训练集包含了来自网页的20万张图片,还有5000张来自应用的图片,开发集就是2500张来自应用的图片,测试集也是2500张来自应用的图片。现在你瞄准的目标就是你想要处理的目标。缺点在于训练集和开发集、测试集的分布不一样。但事实证明,这样把数据分成训练、开发和测试集,在长期能给你带来更好的系统性能(get you better performance over the long term)。

下面看另一个样本:

假设你正在开发一个全新的产品,一个语音激活汽车后视镜(speech activated rearview mirror),可以实现和后视镜对话,那么你怎么收集数据去训练这个产品语言识别模块呢?对于你的训练集,你可以将你拥有的所有语音数据,从其他语音识别问题收集来的数据,比如这些年你从各种语音识别数据供应商(speech recognition data vendors)买来的数据,今天你可以直接买到成,对的数据,其中是x音频剪辑(audio clip),y是听写记录(transcript)。或者也许你研究过智能音箱(smart speakers),语音激活音箱(smart voice activated speakers),所以你有一些数据,也许你做过语音激活键盘(voice activated keyboards)的开发之类的。当用户要查询地址信息的时候,这个数据集可能会有很多街道地址,所以这个数据的分布和左边大不一样,但这真的是你关心的数据,因为这些数据是你的产品必须处理好的,所以你就应该把它设成你的开发和测试集。你应该这样设立你的训练集,左边有500,000段语音,然后你的开发集和测试集,我把它简写(abbreviate)成D和T,可能每个集包含10,000段语音,是从实际的语音激活后视镜收集的。这种方法将改善你的算法。

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

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

估计学习算法的偏差和方差可以帮忙确定接下来的优化方向,但是当训练集和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样。

继续以猫分类器为例,人类在这个问题上做到几乎完美,所以认为贝叶斯错误率几乎是0%,所以要进行错误率分析,你通常需要看训练误差(training error),也要看看开发集的误差(dev error)。比如,训练集误差是1%,开发集误差是10%,如果开发集和训练集分布一样,显然模型存在很大的方差问题(variance),模型处理训练集很好,但是泛化能力却很弱。但如果你的训练数据和开发数据来自不同的分布,就不能再放心下这个结论了。所以也许算法没有方差问题,这只不过反映了开发集包含更难准确分类的图片。所以这个分析的问题在于,当你看训练误差,再看开发误差,有两件事变了。首先,算法只见过训练集数据,没见过开发集数据。第二,开发集数据来自不同的分布。而且因为你同时改变了两件事情,很难确认这增加的9%误差率有多少是因为算法没看到开发集中的数据导致的,这是问题方差的部分,有多少是因为开发集数据就是不一样。

为了分辨清楚两个因素的影响,定义一组新的数据是有意义的,我们称之为训练-开发集(training-dev set),所以这是一个新的数据子集。从训练集的分布里挖出来,但你不会用来训练你的网络(“Same distribution as training set, but not used for training.”)。现在进行误差分析时,你需要关注训练集误差、训练-开发集误差和开发集误差。在这个样本中,训练集误差是1%,训练-开发集误差是9%,开发集误差是10%,这样得到结论算法存在方差问题(variance),因为训练-开发集的错误率是在和训练集来自同一分布的数据中测得的。

再看一个不同的样本(右侧),假设训练误差为1%,训练-开发误差变为1.5%,开发集错误率10%。现在算法的方差问题就很小了,因为从训练数据转到训练-开发集数据,错误率只上升了一点点(1.5%-1%=0.5%)。但开发集的错误率就大大上升了,这是数据不匹配(dis-matched data)的问题。

看下一行的另一个例子,训练误差、训练-开发误差、开发误差分别为10%,11%,12%,要记住,人类水平对贝叶斯错误率的估计大概是0%,这样的情况存在偏差问题(bias),存在可避免偏差问题,因为算法做的比人类水平差很多。

最后一个例子,如果训练集错误率是10%,训练-开发错误率是11%,开发错误率是20%,那么这其实有两个问题。第一,可避免偏差相当高(10%-0%=10%)。这里方差似乎很小(11%-10%=1%),但数据不匹配问题(20%-11%=9%)很大,所以对于这个样本,算法有很大的偏差或者可避免偏差问题,还有数据不匹配问题。下面总结一下一般原则。

主要关注下面几个差值:训练集误差(training error)和人类水平误差(human-level error)反映可避免偏差(avoidable error);训练-开发集误差(training-dev error)和训练集误差(training error)反映方差(variance);开发集误差(dev error)和训练-开发集误差(training-dev error)反映数据不匹配问题(data mismatch problem);测试集误差(test error)和开发集误差(dev error)反映开发集过拟合的程度(degree of overfitting to dev set)。

之前介绍了处理偏差和方差的方法,那么如何处理数据不匹配问题呢?说实话并没有系统解决数据不匹配问题的方法,但是可以做一些尝试,下一个视频细讲。

《2.6 处理数据不匹配问题》 Addressing data mismatch

这个问题没有完全系统的解决方案(completely systematic solutions),但可以看看一些可以尝试的事情。

如果Andrew发现有严重的数据不匹配问题,会亲自做错误分析(error analysis),尝试了解训练集和开发测试集的具体差异。技术上,为了避免对测试集过拟合,要做错误分析,应该人工去看开发集而不是测试集。

假如你正在开发一个语音激活的后视镜应用,如果你发现车辆背景噪音(car noise)是主要的错误来源,那么你可以模拟车辆噪声数据(simulate noisy in-car data),加入到你的训练集中。你的目的是让训练数据更接近开发集,那么你应该怎么做呢?

其中一种技术是人工合成数据(artificial data synthesis)。实际上没有那么多在汽车噪音下录制的音频,训练样本很可能没有背景噪声,可以人工添加背景噪声,通过人工数据合成,处理后的数据再喂给机器学习算法,这样会让模型训练的效果更准确。值得注意的是,人工合成有一个潜在问题,如果你只录了一个小时车辆背景噪音,然后反复播放,给每段语音都增加同一段背景噪声,这样可能对这个汽车噪音过拟合。

这是人工合成数据的另一个例子,假设你在研发无人驾驶汽车(self driving car),你可能希望检测出这样的车,然后用这样的框(put a bounding box)包住它。很多人都讨论过的一个思路是,为什么不用计算机合成图像来模拟成千上万的车辆呢?,如果你只合成这些车中很小的子集,对于人眼来说也许这样合成图像没什么问题,但你的学习算法可能会对合成的这一个小子集过拟合(overfit)。

总而言之(to summarize),如果存在数据不匹配问题,Andrew建议做错误分析,或者看看训练集(train sets)、开发集(dev sets),试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。有一种办法是人工数据合成,但是一定要谨慎,要记住有可能从所有可能性的空间只选了很小一部分去模拟数据。

所以这就是如何处理数据不匹配问题,接下来,Andrew将分享一些想法就是如何从多种类型的数据同时学习。

《2.7 迁移学习》Transfer learning

深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中学习知识,并将这些知识应用到另一个独立的任务中。例如,也许你已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那些知识,或者部分知识去帮助更好地阅读x射线扫描图,这就是所谓的迁移学习(transfer learning)

如上图,假设你已经训练好一个图像识别神经网络(neural network on image recognition),并在(x,y)对上训练,其中x是图像(image),y是某些对象(object),图像是猫、狗、鸟或其他东西。如果把这个神经网络拿来迁移学习,在不同任务中学到的知识,比如放射科诊断(radiology diagnosis),就是说阅读x射线扫描图。可以把神经网络最后的输出层(last layer)删掉,还有进入到最后一层的权重删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。

现在,我们在新的放射科数据集上重新训练网络,有几种做法:(1)如果你的放射科数据集很小(a small radiology dataset),你可能只需要重新训练最后一层的权重,就是W^[L]和b^[L],并保持其他参数不变。(2)如果你有足够多的数据(enough data),你可以重新训练神经网络中剩下的所有层。经验规则(rule of thumb)是,如果你有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层。但是如果你有很多数据,那么也许你可以重新训练网络中的所有参数。如果你重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练(pre-training),因为你在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果你以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调(fine tuning)。如果你在深度学习文献中看到预训练和微调,你会知道预训练和微调的权重来源于迁移学习(transfer learning)。为什么这样做有效果呢?有很多低层次特征,比如说边缘检测(detect edges)、曲线检测(curves)、阳性对象检测(positive objects),从非常大的图像识别数据库中习得这些能力可能有助于你的学习算法在放射科诊断中做得更好,算法学到了很多结构信息,图像形状的信息,这些知识有可能帮助你的放射科诊断网络学习更快一些,或者需要更少的学习数据。

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

总结一下,什么时候迁移学习是有意义的?

(1)如果你想从任务A学习并迁移一些知识到任务B,那么当任务A和任务B都有同样的输入时,迁移学习是有意义的。在第一个例子中,A和B的输入都是图像,在第二个例子中,两者输入都是音频。(2)当任务A的数据比任务B多得多时,迁移学习意义更大。所有这些假设的前提都是,你希望提高任务B的性能,因为任务B每个数据更有价值,对任务B来说通常任务A的数据量必须大得多,才有帮助,因为任务A里单个样本的价值没有比任务B单个样本价值大。(3)然后如果你觉得任务A的低层次特征,可以帮助任务B的学习,那迁移学习更有意义一些。

总的来说(summarize),迁移学习最有用的场合是,如果你尝试优化任务B的性能,通常这个任务数据相对较少。

这就是迁移学习,你从一个任务中学习,然后尝试迁移到另一个不同任务中。从多个任务中学习还有另外一个版本,就是所谓的多任务学习,当你尝试从多个任务中并行学习,而不是串行学习,在训练了一个任务之后试图迁移到另一个任务,所以在下一个视频中,让我们来讨论多任务学习。

《2.8 多任务学习》 Multi-task learning

在迁移学习中,你的步骤是串行(sequential process)的,你从任务A里学习只是然后迁移到任务B。在多任务学习(multi-task learning)中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。

假设你在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检测不同的物体,比如检测行人(pedestrians)、车辆(cars)、停车标志(stop signs),还有交通灯(traffic lights)各种其他东西。输入图像x,输出y,现在不是一个标签,而是4个标签。

你现在可以做的是训练一个神经网络,来预测这些y值,你就得到这样的神经网络,输入x,现在输出是一个四维向量y。请注意,这里输出有四个节点,所以第一个节点就是我们想预测图中有没有行人,然后第二个输出节点预测的是有没有车,这里第三个输出节点预测有没有停车标志,这里第四个输出节点预测有没有交通灯,所以这里是y帽四维的。

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

L指logistic损失,写成:

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

在这个场合,一张图可以有多个标签。如果你训练了一个神经网络,试图最小化这个成本函数,这就是多任务学习。因为你现在做的是建立单个神经网络,观察每张图,然后解决四个问题,系统试图告诉你,每张图里面有没有这四个物体。另外你也可以训练四个不同的神经网络,而不是训练一个网络做四件事情。但神经网络一些早期特征,在识别不同物体时都会用到,然后你发现,训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。

注意到有一些样本标记了问号,在j从1到4求和时,只对带0和1标签的j值求和,忽略有问号的选项,这样处理的话你可以使用带问号的数据集。

那么多任务学习什么时候是有意义的呢?当下面三件事为真时,就是有意义的。

(1)第一,如果你训练的一组任务,可以共用低层次特征(share low-level features)。对于无人驾驶(autonomous)的例子,同时识别交通灯、汽车和行人是有道理的,这些物体有相似的特征,也许能帮你识别停车标志,因为这些都是道路上的特征。(2)第二,这个准则(rule)没有那么绝对,所以不一定是对的。但我从很多成功的多任务学习案例中看到,如果每个任务的数据量很接近,表现良好。(3)最后多任务学习往往在以下场合更有意义,当你可以训练一个足够大的神经网络,同时做好所有的工作,所以多任务学习的替代方法是为每个任务训练一个单独的神经网络。

实践中,多任务学习的使用频率要低于迁移学习。但多任务学习比较少见,就是你需要同时处理很多任务,都要做好,你可以同时训练所有这些任务,也许计算机视觉是一个例子。在物体检测中,我们看到更多使用多任务学习的应用,其中一个神经网络尝试检测一大堆物体,比分别训练不同的神经网络检测物体更好。但我说,平均来说,目前迁移学习使用频率更高,比多任务学习频率要高,但两者都可以成为你的强力工具。

所以这就是多任务学习,多任务学习和迁移学习都是工具包中的重要工具。下一个视频来讨论端到端深度学习。

《2.9 什么是端到端深度学习?》What is end-to-end deep learning

深度学习中最令人振奋的最新动态之一就是端到端深度学习的兴起,那么端到端学习到底是什么呢?以前有一些数据处理系统或者学习系统(data processing systems or learning systems),它们需要多个阶段的处理。那么端到端深度学习(end-to-end deep learning)就是忽略所有这些不同的阶段,用单个神经网络代替它。

如上图,以语音识别(speech recognition)为例,你的目标是输入x,比如说一段音频,然后把它映射到一个输出y,就是这段音频的听写文本。所以传统上,语音识别需要很多阶段的处理。首先你会提取一些特征(feature),一些手工设计的音频特征,在提取出一些低层次特征之后,你可以应用机器学习算法在音频片段中找到音位(phonemes),所以音位是声音的基本单位,然后你将音位串在一起构成独立的词(words),然后你将词串起来构成音频片段的听写文本(transcript)。

和这种有很多阶段的流水线(pipeline)相比,端到端深度学习做的是,训练一个巨大的神经网络,输入就是一段音频,输出直接是听写文本。端到端深度学习就只需要把训练集拿过来,直接学到了x和y之间的函数映射,直接绕过了其中很多步骤。但对一些学科的人来说,这有点难以接受。

事实证明,端到端深度学习的挑战之一是,你可能需要大量数据才能让系统表现良好,所以当你的数据集较小的时候,传统流水线方法其实效果也不错,通常做得更好。如果数据量适中,那么也可以用中间件方法,你可能输入还是音频,然后绕过特征提取,直接尝试从神经网络输出音位。

上图是一个研究员做的人脸识别门禁(turnstile),是百度的林元庆研究员做的。你可以接近门禁,如果它认出你的脸,它就直接让你通过,你不需要带RFID工卡。那么怎么搭建这样的系统呢?迄今为止最好的方法似乎是一个多步方法,首先,你运行一个软件来检测人脸,找到人脸位置,检测到人脸,然后放大图像的那部分,并裁剪图像(crop that image),使人脸居中显示,然后就是这里红线框起来的照片,再喂到神经网络里,让网络去学习或估计那人的身份。研究人员发现把这个问题分解成两个更简单的步骤。首先,是弄清楚脸在哪里。第二步是看着脸,弄清楚这是谁。这在整体上得到更好的表现。为什么两步法更好呢?实际上有两个原因。一是,你解决的两个问题,每个问题实际上要简单得多。但第二,两个子任务(sub-task)的训练数据都很多。相比之下,如果你想一步到位,这样(x,y)的数据对就少得多,其中x是门禁系统拍摄的图像,y是那个人的身份,并没有足够多的数据去解决这个端到端学习问题,实际上两步法比纯粹的端到端方法有更好的表现。

再看一个例子,例如机器翻译(machine translation)。

传统上,机器翻译系统也有一个很复杂的流水线(complicated pipeline),比如英语机翻得到文本,然后做文本分析,基本上要从文本中提取一些特征之类的,经过很多步骤,最后会将英文文本翻译成法文。因为对于机器翻译来说的确有很多(英文,法文)的数据对,端到端深度学习在机器翻译领域非常好用,那是因为在今天可以收集x-y对的大数据集,就是英文句子和对应的法语翻译。所以在这个例子中,端到端深度学习效果很好。

最后一个例子(上图下方),儿科医生(pediatricians)通过一个孩子手部的X光照片来判断一个孩子的发育是否正常。处理这个例子的一个非端到端方法,就是照一张图,然后分割出每一块骨头,所以就是分辨出那段骨头应该在哪里,那段骨头在哪里,那段骨头在哪里,等等。然后,知道不同骨骼的长度,你可以去查表,查到儿童手中骨头的平均长度,然后用它来估计孩子的年龄,所以这种方法实际上很好。相比之下(whereas in contrast)如果你直接从图像去判断孩子的年龄,那么你需要大量的数据去直接训练。据我所知,这种做法今天还是不行的。

总之,端到端深度学习系统是可行的,它表现可以很好,也可以简化系统架构,让你不需要搭建那么多手工设计的单独组件,但它也不是灵丹妙药(panacea),并不是每次都能成功。在下一个视频中,Andrew将分享一个更系统的描述,什么时候应该使用或者不应该使用端到端的深度学习,以及如何组装这些复杂的机器学习系统。

《2.10 是否要使用端到端的深度学习?》Whether to use end-to-end deep learning

假设你正在搭建一个机器学习系统(building a machine learning system),你要决定是否使用端对端方法,我们来看看端到端深度学习的一些优缺点,这样你就可以根据一些准则(guidelines),判断你的应用程序是否有希望使用端到端方法。

这里是应用端到端学习的一些好处(pros),(1)首先端到端(end-to-end)学习真的只是让数据说话。如果有足够多的数据,直接输入去训练神经网络,更能捕获数据中的信息,而不是引入人类的成见。如果你让你的学习算法学习它想学习的任意表示方式,而不是强迫你的学习算法使用音位作为表示方式,那么其整体表现可能会更好。(2)端到端深度学习的第二个好处就是这样,所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能。

这里有一些缺点(cons),(1)首先,它可能需要大量的数据。(2)另一个缺点是,它排除了可能有用的手工设计组件。如果你没有很多的数据,把人类知识直接注入算法的途径,这总不是一件坏事。我觉得学习算法有两个主要的知识来源(two main sources of knowledge),一个是数据,另一个是你手工设计的任何东西,可能是组件,功能,或者其他东西。所以当你有大量数据时,手工设计的东西就不太重要了,但是当你没有太多的数据时,构造一个精心设计的系统,实际上可以将人类对这个问题的很多认识直接注入到问题里,进入算法里应该挺有帮助的。所以端到端深度学习的弊端之一是它把可能有用的人工设计的组件排除在外了,精心设计的人工组件可能非常有用,但它们也有可能真的伤害到你的算法表现。这是一把双刃剑,手工设计的组件往往在训练集更小的时候帮助更大。

在构建一个新的机器学习问题时,在决定是否使用端到端深度学习,Andrew认为关键问题(key question)是,你有足够的数据(sufficient data)能够直接学到从x映射到y足够复杂的函数吗

回忆之前的例子(如上图),相对来说,把手的X射线照片直接映射到孩子的年龄,直接去找这种函数,直觉上似乎是更为复杂的问题。如果你用纯端到端方法,需要很多数据去学习。看一个更复杂的例子(横线下方),关于无人驾驶技术(autonomous driving)的。把你车前方的雷达(radar)、激光雷达(LIDAR)或者其他传感器的读数(other sensor readings)看成是输入图像。这里简化说明,拍一张车前方或者周围的照片,然后要驾驶安全的话,必须检测到附近的车、行人或其他东西,弄清楚其他车和行人的位置之后,就可以规划路线。从传感器或图像输入到检测行人和车辆,深度学习可以做得很好,但一旦知道其他车辆和行人的位置或者动向,选择一条车要走的路,这通常用的不是深度学习,而是用所谓的运动规划(motion planning)软件完成的。所以在这个例子中,Andrew认为这种纯粹的端到端深度学习方法,其实前景不如这样更复杂的多步方法。因为目前能收集到的数据,还有我们现在训练神经网络的能力是有局限的。这就是端到端的深度学习,有时候效果拔群,但也要注意应该在什么时候使用端到端深度学习。

Summary

Andrew:最后,谢谢你,恭喜你坚持到现在,如果你学完了上周的视频和本周的视频(机器学习策略),那么我认为你已经变得更聪明,更具战略性,并能够做出更好的优先分配任务的决策,更好地推动你的机器学习项目,也许比很多机器学习工程师,还有和我在硅谷看到的研究人员都强。加油!

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值