构建机器学习项目

机器学习策略简介

为什么是机器学习?

更为高效的构建机器学习系统的方法。
什么是机器学习策略?

如果例子的效果不理想,你的脑海里会涌现出很多提升准确率的思路:
1.收集更多的数据
2.增大训练样本多样性
3.使用梯度下降法训练更长的时间
4.换一种优化算法,比如Adam算法
5.尝试更复杂或更简单的神经网络
6.尝试dropout算法
7.L2正则化
8.改变网络架构,比如更换激活函数;改变隐藏单元数量等

所以要学习一些基本思路,也就是分析机器学习问题的方法,这些方法会让你避免南辕北辙,总结经验教训,希望这些可以让深度学习系统尽快达到你的期望值。

第二课:正交

建立机器学习系统的挑战之一是:有太多可以尝试和改变的东西,例如调整超参数,高效的机器学习人员应该明白需要调整什么来达到一个预期的效果。
我们称这一过程为正交化。

电视机设计的时候,确保每一个按钮只进行一个参数的调整从而让电视屏幕的调整变得更简单。汽车设计的时候,也是一个操纵杆控制旋转角,一个控制速度。

通过使用正交化,正交化是指(两个变量成90度角),通过正交化控制,能与你真正想要控制的事物保持一致,它让调整相应按钮变得更简单。

这和机器学习有什么关系呢?

为保证有监督机制的学习系统良好的运行,通常你需要调整系统按钮,确保四件事准确无误。
1.通常确保至少训练组运行良好,因此,训练组的情况需要进行一些可行性评估(与人类的一些性能进行比较)
2.开发组运行良好
3.测试组运行良好
4.在代价函数的测试里运行良好,因为结果会影响系统在实际情况中的表现

类比于电视机画面调节,如果你的算法不适合训练集的代价函数,你需要一个旋钮去对应调整以确保优化你的算法,使其适用于训练组。
如果算法对训练集的拟合效果不好,这个旋钮可能用来训练一个更大的网络,或者你想更换一种优化算法比如Adam算法。
相反,如果你发现算法对交叉验证集的拟合结果不好,那么就需要另外一套单独的旋钮来调整。比如正则化或者增加训练集。
如果在测试集上表现不好,你可以增大交叉验证集的数量。
如果算法仍然不能给你愉快的体验,这意味着你可能需要返回去调整你的开发集或者代价函数。

当我训练神经网络时,我倾向于不提前停止训练,因为提前停止训练是一个同时会影响你拟合训练集里的效果的操作,它也经常被用来提高你的开发集里的执行效果,所以这是一个更少正交化的按钮,因为它同时影响了两件事。所以当你有更多正交化控制,不采用这种方法会让你在调整网络的过程中更容易。

如何诊断是什么瓶颈限制了系统的性能,同时找到控制着这些特定方面的旋钮以通过调整它们来调整整个系统从而提升系统性能?

第三课:单号评估指标

无论你是选择超参调优、选择不同的机器学习算法,抑或是构建机器学习系统时尝试不同的配置项,你都会发现,如果你有单一的量化评估指标,可以让你知道新的方法比上一次更好还是更糟,那么整个进程将会加快很多。

所以当团队启动一个机器学习项目时,我建议设置一个单一的量化评估指标。

精准率就是:它识别出是猫的集合中有多少百分比真的是猫?
召回率是指:对于所有是猫的图片,你的分类器有多少百分比可以正确的识别出来,即多少比率的真猫被正确识别出来了?

你常常需要在这两者之间做权衡,需要同时关注这两个指标。

所以使用精准率和召回率来评估分类器,看起来应该是合理的。问题就在于把它们作为评估指标时,不能确定哪个分类器更好了。当有两个评价指标时,快速找出超参数最好的那一个会变得很困难。

所以选择一个新指标,同时兼顾精准率和召回率。
F1分数。你可以把它理解为精准率P和召回率R的一种平均值,它是P和R的调和平均数。

很多机器学习团队都会与一个很好的验证集来评估精准率和召回率和一个单一量化评估指标,有时候我们称之为single row number。这个评估指标可以帮助你快速判断哪个分类器更好。

所以一个好的验证集和单一量化评估指标可以提高迭代的效率,它加速整个流程,让你的机器学习算法不断改进。

除了追踪4各不同地区的表现,应该同时关注它们的平均值,平均表现是个合理的单一量化评估指标,通过比较平均值可以看出哪个算法的错误率最低。即你必须选择一个算法并且不断进行迭代而改进它。

所以在机器学习系统的设计过程中,通常是现有一个想法,然后实现它,然后你想要知道你的想法是否奏效。所以要学着找到一个单一量化评估指标,可以更好的让你的团队做出快速的决策。

如何效率的设置评估指标?如何设置优化和满意度矩阵?

第四课:满意度和优化指标

将所有你关心的方方面面组合成一个用行索引就能判别的单一指标不总是一件容易的事,因此,某些情况下建立满足指标和优化指标,是很有用的。

你可以把准确率和运行时间组合成一个整体评价指标。像这种就像把两者的进行线性加权的方式有些刻意。所以你还可以:
选择一个分类器,它在确保运行时间的前提下提供最大准确率,例如甄别时间必须小于100ms。这时,准确率就变成优化指标,因为你想要最大化准确率,运行时间是满足指标。
所以这种方式对准确率和运行时间进行权衡或者说通盘考虑相当合理。

通过定义满意指标和优化指标。你就有了挑选最佳分类器的明确方向。
更一般的说,如果你有N个关心的指标,有时候选择其中一个加以优化是个合理的策略,那么剩下的N-1个都是满足指标,意味着它们只要达到某个阈值就可以了。

对于触发词,一个合理的做法可能是最大化准确度,也就是当有人说了这些触发词的时候,最大化设备被唤醒的几率,并在此前提下,确保24小时内只有一次不是被触发词唤醒。这个例子中 准确率是优化指标,24小时内被其他原因随机唤醒的次数是满足指标。你必须确保24小时内只有最多一次被随机唤醒。

总结:如果你同时关心多项指标,你可以将其中一项设为优化指标,使其尽可能表现得好,将另外一项或多项设为满足指标确保其满足要求,大多数情况下它们都会优于最低标准。这样一来你就会有一个几乎自动的快速评价模型和选择最佳模型的方法。

现在那些评价指标必须在训练集/开发集/测试集上评估计算,那么另一件你需要做的就是建立训练集/开发集/测试集,那么建立训练集/开发集/测试集的指导原则是?

第五课:训练/开发/测试分配

如何分配训练/开发/测试集将会对构建机器学习应用的进展中产生巨大的影响。

如何设置开发集和测试集?
机器学习的工作流程是你尝试了很多的想法,在训练集上训练不同的模型,然后使用开发集来评估不同的想法,并选择一个。并且保持创新,不端提高模型在开发集上的表现性能,直到最后你有一个比较满意的结果,然后你在测试集上评估它们。

随机选择四个国家作为开发集,剩下的作为测试集是一个糟糕的想法。因为你的开发集和测试集来自不同的分布。我的建议是让你的开发集和测试集来自相同的分布。

所以记住一个重要的地方:
设定开发集和评估方法时,就像是设置了一个目标然后告诉团队你们的目标是什么,一旦确定了开发集和评估方法,团队就会尝试各种不同的方法并进行实验,很快利用开发集和评估方法来评估选择器并选取最好的一个。所以机器学习很擅长多线执行,然后根据各种尝试来不断接近目标,在这种开发集和评估方法上做的更好。

因此在我们在设置开发集和测试集时要注意,你的团队可能用了几个月的时间靠拢开发集,当你在测试集上运行的时候,可能数据结构不同。

所以让测试集和开发集来自不同的分布就想让你的团队用数个月瞄准,但是最后你说,稍等,我要换个目标,我们瞄准这里,却要打那里。。。

所以为了避免这种情况的发生,我建议你们将所有数据随机打乱然后分为开发和测试集,这样开发和测试集都拥有了八个地区的数据,这样开发和测试集就来自相同的分布了,分布在你拥有的所有数据中。

另一个例子:
在中产贷款数据做的预测贷款是否成功的模型被用在低收入区。。。

所以我推荐的设置开发集和测试集的方法是:
选择的开发集和测试集能够反映出将来预计得到的数据,和你认为重要的数据,特别地,这里的开发和测试集应该来自相同的分布。
所以无论未来你需要预测什么样的数据,一旦你试着获取这些数据,无论这些数据是什么,直接把它同时放进你的开发和测试集中,因为这样你就瞄准了你想要瞄准的目标。团队也可以有效地开发在同一目标上表现良好。

如何设置训练集?

总结:设置开发集和检验方法直接决定了你的目标,将开发和测试集取在同一分布上,你才真正瞄准了你和你团队的目标,你选择训练集的方法会影响你击中目标的精度,我们后面讨论这个。

第六集:开发和测试集的大小

在深度学习大数据时代,我们训练数据往往不需要20%-30%的数据量作为开发和测试集,往往1%就够了,训练集的比例往往会变得更高。

测试集应该多大呢?
测试集的作用是在系统开发完成后,帮助我们评估最终系统的性能,因此测试集的大小只要足够能保证对系统整体性能评估的高置信度即可。因此,除非你需要对最终系统性能非常精确的测量,否则你的测试集上并不需要上百万个样例,或许你认为1万个样例就可以提供足够的置信度来评估性能,抑或是10万个。

在某些场景,可能你并不需要对最终系统整体性能的评估具有很高的置信度,或许你只需要训练集和开发集,那么没有测试集也是可以的。
即如果我们只关心有用于训练的数据,和用于调优的数据,然后直接上线最终的系统,而不太关心它的实际性能,我认为也可以只使用训练集和开发集而不使用测试集。

我觉得有一个测试集更安心,你可以在上线前使用测试集得到对系统性能的无偏估计。但如果你有一个很大的开发集,你相信不会对开发集过拟合的太厉害,那么只使用测试集和训练集,也不是完全不合理。

总结一下:现在的趋势是使用更多的数据作为训练集,使用较少的数据作为开发集和测试集。
经验法则是:确保开发集的大小足以达到其目的,也就是帮助我们评估不同的算法;测试集的目的是对最终的分类器进行评估,你只需要让测试集 的大小满足这一目的即可。

事实证明,有时,在机器学习问题的某个方面,您可能希望更改评估指标,或更改您的开发和测试集。 当你想要这样做时?

第八课:如何更改开发/测试集和指标

确定了你的团队要瞄准的靶子,可有时候,项目进行了一半,你会发现靶子放错了位置,这时候就应该移动你的靶子。

尽管算法A具有更小的误差,但是它会误识别色情图片,所以相对于B,A就不是一个好算法。

当你的评估指标无法正确的对算法的优劣进行排序时,这时你应该修改评估指标,可能也要修改开发集或测试集。

例如,在计算精确率时,将色情图片赋予一个比较大的错误权重。

即当你发现无法对算法的优劣给出一个正确的排序时,那么就需要考虑定义一个新的评估指标,评估指标的目的是为了能够准确的告诉你给出两个分类器,哪一个更适合你的应用?
重点是:如果你对原有的误差指标不满意,那就不要将就着使用这个你不满意的指标,而是定义一个新的指标,使其能够更好的反应你的偏好,以符合你对更好的算法的定义。

我们讨论了如何定义一个指标来评估分类器,我们定义了一个指标来对分类器进行更好的排序,以区别它们在区分色情图片上的不同水平,这其实就是正交化思想的一个例子。

我认为应该将机器学习问题分解为独立的步骤,第一步是确定一个指标,以衡量分类器在你的目标上的性能,然后我再单独考虑,如何在这个指标上得到更好的性能。

所以两个步骤可以看做是:
1.摆放靶子,即确定你要瞄准的地方
2.瞄准和射击靶子,有时可能需要修改神经网络所优化的代价函数J

另一个例子:
在评估时,开发集和测试集中都是非常精美、高分辨率或取景很好的图片,而你的用户上传的确实不那么专业的,比较模糊的...

这种情况下的指导方针是:
如果在你的指标上以及在当前开发集和测试集上的分布表现良好,不能对应于在你关心的应用场景下也表现的很好,这时就需要修改指标和/或开发集和测试集。让你的数据能够更好的反应实际上你关心的数据的情况。

我的建议是:即便你无法定义一个完美的评估指标和开发集,你也应该尽快将它们确定下来,以此来驱动你们团队的迭代速度,如果之后发现选的不好,或者你有了新的想法,你完全可以再重新修改。对于任何团队和个人,我不建议在没有任何评价指标和开发集的情况下进行长时间的开发,因为这实际上会降低你们团队进行迭代和改善算法的效率。

设立一个明确的目标,从而能更有效率地朝着改善性能的方向进行迭代!

第八课:人类行为表现?

将机器学习系统与人类行为表现进行比较,两个原因:
1.随着深度学习的发展,机器学习算法的效率不断提高,使它应用在很多新领域,算法和人相比也更有竞争力
2.在某些领域,用机器学习解决问题的效率比用人工解决问题的效率更高

机器学习算法的效果逼近但是从来不会超越一个理论值,这称为贝叶斯最优方差,所以贝叶斯最优方差就是最小的理论误差值。这就是用从x到y的任何函数映射超过一定的准确度。

贝叶斯最优误差、贝叶斯最佳误差、贝叶斯错误
简而言之就是:从x到y映射的最好的理论函数,那是永远无法被超越的。机器学习算法的准确度进步非常快,直到你超越人类表现,就会慢下来。我认为有两个原因:
1.人类级别的表现,在许多任务中离贝叶斯最优误差不远,所以超越人类表现之后没有那么多的改善空间。
2.只要你的表现还不如人类水平,那么实际上你可以用某些工具来提高,而当你超越人类水平以后,就很难使用工具来提高了

当算法不如人类表现时,可以采取的策略:

1.对于人类擅长的任务,只要机器学习算法比人类糟糕,你就可以从人类得到数据标记,这样你就有更多的数据以满足你的学习算法。
2.手动误差分析,只要人类表现还优于算法,你可以让人看看你的算法算错的例子,然后理解为什么人可以做到,但是算法却搞错了
3.你也可以得到更好的偏差分析和方差

而一旦你的算法超过人类表现,这三个策略将变得很难使用。

为什么机器学习算法是真的很出色于试图复制人类擅长的任务并渐渐赶上或也许略微超过人类,尤其是当你直到什么是偏差和方差,知道人类如何胜任一项任务能帮助你更好地理解这一问题。
你应该如何尝试减少偏差和方差?

第九课:可避免的偏差

有些时候你不希望算法的效果好过头,如果你知道人类的水准是什么程度的话,那么就知道了算法什么样的表现算是好但是没有过头。

对于人类和训练集上的表现差异很大的情况,在消除偏差和方差的工具两者之中,我推荐重点消除偏差,可以尝试训练更大的神经网络,或者训练更长时间,从而提升模型在训练集上的表现。

对于人类和训练集上的表现差异很小的情况,在消除偏差和方差的工具两者之中,我推荐重点消除方差,可以尝试使用正则化的方法,来使开发集上的误差向训练集上的误差靠近。

我们可以把人类水准的错误率看作是贝叶斯最优误差的代理变量或是估计值。在计算机视觉任务中,这个代理变量是合理的,因为人类擅长视觉的任务, 所以人类能达到的水准也许和贝叶斯误差相差不大。从定义上说,人类误差必然是大于贝叶斯误差的,因为没有任何误差能小于贝叶斯误差,但是人类可以做到和贝叶斯误差相比差距不大。

人类误差或者贝叶斯误差会给我们一个指导:改进的侧重点可能是减少方差或是减少偏差。

命名:贝叶斯误差和训练集上的误差称为可避免的误差,所以你可能想改进模型在训练集上的表现,直到误差小到可以与贝叶斯误差齐平。
这是模型在训练集与开发集上的误差之差则是对模型中存在的方差问题的量度,叫做可避免的方差。

人类水准的误差的意义?

第十课:了解人类水准

更精准的定义:人类表现

对于医学图像分类问题:
如何定义人类误差?
区分这个问题,我希望你记住的最有效的方法是:
是把人类误差当做贝叶斯误差的替代值或估计值。
但当你出于发布研究报告或配置系统时,对于人类误差定义或许会不同,超过一个放射科医生就很值得去开发了。。。即搞清楚你的目的是什么?

比如这个例子中,你选择哪一个作为人类误差其实差距不大,相比于可避免的方差,你需要专注于降低偏差的技术比如训练更大的伸进网络。但是更改训练集的误差为1%以后,你就需要专注于方差降低的技术。比如正则化或者使用一个更大的训练集。两者相近时,方差和偏差都可以改进。。。

为什么机器学习问题会在你达到或者接近人类水平表现时变得更难。

总结:对于一个人类可以很好完成的任务,如果你达到了人类水平的误差估计值,这时你想搞清楚方差还是偏差问题,你可以使用人类水平的误差作为贝叶斯误差的替代值或近似值。你的训练误差和贝叶斯误差的差距告诉你可以避免的偏差有多大,而训练误差和开发集误差的差距告诉你方差问题有多大,你的算法是否可以做到更好的泛化。

这里以上叫做偏差的估计!

我们对贝叶斯误差做了一个比较详细的讨论,因为贝叶斯误差有时候也不为0,且所有的问题的误差都不一定小于某一个定值,而是根据人类误差进行特定分析。
比如对于嘈杂的语音识别,这时候有一个人类误差作为贝叶斯误差估计,可以很好的帮助我们评估可避免的偏差和方差,从而更利于做出决定是专注于降低方差还是偏差。

如何处理超越人类表现得算法?

第十一课:超越人类的表现

当你达到超越人类水准的性能时会遇到哪些情况?

进展会越来越慢?

当你的算法的误差小于人类团队的误差值时:
是你的算法过拟合了?
还是贝叶斯误差是更低值?

这时候你没有足够的信息去判断应该专注于减少方差还是偏差?
所以你取得进展的效率就降低了。

其次如果你算法的误差已经比人类团队通过讨论和辩论才能达到的误差还小,那么你就更难依靠人类的直觉来判断还能从哪方面进行优化算法的性能了。
即优化的方向和方法就不明确了。这并不意味着你不能取得进展,你仍然可以使用没有指明方向的工具提升算法性能。

超越人类性能的例子:
在线广告
产品推荐
物流预测
预测是否会还贷从而判断是否应该批准贷款申请

以上四个例子都是从结构化数据中进行学习的,即都有数据库系统,且这些都不是自然感知问题,不是计算机视觉,或者语音识别,或者自然语言处理。人类特别擅长自然感知的任务,这使得计算机在自然感知领域超越人类的水平虽然是可能的,但是难度更大一点。且在以上的问题上,团队都要能获得海量的数据。上述系统中,计算机看到的数据可能比任何一个人类所能看到的都多,这使得它相对容易取得超越人类的水平。

事实上由于计算机能够检索海量的数据,所以它比人类更擅长挖掘数据结构中的统计规律。

事实上,在语音识别和计算机视觉上,有的计算机算法已经超越了人类,还有一些医学相关的任务...

总结:取得超过人类水平的性能通常都不容易,但是基于足够的数据量,已经有很多深度学习系统在单个监督学习问题上超越了人类水平。这也适用于你开发的应用!希望有一天,你开发的应用也能超越人类水平...

第十二课:提高你的算法性能

你们已经学习了正交化、如何设置开发集和测试集用人类水平代表贝叶斯偏差,以及如何估计可避免偏差和方差,让我们把这些结合成一套准则用于改进你的学习算法:

我认为一个监督学习系统能发挥作用,意味着希望或者预设你可以做到两件事:
1.你能很好的拟合训练集,即你能得到较低的可避免偏差
2.训练集的效果可以很好的推广到开发集或测试集,即方差不太大

如果你要改善你的机器学习系统:

首先看训练集偏差和贝叶斯偏差的差距,估计可避免偏差,然后看测试集偏差和训练集偏差的差距,估计你的可避免方差有多大,即你需要付出多大的努力来让你训练集的效果推广到开发集那些没有直接用在训练的数据上。

然后根据方差还是偏差问题进行相应的策略调整,包括增大训练数据,训练更长时间,加入新的优化算法,或者是使用新的神经网络,即调整超参数的大小。

对于方差问题,我们一样可以采取相应的增大数据,正则化,或者尝试不同的神经网络架构等。

高效、系统、有策略!

你可能感兴趣的:(构建机器学习项目)