机器学习训练秘籍 属于deeplearning.ai项目. =======中文PDF相关信息======= 项目地址:点击此处文件版本:0.5.0draft最后更新:2018/10/31 译者水平有限,如有翻译不当之处,恳请读者指正,联系邮箱:acdoge.cao@gmail.com ========================= ©2018AndrewNg.AllRightsReserved. 目录 1机器学习为什么需要策略? 2如何使用此书来帮助你的团队 3先修知识与符号说明 4规模驱动机器学习发展 5开发集和测试集的定义 6开发集和测试集应该服从同一分布 7开发集和测试集应该有多大?? 8使用单值评估指标进行优化 9优化指标和满意度指标 10通过开发集和度量指标加速迭代 11何时修改开发集、测试集和指标 12小结:建立开发集和测试集 13快速构建并迭代你的第一个系统 14误差分析:根据开发集样本评估想法 15在误差分析时并行评估多个想法 16清洗误标注的开发集和测试集样本 17将大型开发集拆分为两个子集,专注其一18Eyeball和Blackbox开发集该设置多大?19小结:基础误差分析 20偏差和方差:误差的两大来源 21偏差和方差举例 22与最优错误率比较 23处理偏差和方差 24偏差和方差间的权衡 25减少可避免偏差的技术 26训练集误差分析 27减少方差的技术 28诊断偏差与方差:学习曲线 29绘制训练误差曲线 30解读学习曲线:高偏差 31解读学习曲线:其它情况 32绘制学习曲线 33为何与人类表现水平进行对比 34如何定义人类表现水平 35超越人类表现水平 36何时在不同的分布上训练与测试 37如何决定是否使用你所有的数据 38如何决定是否添加不一致的数据 39给数据添加权重 40从训练集泛化到开发集 41辨别偏差、方差和数据不匹配误差 42解决数据不匹配问题 43人工合成数据 44优化验证测试 45优化验证测试的一般形式 46强化学习举例 47端到端学习的兴起 48端到端学习的更多例子 49端到端学习的优缺点 50流水线组件的选择:数据可用性 51流水线组件的选择:任务简单性 52直接学习更为丰富的输出 53根据组件进行误差分析 54误差归因至某个组件 55误差归因的一般情况 56组件误差分析与人类水平对比 57发现有缺陷的机器学习流水线 58建立超级英雄团队-让你的队友阅读这本书吧! 1机器学习为什么需要策略? 机器学习(machinelearning)已然成为无数重要应用的基石——如今,在网络搜索、垃圾邮件检测、语音识别以及产品推荐等领域,你都能够发现它的身影。如果你或你的团队正在研发一款机器学习相关应用,并期待取得较快进展,那么这本书将会是你的得力助手。 案例:建立猫咪图片初创公司 想象一下,你正在建立一家初创公司,这家公司的产品目标是为猫咪爱好者们提供数不尽的猫咪图片,你打算应用神经网络(neuralnetwork)技术来构建一套计算机视觉系统,通过该系统来识别图片中的猫。 但悲剧的是,目前你的学习算法准确度还不够好。为了改进这个猫咪检测器,你正面临着巨大的压力。可你该怎么做呢? 你的团队给出了许多建议,例如: ●获取更多的数据,即收集更多的猫咪图片 ●收集更加多样化的训练数据集,图片中猫的位置可能不常见,也有可能颜色奇异,或者拍摄时使用不同的相机参数 ●通过增加梯度下降的迭代次数,使算法训练得久一些 ●尝试一个拥有更多层/更多隐藏元/更多参数的,规模更大的神经网络 ●尝试一个更小的神经网络 ●尝试加入正则化(例如L2正则化) ●改变神经网络的架构(激活函数,隐藏元数量等等) ●... 在上面众多的方向中,如果你做出了正确的选择,就将建立起一个效果领先的猫咪图片识别平台,并带领你的公司取得成功。但如果你选择了一个糟糕的方向,则可能因此浪费掉几个月的时间。那么你该如何做出决定呢? 这本书将告诉你应该怎么做。众多的机器学习问题会留下一些线索,告诉你什么样的尝试有用 ,什么样的没用。而学会解读这些线索将会节省你几个月甚至几年的开发时间。 2如何使用此书来帮助你的团队 完成本书的阅读后,你将进一步理解如何为一个机器学习项目设定技术方向,但团队成员可能不理解你为何要推荐某个特定的方向。有时你希望你的团队定义一个单值评估指标,但他们并不认可你的想法,此时你将如何说服他们? 这正是我决定缩短章节篇幅的原因——这样你就能够将它们打印出来,并且让你的成员仅阅读 其中他们需要了解的那几页。 优先级的稍加改变会对团队的生产力产生巨大的影响,我希望你能帮助团队做出一些这样的改变,从而成为团队里的超级英雄! 3先修知识与符号说明 如果你有学习过机器学习相关课程(例如我在Coursera开设的机器学习MOOC),或者有 过监督学习的应用经验,这本书的内容对你而言则不难理解。 本书假设你熟悉监督学习(supervisedlearning)概念,即使用标注(labeled)的训练样本 (x,y)来学习一个从x映射到y的函数。监督学习算法主要包括线性回归(linearregression )、对数几率回归(logisticregression,又译作逻辑回归、逻辑斯蒂回归)和神经网络(neuralnetwork)。虽然机器学习的形式有许多种,但当前具备实用价值的大部分机器学习算法都来自于监督学习。 我将经常提及神经网络(也被人们称为“深度学习”),但你只需对这个概念有基础的了解便可以阅读本书后面的内容。 如果对上文提到的一些概念你还不是很熟悉,可以在Coursera观看《机器学习》前三周的课 程内容。(课程地址:http://ml-class.org) 4规模驱动机器学习发展 关于深度学习(神经网络)的一些想法在几十年前就有了,那为什么它们到现在才流行起来了呢? 推动其近期发展的主要因素有两个: -数据可用性(dataavailability):如今人们在数字设备(笔记本电脑、移动设备等)上花费的时间越来越多,对应的数字化行为与活动产生了海量的数据,而这些数据都可以提供给我们的学习算法用来训练。 -计算规模(computationalscale):在近几年前,我们才开始有能力训练出规模足够大的神经网络来使用现有的海量数据集。 具体来说,即使你积累了更多的数据,但应用在类似于对数几率回归(logisticregression)这样较传统的学习算法上,其性能表现(performance)也将趋于“平稳”。这意味着算法的学习曲线将“变得平缓”,就算提供更多的数据,算法的性能也将不再提升。 传统学习算法似乎并不知道要如何来处理现今这般规模量级的数据。 在同样的监督学习任务下,选择训练一个小型的神经网络(neutralnetwork,NN),你可能会 获得较好的性能表现: 这里的“小型神经网络”指的是只含有少量的隐藏元/层/参数的神经网络。但如果你训练的神经网络规模越来越大,最终很有可能会获得更好的表现:1 因此,为了获得最佳的性能表现,你可以这样做:训练大型的神经网络,效果如同上图的绿色曲线;拥有海量的数据。 在算法训练时,许多其它的细节也同等重要,例如神经网络的架构。但目前来说,提升算法性能的更加可靠的方法仍然是训练更大的网络以及获取更多的数据。完成1和2的过程异常复 1该图显示了在小数据集上应用神经网络的效果会更好,但这种效果与将神经网络应用在大数据集时不太一致。在小数据集情况下,传统算法是否会表现得更好,取决于人们如何进行特征选择工程。例如 ,假设你只有20个训练样本,那么使用对数几率回归还是神经网络可能无关紧要;此时人为的特征选 择工程比起选择哪种算法将产生更大的影响。但如果你有100万个样本数据,我会赞成你使用神经网 络。 杂,本书将对其中的细节作进一步的讨论。我们将从传统学习算法与神经网络中都起作用的通用策略入手,循序渐进地讲解至最前沿的构建深度学习系统的策略。 设置开发集 与测试集 5开发集和测试集的定义 继续分析我们之前提到的猫咪图片的案例:现在你负责运营一个移动端app,用户会向这个app上传许多不同内容的图片。而你希望这个app能够从图片中自动地找到含有猫的图片。 你的团队已经在不同的网站下载了含有猫的图片(正样本,又译作正例),以及不含猫的图片 (负样本,又译作反例),从而得到了一个巨型的数据集。他们将数据集按照70%/30%的比例划分为训练集(trainingset)和测试集(testset),并且使用这些数据构建出了一个在训练集和测试集上均表现良好的猫咪检测器。 可当你将这个分类器(classifier)部署到移动应用中时,却发现它的性能相当之差! 这究竟是什么原因导致的呢? 你会发现,从网站上下载下来作为训练集的图片与用户上传的图片有较大的区别——用户上传的图片大部分是使用手机拍摄的,此类图片往往分辨率较低,且模糊不清,采光也不够理想。但由于用来进行训练和测试的数据集图片均取自网站,这就导致了算法不能够很好地泛化(generalize)到我们所关心的手机图片的实际分布(actualdistribution)情况上。 在大数据时代来临前,机器学习中的普遍做法是使用70%/30%的比例来随机划分出训练集和测试集。这种做法的确可行,但在越来越多的实际应用中,训练数据集的分布(例如上述案例中的网站图片)与人们最终所关心的分布情况(例如上述案例中的手机图片)往往不同,此时执意采取这样的划分其实是一个坏主意。 我们通常认为: •训练集(trainingset)用于运行你的学习算法。 •开发集(developmentset)用于调整参数,选择特征,以及对学习算法作出其它决定。有时也称为留出交叉验证集(hold-outcrossvalidationset)。 •测试集(testset)用于评估算法的性能,但不会据此改变学习算法或参数。 在定义了开发集(developmentset)和测试集(testset)后,你的团队将可以尝试许多的想法,比如调整学习算法的参数来探索哪些参数的使用效果最好。开发集和测试集能够帮助你的团队快速检测算法性能。 换而言之,开发集和测试集的使命就是引导你的团队对机器学习系统做出最重要的改变。 所以你应当这样处理: 合理地选择开发集和测试集,使之能够代表将来实际数据的情况,并期望算法能够运行良好。 也就是说你的测试集不应该仅是简单地将可用的数据划分出30%,尤其是将来获取的数据 (移动端图片)在性质上可能会与训练集(网站图片)有所不同时。 如果你尚未推出移动端app,那么可能还没有任何的用户,因此也无法获取一些准确的反馈数据来为后续的行动提供依据。但你仍然能够尝试去模拟出这种情况,例如邀请你的朋友用手机拍下照片并发送给你。当你的app上线后,就能够使用实际的用户数据对开发集和测试集进行更新。 如果你实在没有途径获取近似未来实际情况的数据,也可以尝试使用已有的网站图片。但你应该意识到这其中的风险,它将导致系统不能够很好地泛化(generalize)。 选择一个理想的开发集和测试集是需要一定投入的,投入多少由你来决定。但请不要武断地认为测试集分布和训练集分布是一致的。尽可能地选择你最终期望算法能够正确处理的样本作为测试集,而不是随便选择一个你恰好拥有的训练集样本。 6开发集和测试集应该服从同一分布 根据公司的核心市场分布情况,你将猫咪app的图像数据划分为“美国”、“中国”、“印度”和“其它地区”四个区域。在设立开发集和测试集时,可以尝试将“美国”和“印度”的数据归于开发集,而“中国”和“其它地区”的数据归于测试集。也就是说我们可以随机地将其中两个区域的数据分配给开发集,另外两个区域的数据分配给测试集。这样做对吗? 当然不对! 一旦定义好了开发集和测试集,你的团队将专注于提升开发集的性能表现,这就要求开发集能 够体现核心任务:使算法在四个地区都表现优异,而不仅仅是其中