安德鲁·安(Andrew Un)的书《机器学习的激情》第1至14章的翻译

不久前,我的Facebook Feed中出现了指向Andrew Ng的《机器学习的渴望》一书的链接,该书可以翻译为《机器学习热情》或《机器学习渴求》。


图片<img src =“ <img src =” https://habrastorage.org/webt/ds/rc/ct/dsrcctfottkedkf7o1hxbqsoamq.png“ />” alt =“图像” />


对机器学习或在该领域工作感兴趣的人无需介绍Andrew。 对于初学者来说,可以说他是人工智能领域的世界级明星。 科学家,工程师,企业家, Coursera的创始人之一。 他是机器学习和构成深度学习专业课程的精彩介绍的作者。


我非常尊重安德鲁,我参加了他的课程,所以我立即决定阅读这本书。 事实证明,这本书尚未写成,而是由作者写成一部分出版。 总的来说,这甚至不是一本书,而是未来书的草稿(是否会以纸质形式出版尚不清楚)。 然后,这个想法开始翻译正在出版的章节。 当前已翻译的14章(这是该书的第一篇摘录)。 我计划继续进行这项工作,并翻译整本书。 我将在Habré的博客中发布翻译的章节。


在撰写这些专栏之时,作者已经出版了56个构想中的52个章节(7月4日,我收到52个章节准备就绪的通知)。 当前所有可用的章节都可以在此处下载或自己在Internet上找到。


在发布我的翻译之前,我寻找了其他翻译,我发现了另一本,也发布在Habré上。 没错,仅翻译了前7章。 我无法判断谁的翻译更好。 我和IliaSafonov(从阅读中我感觉)都不是专业翻译。 我更喜欢某些零件,伊利亚有些。 在Ilya的序言中,您可以阅读有关这本书的有趣细节,我忽略了。


我出版的译文未经校对,“从烤箱里出来”,我打算返回某些地方并进行更正(这尤其适用于与train / dev / test数据集混淆的情况)。 请将有关样式,错误等的评论以及与作者文字相关的信息提供评论,我将不胜感激。


所有图片都是原始的(来自安德鲁·恩),没有它们,这本书会更无聊。


所以,到这本书:


第1章为什么我们需要机器学习策略?


机器学习是无数重要应用程序的核心,包括Web搜索,电子邮件反垃圾邮件,语音识别,产品推荐等。 我假设您或您的团队正在研究机器学习应用程序。 您想加快这项工作的进度。 这本书将帮助您做到这一点。


示例:创建猫图片识别启动


假设您正在一家初创公司工作,该公司会为猫爱好者处理无休止的猫照片。


猫


您使用神经网络来构建计算机视觉系统,以识别照片中的猫。


但是不幸的是,您的学习算法的质量仍然不够好,巨大的压力在于改进猫检测器。
怎么办


您的团队有很多想法,例如:


  • 获取更多数据:收集更多猫照片。
  • 收集更加异构的数据集。 例如,处于不寻常位置的猫的照片; 颜色异常的猫的照片; 具有各种相机设置的图片; ...
  • 通过增加梯度下降的迭代次数来更长时间地训练算法
  • 尝试增加具有很多层/隐藏神经元/参数的神经网络。
  • 尝试减少神经网络。
  • 尝试添加正则化(例如L2正则化)
  • 更改神经网络的架构(激活功能,隐藏神经元的数量等)
  • ...

如果您成功地在这些可能的方向之间进行选择,您将建立一个领先的cat图像处理平台,并带领您的公司走向成功。 如果您的选择不成功,您可能会徒劳地失去数月的工作。
怎么办


这本书将告诉您如何。


大多数机器学习任务都有提示,可以告诉您尝试什么会有用,什么也没用。 如果您学习阅读这些技巧,则可以节省数月和数年的开发时间。


2.如何使用本书来帮助您的团队工作


阅读完本书后,您将对如何选择机器学习项目的技术方向有深刻的了解。


但是对于您的队友而言,可能尚不清楚为什么您建议某个方向。 也许您希望您的团队使用单参数度量来评估算法的质量,但是同事们不确定这是一个好主意。 您如何说服他们?


这就是为什么我将这些章节简短化的原因:这样您就可以将它们打印出来,并给您的同事一两页,其中包含您需要使团队熟悉的材料。


优先级的微小变化会对团队的生产力产生巨大影响。 希望通过这些小的更改,您可以成为团队的超级英雄!


超级英雄


3.背景和说明


如果您已经完成了机器学习课程(例如我在Coursera的MOOC机器学习课程),或者您有与老师一起教算法的经验,那么阅读该书就不会很困难。


我假设您熟悉“教师培训”:使用标记的培训示例(x,y)学习将x链接到y的函数。 与老师一起学习的算法包括线性回归,逻辑回归,神经网络等。 如今,机器学习有许​​多形式和方法,但大多数具有实际重要性的方法都来自“与老师一起学习”一课的算法。


我将经常提到神经网络(“深度学习”)。 您只需要有关它们的基本概念即可理解本文。


如果您不熟悉此处提到的概念,请在Coursera http://ml-class.org/上观看机器学习课程前三周的视频。


Coursera


4.机器学习的进度条


深度学习(神经网络)的许多思想已经存在了数十年。 为什么这些想法今天才兴起?


最新进展的两个最大驱动因素是:


  • 数据可用性如今,人们在计算设备(笔记本电脑,移动设备)上花费了大量时间。 他们的数字活动产生了大量数据,我们可以将其馈送到我们的学习算法中。
  • 计算能力仅在几年前,就可以训练足够大的神经网络,从而使您获得使用我们拥有的庞大数据集的好处。

我会澄清,即使您积累了大量数据,通常旧学习算法(例如逻辑回归)的准确性的增长曲线也是“平坦的”。 这意味着学习曲线是“平坦的”,尽管您提供了更多训练数据,但算法的预测质量却停止增长。


附表1


看来旧算法不知道如何处理现在可供我们使用的所有这些数据。


如果您为相同的“与老师一起学习”任务训练一个小型神经网络(NN),则可能会比“旧算法”得到更好的结果。


附表2


在这里,“小神经网络”是指具有少量隐藏神经元/层/参数的神经网络。 最后,如果您开始训练越来越大的神经网络,则可以获得更高的质量。


作者的注释 :该图显示了神经网络在小型数据集模式下的性能更好。 这种效果比在大型数据集模式下运行良好的神经网络的效果不稳定。 在小数据模式下,根据特征的处理方式(取决于特征工程的质量),传统算法的效果可以好于神经网络。 例如,如果您有20个训练示例,则使用逻辑回归或神经网络都没关系; 特征准备比选择算法具有更大的作用。 但是,如果您有100万个训练示例,那么我希望使用神经网络。


附表3


因此,当您(i)训练一个非常大的神经网络时,您将获得算法的最佳质量,在这种情况下,您位于上图中的绿色曲线上; (ii)您拥有大量数据可供使用。


神经网络架构等许多其他细节也很重要,并且在这一领域已经创建了许多创新的解决方案。 但是,当今提高算法质量的最可靠方法仍然是(i)增加训练后的神经网络的大小(ii)获取更多训练数据。


实际上,共同满足条件(i)和(ii)的过程非常复杂。 本书将详细讨论其细节。 我们从对传统算法和神经网络都同样有用的通用策略开始,然后研究在深度学习系统的设计和开发中使用的最现代的策略。


5.创建用于训练和测试算法的样本


让我们回到上面的猫照片示例:您启动了移动应用程序,并且用户将大量不同的照片上传到您的应用程序。 您要自动查找猫的照片。


您的团队通过从各个网站下载猫的照片(正例)和没有猫的照片(负例)来接受大量的培训。 他们将数据集按70%到30%的比例分为训练和测试。 他们利用这些数据构建了一种算法,该算法可以找到在训练和测试数据上都可以很好地起作用的猫。


但是,当您将此分类器引入移动应用程序时,您发现它的质量非常差!


吃惊


发生什么事了


您突然发现用户上传到您的移动应用程序中的照片的外观与构成训练数据集的网站中的照片完全不同:用户上传使用手机相机拍摄的照片,通常较低的分辨率,清晰度较低,并且在弱光条件下拍摄。 在对从网站的照片中收集的训练/测试样本进行了训练之后,您的算法无法将结果定性地推广到与您的应用程序相关的数据的实际分布(使用手机相机拍摄的照片)。


在大数据现代时代来临之前,机器学习的一般规则是按70%到30%的比例将数据分为教育和测试数据。 尽管该方法仍然有效,但在越来越多的应用中使用该方法将是一个坏主意,在这些应用中,训练样本的分发(上述示例中来自网站的照片)与用于战斗的数据分发有所不同应用程序的模式(来自手机相机的照片)。


通常使用以下定义:


  • 训练集-用于训练算法的数据样本
  • 验证采样 (Dev(开发)集)-一种数据采样,用于选择参数,选择特征并做出有关算法训练的其他决策。 有时也称为保留交叉验证集。
  • 测试样本 -用于评估算法质量的样本,但不用于教授算法或本次培训中使用的参数。

译者的话:安德鲁·恩(Andrew Eun)使用开发集或开发集的概念,在俄语和机器学习的俄语语言术语中,此类术语不会出现。 “设计样本”或“设计样本”(英语单词的直接翻译)听起来很麻烦。 因此,我将继续使用短语“验证选择”作为开发集的翻译。


译者2的评论: DArtN建议将开发集翻译为“调试采样”;我认为这是一个很好的主意,但是我已经在大量文本上使用了“验证采样”一词,现在替换它很费力。 公平地讲,我注意到术语“验证样本”具有一个优势-该样本用于评估算法的质量(以评估在训练样本中训练的算法的质量),因此,从某种意义上讲,它是“测试”,即“验证”。包括这方面。 形容词“调试”专注于调整参数。 但是总的来说,这是一个非常好的术语(特别是从俄语的角度来看),如果我较早想到,我会用它代替术语“验证样本”。


选择验证和测试样本,以便它(除了参数的选择(调整)之外)反映您希望将来接收的数据并希望您的算法在这些数据上运行良好。
换句话说,您的测试样本不应该只是可用数据的30%,尤其是如果您希望将来的数据(来自手机的照片)与您的训练集(从网络拍摄的照片)本质上有所不同时网站)。


如果尚未启动移动应用程序,则可能没有用户,因此,可能没有可用的数据反映算法应处理的战斗数据。 但是您可以尝试近似它们。 例如,请您的朋友使用手机为猫拍照,然后将其发送给您。 启动应用程序后,您将能够使用当前用户数据更新验证和测试样本。


如果您无法获得近似于用户将要上传的数据的数据,则可能可以尝试开始使用网站上的照片。 但是您必须意识到,这会带来系统无法与战斗数据一起正常运行的风险(其概括能力对于他们而言是不够的)。


验证和测试样本的开发需要认真的方法和深入的思考。 最初不要假定训练集的分布应与测试集的分布完全匹配。 尝试选择测试用例,以使其最终反映出您希望算法在其上运行良好的数据的分布,而不是反映创建训练样本时可用的数据的分布。


6.验证和测试样品应具有相同的分布


嘘声


假设您的猫照片应用程序数据分为与您最大的市场相对应的四个区域:(i)美国,(ii)中国,(iii)印度,(iv)其他。


假设我们根据从美国和印度市场获得的数据形成了一个验证样本,并基于中国和其他数据形成了一个测试样本。 换句话说,我们可以随机分配两个段来获取验证样本,另外两个段来获取测试样本。 对不对


确定验证样本和测试样本后,您的团队将专注于改进验证样本上算法的操作。 因此,验证样本应反映出最重要的任务,即该算法应在所有四个地理区域(而不仅仅是两个)上都可以正常工作。


验证样本和测试样本分布不同的第二个问题是,您的团队可能会开发出一些在验证样本上能很好工作的东西,只是发现它在测试样本中产生的质量较差。 因此,我看到了许多失望和浪费的努力。 避免这种情况发生在您身上。


例如,假设您的团队开发了一种系统,该系统可以在经过验证的样本上很好地工作,但是不能在测试样本上工作。 如果您的验证样本和测试样本是从相同的分布中获得的,那么您[可以得到非常清楚的诊断]可以轻松地诊断出问题所在:对验证样本进行重新训练的算法。 .


, .


  1. , . , .
  2. , , . . .

. , — . , , , .


, , , ( ). , , , . — , . , , , , . .


7. ?


, . , 90.0% 90.1%, , , 100 , 0.1%.
: . ( ), .


— , , -, , , 0.01% , . , 10000, , .


? . 30% . , , 100 10000 . , , , , , . / , , .


8.


: ( ), , , . , 97% , 90%, .


(precision) (recall), . . . :


ClassifierPrecisionRecall
95%90%
98%85%

, .


ClassifierPrecisionRecallF1 score
95%90%92.4%

: (precision) () , , . (recall) () , , . , .


, , , , . . , (accuracy) , .


, , . , . F1 , , .
: F1 , . ​https://en.wikipedia.org/wiki/F1_score , « » , 2/((1/Precision)+(1/Recall)).


ClassifierPrecisionRecallF1 score
95%90%92.4%
98%85%91.0%

, . .


, , : (i) , (ii) , (iii) (iv) . . , . .


9.


.
, . :


90%80
92%95
95%1500

, , [] — 0.5*[] , .


: -, , «». , 100 . , . (satisficing) — , , 100 . .


N , ( - , ), , , N-1 . . . , . (N-) , . , , , .


, , « », ( , ). , Amazon Echo «Alexa»; Apple Siri «Hey Siri»; Android «Okay, Google»; Baidu «Hello Baidu». false-positive — , , false-negative — . false-negative ( ) false positive 24 ( ).


.


10


, . - . , :


  1. ,
  2. ( )
  3. , . ( !) , .

迭代


. , . : , , .


, , . , - , , . ! , 95.0% 95.1%, 0.1% () . 0.1%- . , , ( ) , , .


11当您需要更改验证和测试(开发/测试集)样本和指标时


当一个新项目开始时,我尝试快速选择验证和测试样本,这将为团队设定明确的目标。


我通常要求我的团队从项目开始起的一个星期内,就可以更快地获得初始验证和测试样本以及初始指标,而这种情况很少。最好是采取一些不完美的方法并迅速前进,而不是长时间考虑最佳解决方案。但是,这一周的时间不适合成熟的应用程序。例如,反垃圾邮件过滤器是成熟的深度学习应用程序。我观察到团队已经在成熟的系统上工作,并花了几个月的时间来获取更好的测试和开发样本。


如果您以后确定最初的开发/测试选择或原始指标未正确选择,则将所有精力投入到快速更改它们中。 例如,如果您的开发样本+指标将“分类器A”的等级高于“分类器B”,并且您和您的团队认为“分类器B”在客观上更适合您的产品,那么这可能表明您需要更改开发/测试数据集或更改度量以进行质量评估。


验证样本或质量评估指标不正确地将分类器A排在分类器B之上的主要原因有三个:


1.有待改进的实际分布与开发/测试样本不同


想象一下,您原始的开发/测试数据集主要包含成年猫的图片。 您开始分发您的cat应用程序,发现用户上载的小猫图像比您预期的要多得多。 因此,开发/测试分布不具有代表性;它不反映需要提高识别质量的对象的实际分布。 在这种情况下,请更新您的开发/测试选择,使其更具代表性。


猫


2.您对验证选择(开发集)进行重新训练


在验证集(开发集)上,想法的多次演变过程使您的算法逐渐在其上进行重新训练。 完成开发后,您可以通过测试样本评估系统的质量。 如果您发现验证集(开发集)上的算法质量比测试集(测试集)上的算法质量好得多,则表明您对验证样本进行了再培训。 在这种情况下,您需要获取一个新的验证样本。


如果您需要跟踪团队的进度,还可以使用对测试样本的算法质量评估来定期评估系统质量,例如每周或每月。 但是,请勿使用测试集对算法做出任何决定,包括是否返回到上周测试过的系统的先前版本。 如果您开始使用测试样本来更改算法,则将开始对测试样本进行再培训,并且无法再依靠它来获得算法质量的客观评估(如果发表研究文章,或者使用这些指标,则需要这样做)制定重要的业务决策)。


3.度量标准评估的内容与出于项目目的需要优化的内容不同


假设您的猫科动物应用程序的指标是分类准确性。 此指标当前将分类器A列为高级分类器B。但是,假设您尝试了这两种算法,但发现随机色情图片会通过分类器A。 尽管分类器A更准确,但是随机色情图片留下的不良印象使其质量无法令人满意。 你做错了什么?


在这种情况下,评估算法质量的指标无法确定算法B对于您的产品实际上比算法A更好。 因此,您不再可以信任度量标准来选择最佳算法。 现在该改变质量评估指标了。 例如,您可以通过对跳过色情图片的算法施加严厉的惩罚来更改指标。 我强烈建议您选择一个新指标,并使用该新指标为团队明确设定新目标,而不是继续使用不可信指标花费太长时间,每次返回分类器之间的手动选择。


这些是在进行项目时更改开发/测试样本或更改质量评估指标的相当通用的方法。 拥有原始的开发/测试样本和指标可以使您快速开始迭代您的项目。 如果您甚至发现所选的开发人员/测试人员选择或指标不再使您的团队朝着正确的方向发展,那就没关系了! 只需更改它们,并确保您的团队知道一个新的方向。


12条建议:我们准备验证(开发)和测试样本


  • 从一个分布中选择开发和测试样本,该分布可以反映您将来希望接收的数据,并且您希望算法在该数据上运行良好。 这些样本可能与您的训练数据集的分布不一致。
  • 如果可能,从相同的发行版中选择开发测试集
  • 选择一个参数评估指标,以评估算法质量以优化团队。 如果您需要同时实现多个目标,请考虑将它们组合为一个公式(例如平均多参数误差的度量)或定义限制性度量和优化度量。
  • 机器学习是一个高度迭代的过程:在找到满足您需求的想法之前,您可以尝试许多想法。
  • 开发/测试样本和单参数质量评估指标的存在将帮助您快速评估算法,从而更快地进行迭代。
  • 当开始开发新应用程序时,请尝试快速安装开发/测试示例和质量评估指标,例如,花不超过一周的时间。 对于成熟的应用程序,如果此过程花费的时间更长,这是正常的。
  • 将训练样本和测试样本划分为70%到30%的良好启发式方法不适用于数据量很大的问题; 开发/测试样本可能大大少于所有可用数据的30%。
  • 如果您的开发样本和指标不再告诉您的团队正确的方向,请快速交换它们:(i)如果您的算法正在验证集(开发集)上进行训练,请向其中添加更多数据(在您的开发集中)。 (ii)如果实际数据的分布(您需要改进的算法的质量)不同于验证和(或)测试样本(开发/测试集)中的数据分布,请创建用于测试和开发的新样本(开发/测试集),使用其他数据。 (iii)如果您的质量评估指标不再衡量对您的项目最重要的指标,请更改该指标。

13快速构建您的第一个系统,然后迭代升级


您想构建一个新的电子邮件反垃圾邮件系统。 您的团队有以下几点想法:


  • 收集包含垃圾邮件的大量培训样本。 例如,设置一个诱饵:故意向已知的垃圾邮件发送者发送虚假的电子邮件地址,以便您可以自动收集将发送到这些地址的垃圾邮件。
  • 形成标志以理解信件的文字内容
  • 开发用于理解字母/标题外壳的标志,这些标志显示该信件通过哪个Internet服务器
  • 依此类推

尽管我在反垃圾邮件应用程序方面进行了艰苦的工作,但是仍然很难选择这些领域之一。 如果您不是正在开发应用程序领域的专家,这将更加困难。


因此,请勿从一开始就尝试构建理想的系统。 相反,可能要在几天内尽快构建和训练一个简单的系统。
作者注意:本技巧仅适用于希望开发AI应用程序的读者,而不适用于旨在发表学术文章的读者。 稍后,我将回到研究主题。
即使一个简单的系统离您可以构建的“理想”系统相去甚远,研究这个简单系统的工作方式也会很有用:您将很快找到提示,这些提示向您展示了应该花时间的最有希望的领域。 接下来的几章将向您展示如何阅读这些技巧。


14错误分析:查看开发人员设置示例以获取想法。


狗


当您使用cat应用程序进行游戏时,您注意到了几个示例,其中该应用程序将猫误认为猫。 有些狗看起来像猫!


其中一位小组成员建议引入第三方软件,以改善狗照片中系统的性能。 实施更改将需要一个月,提议这些更改的团队成员会非常热情。 您应该做出什么决定?


在投入一个月的时间来解决此问题之前,建议您首先评估其解决方案将如何改善系统质量。 然后,您可以更合理地决定是否值得改进开发月份,或者用这段时间解决其他问题是否更好。


具体来说,在这种情况下可以做什么:


  1. 从开发集中收集了100个示例的样本,这些示例对您的系统进行了错误分类。 也就是说,您的系统出错的示例。
  2. 研究这些示例并计算出狗的图像有多少。

研究分类器出错的示例的过程称为“错误分析”。 在上面的示例中,假设您发现错误分类的图片中只有5%是狗,那么您对算法在狗图片上的性能提高多少都无所谓,您获得的质量不会超过错误率的5% 。 换句话说,在预期的改善可以帮助的范围内,“上限”为5%(表示可能的最高数字)。 因此,如果您的整个系统当前的准确度为90%(错误为10%),则可以进行这种改进,充其量只能将结果提高到90.5%的准确性(否则错误率将为9.5%,比原始错误率低5%)错误的10%)


相反,如果您发现50%的错误是狗,那么您可以更加确信所提议的改进系统的项目将产生很大的影响。 可以将精度从90%提高到95%(将相对误差从10%降低到5%可以降低50%)


这个简单的错误分析评估程序使您可以快速评估实施第三方狗图像分类软件的可能收益。 它提供了定量评估,以决定在实施该项目时是否要花费时间。


错误分析通常可以帮助理解未来工作的各个方向的前景。 我观察到,许多工程师都不愿分析错误。 通常,仅仅冲入一个想法似乎比找出该想法是否值得花费时间更令人兴奋。 这是一个常见的错误:这可能导致您的团队花一个月的时间只是为了了解结果是微不足道的改进。


从样本中手动验证100个示例,时间不长。 即使您在图像上花费一分钟,整个检查也将花费不到2个小时。 这两个小时可以为您节省一个月的精力。


延续

Source: https://habr.com/ru/post/zh-CN419757/


All Articles