第一课:进行错误分析
如果你想得到一个训练算法来做人类可以做的任务,而且你的算法没有达到人类的效果,你需要手动检查算法中的错误,来得到你的下一步应该做什么?这个过程叫做错误分析。
假如你的算法对猫的分类中总是将狗误判为猫,你可以采取的措施有很多侧重点,比如收集更多狗的图片,或者设计对狗特有的特征等以让狗不再误认为猫。
问题在于你是否应该继续并且开始一个项目侧重于狗的问题?它重要么?
错误分析的方法可以让你很快的判断值不值得这么做。
所以我的建议是:
1.拿大约100张分类错误的验证集图片进行手动检测,数一数看看有几张验证集中标错的样本实际上是狗的图片。即得到一个上限,通过处理狗的问题能提高多少准确率?机器学习中,称之为表现上限。
如果你在构建应用系统时,这个简单的计数过程也就是错误分析,可以节省你很多时间,来决定什么是重要的,或者哪个方向有希望,值得关注?
2.有时你也可以评估多个思路通过并行的错误分析,例如,假设你有好几个改进你的猫检测器的思路,如果用错误分析来评估这三种思路,我的做法是创建一个表格。
在表格中只看验证集中你的算法判断错误的样本,然后进行统计。这个过程的结论会给你一个估计值,来判断这些不同类别的错误,有多少处理价值。
这个过程通常很快,但是它可以帮你做出更好的优先决策,并且了解不同算法的潜力。
综上,要进行错误分析,你应该找到一套在你验证集中标识错误的样本,并按假阳性和假阴性来看,并计算不同类别中的误判个数,在此过程中,可能会促使你想出新的错误类别,比如滤镜也会影响分类效果,你可以在讨论中建立新类别,但通过对不同类中错误标识的例子计数,通常有助于你判断优先级或给你新方向的灵感。
开发集中存在错误标签的数据?怎么办?
第二课:清理错误标记的数据
在监督式学习中,数据由输入x和输出的标签y组成,如果检查数据集,你会发现有些数据输出标签y错了。也就是说你的部分数据有错误的标签,你值得花费精力去修正这些标签么?
术语:错误标记指的是:你的学习算法,输出了一个错误的Y的值,但是我要说,错误标记的例子,是指:如果在数据集中,不管是训练集、开发集还是测试集,y的标签,不管人们给这个数据贴的什么标签,实际上是错误的。
所以,如果你发现你的数据中有些被人贴了错误的标签,你应该怎么做?
首先,考虑训练集的状况。事实表明,深度学习对训练集中的随机错误很稳健,只要你的错误或者你错误标记的例子,不是那么偏离随机分布,可能是标记的人的偶然疏忽造成的。总之,如果这些错误是非常随机的,那么我们基本上可以不管这些错误。
我见过很多机器学习的算法,在已知包含错误标记的数据集上训练,它们通常表现得还可以。即强调:深度学习算法对随机错误很稳健,但它们对系统误差不那么稳健。例如你的标记员把白色的狗当成猫,而不是随机的误标为猫,那么就会产生问题,因为你的分类器会学着把所有的白色的狗当成猫。
现在已经讨论了如何在训练集中处理被错误标记的数据,那么在开发集和测试集中呢?
如果你担心随机标识的错误对结果有影响,一个比较推荐的做法是:在错误分析的过程中,增加一列去统计y的标签错误的数量。有时候不是你的算法标错了,而是标签本身就存在错误。
那么我们值得花费时间去纠正这6%的错误标记的例子么?
我的建议是:如果这些错误对你评估算法在开发集上的效果有很大影响的话,那就花点时间去纠正这些错误标签。如果对你用开发集去评估模型没有太大影响,那么就没必要花时间在这上面。
举个例子:可以看三个数字来判断是否值得你花时间去减少错误标记的量。
1.整体的开发集的错误率
2.由错误的标签导致的错误率
3.由其他原因导致的错误率
开发集的主要目标是:用它来帮助你在分类器A和B中作出选择,但是此时,由于存在错误标签导致的错误率,所以就需要去纠正开发集中的错误标签了。当然前提是错误标签对整体算法错误率的评估有着非常大的影响。
如果你着手重新检查开发集,手动重新检查标签,并且尝试纠正一些标签,这里有一些额外的指南或者原则需要去考虑:
1.不管在什么情况下,我都鼓励你去同时应用开发集和测试集,因为开发集和测试集需要相同的分布,其中开发集是你优化的目标,当你的模型在开发集上表现良好时,你会希望这个良好的性质能够推广到测试集。所以开发集和测试集要服从同样地分布。
2.我强烈建议你考察你的算法准确预测和错误预测的例子。去检查你的算法错误预测的例子很简单,只要看那些需要被纠正的,不过有时可能即使你的预测对了,但它确是需要被纠正的,如果你只修正那些预测错的样本,那么当你评估算法错误率时,就会有更大的偏差。
第二个原则不常用,因为你的分类器很准确,那么它出错很少,验证没出错的数据非常麻烦。
3.如果你探究开发集和数据集,去纠正一些标签,你可能应用同样地方法到训练集上,也可能不,反正纠正训练集中的标签不那么重要。很可能是当你修正测试集和开发集中的标签,这部分数据很少,也就比较省时。
你的开发集和测试集服从同样的分布,这很重要。但是如果你的训练集服从稍微不同的分布,通常这是合理的。
总结一下几条建议:
1.深度学习的研究者喜欢说:我只是把数据扔进算法,训练后算法有效,不加入人的观察,但是我认为在建造有用的系统时,通常,有一些更偏向于人工的错误分析和人的见解加入到系统中,深度学习的研究者要更重视
2.我见过一些工程师和研究者不愿意做人工检查案例了,但这就是我的做法,希望理解机器哪里出现了错误,亲自计算大数据,然后尽力计算出错误率。
第三课:快速构建您的第一个系统,然后迭代
你应该迅速构建你的第一个系统然后进行迭代。
举例:语音识别系统。假设你正在考虑建立一个全新的语音识别系统,实际上有很多方向可以做。比如说有很多事情你可以区分优先级:
更普遍的说,对于几乎所有的机器学习应用,可能有50个不同的方向去研究,每个方向都是合理的会使你的系统更好,但挑战是如何从中选择需要关注的问题。
所以我的建议是:如果要构建一个全新的机器学习应用,你要迅速建立你的第一个系统然后迭代。即我建议你快速建立一个开发/测试集以及度量指标,即首先立一个靶子,如果你发现你错了你始终可以稍后移动目标,但是至少先建立一个目标,然后我建议你快速建立一个初步的简单的机器学习系统,找到训练集,训练它然后看结果,开始观察并理解你的系统对开发/训练集如何价值和度量指标是什么?当你构建了初步的系统,你就可以用偏差/方差分析我们之前讨论过的,以及错误分析去区分接下来几步的优先级。
具体来说,如果错误分析让你意识到很多问题是由于麦克风具体太远导致的,那么就给了你充分的理由去研究远场语音识别技术。建立这个初始系统的价值是作为一个迅速并且早期的实践,不要考虑太多,然而,这些初始系统的价值在于有一些训练过的学习系统使得你能定位偏差/方差。然后区分得到下一步应该做什么,然后做误差分析,去研究错误的方向,进而找到研究的方向,这些价值才是值得的。
回顾一下,我的建议是快速建立你的第一个系统,然后迭代,这个建议不那么适用如果你处于一个你经验丰富的领域,这个建议也同样不适用于有很多可以参考的学术论文,针对你正在研究的几乎完全相同的问题。比如人脸识别问题。你可以依托大量文献,刚开始就建立一个比较复杂的系统。但如果你刚开始研究一个新问题,那么我的建议就是真的不要考虑太多,也不要把你的第一个系统做的太复杂,只要建立一个早期的系统然后使用它,来帮助你确定一个优先级如何改善你的系统。
总结:
如果你正在将机器学习算法投入到一个新的应用,如果你的主要目标是构建可用的东西,而不是去发明一个新的机器学习算法,这是不同的目标,那么你的主要目标是建造运行得很好的东西,用它来做偏差/方差分析,误差分析,用这些分析的结果来帮助你辨别接下来要做什么。
第四课:对不同发行版进行培训和测试
深度学习算法都希望有大量的训练数据,要使它运转在最佳状态,训练集中要有足量已标记训练数据,很多团队将能找到的所有数据都塞进训练集中。即使有些数据来自于开发集和测试集的不同分布。因此,深度学习时代越来越多的团队正在使用的训练数据并非来自开发集和测试集相同的分布,针对这种情况,这里有一些需要了解的微妙之处和一些最好的实践方法。
比如你从网页抓取的200000张猫图和10000张用户上传的猫图,难处在于:
1.你的数据集比较小只有10000个样例来自这个分布,大得多的数据来自于另外的分布
2.200000张图片并非来自你的目标分布
你该怎么办呢?
方案一:
你可以将这些数据集中在一起,然后将这210000张数据随机混合,得到训练/开发/测试集,这样的数据分配有其优缺点,优点是这样一来,你的训练/开发/测试集都来自于同一分布,易于管理,而巨大的缺点是仔细看看你的开发集有2500个样例,但是大部分来自网页图片的分布,而不是你真正关心的来自移动应用图片的分布。请记住:
设置开发集的目的是告诉团队你要瞄准的目标,而你正在花费大量时间优化的是网页图片的分布,而这并不是你想要的。
所以我不建议你采用此方案。因为它设置的开发集使你的团队致力于优化一个与你实际关心的目标并不相同的数据分布。
方案二:训练集包含200000张网络图片和5000张移动应用图片,开发集包含2500个移动应用图片,测试集也包含2500个移动应用图片。按照这种方式划分的训练/测试/开发集,其优点是你瞄准的是正确的目标,你在向你的团队表明我的开发集数据来自于移动应用,而这正是你关系的图片的分布,如果在此基础上建立机器学习系统,它在移动应用图片分布上的表现的确很好。当然这样做的缺点就是你的训练集的分布,不同于你在开发和测试集中的分布,但事实证明这样划分训练/开发/测试集长期来说性能更好。
之后有一个细节来讨论处理训练集与开发测试集来自不同分布的问题。
另一个例子:假设你在打造一个语音激活的后视镜
对于训练集,你可以使用所有你在过去的语音识别工作中所积累的数据,比如,你多年来从语音识别数据供应商处购买的数据,如今你确实可以从供应商那里购买形如(x,y)的数据,其中x是音频,y是文字,也许你有在智能语音激活扬声器领域的工作经验,以及语音激活键盘或者其他的一些工作经历,假设你有500000个从这些来源收集的话语片段,而你的开发/测试集可能是小的多的数据集,它来自于语音激活后视镜,因为用户需要导航或者去各种地方的方向,包含街道地址等,两种数据差距很大,而语音激活后视镜才是你需要产品化的东西。
那么在这个例子你需要做的是将训练集设为左边的500000个话语,而开发集和测试集简写为D和T,分别包含10000个话语,来自语音激活后视镜的真实话语。或者如果你认为你不需要把所有来自于语音激活后视镜的全部20000个语音都放到开发/测试集,你可以分出一半来放到训练集。510000个训练集数据,开发集和测试集各包含5000个话语样例,这是另一种将你的数据分配到训练集和测试开发集的做法。而且比起单纯的使用语音激活后视镜提供的数据,它提供大得多的训练集有大于500000的话语样例。
从这个例子中:
如果允许训练集和开发/测试集中的数据来自不同的分布,那么你将拥有一个大得多的训练集,它会促使你的算法运行的更好。
是否应该使用总数据呢?
它并不总是肯定的,下一节见反例。
网友评论