你好,游客 登录
背景:
阅读新闻

干货 | 深度学习的实践应用之路

[日期:2017-07-15] 来源:雷锋网  作者: [字体: ]

雷锋网(公众号:雷锋网)按:本文由图普科技编译自《Applying Deep Learning to Real-world Problems》,雷锋网独家首发。

近年来,人工智能的崛起可以说是得益于深度学习的成功。驱动深度神经网络突破的三个主要因素分别是:海量的训练数据、强大的计算架构和学术领域的相关进展。因此,深度学习在图像分类、面部识别等任务的表现上不仅超越了传统方法,还超越了人类水平。这一切都为那些使用深度学习解决实际问题的新业务创造了巨大的发展潜力。

在位于柏林的Merantix总部,我们致力于研究这项新业务在不同行业下的应用。(目前,我们的研究对象是汽车业、医疗保障业、金融业和广告业。)

学术理论与现实生活通常有很大不同(来源:mimiandeunice.com)

现在训练一个神经网络比以往任何时候都要简单。然而,这并不意味着你可以将教程中的代码直接应用到应用程序中。有趣的是,学术理论对这些至关重要的训练技巧几乎不予讨论,而这些技巧恰恰是产品的关键所在。

将深度学习应用于现实问题可能会比较麻烦(来源:pinsdaddy.com)

因此,我想理解和掌握这些技巧,对于那些计划在生意上应用深度学习的人来说将会大有裨益。

在本文中,我想分享三点关键的心得和经验。当我们在Merantix用深度学习应对现实问题时,这些心得给了我们很大的帮助和启发:

  • 心得I:预训练的重要性

  • 心得II:实际标签分布的注意事项

  • 心得III:理解黑箱模型

声明:

  • 本文介绍的内容不代表完整的方法,还有很多其他的方法和技巧本文没有涉及。

  • · 本文分享的大部分心得体会不仅适用于深度学习,还适用于其他机器学习算法。

  • · 所有的心得都不是针对某一行业的。

  • · 本文中的大多内容都适用于有监督式学习的问题。

这篇文章是根据我在5月10日“柏林人工智能大会”上的演讲修改而成的。

心得I:“预训练”的重要性

在机器学习学术界,对获取数据集的关注微乎其微。相反,为了将深度学习方法与其他方法作比较,并最终确定一个最优方法,标准做法是在一个标准数据集上,以相同的评估程序来评测不同方法的表现。然而在现实情境中,你的新算法性能比另一算法高出1%并不重要,重要的是建立一个强大稳健的,并且能够准确地解决目标任务的系统。对所有机器学习系统来说,这需要一些算法能够从中学习的标记训练。

对许多现实问题来说,获取标注的训练数据的成本相当昂贵。为了详细地阐述这个问题,我们来看两个案例:

1. 医学影像

如果我们想要建立一个在CT图像中检测人体淋巴结的系统,我们需要对CT图像中的淋巴结进行标记。这是一项非常耗时的工作,因为这些图像都是3D的,而且我们需要在3D图像中识别出非常小的结构。假设,一个放射科医生一小时能标记4张图像,他的时薪是100美元;这就意味着标记一张CT图像将花费我们25美元,而标记一万张CT图像,我们要花25万美元。因此,我们需要几个医生来对同一张图像进行标注,以确保接近100%的诊断准确性。这样一来,一个医学任务的数据集的成本很容易就会超过25万美元。

2. 信用评分

如果我们想建立一个能够对客户信用等级进行评估的系统,我们就需要知道存在潜在违约风险的客户,这样我们才能让一个机器学习系统提前识别出他们。不幸的是,只有当违约真正发生的时候我们才能确定违约的客户。因此,一个比较天真的策略是给每个人发放贷款(假如是每人一万美元)。但这就意味着每一个人违约我们就将损失一万美元,这无形中就使得每一个标注数据点的价格都非常昂贵。

显然我们可以通过一些方法来降低这些成本,但总体来说,获取用于解决现实问题的标记数据的成本非常高。

那么,我们究竟该如何解决这个问题呢?

“预训练”

预训练能有效降低成本(来源:massivejoes.com)

“预训练”的基本操作是——首先,我们需要在一个相关领域的廉价大数据集上,或者是在同一领域的“非纯净训练数据”上,对一个神经网络(或另一个机器学习算法)进行训练。尽管这样做不能直接解决问题,但这能让神经网络对你需要解决的问题有初步的了解。接下来的第二步,我们要在一个更精细的、成本更高的小数据集上进一步优化神经网络的参数。下图是“预训练”的操作示意图:

当训练数据集很难获取时,首先在相对廉价的大型数据集上对神经网络进行“预训练”;然后,在一个成本相对高的、相对精细的数据集上调整神经网络。在对神经网络进行微调时,类别的数目可能会发生改变。

人们通常会在有着1000个类别的ImageNet数据集上对神经网络进行“预训练”,然后根据他们实际需要解决的问题对神经网络进行微调,而微调过程中的类别数与“预训练”中的类别数很可能是不一样的。这就意味着神经网络的最后一层需要重新初始化。通常情况下,神经网络中最后一层的学习效率要相对高一些,因为最后一层需要从头开始学习,而前面的层的学习速率会低一些。对于像ImageNet这样的数据集,这样的特征学习是通用的,因此它能直接用于解决其他的计算机视觉问题。

我们应该如何获取“预训练”的数据?

“预训练”数据的来源

1. 预训练模型:网络上有很多经过训练的模型,其中最应该指出的就是Model Zoos。Model Zoos包含了一系列不同的训练数据,这些数据经过了专家学者、公司企业和深度学习爱好者的训练。

2. 公共数据集:网上有很多数据集,所以不要在收集数据集上浪费时间,花时间看看网上有没有能够解决你的问题的数据集。

3. 数据抓取:如果网上既没有一个公共的“预训练”模型,也没有你需要的数据集,那么你可以通过一个小门路来生成一个数据集。你可以建立一个所谓的“抓取器”,让它自动从特定的网站上收集数据集。这样你就能建立一个新的数据集了。

预训练的数据来源

弱标记的数据

因为我们会在一个更精确的数据集上对神经网络进行调整,所以在调整之前我们是可以在所谓的“弱标记”数据集上对其进行“预训练”的。之所以称之为“弱标记”数据集,是因为其中的数据标记并非是完全正确的(可能有90%的数据是正确的,10%是错误的)。“弱标记”数据的好处在于它能够轻松获取,不需要人工参与标记。这与那些人工参与标记的数据集相比成本要低很多。

举个例子来说,在攻读博士学位期间,我从维基百科和IMDb上获取了一个数据集,这个数据集中包含了50万张人脸图像。将照片中每个人的出生日期和照片底部显示的拍摄日期结合起来,这样我们就能大致判断出每张图像的年龄。需要注意的是,在某些情况下,照片底部显示的拍摄日期可能是错的,或者一张照片中可能有多个人而面部检测器在识别人脸时出现了差错,因此,我们不能完全保证图像年龄的判断都是正确的。尽管如此,我们还是应该在这个“弱标记”数据集上进行“预训练”,以提高神经网络的性能,而仅在准确标记了的数据集上训练是完全不够的。

在前面提到的医学影像问题上,我们同样可以用这样的逻辑来理解。为了使标记准确度尽可能接近100%,我们需要好几个医生单独对同一张CT图像进行标记。这就相当于我们用于进一步调整神经网络的数据库。另外,我们可以收集一个仅由一个人完成标记的“弱标记”大数据集,这样我们不但能够减低标记的成本,还能确保神经网络经过了不同的图像数据训练过。

总之,提高神经网络性能不一定要昂贵的人工标记或人工注释,通过免费的,或是低成本的标记数据集,同样可以提高性能。

心得II: 实际标签分布的注意事项

现实中的标签分布(来源:r4risk.com.au)

既然我们已经获得了“预训练”和调整的数据,接下来我们就能开始神经网络的正式训练了。在正式训练中,出现了另一个学术界与现实世界之间的巨大分歧。

在学术界,数据集大多都是平衡的。也就是说,在有监督的分类问题上,每一类别通常有数目相同的样本。下图中有两个学术界数据集的例子:MNIST是一个非常有名的手写数字数据集,这个数据集中包含了与数字的数量大致相等的样本。Food 101是学术界数据集的另一个典型,其中的每一类食物都有整整1000张图像。

MNIST和Food101都是“平衡数据集”

非平衡标签分布

我想再一次用两个现实中的案例来说明这个问题:

1. 医学影像:医学影像的训练数据是很不平衡的。病患中的大多数其实都是健康的,只有一小部分人患某种疾病。

2. 信用评分:实际上,大多数客户都归还了贷款,违约的人只占大约1-2%。

不平衡的现实生活的标签分布

正如上面所说的,在这两个案例中,标签分布是非常不平衡的。这在现实生活中其实是很常见的。实际上,每一类都有相同多的样本量是很少见的。

不平衡的错误分类成本

不幸的是,这种情况变得越来越糟糕。在学术界,数据集中每一类别的分类错误的成本通常是一样的。但是在现实生活中就大不相同了。

1. 医学影像:将一个健康的人误诊为病人还不是最糟糕的,只要医生在反复检查后发现这个人实际上是健康的就没有问题。但是讲一个患病的人错误地判断为健康的人,让病人没能得到及时的治疗,这就非常危险了。

2. 信用评分:拒绝向那些会归还贷款的人提供贷款还不算最糟糕的,这最多让你损失一些贷款利率。但是给违约的人提供贷款的代价就很高了,你需要承担借出的所有贷款。

下面是这两个案例的示意图:

现实应用中不平衡的错误分类成本

如何解决这一问题?

既然类别和错误分类的成本都是不平衡的,那么我们就必须要想个方法来应对这个不平衡的问题。针对这一问题的文献十分有限,我们找到了一些与之相关的博客文章和Stack Overflow问题。

值得注意的是,不平衡的类别和不平衡的错误分类成本都是高度相关的,因为这意味着对于部分样本,我们几乎没有训练数据;而且出现错误的成本相当高。

我将那些有助于模型分类的方法大致分成了四种:

1. 更多训练数据

最突出的方法就是从少量的类别中收集尽量多的数据。以医学影像为例,这就意味着我们要尽量收集患有某种疾病的病人的图像。如果收集这些图像的成本过高,那么就用前面所讨论的其他方法来获取训练数据。注意,在调整训练标签分布的时候你需要非常小心,因为这对于模型的预测判断有很大的影响:如果你在训练数据集中增加了患病病人的数量,那么模型就更倾向于将对象预测为患病病人。

收集更多稀缺类别的数据。当训练过程中的标签分布与预测结果不匹配时你就要非常注意了。

2.改变标记

如果你不能收集到更多稀缺类别的数据,那就考虑换一种分类方法。在实际的应用中,你可能不需要区分A疾病与B疾病,只要能识别出这两者中的其一就够了。在这种情况下,你可以将这两个类别合并。这样一来,训练期间的训练流程将会被简化;而且在模型推断阶段,即使A疾病和B疾病混淆了也没有太大关系。

在训练期间,或在模型评估阶段将两个或多个类别合并能使问题简单化

3. 采样

如果你既不能得到更多数据,也无法改变标记,那就意味着你需要研究原始数据了。那么究竟该如何确保我们的模型善于处理稀缺类别呢?你只需要在训练过程中改变算法处理案例的方式。通常情况下,样本都是经过统一采样得来的,这也就意味着算法在训练期间处理每个案例的方式都是一样的。

我们可以采取一些不同的、有助于提高稀缺类别标记的性能的采样方法。

  • 忽略样本:忽略高频类别的部分样本可以说是最简单的方法了。我们可以在每一类样本数目大致相同的情况下采用这种方法。

  • 过采样/欠采样:“过采样”指的是将稀缺类别的样本以更高的频率展示给算法;而“欠采样”的意思则相反。从算法的角度来看,这两种方法的结果是一样的。这两种方法相对于前面的方法好处在于没有样本是被忽略的。

  • 消极样本挖掘:第三组采样方法稍微复杂一些,但却是最有效的方法。跟之前的“过采样”和“欠采样”不同,我们这一步的采样是有意识的。尽管我们有很多高频类别的样本,但是我们最关心的还是其中最复杂、最困难的样本,比如那些被误分类概率最高的样本。因此,我们可以在训练过程中有规律地对模型进行评估,同时调查样本,以识别出其中很可能被误分类的部分。这样一来,我们能够轻易地选择出算法最常学习的样本了。

4. 对损失进行加权

采用上述的三个方法以后,我们在改善类别分布方面做的就已经够多了。因此,我们现在可以转移注意力至算法本身。幸运的是,还有一些方法是能够用于让算法更多地关注稀缺类别的。其中一个直接的方法就是增加稀缺类别样本的损失权重。

稀缺类别的损失权重增加了

心得III:理解黑箱模型

一个黑箱(来源:辛普森一家)

正如我们在前面提到的“预训练”,学术界最重要的目标就是不论采用的模型是怎样的,都要达到或超越当今最先进的性能。而在考虑现实生活应用时,仅建立一个性能良好的模型是不够的。

我们还需要:

  • 理解模型为什么及如何出现预估错误的,

  • 给出直观的事实说明为什么我们的模型性能要优于之前的任何方法,

  • 确保模型不会被欺骗。

在深度神经网络兴起之前,大部分模型都是相对容易理解的。看以下几点:

  • 线性模型:线性分类器或回归模型提供了每一特征和预测结果之间的直接关系。这就使我们能够直接、轻易地理解模型预估决策机制。

  • 决策树:“决策树”的优势在于我们可以沿着树来理解决策是如何形成的。总体上来说,最顶端的枝节涵盖了最重要的特征。谈到任意决策森林时,情况就变得稍微复杂一些了,但树的结构还是能让我们很好地理解其中的原理的。

不幸的是,理解深度神经网络的决策机制要困难得多。因为深度神经网络是高度非线性的,而且其中的变量数量基本都是上亿的。所以要解释其决策的方式是很困难的。

传统机器学习方法VS深度学习

如今,如何解释决策程序已经成为了现实生活应用中的一个巨大挑战,因为深度神经网络正迅速融入我们生活的各个领域——汽车自动驾驶、医疗诊断、金融决策等等。大部分的实际应用对我们的生活、财产和一些敏感信息都会产生巨大的影响。因此,算法作出的错误决策很可能会谋财害命。

“特斯拉汽车事故”(左图)和关于人工智能转变为种族主义者的报道文章(右图)

不幸的是,这些失误的发生不全是偶然的,攻击者的有意而为也会引发这些失误。为了强调这个话题的相关性,研究专家已经发现,只要在一张普通图像上增加简单任意的噪声,就能改变深度神经网络的分类结果,而人眼几乎察觉不出图像的变化。同样,在与纯人工图像相适应的同时,仍能得到一个非常自信的预测结果。

在一张图像或人工图像上加上少量的任意噪声(左图)能轻易地骗过神经网络

在现实生活中,你通常会非常想弄清楚为什么你的系统不能发挥它本身的效能。

在Merantix,我们对这些问题非常重视,我们相信这些问题在未来将会变得更加重要,因为深度学习系统在现实生活中将会有更多的实际应用。

最近,我们开发了一个名为Picasso(Medium Post,Github)的深度学习可视化工具箱。由于要研究各种各样的神经网络架构,所以我们开发了Picasso来帮助我们在不同的领域查看标准的模型。比如,在汽车驾驶中理解道路分叉或道路对象识别失误;广告业中理解为什么某种创意能获得更高的点击率;在医学影像领域分析CT图像或X光图中出现的不明对象。下图是我们的开源Picasso视觉化检视器的演示图:

总结

在本文中,我分享了在Merantix用深度学习解决现实问题时总结出的三个非常重要的心得体会,希望这些心得对那些计划在生意中使用深度学习的人有所帮助。正如我在文章开头说的,在将深度学习应用于实际生活中时,我们有许多非常有用的技巧,也有很多需要注意的事项。

Rasmus Rothe是欧洲最重要的深度学习专家之一,也是Merantix的联合创始人之一。他曾在苏黎世大学、牛津大学和普林斯顿大学学习计算机科学,并专攻深度学习。他曾开发了howhot.io,并将其作为他博士研究的一部分;创办了欧洲最大的Hackathon HackZurich,并为谷歌和BCG工作。

收藏 推荐 打印 | 录入:admin | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款