智算多多
官方邮箱:sw@zsdodo.com

公司地址:北京市丰台区南四环西路188号总部基地三区国联股份数字经济总部(邮 编:100070)


京公网安备11010602202532号 原文:Practical Deep Learning for Cloud, Mobile, and Edge
译者:飞龙
协议:CC BY-NC-SA 4.0
我们正在经历人工智能的复兴,每个人和他们的邻居都希望成为这一运动的一部分。这很可能是您正在浏览这本书的原因。关于深度学习的书籍有很多。因此,您可能会问我们,非常合理地问,为什么这本书存在?我们马上就会解释。
自 2013 年以来,我们在微软、英伟达、亚马逊和 Square 等公司构建产品的深度学习之旅中,我们目睹了这一领域的巨大变化。不断发展的研究是一个事实,而成熟工具的缺乏是生活的现实。
在与社区的交流和学习过程中,我们注意到缺乏明确的指导,说明如何将研究转化为面向日常用户的最终产品。毕竟,最终用户可能在网络浏览器、智能手机或边缘设备的前面。这通常涉及无数小时的黑客和实验,通过博客、GitHub 问题线程和 Stack Overflow 答案进行广泛搜索,给包的作者发送电子邮件以获取深奥的知识,以及偶尔的“恍然大悟”时刻。即使市场上的书籍往往更注重理论或如何使用特定工具。我们能希望从现有的书籍中学到的最好的东西就是构建一个玩具示例。
您很可能已经是一位熟练的程序员。即使 Python 对您来说是一种陌生的语言,我们相信您将能够轻松掌握并立即开始。最重要的是,我们不指望您具有机器学习和人工智能方面的任何背景;这就是我们在这里的原因!我们相信您将从本书关注以下领域中获益:
您可能已经精通机器学习,可能知道如何训练深度学习模型。好消息!您可以进一步丰富您的技能,并加深您在该领域的知识,以便构建真实产品。本书将通过以下内容帮助您的日常工作和更多内容:
在本书中,我们经常使用“人工智能”、“机器学习”和“深度学习”这些术语,有时可以互换使用。但从严格的技术角度来看,它们有不同的含义。以下是每个术语的概要(也可参见图 1-2)。
人工智能
这使得机器具备模仿人类行为的能力。IBM 的深蓝是人工智能的一个著名例子。
机器学习
这是人工智能的一个分支,其中机器使用统计技术从以前的信息和经验中学习。目标是让机器根据过去的学习观察来未来采取行动。如果您看过 IBM 的沃森在危险边缘上与肯·詹宁斯和布拉德·拉特对决,您就看到了机器学习的实际应用。更具相关性的是,下次垃圾邮件没有进入您的收件箱时,您可以感谢机器学习。
深度学习
这是机器学习的一个子领域,其中使用深度、多层神经网络进行预测,特别擅长计算机视觉、语音识别、自然语言理解等领域。
让我们回到过去一点:我们整个宇宙都处于一个炽热而密集的状态。然后大约在 140 亿年前开始膨胀,等等…好吧,我们不必回溯那么久(但现在你一整天都会被这首歌困扰,对吧?)。其实,70 年前才种下了人工智能的第一颗种子。艾伦·图灵在他 1950 年的论文《计算机器械与智能》中首次提出了“机器能思考吗?”这实际上涉及到了更大的哲学辩论,即意识和成为人类的含义。拥有创作协奏曲的能力并知道你已经创作了它,这是什么意思?图灵发现这种框架相当狭隘,而提出了一个测试:如果一个人无法区分机器和另一个人,那真的重要吗?一个能够模仿人类的人工智能本质上就是人类。
在 Gordon Ramsay 开始烹饪之前,他确保所有的配料都准备就绪。解决问题时使用深度学习也是如此(图 1-8)。
Dataset + Model + Framework + Hardware = Deep Learning Solution
就像吃豆子的吃豆人渴望数据一样,深度学习也渴望数据——大量的数据。它需要这么多数据来发现有意义的模式,从而帮助做出稳健的预测。传统机器学习在 20 世纪 80 年代和 90 年代是主流,因为即使只有几百到几千个示例,它也可以正常运行。相比之下,从头开始构建的深度神经网络(DNNs)通常需要更多的数据来完成典型的预测任务。这里的好处是预测更准确。
| 数据类型 | 名称 | 详情 |
|---|---|---|
| 图像 | 开放图像 V4(来自谷歌) | 19700 个类别中的九百万张图像 拥有 600 个类别的 174 万张图像(带有边界框) |
| 图像 | Microsoft COCO | 拥有 80 个对象类别的 33 万张图像 包含边界框、分割和每张图像五个标题 |
| 视频 | YouTube-8M | 610 万个视频,3862 个类别,26 亿个视听特征 3.0 标签/视频 1.53 TB 的随机抽样视频 |
| 视频、图像 | BDD100K(来自加州大学伯克利分校) | 超过 1100 小时的 10 万个驾驶视频 拥有 10 个类别的边界框的 10 万张图像 拥有车道标记的 10 万张图像 拥有可驾驶区域分割的 10 万张图像 拥有像素级实例分割的 1 万张图像 |
| 视频 | Waymo 开放数据集 | 总计 3,000 个驾驶场景,16.7 小时的视频数据,60 万帧,约 2500 万个 3D 边界框和 2200 万个 2D 边界框 |
| 文本 | SQuAD | Yelp 评论 |
| 卫星数据 | Landsat 数据 | |
| 音频 | Google AudioSet | |
| 音频 | LibriSpeech | 1000 小时的英语朗读语音 |
在高层次上,模型只是一个函数。它接受一个或多个输入并给出一个输出。输入可以是文本、图像、音频、视频等形式。输出是一个预测。一个好的模型是那些预测可靠地匹配预期现实的模型。模型在数据集上的准确性是决定其是否适用于实际应用的主要因素。对于许多人来说,这就是他们真正需要了解的关于深度学习模型的全部。但当我们窥探模型的内部工作时,它变得真正有趣(图 1-9)。
| 任务 | 示例模型架构 |
|---|---|
| 图像分类 | ResNet-152(2015 年),MobileNet(2017 年) |
| 文本分类 | BERT(2018 年),XLNet(2019 年) |
| 图像分割 | U-Net(2015 年),DeepLabV3(2018 年) |
| 图像翻译 | Pix2Pix(2017 年) |
| 目标检测 | YOLO9000(2016 年),Mask R-CNN(2017 年) |
| 语音生成 | WaveNet(2016 年) |
有几个深度学习库可以帮助我们训练模型。此外,还有专门用于使用这些训练模型进行预测(或推理)的框架,优化应用程序所在的位置。
| 框架 | 最适用于 | 典型目标平台 |
|---|---|---|
| TensorFlow(包括 Keras) | 训练 | 台式机、服务器 |
| PyTorch | 训练 | 台式机、服务器 |
| MXNet | 训练 | 台式机、服务器 |
| TensorFlow Serving | 推理 | 服务器 |
| TensorFlow Lite | 推理 | 移动和嵌入式设备 |
| TensorFlow.js | 推理 | 浏览器 |
| ml5.js | 推理 | 浏览器 |
| Core ML | 推理 | 苹果设备 |
| Xnor AI2GO | 推理 | 嵌入式设备 |
正如第一章所讨论的,Keras 于 2015 年作为一个易于使用的抽象层出现,使快速原型设计成为可能。这使得深度学习的初学者的学习曲线陡峭度降低了很多。同时,它通过帮助他们快速迭代实验,使深度学习专家更加高效。事实上,Kaggle.com上的大多数获胜团队都使用了 Keras。最终,在 2017 年,Keras 的完整实现直接集成到了 TensorFlow 中,将 TensorFlow 的高可扩展性、性能和庞大的生态系统与 Keras 的易用性结合在一起。在网络上,我们经常看到将 TensorFlow 版本的 Keras 称为tf.keras。
用通俗的语言来说,图像分类回答了一个问题:“这张图像包含什么对象?”更具体地说,“这张图像包含* X 对象的概率是多少”,其中 X 来自预定义的对象类别列表。如果概率高于最小阈值,则图像很可能包含一个或多个 X *实例。
一个简单的图像分类流程包括以下步骤:
在讨论迁移学习的过程之前,让我们快速回顾一下深度学习蓬勃发展的主要原因:
如果我们想要从一个模型转移知识到另一个模型,我们希望重复使用更多通用层(靠近输入)和更少任务特定层(靠近输出)。换句话说,我们想要移除最后几层(通常是全连接层),以便我们可以利用更通用的层,并添加针对我们特定分类任务的层。一旦训练开始,通用层(构成我们新模型的大部分)将保持冻结(即,它们是不可修改的),而新添加的任务特定层将被允许修改。这就是迁移学习如何帮助快速训练新模型的方式。图 3-4 说明了这个过程,即针对任务 X 训练的预训练模型如何适应任务 Y。
正如承诺的那样,现在是用 30 行或更少行构建我们的最先进分类器的时候了。在高层次上,我们将使用以下步骤:
首要问题是:给定两幅图像,它们是否相似?
解决这个问题有几种方法。一种方法是比较两幅图像之间的区域块。尽管这可以帮助找到精确或接近精确的图像(可能已经被裁剪),但即使轻微旋转也会导致不相似。通过存储区块的哈希值,可以找到图像的重复。这种方法的一个用例是在照片中识别抄袭行为。
另一种天真的方法是计算 RGB 值的直方图并比较它们的相似性。这可能有助于找到在相同环境中拍摄的内容没有太多变化的近似图像。例如,在图 4-1 中,这种技术用于图像去重软件,旨在找到硬盘上的照片爆发,这样您就可以选择最好的照片并删除其余的照片。当数据集增长时,误报的可能性会增加。这种方法的另一个缺点是,对颜色、色调或白平衡进行小的更改会使识别变得更加困难。
更加健壮的传统计算机视觉方法是利用诸如尺度不变特征变换(SIFT)、加速稳健特征(SURF)和定向 FAST 和旋转 BRIEF(ORB)等算法,在边缘附近找到视觉特征,然后比较两张照片之间共同的相似特征数量。这有助于从通用的图像级理解转向相对健壮的对象级理解。尽管这对于具有较少变化的刚性对象的图像非常有效,比如谷物盒的印刷侧几乎总是相同的,但对于比较可变形的对象如人类和动物则不太有帮助,因为它们可能展示不同的姿势。例如,您可以在亚马逊应用程序的基于相机的产品搜索体验中看到显示的特征。该应用程序以蓝色点的形式显示这些特征(图 4-2)。当它看到足够数量的特征时,它会将它们发送到亚马逊服务器以检索产品信息。
更深入地探讨,另一种方法是使用深度学习找到图像的类别(例如,沙发),然后找到同一类别内的其他图像。这相当于从图像中提取元数据,以便随后可以对其进行索引并在基于典型文本查询的搜索中使用。通过在 ElasticSearch 等开源搜索引擎中使用元数据,可以轻松扩展此功能。许多电子商务网站在内部进行基于标签的查询搜索时,会根据从图像中提取的标签显示推荐内容。正如您所期望的那样,通过提取标签,我们会丢失某些信息,如颜色、姿势、场景中物体之间的关系等。此方法的一个主要缺点是需要大量标记数据来训练用于在新图像上提取这些标签的分类器。每次需要添加新类别时,都需要重新训练模型。
因为我们的目标是在数百万张图像中进行搜索,理想情况下,我们需要一种方法将图像中数百万像素中包含的信息总结为一个较小的表示(比如几千维),并且使得相似对象的总结表示彼此靠近,而不同对象之间则相距较远。
幸运的是,深度神经网络来拯救。正如我们在第二章和第三章中看到的,CNN 将图像输入转换为一千维的特征向量,然后将其作为分类器的输入,输出图像可能属于的顶级身份(比如狗或猫)。特征向量(也称为嵌入或瓶颈特征)本质上是几千个浮点值的集合。通过 CNN 中的卷积和池化层,基本上是一种减少操作,以过滤图像中包含的信息,提取最重要和显著的成分,这些成分形成瓶颈特征。训练 CNN 会以这种方式塑造这些值,使得属于同一类别的项目之间的欧氏距离很小(或者简单地说是对应值之间差的平方和的平方根),而不同类别的项目之间的距离较大。这是一个重要的特性,有助于解决许多无法使用分类器的问题,特别是在无监督问题中,因为缺乏足够的标记数据。
