自己笔记更新至此不再更新,参看吴恩达所有deeplearning.ai课程笔记网址:http://www.ai-start.com/dl2017/ 感谢作者
1. Setting up your goal
1.1 single number evaluation metric
无论你在选择超参调优或是选择不同的机器学习算法,还是在构建机器学习系统的时候,选择不同的配置项,你都会发现,如果你有单一的量化评估指标,可以让你知道新的方法比上一次好还是坏,那么整个进程会加快很多,所以,当团队在启动一个机器学习项目时,常常建议设置一个单一的量化评估指标,下面看一个例子:
一个合理的评估你的分类器好坏的方法就是看它的精准率和召回率,比如你要识别猫的图片,精准率就是它识别出猫的集合中有多少百分比真正是猫,因此分类器A有95%的精准率,就意味着,A如果把一张图片分类为猫,那么95%可能它就是猫,召回率就是对于所有猫的图片,你的分类器有多少百分比可以正确的识别出来,即多少比例的真猫被正确识别出来了,因此如果分类器A的召回率是90%,意味着你验证集中真猫的图片,分类器A正确分出了90%。不同太在意精准率和召回率的定义,事实证明你常常要在这两者之间做权衡,需要同时关注这两个指标,你要的是当分类器说它是猫的时候,它有很高的可能性是猫,而对于所有真正是猫的图片,你同样希望分类器可以把绝大多数都识别出来,所以使用精准率和召回率来评估分类器看起来应该是合理的,问题就在于把它们作为评估指标的时,如果分类器A的召回率比较好,而分类器B的精准率更好(如上图表),那么你就不能确定究竟哪个分类器更好了,并且如果你尝试许多不同的算法,就会有许多超参,你就不止从两个分类器中选择,可能需要从几十个中快速地选出最好的那个,以便你可以在这个基础上继续迭代,当有两个评估指标时,快速找出最好的那个会很困难,因此建议是与其使用两个数字精准率和召回率来选择分类器,不如找一个新的评估指标,它兼顾了精准率和召回率,在机器学习领域,标准的方法是使用F1分数,简单的说,你可以把它理解为精准率P和召回率R的一种平均,F1分数的计算公式是
接下来看另外一个例子,假如你做了一个关于猫的应用,给四个主要地区的猫的爱好者,你的两个分类器在这四个地区的数据上有不同的错误率,如下表:
可能追踪每个不同地区上你分类器的效果是有意义的,但是同时考量4个数字,让你快速的确定分类器A还是B好会很困难,并且如果你同时测试许多不同的分类器那将会更加困难,如下表:
因此在这个例子中,建议除了追踪4个不同地区的表现,应该同时关注它们的平均值,平均表现是一个合理的单一量化评估指标,通过计算平均值,你可以很快看出算法C的错误率最低,然后你可以继续对它改进了,你必须选择一个算法并且不断的对它进行迭代。
1.2 Satisficiing and optimizing metrics
将所有你关心的方方面面组合成一个行索引,就能判别的单一指标并不总是一件容易的事,因此在某些情况下,建立满足指标(Satisficing matrics)和优化指标(optimizingmatrics)是很有用的,比如你决定你要关注猫分类器的分类准确率(accuracy),它可以是F1分数或者别的什么准确度度量,但是假设除了准确率之外,你还关心运行时间,也就是对一个图像分类需要多少时间,如下表:
你当然可以把准确率和运行时间组合成一个整体评价指标(overall evaluationmetric)比如说整体代价是 准确率-0.5*运行时间,但是将准确率和运行时间这样的公式整合,看起来有些刻意,就像二者的线性加权和(linear weighted sum),所以你还可以这样做,你可能想要选择一个分类器,它在确保运行时间的前提下提供最大准确率,比如它在甄别图像时最大时间必须小于100ms,这个例子中,我们说准确率是优化指标,因为你想要最大化准确率,但是运行时间是我们所说的满足指标,意味着它必须足够好,所以用这种方式对准确率和运行时间进行权衡或者说铜盘考虑,相当合理,有可能的情况是,只要运行时间你的用户并不在意它是100毫秒还是50毫秒或更快,通过定义优化指标和满足指标,你就有了挑选”最优”分类器的明确方向,这个例子中中标的是B,因为B优于100ms的分类器中它的准确率最高,更一般的说,如果你有N个关心的指标,有时候选择一个加以优化是个合理的策略,你想要它表现尽可能的好,那么剩下的N-1就是满足指标,意味着它们只要达到某种阈值(threshold)就可以了,比如运行时间比100ms快之类的,一旦达到了阈值,你就不必费心优化他们了,但是必须保证他们达到了阈值。
看另外一个例子,假设你在建一个检测唤醒词(wake words)的系统,也叫触发词(trigger words),它指的是一些声控设备,比如你用OKGoogel唤醒google设备,或者hey Siri唤醒Apple设备,所以你可能关心这些触发词监测系统的准确度,也就是当有人说了某个触发词,实际上会唤醒你的设备的可能性有多大,你也可能关心假阳性(false positive)的次数,也就是没人说这个触发词,设备却被随机唤醒的几率是多大,在这种情况下,组合这两个评估指标的一个合理做法就是最大化准确率,也就是当有人说了这些触发词的时候,最大化设备会被唤醒的几率,并在此前提下,确保24小时内只有一次不是被触发词唤醒,即平均来说,你的设备在一天内只有一次在没有人和它说话的时候被随机唤醒,这个例子中准确率是优化指标,24小时内被其他唤醒的次数是满足指标(保证24小时内最多一次被其他唤醒)。总的来说,如果你同时关心多项指标,你可以将其中一项设为优化指标,使其尽可能表现好,将另外一项或者多项设为满足指标确保其表现满足要求,大多数情况下它们都会优于最低标准
1.2 Train/dev/test distribution
这一节重点介绍如何设置您的开发集和测试集,而且,机器学习的工作流程是你尝试了很多想法,在训练集上训练不同的模型,然后用开发集来评估不同的想法,并选择一个,并且保持创新,提高模型在开发集上的表现性能,直到最后你有一个很高兴的结果,然后你在测试集上评估它们。
举个例子,如果你要训练一个分类器,来识别不同地区的猫的图片,那么你要把所有数据随机打乱然后分为开发和测试集,这样开发和测试集都拥有了不同地区的猫的数据,这样开发和测试集就来自相同的分布了
建议:Choose a dev set and test set to reflectdata you expect to get in the future and consider important todo well on。需要注意的是开发集和测试集应该来自相同的分布(distribution)
1.3 Size of the dev and test sets
当数据规模很小的时候,比如很久以前的模型(数据小于10000),使用70/30或60/20/20的经验法则是非常合理的,但现代机器学习中,需要训练大量数据,比如你有100万个训练样例,那么你要用98%作为训练集,1%作为开发集,1%作为测试集,现在的趋势是使用更多的数据作为训练集,使用较少的数据作为训练集和开发集,尤其当你的数据集很大的时候,测试集的目的是对最终的分类器进行评估,你只需要让测试集的大小足以满足这一目的即可。
1.4 When to change dev/test sets and metrics
假设你决定构建一个猫分类器,用于寻找猫的图像,并展现给爱猫的用户你决定使用分类误差作为评估指标,如上图,貌似分类器A更好些,但是你测试的时候,你发现算法A由于某些原因,会将很多色情图片也分类为猫,这样它会向你的用户也展示一些色情图片,这是无法容忍的,相比之下,B虽然误差大,但是不会有色情图片,
重点是如果你对原有的误差指标不满意,那就不要将就着使用这个你不满意的指标,而是定义一个新的指标,使其能够更好地反应你的偏好,以符合你对更好的算法的定义。
重点是正交化思想:
第一步是确定一个指标,以衡量分类器在你的目标上的性能,然后我们再单独的考虑,如何在这个指标上得到更好的性能,所以可以把机器学习任务看成两个独立的步骤,用靶子作比喻,第一步是摆放靶子,确定你要瞄准的地方,这是一个完全独立的步骤,至于如何精准的射中靶子,则有另一个独立的旋钮进行调节,有时候你需要增加一个权重w,来规避上边那个色情图片问题(代价函数J只是一个例子
):
还要修改m这个归一化常数,修改为对w(i)求和:
因为用户拍摄的照片是很随机的,并不是一直是质量很好的,这种情况下,还是需要修改你的指标或者你的开发集和测试集。
2. Comparing to human-levelperformance
2.2
接受这个数据集上表现一般的事实,把重点放在开发集与训练集的2%的差距上,然后针对它尝试一些消除方差的方法,譬如正则化,或者获取更多的训练数据,
注意:把贝叶斯误差或者对其的近似其与训练集上的误差,称为可避免的误差,所以你可能想改进模型在训练集上的表现,直到误差小到与贝叶斯误差齐平,但是你并不想小于贝叶斯误差,想小于贝叶斯误差是不可能的,除非过拟合,而这时模型在训练集与开发集上的误差之差,则是对模型中存在的方差问题的度量。而可避免的误差,这个术语就表现出了训练时能同时达成的误差的下限,也就是贝叶斯误差,即7.5%,所以与其说在训练集上的误差是8%,不如说可回避的偏差是0.5% 或者说是偏差的度量是0.5%,同时 方差的度量是2%,所以在方差上有2%的进步空间,比偏差的0.5%要大许多,左边的例子中可回避的偏差差的度量高达7%,而可回避的方差的度量只有2%,所以在上图左边的例子中,偏差上的进步空间要大很多。
2.3 关于贝叶斯误差(世界上所有函数竭尽所能,能够达到的最佳错误率)的定义,通常是小于d
注意下图,你的训练模型越接近人类水平,要想再提高就会越难
总结一下,估计人类水平的表现,就能给你贝叶斯误差的估计,这能让你更快的决定,是否应该减少你的算法的偏差还是方差,这些技巧还是蛮有用的,直到你超越了人类水准。
2.4 Surpassing human-Level performance 超越人类水准
我们之前讨论过,当性能接近或者超过人类水平时,机器学习的进展将会变得越来越慢,看一个例子:
假设你有一个问题,由人类团队通过深入讨论和辩论,可以达到0.5%的误差,如下图:
这种情况下,可避免的偏差有多少呢?你可以估计可避免的偏差至少是0.1% 方差是0.2%,如下图
上边这四个例子都是从结构化的数据中进行学习,比如有用户点击过的广告的数据库,你所购商品的数据库,从A地到B地所花时间的数据库,以前的贷款申请及结果的数据库,这些都不是自然感知(Natural Perception)问题,不是计算机视觉,或者语音识别或自然语言处理的任务,人类非常擅长自然感知的任务,
2.4 Improving your model performance
第一是你可以很好的拟合训练集,你可以大致认为你能得到较低的可避免误差
第二是训练集的结果可以很好的推广到开发集或者测试集,这就是说,方差不太大
从正交化角度来说,你看到的是存在一组旋钮可以修正可避免偏差的问题,比如训练更大的神经网络或者训练更长时间,并且有另一组独立的方法可以用来处理方差问题,比如正则化或者获取更多的数据,
总结: