Spark模型在Uber机器学习平台应用

Evolving Michelangelo Model Representation for Flexibility at Scale
Evolving Michelangelo Model Representation for Flexibility at Scale

Michelangelo 是 Uber 的机器学习(ML)平台,可以训练并服务于整个公司范围内生产环境中的数千种模型。该平台被设计成了一个端到端的工作流,目前支持经典的机器学习、时间序列预测和深度学习模型,可以涵盖大量的用例,从 生成市场预测、响应客户支持工单 到 准确计算预计到达时间(EAT) 以及使用自然语言处理(NLP)模型在驾驶员 App 中提供 一键式聊天功能。

大多数 Michelangelo 模型都是基于 Apache Spark MLlib 的,这是一个可伸缩的 Apache Spark 机器学习库。为了处理高 QPS 的在线服务,Michelangelo 最初仅通过内部定制的模型序列化和表示支持 Spark MLlib 模型的一个子集,这使得客户无法灵活地试验任意复杂的模型管道,限制了 Michelangelo 的扩展速度。为了解决这些问题,我们改进了 Michelangelo 对 Spark MLlib 的使用,特别是在模型表示、持久性和在线服务方面。

在 Michelangelo 中改进 Spark MLlib 用法的动机

我们最初开发 Michelangelo 是为了为生产环境提供可扩展的机器学习模型。它对基于 Spark 的数据摄取调度、模型训练和评估以及批量和在线模型服务部署提供端到端的支持,在 Uber 获得了广泛的认可。

为了将 Spark 用于数据预处理和低延迟服务,并使用 GPU 进行分布式深度学习训练,Michelangelo 针对深度学习用例使用了一致的 Spark 管道架构。
为了将 Spark 用于数据预处理和低延迟服务,并使用 GPU 进行分布式深度学习训练,Michelangelo 针对深度学习用例使用了一致的 Spark 管道架构。

最近,Michelangelo 已经发展到可以处理更多的用例,包括提供在核心 Michelangelo 之外训练过的模型。例如,深度学习模型的扩展和端到端加速训练需要在不同环境中执行操作步骤,以便利用 Spark 的分布式计算转换、Spark Pipelines 在 CPU 上的低延迟服务以及使用 Horovod(Uber 的分布深度学习框架)在 GPU 集群上的分布式深度学习训练。为了使这些需求更容易实现,并保证训练和服务的一致性,有一个一致的架构和模型表示很重要,它可以利用我们现有的低延迟的基于 JVM 的模型服务基础设施,同时提供正确的抽象来封装这些需求。

具有活动 Spark 会话的外部环境可以无缝地反序列化来自 Michelangelo 的经过训练的管道模型,并序列化供 Michelangelo 生态系统的其余部分使用的模型。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标识并不意味着 Apache 软件基金会的认可。
具有活动 Spark 会话的外部环境可以无缝地反序列化来自 Michelangelo 的经过训练的管道模型,并序列化供 Michelangelo 生态系统的其余部分使用的模型。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标识并不意味着 Apache 软件基金会的认可。

另一个动机是使数据科学家能够使用 PySpark 在熟悉的 Jupyter 笔记本(数据科学工作台)中构建和试验任意复杂的模型,同时仍然能够利用 Michelangelo 生态系统可靠地进行分布式训练、部署和服务。这也为 集成学习 或 多任务学习 技术所需的更复杂的模型结构提供了可能性,同时让用户可以动态地实现数据操作和自定义评估。

因此,我们回顾了 Michelangelo 对 Spark MLlib 和 Spark ML 管道 的使用,概括了其模型持久性和在线服务机制,目的是在不影响可伸缩性的情况下实现可扩展性和互操作性。

Michelangelo 最初推出的是一个统一的架构,它负责管理紧耦合的工作流和用于训练和服务的 Spark 作业。Michelangelo 对每种支持的模型类型都有特定的管道模型定义,并使用内部定制的 protobuf 表示经过训练的服务模型。离线服务通过 Spark 处理;在线服务使用添加到 Spark 内部版本的自定义 API 来处理,以实现高效的单行预测。

向本地 Spark 序列化和反序列化转变在模型持久化管道阶段(Transformer/Estimator)层面上实现了灵活性和跨环境兼容性。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标识并不意味着 Apache 软件基金会的认可。
向本地 Spark 序列化和反序列化转变在模型持久化管道阶段(Transformer/Estimator)层面上实现了灵活性和跨环境兼容性。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标识并不意味着 Apache 软件基金会的认可。

最初的架构支持通用机器学习模型(如广义线性模型 GLM 和梯度增强决策树模型 GBDT)的大规模训练和服务,但是自定义的 protobuf 表示使添加对新 Spark 转换器的支持变得困难,并排除了在 Michelangelo 之外训练的模型。当新版本的 Spark 可用时,Spark 的自定义内部版本也使得每次的升级迭代变得复杂。为了提高对新转换器的支持速度,并允许客户将自己的模型引入 Michelangelo,我们考虑了如何改进模型表示并更加顺畅地添加在线服务接口。

Michelangelo 的架构和模型表示法的演变

Michelangelo 的架构必须处理由不同功能需求带来的复杂性,并保持训练和服务环境之间的一致性。 Uber 的机器学习工作流通常很复杂,涉及不同的团队、库、数据格式和语言;为了使模型表示和在线服务接口可以恰当地演化,我们需要考虑所有这些维度。
Michelangelo 的架构必须处理由不同功能需求带来的复杂性,并保持训练和服务环境之间的一致性。

Uber 的机器学习工作流通常很复杂,涉及不同的团队、库、数据格式和语言;为了使模型表示和在线服务接口可以恰当地演化,我们需要考虑所有这些维度。

部署并提供机器学习管道模型服务包括模型前面的所有转换和操作步骤。
部署并提供机器学习管道模型服务包括模型前面的所有转换和操作步骤。

要部署用于服务的机器学习模型,需要部署整个管道,包括模型前面的转换工作流。通常还需要打包数据转换、特征提取、预处理甚至预测后转换。原始预测通常需要解释或转换回标签,在某些情况下需要转换到不同的维度空间,比如日志空间,以便下游服务使用。它也可以用于通过额外的数据加强原始预测,如它们的置信区间,通过 概率校准 来校准概率。我们想要一个能够反映 Spark MLlib 模型固有管道步骤的模型表示,并允许 Michelangelo 与外部工具进行无缝交互。

选择一种最新的模型表示

在评估可供选择的模型表示时,我们评估了不同的需求,包括:

  • 表示广义转换序列的能力(必需)
  • 处理在线用例的轻量级服务的可扩展性(必需)
  • 支持使用非 Michelangelo 原生 Spark 工具替换存储在 Michelangelo 中的模型(必需)
  • 训练时和服务时的模型解释偏差风险低(非常想要)
  • Spark 更新速度要快,并且易于编写新的估计器 / 转换器(非常想要)

我们考虑的一种方法是使用 MLeap,这是一个独立的库,它通过一个专用的运行时来执行管道,提供了管道和模型序列化(到 Bundle.ML)和反序列化支持。MLeap 具有所需的表达能力和对轻量级在线服务的支持。但是,它有自己专有的持久化格式,这限制了与序列化和反序列化普通 Spark MLlib 模型的工具集的互操作性。

MLeap 还引入了服务时行为偏离训练时评估的风险,因为在技术上,正在提供服务的模型加载时的格式与训练时内存中的格式不同。MLeap 还降低了 Spark 更新的速度,因为除了 Spark MLlib 本地使用的方法之外,还必须为每个转换器和估计器添加单独的 MLeap 保存 / 加载方法。Databricks 的 ML 模型导出 dbml-local 提供了类似的方法。

我们考虑的另一种方法就是将训练模型导出到一个标准的格式,如 预测模型标记语言(PMML) 或 可移植分析格式(PFA),它们都具备我们需要的表达能力并且可以和 Spark 交互,Spark 直接提供了 PMML 支持,而 aardpfark 可以将 Spark 模型导出为 PFA。然而,这些表示还是存在服务时行为偏离方面的风险,我们认为这一风险高于 MLeap,因为一般标准在特定的实现中通常会有不同的解释。这些标准在 Spark 更新速度方面也带来了更大的阻碍,因为根据 Spark 变化的性质,标准本身可能需要更新。

我们发现,最直接的方法是使用标准的 Spark ML 管道序列化来表示模型。Spark ML 管道展示了我们想要的表达能力,允许与 Michelangelo 之外的 Spark 工具集交互,展现出了低风险的模型解释偏差,对 Spark 的更新速度影响较小。它还有助于编写自定义的转换器和估计器。

我们看到,使用 Spark 管道序列化的主要挑战是它与在线服务需求的不兼容性(Nick Pentreath 在 2018 年的 Spark AI 峰会 上也讨论了这一点)。这种方法会启动一个本地 Spark 会话,并用它来加载一个训练好的 Spark MLlib 模型,这相当于在单台主机上运行一个小型集群,内存开销和延迟都很大,使它不适合许多在线服务场景要求的 p99 毫秒级延迟。虽然现有的用于提供服务的 Spark API 集在性能上还不足以满足 Uber 的用例,但我们发现,我们可以在这种开箱即用的体验中进行许多直接的更改,以满足我们的需求。

为了提供用于在线服务的轻量级接口,我们将 anOnlineTransformer添加 到可以提供在线服务的转换器中,包括利用低级 Spark 预测方法的单个方法和小型方法列表。我们还调整了模型加载的性能,以满足我们的目标开销要求。

使用增强型转换器和估计器的管道

为了实现一个可以由 Michelangelo 在线训练并提供服务的 Transformer 或 Estimator,我们构建了一个 OnlineTransformer 接口,它扩展了开箱即用的 Spark Transformer 接口,并执行两个方法:1)Transform(instance: Dataset[Any]) ;2)ScoreInstance(instance: Map[String, Any])。

Transform(instance: Dataset[Object]) 作为分布式批处理服务的入口,提供了开箱即用的基于数据集的执行模型。ScoreInstance(instance: Map[String, Object]): Map[String, Object] 作为较为轻量级的 API,用于低延迟、实时服务场景中出现的针对单一特征值映射集的单行预测请求。ScoreInstance 背后的动机是提供一个更轻量级的 API,它可以绕过依赖于 Spark SQL Engine 的 Catalyst Optimizer 的 Dataset 所带来的巨大开销,从而对每个请求进行查询规划和优化。如上所述,这对于实时服务场景(如市场营销和欺诈检测)非常重要,其中 p99 延迟的 SLA 通常是毫秒级的。

当加载 Spark PipelineModel 时,任何具有相似类(包含 OnlineTransformer 特性)的 Transformer 都会映射到该类。这使得现有的训练好的 Spark 模型(由支持的转换器组成)获得了提供在线服务的能力,而且没有任何额外的工作。注意,OnlineTransformer 还实现了 Spark 的 MLWritable 和 MLReadable 接口,这为 Spark 免费提供了对序列化和反序列化的本地支持。

保持在线和离线服务一致性

转向标准的 PipelineModel 驱动的架构,通过消除 PipelineModel 之外的任何自定义预评分和后评分实现,进一步加强了在线和离线服务准确性之间的一致性。在每个管道阶段,实现自定义评分方法时的标准实践是首先实现一个公共评分函数。在离线转换中,它可以作为 DataFrame 输入上的一组 Spark 用户定义函数(UDF)运行,相同的评分函数也可以应用于在线 scoreInstance 和 scoreInstances 方法。在线和离线评分一致性将通过单元测试和端到端集成测试进一步保证。

性能优化

我们最初的度量结果显示,与我们自定义的 protobuf 表示的加载延迟相比,原生 Spark 管道加载延迟非常高,如下表所示:

这种序列化模型加载时间上的性能差异对于在线服务场景是不可接受的。模型实际上被分片到每个在线预测服务实例中,并在每个服务实例启动时、新模型部署期间或接收到针对特定模型的预测请求时加载。在我们的多租户模型服务设置中,过长的加载时间会影响服务器资源的敏捷性和健康状况监控。我们分析了加载延迟的来源,并进行了一些调优更改。

影响所有转换器加载时间的一个开销来源是 Spark 本地使用 sc.textFile 读取转换器元数据;从一个小的单行文件生成一个字符串 RDD 非常慢。对于本地文件,用 Java I/O 替换这段代码要快得多:

[loadMetadata in src/main/scala/org/apache/spark/ml/util/ReadWrite.scala]

在我们的用例中(例如,LogisticRegression、StringIndexer 和 LinearRegression),影响许多转换器的另一个开销来源是对与转换器相关的少量数据使用 Spark 分布式 read/select 命令。对于这些情况,我们使用 ParquetUtil.read 代替 sparkSession.read.parquet;直接进行 Parquet read/getRecord 大大降低了转换器的加载时间。

树集成(Tree ensemble)转换器有一些特殊的调优机会。加载树集成模型需要将序列化到磁盘的模型元数据文件读取到磁盘,这会触发小文件的 groupByKey、sortByKey 以及 Spark 的分布式 read/select/sort/collect 操作,这些操作非常慢。我们直接用更快的 Parquet read/getRecord 代替了它们。在树集成模型保存方面,我们合并了树集成节点和元数据权重 DataFrame,以避免写入大量读起来很慢的小文件。

通过这些调优工作,我们能够将基准示例的本地 Spark 模型加载时间从 8 到 44 倍减少到仅比从自定义 protobuf 加载慢 2 到 3 倍,这相当于比 Spark 原生模型快 4 到 15 倍。考虑到使用标准表示的好处,这种水平的开销是可以接受的。

需要注意的是,Michelangelo 在线服务创建了一个本地的 SparkContext 来处理任何未加密的转换器的负载,因此,在线服务不需要 SparkContext。我们发现,当没有模型加载处于活动状态时,让 SparkContext 继续运行会对性能产生负面影响并导致延迟,例如,通过 SparkContext 清理器的操作。为了避免这种影响,我们在没有运行负载时停止 SparkContext。

可服务管道的灵活结构

使用管道模型作为 Michelangelo 的模型表示,用户可以灵活地组合和扩展可服务组件单元,使它们在线和离线服务时保持一致。然而,这并没有完全封装管道模型在机器学习工作流的各个阶段使用时的操作需求差异。有些操作步骤或概念本质上与机器学习工作流的特定阶段相关,而与其他阶段完全无关。例如,当用户对模型进行评估和迭代时,常常需要进行超参数优化、交叉验证以及生成模型解释及评估所需的特定元数据等操作。这些步骤允许用户帮助生成模型、与模型交互以及评估管道模型,但是一旦准备好进行产品化,就不应该将这些步骤合并到模型服务中。

同时,在机器学习工作流不同阶段的需求差异,促使我们开发了一个基于通用编排引擎的工作流和操作员框架。除了组合自定义可服务管道模型的灵活性之外,这还允许用户以有向图或工作流的形式组合和编排自定义操作的执行,以实现最终的可服务管道模型。

Michelangelo 基于 Operator Framework 的工作流提供了另一种程度的灵活性,通过优化的执行计划来方便地定制操作,从而生成可服务的、序列化的 Michelangelo 管道模型以及有用的工件。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标记并不意味着 Apache 软件基金会的认可。Docker 和 Docker 标识是 Docker 公司在美国和 / 或其他国家的商标或注册商标。Docker 公司及其他各方也可以在本协议中使用的其他条款中享有商标权。本标记的使用并不意味着 Docker 的认可。TensorFlow、TensorFlow 标识及任何相关标识均为谷歌公司的商标。
Michelangelo 基于 Operator Framework 的工作流提供了另一种程度的灵活性,通过优化的执行计划来方便地定制操作,从而生成可服务的、序列化的 Michelangelo 管道模型以及有用的工件。Apache Spark 是 Apache 软件基金会在美国和 / 或其他国家的注册商标。使用这个标记并不意味着 Apache 软件基金会的认可。Docker 和 Docker 标识是 Docker 公司在美国和 / 或其他国家的商标或注册商标。Docker 公司及其他各方也可以在本协议中使用的其他条款中享有商标权。本标记的使用并不意味着 Docker 的认可。TensorFlow、TensorFlow 标识及任何相关标识均为谷歌公司的商标。

未来展望

在这一点上,Spark 原生模型表示已经在 Michelangelo 生产环境中运行了一年多,作为一种健壮且可扩展的方法,在我们公司范围内提供 ML 模型。得益于这种演变和 Michelangelo 平台的其他更新,Uber 的技术栈可以支持新的用例(如灵活的试验和在 Uber 的 数据科学工作台 中训练模型)、Jupyter 笔记本环境以及使用 TFTransformers 的端到端深度学习。为了介绍我们的经验并帮助其他人扩展他们自己的 ML 建模解决方案,我们在 2019 年 4 月的 Spark AI 峰会 上讨论了这些更新,并提交了 SPIP 和 JIRA,把我们对 Spark MLlib 的更改开源。

《美团机器学习实践》下载

美团作为国内 O2O 领域领 先的服务平台,结合自身的业务场景和数据,积极进行了人工智能领域的应用探索。在美团的搜索、推荐、计算广告、风控、图像处理等领域,相关的人工智能技术得到广泛的应用。本书包括通用流程、数据挖掘、搜索和推荐、计算广告、深度学习以及算法工程 6 大部分内容,全面介绍了美团在多个重要方面对机器学习的应用。

本书非常适合有一定机器学习基础的工程技术人员和在校大学生学习和阅读。通过本书,有经验的算法工程师可以了解美团在这方面的做法,在校大学生可以学习机器学习算法如何在具体的业务场景中落地。

下载:https://pan.baidu.com/s/1NC2aov1iszDQPEr09OyVCQ
提取码:841h

吴恩达《机器学习训练秘籍》完整中文版 – 更新

此前,我们发布了『吴恩达《机器学习训练秘籍》完整中文版』信息,目前该开源项目已迁移到新的地址。请在新的地址开始在线阅读《机器学习训练秘籍》样稿,相关代码开源地址如下:

Machine Learning Yearning
Machine Learning Yearning

GitHub地址项目 GitHub 地址

Gartner:2019年人工智能成熟度曲线的超前趋势

Gartner 的这种成熟度周期凸显出人工智能正以多种不同的方式影响企业

根据 Gartner 对 2019 年的 CIO 议程调查,2018 年至 2019 年间,部署人工智能 (AI) 的组织从 4% 增长到了14%。与几年前相比,人工智能正在以多种不同的方式影响组织,当时没有其他方法可以替代使用机器学习 (ML) 构建自己的解决方案。AutoML 和智能应用拥有较明显的发展势头,其他方法也同样值得关注——即人工智能平台即服务(AIPaaS)或人工智能云服务。受亚马逊 Alexa、谷歌 Assistant 等公司在全球范围内取得成功的推动,对话人工智能仍是企业规划日程中的首要内容。与此同时,诸如增强智能、边缘人工智能、数据标签和可解释的人工智能等新技术不断涌现。

今年的成熟度曲线出现了许多新技术,但被大众所知晓的有价值或目标的很少

Gartner 2019 年人工智能成熟度曲线审查了在 AI 领域的创新和趋势潮流,以及 AI 计划范围。快速跟风者,首先应该为 AI 设计一个商业案例。对于早期使用者来说,AI 的可扩展性是下一个挑战。

今年的成熟度周期包含了很多新技术,但被大众所知晓的有价值或目标的很少,而被主流应用的则少之又少。“这并不代表 AI 是不可用的。这表示它将会发生改变,为了评估 AI 的价值和风险,CIO 需要为其设定现实的预期。” Gartner 副总裁分析师 Svetlana Sicular 表示。

以下是 Sicular 重点介绍的人工智能技术,这些技术必须在 CIO 的计划上,才能在未来两到五年内对业务转型产生巨大影响。

Hype_Cycle_for_AI_2019
Hype_Cycle_for_AI_2019

增强型智能(Augmented intelligence)

增强型智能是以人为中心的 AI 与人协作提高认知能力的合作模式。它关注的是人工智能在提高人类能力方面的辅助作用。

AI 与人们互动,改善他们已经知道的事物,可以减少日常失误,并可以改善客户互动、市民服务和病人护理。增强型智能的目标是提高自动化的效率,同时辅以人性化和常识来管理决策自动化的风险。

吐槽:不再是我们日常所调戏的Siri和人工智障爱酱,开始追求更高的智慧,比如阿尔法狗这种,目前听说过的比较成功的就是游戏的黑科技外挂,星际 1、拳皇 97 的黑科技可以秒杀世界顶级选手,如果在其他领域开发出这样的增强型智能程序,是不是离 Skynet也不远了。

聊天机器人(ChatBots)

聊天机器人是 AI 的代表,影响着人们所有可交流的领域,比如汽车制造商 KIA,它每周与 11.5 万名用户对话,或者 Lidl 的 Winebot Margot,它提供购买葡萄酒的指导和食物搭配方面的建议。

聊天机器人可以基于文本或语音,也可以两者结合,并依赖于极少人为干预的脚本响应。

常见的应用程序存在于 HR、IT 帮助台和自助服务中,聊天机器人在客户服务领域已经产生极大影响,尤其是改变了客户服务的执行方式。从“用户学习界面”到“聊天机器人正在学习用户想要的东西”的转变,意味着对员工入职、工作效率和培训的更大影响。

机器学习(Machine Learning, ML)

机器学习可以解决业务问题,如个性化的客户服务、供应链推荐、动态定价、医疗诊断和反洗黑钱。ML 使用数学模型从数据中提取知识和模式。随着组织面临的数据量的指数增长和计算基础设施的改进,ML 的使用也在增加。

目前,ML 被用于多个领域和行业,以推动改进,并为业务问题找到新的解决方案。美国运通使用数据分析和 ML 算法来帮助检测几乎实时的欺诈行为,以节省数百万美元的损失。沃尔沃利用数据帮助预测零部件何时可能出现故障,何时需要维修,从而提高了其汽车的安全性。

AI 治理

组织不应该忽视 AI 治理。他们需要意识到潜在的监管和声誉风险。Sicular 说:“AI 治理是制定政策,对抗 AI 相关的偏见、歧视和 AI 其他负面影响的过程。”

确定数据源和算法的透明度要求,减少风险并增强信心

为了发展人工智能治理,数据和分析领导者和 CIO 应该关注三个领域:信任、透明度和多样性。他们需要关注对数据源和人工智能结果的信任,以确保人工智能的成功使用。他们还需要确定数据源和算法的透明度要求,以降低风险,增强对人工智能的信心。此外,应该确保数据、算法和观点的多样性,以追求人工智能的道德伦理和准确性。

智能应用

大多数组织对获取 AI 功能的偏好正在发生改变,更倾向于将其用于企业应用程序中。智能应用是具有嵌入式或集成 AI 技术的企业应用,通过智能自动化、以数据为基础的分析和指导建议来支持或替代基于人工的活动,以提高生产力和决策制定。

今天,企业应用程序供应商正在他们的产品中嵌入 AI 技术,并引入人工智能平台功能——从企业资源规划到客户关系管理,再到人力资源管理,再到劳动力生产率应用程序。

CIO 们应该向他们的外包软件供应商提出要求,需要他们在产品路线图中概述如何结合 AI,以高级分析、智能流程和高级用户体验的形式增加业务价值。

MediaPipe:Google 开源多媒体机器学习框架

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTubeGoogle LensARCoreGoogle Home 以及 Nest,都已深度整合了 MediaPipe。

作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。

为什么需要 MediaPipe?

一款多媒体机器学习应用的成败除了依赖于模型本身的好坏,还取决于设备资源的有效调配、多个输入流之间的高效同步、跨平台部署上的便捷程度、以及应用搭建的快速与否。

基于这些需求,谷歌开发并开源了 MediaPipe 项目。除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。

MediaPipe 演示案例

在今年六月举行的 CVPR 会议上,Google Research 开源了 MediaPipe 的预览版。为方便开发者学习和使用,我们提供了多个桌面系统和移动端的示例。作为一款应用于多媒体的框架,现已开源的安卓和苹果 iOS 示例包括:

MediaPipe 主要概念

MediaPipe 的核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定时间戳(Timestamp)只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从数据源(Source Calculator或者 Graph Input Stream)流入图直至在汇聚结点(Sink Calculator 或者 Graph Output Stream) 离开。

 

MediaPipe 主要概念
MediaPipe 主要概念

MediaPipe 在开源了多个由谷歌内部团队实现的计算单元(Calculator)的同时,也向用户提供定制新计算单元的接口。创建一个新的 Calculator,需要用户实现 Open(),Process(),Close() 去分别定义 Calculator 的初始化,针对数据流的处理方法,以及 Calculator 在完成所有运算后的关闭步骤。为了方便用户在多个图中复用已有的通用组件,例如图像数据的预处理、模型的推理以及图像的渲染等, MediaPipe 引入了子图(Subgraph)的概念。因此,一个 MediaPipe 图中的节点既可以是计算单元,亦可以是子图。子图在不同图内的复用,方便了大规模模块化的应用搭建。

想了解更多 MediaPipe 的概念和使用方法,请移步我们的 GitHub 文档。同时,我们也提供了MediaPipe 移动端的使用教程及示例代码:

机器感知实例 —— 手部关键点追踪

一个使用 MediaPipe 的实例是在图片或视频中检测手部关键点。我们最近在 谷歌 AI 博客上发表了一篇相关文章: “使用 MediaPipe 实现设备端实时手部追踪”介绍了我们如何使用 MediaPipe 来搭建这个应用。

手部关键点追踪解决方案有两部分:手掌检测(Hand Detection)及手部关键点回归 (Hand Landmark Regression)。

手掌模型检测教程
手掌模型检测教程

我们训练了基于SSD 架构的 BlazePalm 模型来进行手掌检测,并对移动端进行了优化。手部检测相较人脸检测来说,是一个更加困难的问题,例如:手的大小角度会有较大范围的变动,手没有显著的纹理结构,以及存在更多遮挡的情景。因此,我们的解决方案采取了不同的思路。我们训练的模型只对手掌区域进行检测,其好处体现在以下几点:首先,手掌相对于整个手而言是一个较为受限的目标,并且由于手掌的区域较小,我们的非极大抑制(Non-Maximum Suppression)算法也会有更好的效果,例如,在两只手相握的情况下,即使手的大部分区域重叠在一起,两只手掌的区域依然可以被区分开;其次,手掌的边框可以用正方形来描述,这样可以减少 3-5 倍数量的锚定位(Anchor),从而最大化模型的容量;最后,经过实验,我们发现使用focal loss可以获得最好的检测结果。该模型在我们的测试数据集上可以达到 95.7% 的平均准确率。

MediaPipe BlazePlam 手掌检测应用

我们使用 MediaPipe 来做移动端模型推理的框架,如下图所示,input_video 为输入图像,output_video 为输出图像。为了保证整个应用的实时运算,我们使用 FlowLimiterCalculator 来筛选进行运算的输入帧数,只有当前一帧的运算完成后,才会将下一帧图像送入模型。当模型推理完成后,我们使用 MediaPipe 提供的一系列计算单元来进行输出的渲染和展示——结合使用 DetectionsToRenderDataCalculator, RectToRenderDataCalculator 及AnnotationOverlayCalculator 将检测结果渲染在输出图像上。

使用 MediaPipe 来做移动端模型推理的框架
使用 MediaPipe 来做移动端模型推理的框架

手掌检测应用的核心部分为上图中的蓝紫色模块(HandDetection子图)。如下图所示,HandDetection 子图包含了一系列图像处理的计算单元和机器学习模型推理的模块。ImageTransformationCalculator 将输入的图像调整到模型可以接受的尺寸,用以送入 TF Lite 模型的推理模块;使用 TfLiteTensorsToDetectionsCalculator,将模型输出的 Tensor 转换成检测结果;运用 NonMaxSuppressionCalculator 等计算单元做后处理;最终从HandDetection子图输出检测结果给主图。

从HandDetection子图输出检测结果
从HandDetection子图输出检测结果

GitHub地址项目 GitHub 地址

计算机科学 (CS) 顶会历届最佳论文列表

历届最佳论文大列表,从 1996 年至 2018 年都包含了。机器学习、深度学习前沿 Paper 都能找得到!这些『顶会』包括:

AAAI, ACL, CHI, CIKM, CVPR, FOCS, FSE, ICCV, ICML, ICSE, IJCAI, INFOCOM, KDD, MOBICOM, NSDI, OSDI, PLDI, PODS, S&P, SIGCOMM, SIGIR, SIGMETRICS, SIGMOD, SODA, SOSP, STOC, UIST, VLDB, WWW

这个网页上,按照不同顶会,列举了各个年份的最佳 CS 论文,论文源地址和作者信息都有了!几个 AI 领域的代表性顶会最佳论文资源包括:

  •  AAAI (Artificial Intelligence)
  •  ACL (Natural Language Processing)
  • CVPR (Computer Vision)
  • ICCV (Computer Vision)
  • ICML (Machine Learning)
  • IJCAI (Artificial Intelligence)

以上是人工智能领域具有代表性的几个顶会,相应的最佳论文都按照不同年份列举出来了,非常便于查找和定位。除此之外,还包括其他 CS 顶会的最佳论文。

Google 发布姿势估测应用

Google 日前发布一款 TensorFlow Lite 示例应用,该应用使用 PoseNet 模型在 Android 中实现人体姿势估测。PoseNet 是一种视觉模块,通过检测人体关键部位的位置,来估测图像或视频中的人体姿势。例如,该模型可以估测图像中人物手肘和膝盖的所在位置。姿势估测模型只会识别人体关键部位的位置,而不会去辨别图像中的人物。TensorFlow Lite 现与您分享这款 Android 示例应用,该应用可利用设备的相机实时检测和显示个人的关键身体部位。

使用 PoseNet 模型在 Android 中实现人体姿势估测
使用 PoseNet 模型在 Android 中实现人体姿势估测

PoseNet 应用前景

姿势估测存在多种用途。例如,开发者可根据人体图像增强现实、制作计算机图形人物动画以及为运动中的运动员分析步态。在 Google I/O 2019 大会上,TensorFlow Lite 展示了使用 PoseNet 模块帮助用户学习舞蹈的应用 Dance Like。借助这款示例应用,应用开发者和机器学习专家能够更轻松地探索轻量级移动模型的各种可能性。

PoseNet 示例应用

不同于用 Java 编写的现有 Andriod 应用,PoseNet 示例应用的开发采用 Kotlin 语言。开发此应用旨在让所有人都能以低成本轻松使用 PoseNet 模型。示例应用包含可消除模型复杂性的 PoseNet 库。下图展示应用、PoseNet 库 和 TensorFlow Lite 库之间的工作流。

PoseNet 应用工作流
PoseNet 应用工作流

PoseNet 库

PoseNet 库提供了一个接口,通过该接口接收经处理的相机图像,并返回人体关键部位所在位置的相关信息。此功能由 estimateSinglePose() 函数提供,该函数会在经处理的 RGB 位图上运行 TensorFlow Lite 解释器并返回 Person 对象。了解 PoseNet 输入和输出的含义

PoseNet 示例应用

PoseNet 示例应用是一种设备端相机应用,该应用可通过相机捕获帧,并实时覆盖图像上的关键点。针对每张传入的相机图像,该应用均会执行以下步骤:

  1. 从相机预览中捕获图像数据,并将其格式从 YUV_420_888 转换为 ARGB_888。
  2. 创建 Bitmap 对象,以保存 RGB 格式帧数据的像素。将 Bitmap 裁剪并缩放至可输入模块的尺寸,从而将其传入模块。
  3. 调用 PoseNet 库的 estimateSinglePose () 函数,以获取 Person 对象。
  4. 将 Bitmap 重新缩放至屏幕尺寸。在 Canvas 对象上绘制新 Bitmap。
  5. 使用通过 Person 对象获取的关键点位置,在画布上绘制骨架。显示可信度高于特定阈值(默认为 0.2)的关键点。

为使姿势渲染与相机帧同步,我们对输出显示使用单个 SurfaceView,而非分别对姿势与相机使用 View 实例。SurfaceView 会在 View 画布上进行捕获、锁定和绘制,从而确保在屏幕上实时显示画面。

发展蓝图

我们希望未来能为此示例应用开发更多功能,其中包括:

  • 多姿势估测
  • 使用 GPU 代理实现 GPU 加速
  • 使用 NNAPI 代理实现 NNAPI 加速
  • 使用模型的训练后量化降低延迟
  • 更多模型选项,例如 ResNet PoseNet 模型

GitHub地址项目 GitHub 地址

最新《机器学习优化》教程

一、资源简介

普林斯顿大学在 19 年开设了 COS 598D《机器学习优化》课程的讲义,这个课程主要介绍机器学习中出现的优化问题,以及解决这些问题的有效算法。这份讲义内容详实循序渐进,非常适合想要入门机器学习优化的同学阅读。

官网:
https://sites.google.com/view/optimization4machinelearning/home

作者简介:
Elad Hazan :普林斯顿大学计算机系的教授,重点研究机器学习和优化的基本问题。曾获得贝尔实验室奖、2012 年和 2008 年 IBM 哥德堡最佳论文奖、欧洲研究理事会奖、居里夫人奖和谷歌研究奖。曾担任计算学习协会指导委员会委员,并担任 COLT 2015 项目主席。2017 年,创立了专注于高效优化与控制的In8 inc,并于 2018 年被谷歌收购。普林斯顿大学商学院的联合创始人和联合董事。

二、主要内容

下面是这份讲义的主要目录:

  1. 介绍
  2. 优化和分析的基本概念
  3. 随机梯度下降法
  4. 泛化和非光滑优化
  5. 正则化
  6. 自适应正则化
  7. 方差减少
  8. Nesterov加速度(Nesterov Acceleration)
  9. 条件梯度法
  10. 机器学习的二阶方法
  11. Hyperparameter优化(Hyperparameter Optimization)

新一代 MNIST 数据集 – QMNIST

在机器学习研究中,MNIST 手写数字图像数据集已经作为基准使用了二十余年。该数据集虽然经典,但也存在测试集过小等问题。近日,来自 Facebook 和纽约大学的研究者重建并扩展了该数据集,在测试集中新增了 50,000 个样本。MNIST 作者之一的 Yann LeCun 在推特中表示

如果多次使用原版的 MNIST 测试集,你的模型可能在测试集上已经过拟合了。是时候在新增的样本上试一下了。

MNIST 数据集
MNIST 数据集

MNIST 是一个由 Yann Lecun 等人创建的手写数字图像数据集,是研究者研究机器学习、模式识别等任务的高质量数据库。它包含训练集和测试集,训练集包含 60,000 个样本,测试集包含 10,000 个样本。

MNIST 数据集抽取自 NIST 数据库。NIST 手写字符集第一个分区的发布要早一年,其训练集是由 2,000 名人口普查局雇员手写的,而测试集更加有挑战性,是由 500 名在校生手写的。

LeCun、Cortes 和 Burges 的其中一个目的是创建一个分布相似的训练集和测试集。据他们描述,这个过程产生了两个 60,000 个样本的集合。然后通过下采样将测试集样本数降低到 10,000 个,可能是因为用当时的电脑处理这样一个数据集会非常慢。剩余的 50,000 个样本从此就丢失了。

20 多年来,MNIST 数据集都被认为是标准的机器学习基准。在过去的十年来,许多研究者都表达过这个数据集已经被过度使用的观点。尤其是其测试集过小,只有 10,000 样本,这引起了很多担忧。数以百计的论文都依据这同一个测试集,得到的性能越来越高。那么模型是否已经在测试集上过拟合?我们还能否相信在该数据集上取得的新结论?机器学习数据集到底能用多久?

为了解决原版 MNIST 测试集过小等问题,来自 Facebook 和研究者决定重建该数据集。QMNIST 的 GitHub 页上提供了 Pytorch 平台的 QMNIST 数据加载器,需要将数据集下载至与 pytorch.py 相同的文件夹下将网络下载选项设置为 download=’True’。

from qmnist import QMNIST

# the qmnist training set, download from the web if not found
qtrain = QMNIST('_qmnist', train=True, download=True)

# the qmnist testing set, do not download.
qtest = QMNIST('_qmnist', train=False)

# the first 10k of the qmnist testing set with extended labels
# (targets are a torch vector of 8 integers)
qtest10k = QMNIST('_qmnist', what='test10k', compat=False, download='True')

# all the NIST digits with extended labels
qall = QMNIST('_qmnist', what='nist', compat=False)

它与标准的 Pytorch MNIST 数据加载器兼容。

GitHub地址项目 GitHub 地址

机器学习科普大全

一、资源简介

机器学习作为人工智能领域里的一个重要部分,越来越多的人开始关注。但是大部分人对机器学习的了解不深入,不完整,甚至是存在一些误解。本文就是面向所有人的机器学习科普大全,涉及所有机器学习相关的关键知识点。

机器学习
机器学习

机器学习属于人工智能的范畴,所以我们需要先简单了解一下人工智能的 3 个关键要素:

数据;算法;算力

3 大要素
3 大要素

我们以制造桌子为例:木材就是数据,提供基础是素材;制造桌子的流水线就是一套算法,解决把木头变成桌子;工厂里的机器就是算力,机器越厉害,制造桌子的效率就越高,速度就越快。

二、主要内容目录

主要讲解的算法有:

  1. 线性回归
  2. 逻辑回归
  3. 线性判别分析
  4. 决策树
  5. 朴素贝叶斯
  6. K邻近算法
  7. 学习向量量化
  8. 支持向量机
  9. 随机森林
  10. Adaboost
  11. 限制玻尔兹曼机
  12. K均值聚类

三、资源分享

同时为了方便大家,我们把最新 PDF 已打包好,可以直接下载

机器学习科普大全

第二版《机器学习基础》发布

Foundations of Machine Learning

从 05 年到 19 年,Mehryar Mohri 在纽约大学已经教过 14 年的 Foundations of Machine Learning 课程。在 2012 年,他就完成了第一版的《机器学习基础》,这本书的数学氛围非常浓厚。2018 年 Mohri 等研究者又完成了第二版,现在第二版及其资料都已经开放下载。

书籍主页:https://cs.nyu.edu/~mohri/mlbook/

百度云下载地址:https://pan.baidu.com/s/194wEpl5fsyJHKE49uc92pg;提取码: xud2

机器学习基础》(Foundations of Machine Learning)是对机器学习的通用简介,可作为研究者的参考书和学生的教科书来使用。该书覆盖机器学习领域的基础现代话题,同时提供讨论和算法证明所需的理论基础与概念工具。这本书还介绍了算法应用的多个关键方面。

这本书旨在呈现最新的理论工具和概念,同时提供准确的证明。该书写作风格力求简洁,同时讨论了机器学习领域的一些关键复杂话题,以及多个开放性研究问题。一些经常与其他话题混合的话题以及没有得到足够关注的话题在本书中得到了单独讨论和重视,例如,这本书专门有一个章节讲多类别分类、排序和回归。

这本书覆盖了机器学习领域的大量重要话题,但作者也省略了个别话题,如图模型和流行的神经网络,这是出于简洁性的考虑,以及这些方法暂时缺少一些坚实的理论保证。

什么样的读者适合读

这本书针对的读者群体是机器学习、统计学及相关领域的学生和研究者。它可用作机器学习研究生和高年级本科生的教材,或者科研讨论会的参考书。

本书前三四章主要讲理论,为后续章节夯实理论基础。其他章各自独立,第 6 和 13 章除外,第六章介绍了和后面章节有关的一些概念,第 13 章和 第 12 章关联度很高。每一章的最后都有一系列练习题(附完整答案)。

本书希望读者熟悉、概率和算法分析。但是,为了进一步帮助到大家,这本书的扩展附录中还包括:对线性代数的概述、简介、概率论简介、对书中算法分析和讨论有用的一些集中不等式(Concentration inequality),以及简介。

第二版的小目标

Mehryar Mohri 等作者的目标是为多个主题和领域提供统一的内容框架,而不是其它书籍采用的专题展示。这些专题书籍只描述某个特殊的视角或主题,例如贝叶斯视角或核方法主题。这本书有比较强的理论基础,证明与分析也会着重强调,因此它相比很多书籍都有较大的差别。

在第二版中,作者们更新了整本书。其主要改变体现在很多章节的写作风格、新的图表可视化、简化的内容与推导过程、对现有章节的一些补充,特别是第 6 章与第 17 章等一些新的章节。此外,作者们新添了完整的章节「模型选择」(第四章),这是非常重要的一个主题,但以前只简要讨论过。

对于第二版的最后,作者在附录中添加了很多新内容,包括线性代数和概率论等数学基础,也包括了信息论等机器学习基础。另外,作者为新章节提供了很多练习题与解决方案,读者也可以做做习题。

补充资料

这本书提供了很多材料,其中大多数都是纽约大学 Mehryar Mohri 的课程机器学习基础(Foundations of Machine Learning)提供的。这门课已经开展了 14 年,这本书也是该课程的内容概述。Mehryar Mohri 表示,正因为该课程学生的一些好建议,第二版才能最终出版。

课程主页:https://cs.nyu.edu/~mohri/ml18/

该课程主页上有额外的家庭作业、课件和项目等资料,配合书籍使用效果更佳。

目录

1~4.3
1~4.3
4.4~7.2
4.4~7.2
7.3~10.3
7.3~10.3
10.4~12.9
10.4~12.9
12.1~16.1
12.1~16.1
16.2~17.6
16.2~17.6

计算机视觉各研究方向汇总

所谓计算机视觉,即 compute vision ,就是通过用计算机来模拟人的视觉工作原理,来获取和完成一系列图像信息处理的机器。计算机视觉属于机器学习在视觉领域的应用,是一个多学科交叉的研究领域,涉及数学,物理,生物,计算机工程等多个学科,由此也可以想象到计算机视觉的研究范围非常广,也是图像,语音,自然语言处理领域中从业人数最多的。

1. 图像分类

1.1 基本概念

图像分类是计算机视觉中最基础的一个任务,也是几乎所有的基准模型进行比较的任务,从最开始比较简单的 10 分类的灰度图像手写数字识别 mnist ,到后来更大一点的 10 分类的 cifar10 和 100 分类的cifar100 ,到后来的 imagenet ,图像分类任务伴随着数据库的增长,一步一步提升到了今天的水平。

现在在 imagenet 这样的超过 1000 万图像,2 万类的数据集中,计算机的图像分类水准已经超过了人类。

图像分类,顾名思义,就是一个模式分类问题,它的目标是将不同的图像,划分到不同的类别,实现最小的分类误差。

总体来说,对于二分类的问题,图像分类可以分为跨物种语义级图像分类,子类细粒度图像分类,以及实例级图像分类三大类别。

图像分类三大类别
图像分类三大类别

传统机器学习方法:
通过各种经典的特征算子+经典分类器组合学习,比如 HoG+SVM。

深度学习方法:
各种分类网络,最为大家熟知的就是 ImageNet 竞赛了。

2012 年 Alexnet 诞生,意味着 GPU 训练时代的来临。
Alexnet 是第一个真正意义上的深度网络,与 LeNet5 的 5 层相比,它的层数增加了 3  层,网络的参数量也大大增加,输入也从 32 变成了 224 。

2014 年 VGG 诞生,它共包含参数约为 550M 。全部使用 3*3* 的卷积核*和 2*2 的最大池化核,简化了卷积神经网络的结构。VGG 很好的展示了如何在先前网络架构的基础上通过增加网络层数和深度来提高网络的性能,网络虽然简单,但是却异常的有效,在今天 VGG 仍然被很多的任务选为基准模型。

同一年 GoogleNet 诞生,也被成为 Inception Model ,它的核心是 Inception Module 。一个经典的   inception 结构,包括有四个成分,1*1 卷积,3*3  卷积, 5*5  卷积,3*3  最大池化,最后对运算结果进行通道上组合,可以得到图像更好的表征。自此,深度学习模型的分类准确率已经达到了人类的水平(5%~10%)。

2015 年,ResNet 被提出。ResNet 以  3.57% 的错误率表现超过了人类的识别水平,并以 152 层的网络架构创造了新的模型记录。由于 resnet 采用了跨层连接的方式,它成功的缓解了深层神经网络中的梯度消散问题,为上千层的网络训练提供了可能。

2016 年 ResNeXt 诞生,101 层的 ResNeXt 可以达到 ResNet152  的精确度,却在复杂度上只有后者的一半,核心思想为分组卷积。即首先将输入通道进行分组,经过若干并行分支的非线性变换,最后合并。

在 resnet 基础上,密集连接的 densenet 将前馈过程中将每一层与其他的层都连接起来。对于每一层网络来说,前面所有网络的特征图都被作为输入,同时其特征图也都被其他网络层作为输入所利用。

2017 年,也是 imagenet 图像分类比赛的最后一年,senet 获得了冠军。这个结构,仅仅使用了“特征重标定”的策略来对特征进行处理,也就是通过学习获取每个特征通道的重要程度,根据重要性去抑制或者提升相应的特征。

1.2 方向特点

图像分类的比赛基本落幕,也接近算法的极限。但是在实际的应用中却面临着比比赛中更加复杂,比如样本不均衡,分类界面模糊,未知类别等。

2. 目标检测

2.1 基本概念

分类任务给出的是整张图片的内容描述,而目标检测任务则关注图片中特定的目标。

检测任务包含两个子任务,其一是这一目标的类别信息和概率,它是一个分类任务。其二是目标的具体位置信息,这是一个定位任务。

face 0.996
face 0.996

与计算机视觉领域里大部分的算法一样,目标检测也经历了从传统的人工设计特征和浅层分类器的思路(以),到大数据时代使用深度神经网络进行特征学习的思路

在传统方法时代,很多的任务不是一次性解决,而是需要多个步骤的。而深度学习时代,很多的任务都是采用 End-To-End 的方案,即输入一张图,输出最终想要的结果,算法细节和学习过程全部丢给了神经网络,这一点在物体检测这个领域,体现得尤为明显。

不管是清晰地分步骤处理,还是深度学习的 end-to-end 的方法,目标检测算法一定会有 3 个模块。第一个是检测窗口的选择,第二个是图像特征的提取,第三个是分类器的设计。

2.2 方法分类

传统机器学习方法:
以保罗·维奥拉和迈克尔·琼斯于 2001 年提出的维奥拉-琼斯目标检测框架为代表,这是第一篇基于Haar+Adaboost 的检测方法,也是首次把检测做到实时的框架;

此方法在 opencv 中被实现为

cvHaarDetectObjects()

是 opencv 中最为人熟知的目标检测方法。

速度非常快,检测召回率相对如今的算法较低。

深度学习方法:
仍然要解决区域选择、提取特征、分类回归三个问题。但是在演变过程中,却发展出了 multi-stage和one-stage 的方法。其中 multi-stage 方法,是分步骤完成上面的任务,甚至可能需要单独训练各个网络。而 one-stage 则是一步到位。

RCNN 的框架是 multi-stage 方法的典型代表。它使用了 Selective search 先生成候选区域再检测,候选窗口的数量被控制在了 2000 个左右。选择了这些图像框之后,就可以将对应的框进行 resize 操作,然后送入 CNN 中进行训练。由于 CNN 非常强大的非线性表征能力,可以对每一个区域进行很好的特征表达,CNN 最后的输出,使用多个分类器进行分类判断。该方法将 PASCAL VOC 上的检测率从  35.1%  提升到了 53.7% ,其意义与  Alexnet 在 2012 年取得分类任务的大突破是相当的,对目标检测领域影响深远。

随后 Fast R-CNN 提出 RoIPooling 从整图对应的卷积特征图选取区域特征,解决了重复提取特征的问题。Faster R-CNN 则提出 Region Proposal , anchors 把一张图片划分成  n*n 个区域,每个区域给出 9 个不同 ratio 和 scale 的 proposal ,解决了重复提取候选 proposal 的问题。 RCNN 系列在工业届应用非常广泛,因此从事目标检测的同学必须掌握。

除了 multi-stage 方法,还有 one-stage 方法。以 YOLO 为代表的方法,没有显式的候选框提取过程。它首先将图片 resize 到固定尺寸,将输入图片划分成一个 7×7 的网格,每个网格预测 2 个边框,对每一个网络进行分类和定位。YOLO 方法也经过了许多版本的发展,从 YOLO v2  到  YOLO v3 。YOLO 的做法是速度快,但是会有许多漏检,尤其是小的目标。所以 SSD 就在  YOLO 的基础上添加了 Faster R-CNN 的   Anchor  概念,并融合不同卷积层的特征做出预测。虽然 YOLO 和 SSD 系列的方法没有了 region proposal 的提取,速度更快,但是必定会损失信息和精度。

2.3 方向特点

目标检测方向有一些固有的难题,比如小脸,遮挡,大姿态。

小脸,遮挡,大姿态
小脸,遮挡,大姿态

而在方法上,多尺度与级联网络的设计,难样本的挖掘,多任务 loss 等

3. 图像分割

3.1 基础概念

图像分割属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把图像分割成具有相似的颜色或纹理特性的若干子区域,并使它们对应不同的物体或物体的不同部分的技术。这些子区域,组成图像的完备子集,又相互之间不重叠。

图像分割
图像分割

在图像处理中,研究者往往只对图像中的某些区域感兴趣,在此基础上才有可能对目标进行更深层次的处理与分析,包括对象的数学模型表示、几何形状参数提取、统计特征提取、目标识别等。

传统方法:
图像分割问题最早来自于一些文本的分割,医学图像分割。在文本图像分割中,我们需要切割出字符,常见的问题包括指纹识别,车牌识别;由于这一类问题比较简单,因为基于阈值和聚类的方法被经常使用。

基于阈值和聚类的方法虽然简单,但因此也经常失效。以 graphcut 为代表的方法,是传统图像分割里面鲁棒性最好的方法。Graphcut 的基本思路,就是建立一张图,其中以图像像素或者超像素作为图像顶点,然后移除一些边,使得各个子图不相连从而实现分割。图割方法优化的目标是找到一个切割,使得移除边的和权重最小。

深度学习方法:
全卷积神经网络(Fully connected Network)是第一个将卷积神经网络正式用于图像分割问题的网络。

一个用于分类任务的深度神经网络通过卷积来不断抽象学习,实现分辨率的降低,最后从一个较小的featuremap 或者最后的特征向量,这个 featuremap 通常为 5*5 或者 7*7 等大小。而图像分割任务需要恢复与原尺度大小一样的图片,所以,需要从这个 featuremap 恢复原始图片尺寸,这是一个上采样的过程。由于这个过程与反卷积是正好对应的逆操作,所以我们通常称其为反卷积。

实际上并没有反卷积这样的操作,在现在的深度学习框架中,反卷积通常有几种实现方式,一个是双线性插值为代表的插值法,一个是转置卷积。

转置卷积
转置卷积

3.2 方向特点

在基于深度学习的图像分割中,有一些比较关键的技术,包括反卷积的使用,多尺度特征融合,crf  等后处理方法。

多尺度与上下文信息:
多尺度的信息融合可以从特征图,还可以直接采用多尺度的输入图像,不过这两者本质上没有太多的差异。使用金字塔的池化方案可实现不同尺度的感受野,它能够起到将局部区域上下文信息与全局上下文信息结合的效果。对于图像分割任务,全局上下文信息通常是与整体轮廓相关的信息,而局部上下文信息则是图像的细节纹理,要想对多尺度的目标很好的完成分割,这两部分信息都是必须的。

CRF:
由于经典的 cnn 是局部的方法,即感受野是局部而不是整个图像。另一方面,cnn 具有空间变换不变性,这也降低了分割的边缘定位精度。针对 cnn 的这两个缺陷,crf 可以进行很好的弥补。crf 是一种非局部的方法,它可以融合 context 信息,Deeplab 系列就使用了cnn 加上全连接的 crf 的方式。

另一方面,前面我们说的图像分割,是属于硬分割,即每一个像素都以绝对的概率属于某一类,最终概率最大的那一类,就是我们所要的类别。但是,这样的分割会带来一些问题,就是边缘不够细腻,当后期要进行融合时,边缘过渡不自然。此时,就需要用到 image matting 技术。

4. 目标跟踪

4.1 基本概念

目标跟踪,指的其实就是视频中运动目标的跟踪,跟踪的结果通常就是一个框。目标跟踪是视频监控系统中不可缺少的环节。

目标跟踪
目标跟踪

根据目标跟踪方法建模方式的不同,可以分为生成式模型方法与判别式模型方法。

生成式模型跟踪算法以均值漂移目标跟踪方法和粒子滤波目标跟踪方法为代表,判别式模型跟踪算法以相关滤波目标跟踪方法和深度学习目标跟踪方法为代表。

生成类方法:
在原始影像帧中对目标按指定的方法建立目标模型,然后在跟踪处理帧中搜索对比与目标模型相似度最高的区域作为目标区域进行跟踪。算法主要对目标本身特征进行描述,对目标特征刻画较为细致,但忽略背景信息的影响。在目标发生变化或者遮挡等情况下易导致失跟现象。

判别类方法:
通过对原始影像帧,对目标及背景信息进行区分建立判别模型,通过对后续影像帧搜索目标进行判别是目标或背景信息进而完成目标跟踪。

判别类方法与生成类方法的根本不同在于判别类方法考虑背景信息与目标信息区分来进行判别模型的建立,由于判别类方法将背景与目标进行区分,因此该类方法在目标跟踪时的表现通常更为鲁棒,目前已经成为目标跟踪的主流跟踪方式。判别类方法包括相关滤波,深度学习方法。

4.2 方向特点

目标跟踪有一些难点:

  1. 目标表征表达问题,虽然深度学习方法具有很强的目标表征能力,但是仍然容易受相似环境的干扰。
  2. 目标快速运动,由于很多跟踪的物体都是高速运动,因此既要考虑较大的搜索空间,也要在保持实时性的前提下减小计算量。
  3. 变形,多尺度以及遮挡问题,当目标发生很大的形变或者临时被遮挡如何保持跟踪并且在目标重新出现时恢复跟踪。

5. 图像滤波与降噪

5.1 基本概念

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪,有时候又称为图像去噪。

降噪可以应用于图像增强和美颜等领域。

图像降噪
图像降噪

传统方法:
传统降噪算法根据降噪的原理不同可分为基于邻域像素特征的方法,基于频域变换的方法,和基于特定模型的方法。

基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素与其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法,因此往往都会存在一个典型的输入参数,即滤波半径r。此滤波半径可能被用于在该局部窗口内计算像素的相似性,也可能是一些高斯或拉普拉斯算子的计算窗口。在邻域滤波方法里面,最具有代表性的滤波方法有以下几种:算术均值滤波与高斯滤波,统计中值滤波,双边滤波,非局部平均滤波方法,BM3D 算法。

深度学习方法:
在 2012 年,随着 Alexnet 的出现,深度学习做去噪的工作取得了一些进展,可以达到和 BM3D 差不多的水平。对于仿真的噪声和固定的噪声,深度学习已经可以很好的去除,达到或超过传统领域里最好的算法。

利用卷积神经网络去除噪声的原理很简单,输入是一张有噪声的图,标签是一张无噪声的图,输出是一张降噪后的图,损失函数是无噪声 groundtruth 与网络输出的 L2 距离,网络通常就是与图像分割算法一样的网络,卷积+与之对称的反卷积。

5.2 方向特点

降噪的研究聚焦在真实数据的去噪声,因为真实世界的噪声不符合高斯加性噪声的假设,而且是依赖于信息本身的。不过,真实噪声图像和相应的无噪声图像获取是非常困难,慢慢的也有了一些 benchmark 。

6. 图像增强

6.1 基本概念

图像增强,即增强图像中的有用信息,改善图像的视觉效果。

图像增强
图像增强

图像增强实际上包含了很多的内容,上面的降噪也属于其中,只是因为降噪多了美颜这一个应用单独拿出来说一下。

对比度增强,用于扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,可用于改善图像的识别效果,满足某些特殊分析。

超分辨,使图像变得更加清晰,可以用于视频的传输先进行降采样,再进行升采样,即降低了传输成本,又增加了视觉效果。

图像修复,重建图像和视频中丢失或损坏的部分,也被称为图像插值或视频插值,主要是替换一些小区域和瑕疵,如 photoshop 中的印章工具。随着发展,已经从原先针对划痕、污点等的修复到现在对图像、视频中文字、物体等的移除,比如水印等。

传统方法:
传统的方法就是一个预定义好的非线性变换,主要有三大类方法,一类是点操作,一类是直方图操作,一类是 Retinex 理论。

点操作也被称为直接对比度增强,将每个像素独立操作,包括对数变化,指数变化,负图像,阈值化等。我们熟知的 gamma 变换如下,可以进行不同形状的映射。

直方图操作也被称为间接对比度增强,包括直方图均衡,直方图匹配等。直方图均衡化通常用来增加图像的全局对比度,尤其是当图像中主体和背景对比度相当接近的时候。直方图均衡化的效果就是让直方图更均衡的分布,这种方法对于背景和前景都太亮或者太暗的图像非常有用,通常是曝光过度或者曝光不足的图片。

Retinex 理论,即颜色恒常知觉的计算理论,Retinex 是一个合成词,它的构成是 retina (视网膜)+cortex (皮层),它将图像认为是 reflectance 和 illumination 的点乘,理论基础是在不同的照明条件下,物体的色彩不受光照非均性的影响是恒定的,而物体的颜色是由物体对长波、中波和短波光线的反射能力决定的而不是由反射光强度的绝对值决定。

深度学习方法:
以增强对比度为例,深度学习方法使用了CNN 来进行非线性变换的学习,而且通常不仅仅局限在对比度增强,经常会同时学习到降噪。深度学习的方法有两种,一种是采用成对的图片训练,比如 pix2pix,learning in the dark ,缺点是没有普适性,只能对所实验的数据集有用。一种是不需要成对图片训练,只需要好图,比如 WESPE ,常配合 GAN 使用。

6.2 方向特点

一个图像增强任务,传统方法需要分别进行降噪,颜色校正,对比度增强等各种操作,而深度学习算法的好处就是 end-to-end 输出,将整个流程丢给了网络。目前图像增强相对于前面的一些方向还是一个蓝海,覆盖的方向和应用非常广,有精力的朋友可以好好研究。

7. 风格化

图像风格化之所以引起我们的注意,完全是因为 2015 年的一个研究,可以将任意的图像转换为梵高的画作风格。 也是得益于深度学习技术的发展,传统的方法做不到这么好的效果。而随着美图秀秀,天天 P 图等 app 层出不穷的滤镜,风格化已经成为了单独的一个研究领域。

图像风格化是一个综述性的技术应用,为了简单起见,就理解为艺术类滤镜把,它指通过算法,将数码相机拍摄的照片,变成绘画、素描等艺术类的非数码相机效果,是后期程度最深的操作,将彻底改变相片的风格。

风格化
风格化

深度学习方法:
以 A Neural Algorithm of Artistic Style 论文发表为起始,Prisma 滤镜为典型代表。虽然风格迁移技术的发展日新月异,但是最革命性的还是该文章的方法,这是德国图宾根大学的研究,它通过分析某种风格的艺术图片,能将图片内容进行分离重组,形成任意风格的艺术作品,最开始的时候需要将近一个小时来处理。

就是把一幅图作为底图,从另外一幅画抽取艺术风格,重新合成新的艺术画,可以参考上面的图。

研究者认为,图片可以由内容层(Content)与风格层(Style)两个图层描述,相互分离开。在图像处理中经常将图像分为粗糙层与细节层,即前者描述图像的整体信息,后者描述图像的细节信息,具体可以通过高斯金字塔来得到。

卷积神经网络的各个神经元可以看做是一个图像滤波器,而输出层是由输入图像的不同滤波器的组合,深度由浅到深,内容越来越抽象。

底层信息重建,则可以得到细节,而从高层信息重建,则得到图像的”风格“。因此,可以选择两幅图像,一幅构建内容信息,一幅构建风格信息,分别进行 Content 重建与 Style 重建。通过将内容与风格组合,可以得到新的视觉信息更加有意思的图像,如计算机油画,这就是它的基本原理。方法的核心在于损失函数的设计,包括内容损失和风格损失

内容损失在像素空间,要求风格化后的图能够保证内容的完整性。风格损失使用 vgg 特征空间的 gram 矩阵,这样就有了较高的抽象层级,实践结果表明可以很好的捕捉风格。

7.2 方向特点

如今风格化方法在很多地方都有应用,比如大家熟悉的变脸等。方法也演变成了几个方向;

  1. 单模型单风格,即一个网络只能做一种风格化。
  2. 单模型多风格,即一个网络可以实现多种风格,比(1)实用的多。
  3. 单模型任意风格,即一个网络可以任意风格,视输入图像而定,这是最好的,更多的研究我们以后会开专题。

8. 三维重建

8.1 基本概念

什么是三维重建呢?广义上来说,是建立真实世界的三维模型。随着软硬件的成熟,在电影,游戏,安防,地图等领域,三维重建技术的应用越来越多。目前获取三维模型的方法主要包括三种,手工建模,仪器采集与基于图像的建模。

三维重建
三维重建
  1. 手工建模作为最早的三维建模手段,现在仍然是最广泛地在电影,动漫行业中应用。顶顶大名的3DMax 就是典型代表,当然了,它需要专业人士来完成。
  2. 由于手工建模耗费大量的人力,三维成像仪器也得到了长期的研究和发展。基于结构光(structured light)和激光扫描技术的三维成像仪是其中的典型代表。这些基于仪器采集的三维模型,精度可达毫米级,是物体的真实三维数据,也正好用来为基于图像的建模方法提供评价数据库。由于仪器的成本太高,一般的用户是用不上了。
  3. 基于图像的建模技术(image based modeling),顾名思义,是指通过若干幅二维图像,来恢复图像或场景的三维结构,这些年得到了广泛的研究。

我们这里说的三维重建,就特指基于图像的三维重建方法,而且为了缩小范围,只说人脸图像,并简单介绍其中核心的 3DMM 模型。

3DMM 模型:

人脸三维重建方法非常多,有基于一个通用的人脸模型,然后在此基础上进行变形优化,会牵涉到一些模板匹配,插值等技术。有基于立体匹配(各种基于双目,多目立体视觉匹配)的方法,通过照相机模型与配准多幅图像,坐标系转换,获取真实的三维坐标,然后进行渲染。有采用一系列的人脸作为基,将人脸用这些基进行线性组合的方法,即 Morphable models 方法。

其中,能够融会贯通不同传统方法和深度学习方法的,就是 3D Morphable Models 系列方法,从传统方法研究到深度学习。

它的思想就是一幅人脸可以由其他许多幅人脸加权相加而来,学过线性代数的就很容易理解这个正交基的概念。我们所处的三维空间,每一点(x,y,z),实际上都是由三维空间三个方向的基量,(1,0,0),(0,1,0),(0,0,1)加权相加所得,只是权重分别为 x,y,z。

转换到三维空间,道理也一样。每一个三维的人脸,可以由一个数据库中的所有人脸组成的基向量空间中进行表示,而求解任意三维人脸的模型,实际上等价于求解各个基向量的系数的问题。

每一张人脸可以表示为:
形状向量 Shape Vector:S=(X1,Y1,Z1,X2,Y2,Z2,…,Yn,Zn)
纹理向量 Texture Vector:T=(R1,G1,B1,R2,G2,B2,…,Rn,Bn)

形状向量 纹理向量
形状向量 纹理向量

而一张任意的人脸,其等价的描述如下:

形状和纹理的平均值
形状和纹理的平均值

其中第一项 Si,Ti 是形状和纹理的平均值,而 si,ti 则都是 Si ,Ti 减去各自平均值后的协方差矩阵的特征向量。 基于 3DMM 的方法,都是在求解 α,β 这一些系数,当然现在还会有表情,光照等系数,但是原理都是通用的。

8.2 方向特点

人脸的三维建模有一些独特的特点:

1.预处理技术非常多,人脸检测与特征点定位,人脸配准等都是现在研究已经比较成熟的方法。利用现有的人脸识别与分割技术,可以缩小三维人脸重建过程中需要处理的图像区域,而在有了可靠的关键点位置信息的前提下,可以建立稀疏的匹配,大大提升模型处理的速度。

2.人脸共性多。正常人脸都是一个鼻子两只眼睛一个嘴巴两只耳朵,从上到下从左到右顺序都不变,所以可以首先建立人脸的参数化模型,实际上这也是很多方法所采用的思路。

人脸三维重建也有一些困难:

  1. 人脸生理结构和几何形状非常复杂,没有简单的数学曲面模型来拟合。
  2. 光照变化大。同一张脸放到不同的光照条件下,获取的图像灰度值可能大不一样的,这些都会影响深度信息的重建。
  3. 特征点和纹理不明显。图像处理最需要的就是明显的特征,而光滑的人脸除了特征关键点,很难在脸部提取稠密的有代表性的角点特征。这个特点,使得那些采用人脸配准然后求取三维坐标的方法面临着巨大的困难。

9. 图像检索

9.1 基本概念

图像检索的研究从 20 世纪 70 年代就已经开始,在早期是基于文本的图像检索技术(Text-based Image Retrieval,简称 TBIR ),利用文本来描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。随着计算机视觉技术的发展,90年代开始出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,也就是基于内容的图像检索(Content-based Image Retrieval,简称 CBIR )技术,本小节的图像检索就特指基于内容的图像检索。

基于内容的图像检索也经历了传统方法和深度学习方法两个主要阶段,传统的基于内容的图像检索通常包括以下流程:

图像检索流程
图像检索流程

预处理,通常包括一些图像归一化,图像增强等操作。特征提取,即提取一些非常鲁棒的图像特征,比如SIFT,HoG 等特征。特征库就是要查询的库,库中不存储图像而是存储特征,每一次检索图像完成特征提取之后,就在特征库中进行匹配和相似度计算。索引就是在某种相似性度量准则下计算查询向量到特征库中各个特征的相似性大小,最后按相似性大小进行高效的排序并顺序输出对应的图片。

图像检索的中最复杂的一步就是检索,在这一步完成验证过程。

图像检索验证过程
图像检索验证过程

最简单的方法就是暴力(brute-force) 搜索方法(又称线性扫描),即逐个与数据库中的每个点进行相似性计算然后进行排序,这种简单粗暴的方式虽然很容易实现,但是会随着数据库的大小以及特征维度的增加其搜索代价也会逐步的增加,从而限制在数据量小的小规模图像数据库,在大规模图像库上这种暴力搜索的方式不仅消耗巨大的计算资源,而且单次查询的响应时间会随着数据样本的增加以及特征维度的增加而增加,为了降低搜索的空间的空间复杂度与时间复杂度,研究者们提出了很多高效的检索技术,其中最成功的大家也最熟悉到方法是基于哈希的图像检索方法

深度学习在图像检索里面的作用就是把表征样本的特征学习好,就够了。

9.2 方向特点

图像检索系统具有非常大的商业价值,从搜索引擎的以图搜图,到人脸验证和识别系统,到一些搜索排序系统(比如基于美学的摄影图库)。由于图像特征的学习是一个通用的研究方向,因此更多的在于设计高效的检索系统。

10. GAN

10.1 基本概念

GAN,即 Generative adversarial net ,被誉为新的深度学习,涉及的研究非常多,可以单列为一个方向,一个经典的网络结构如下。

Generative adversarial net
Generative adversarial net

GAN 的原理很简单,它包括两个网络,一个生成网络,不断生成数据分布。一个判别网络,判断生成的数据是否为真实数据。

Generative adversarial net
Generative adversarial net

上图是原理展示,黑色虚线是真实分布,绿色实线是生成模型的学习过程,蓝色虚线是判别模型的学习过程,两者相互对抗,共同学习到最优状态。

关于 GAN 的基础,我们以前已经写过相关的内容,大家去看就可以了。

10.2 方向特点

作为新兴和热门方向,GAN 包含的研究方向非常的广,包括 GAN 的应用,GAN 的优化目标,GAN 的模型发展,GAN 的训练技巧,GAN 的理论分析,GAN 的可视化等等。

数据科学、神经网络、机器学习完全图解

这是一份非常详实的备忘单,涉及具体内容包括:

  1. 神经网络基础知识
  2. 神经网络图谱
  3. 机器学习基础知识
  4. 著名 Python 库 Scikit-Learn
  5. Scikit-Learn 算法
  6. 机器学习算法选择指南
  7. TensorFlow
  8. Python 基础
  9. PySpark 基础
  10. Numpy 基础
  11. Bokeh
  12. Keras
  13. Pandas
  14. 使用 Pandas 进行Data Wrangling
  15. 使用 dplyr 和 tidyr 进行 Data Wrangling
  16. SciPi
  17. MatPlotLib
  18. 使用 ggplot 进行数据可视化
  19. Big-O
神经网络 Cheat Sheet
神经网络 Cheat Sheet

第一部分:神经网络

神经网络基础知识
神经网络基础知识

神经网络基础知识

人工神经网络(ANN),俗称神经网络,是一种基于生物神经网络结构和功能的计算模型。 它就像一个人工神经系统,用于接收,处理和传输计算机科学方面的信息。

神经网络
神经网络

基本上,神经网络中有 3 个不同的层:

  • 输入层(所有输入都通过该层输入模型)
  • 隐藏层(可以有多个隐藏层用于处理从输入层接收的输入)
  • 输出层(处理后的数据在输出层可用)

神经网络图谱

神经网络图谱
神经网络图谱

图形数据可以与很多学习任务一起使用,在元素之间包含很多丰富的关联数据。例如,物理系统建模、预测蛋白质界面,以及疾病分类,都需要模型从图形输入中学习。图形推理模型还可用于学习非结构性数据,如文本和图像,以及对提取结构的推理

第二部分:机器学习

机器学习 Cheat Sheet
机器学习

用 Emoji 解释机器学习

用 Emoji 解释机器学习
用 Emoji 解释机器学习

Scikit-Learn 基础

Scikit-learn 是由 Python 第三方提供的非常强大的机器学习库,它包含了从数据预处理到训练模型的各个方面,回归和聚类算法,包括支持向量机,是一种简单有效的数据挖掘和数据分析工具。在实战使用scikit-learn 中可以极大的节省代码时间和代码量。它基于 NumPy,SciPy 和 matplotlib 之上,采用 BSD许可证。

Scikit-Learn 基础
Scikit-Learn 基础

Scikit-Learn 算法

这张流程图非常清晰直观的给出了 Scikit-Learn 算法的使用指南。

Scikit-Learn 算法
Scikit-Learn 算法

针对 Azure Machine Learning Studios 的 Scikit-Learn 算法

针对 Azure Machine Learning Studios 的 Scikit-Learn 算法
针对 Azure Machine Learning Studios 的 Scikit-Learn 算法

第三部分:Python 数据科学

Python
Python

TensorFlow

 

 

 

TensorFlow
Python 基础

 

Python 基础
Python 基础

PySpark RDD 基础

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,通过 Scala 语言实现,拥有 Hadoop MapReduce 所具有的优点,不同的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。PySpark 是 Spark  为 Python 开发者提供的  API。

NumPy基础

NumPy 是 Python 语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,前身 Numeric,主要用于数组计算。它实现了在 Python 中使用向量和数学矩阵、以及许多用 C 语言实现的底层函数,并且速度得到了极大提升。

NumPy基础
NumPy基础

Bokeh

Bokeh 是一个交互式可视化库,面向现代 Web 浏览器。目标是提供优雅、简洁的多功能图形构造,并通过非常大或流数据集的高性能交互来扩展此功能。Bokeh 可以实现快速轻松地创建交互式图表、仪表板和数据应用程序。

Bokeh
Bokeh

Keras

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK , 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

Keras
Keras

Pandas

pandas 是一个为 Python 编程语言编写的软件库,用于数据操作和分析,基于 NumPy,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas 提供了大量快速便捷地处理数据的函数和方法。

Pandas
Pandas

使用 Pandas 进行 Data Wrangling

使用 Pandas 进行 Data Wrangling

使用Pandas进行Data Wrangling
使用 Pandas进行 Data Wrangling

使用 ddyr 和 tidyr 进行 Data  Wrangling

为什么使用 tidyr 和 dplyr 呢?因为虽然 R 中存在许多基本数据处理功能,但都有点复杂并且缺乏一致的编码,导致可读性很差的嵌套功能以及臃肿的代码。使用 ddyr 和 tidyr 可以获得:

  • 更高效的代码
  • 更容易记住的语法
  • 更好的语法可读性
使用ddyr和tidyr进行Data Wrangling
使用 ddyr和 tidyr进行 Data Wrangling

Scipy 线性代数

SciPy 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。 与其功能相类似的软件还有 MATLAB、GNU Octave 和 Scilab。

Scipy线性代数
Scipy 线性代数

Matplotlib

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。 它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

Matplotlib
Matplotlib

使用 ggplot2 进行数据可视化

使用ggplot2进行数据可视化
使用 ggplot2 进行数据可视化

Big-O

大 O 符号(英语:Big O notation),又稱為漸進符號,是用于描述函数渐近行为的数学符号。 更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。 … 阶)的大 O,最初是一个大写希腊字母 “Ο” (omicron),现今用的是大写拉丁字母 “O”。

Big-O
Big-O

PDF下载(或点击阅读原文链接):
https://cheatsheets.becominghumanai.com/

参考链接:
https://becominghuman.ai/cheat-sheets-for-ai-neural-networks-machine-learning-deep-learning-big-data-science-pdf-f22dc900d2d7

 

 

 

 

 

 

深度学习最常见的 26 个模型 – 含实现代码

本文首先从 4 个方面(张量、生成模型、序列学习、深度强化学习)追踪深度学习几十年的发展史,然后再介绍主流的 26 个深度学习模型。

1. 深度学习发展史

主要按最早研究出现的时间,从 4 个方面来追踪深度学习的发展史。

1.1 张量

  • 1958 年 Frank 提出感知机,但后来被一些学者发现因算力的不足,制约了较大神经网络的计算,导致很长时间发展缓慢。
  • Fukushima 在 1979 年左右提出 Neocognitron,感觉这是卷积和池化的雏形。
  • Hinton 在 1986 年提出反向传播的思想和多层感知机(BPNN/MLP),有非常大的意义,对未来几十年(可以说直到现在)影响深远。
  • 接下来比较重要的发展是,LeCun 在 1998 年提出 LeNet-5,7 层的 CNN 做数字识别。
  • 然后 AlexNet 在 12 年在 ImageNet 夺冠,主要是 CNN+Dropout+Relu,又是 Hinton 极大的带动了 DL 的发展,大佬的地位毋庸置疑。另外相似的还有 15 年的 GoogLeNet。
  • 总算有华人大佬作出大贡献了,16 年何恺明(CV领域应该无人不知)提出 Resnet,还拿了 best paper,影响较大,当然效果也很好。另外相似的还有 17 年的 DenseNet。
  • 17年 Capsule Network 登场了,又是 Hinton。我比较看好胶囊网络在 NLP 领域的发展,虽然现在还没太明显的效果。因为用胶囊网络来做文本的特征表示的话,可以极大的丰富特征,更适合处理文本这种比较灵活的数据

1.2 生成模型

  • 上世纪 80 年代提出 RBM,06 年叠加成 Deep Belief Network(DBN),这算是重新叠加网络的一个比较重要的开始吧。
  • 上世纪 80 年代 Hinton 提出 Auto-Encode,过了较长时间 Bengio 在 08 年提出 Denoise Auto-Encode。Welling 在 13 年提出 Variational Auto-Encode。
  • 接下来,在 14 年 Goodfellow 和 Bengio 等提出 GAN,从此生成网络不仅是 AE 以及其变种(Denoise Auto-Encode、Variational Auto-Encode等)了,可以这么说:GAN 的出现极大的提高了生成模型的地位和热点,GAN 也是席卷 NLP、CV、AI 等领域的各大顶会,甚至是一些 best paper。另外,陆续出现很多很多 GAN 的变种,比如 DCGAN、CGAN、PGGAN、LAPGAN、InfoGAN、WGAN、F-GAN、SeqGAN、LeakGAN 等。

1.3 序列学习

  • 1982 年提出 hopfield network,1997 年 Schmidhuber 提出 LSTM。Hinton 组在 13 年把 RNN 用在语音识别上取得巨大突破,RNN 立马爆火。
  • 03 年提出 LM(语言模型),13 年提出 w2v,佩服 Bengio,这也是我为啥千里迢迢跑去找 Benign 合影的原因之一。w2v 带来的影响不言而喻,目前 NLP 领域基本上所有 Paper 都会用到词向量,包括也影响了后面出现的 Glove、FastText、ELMo( 18 年 2 月)、Transformer( 18 年 6 月)、Bert ( 18 年 10 月提出,Jacob 一战封神,我感觉至少是 18 年 NLP 领域最大的发展,甚至可以说是近几年最大的发展)等。Bert 的出现,很可能改变所有主流 NLP 任务的打法和 Baseline
  • 还有一个分支,14 年出现 Seq2Seq,这个重要性也无需赘述了,NLP 领域的都知道。然后 15 年出现Charater  CNN ,17 年出现 self-attention。

1.4 深度强化学习

  • 提到强化学习就不得不提这 Deep Mind 、AlphaGo 以及其变种、Silve r。13 年提出 Deep Q-learning 15 年提出 Double DQN,16 年提出 Dueling Net。 15 年的 DDPG 和 16 年的 A3C 都是 NN+Policy Gradient,也应用在不少领域。16 年的 AlphaGo(除了 AI 领域,很多不懂AI的人都知道,甚至可以说是 AI 爆火的最大助力),17 年出现更疯狂的 Alpha Zero。

2. 深度学习模型

深度学习模型
深度学习模型

2.1 Feed forward neural networks (FF or FFNN) and perceptrons (P)

前馈神经网络和感知机,信息从前(输入)往后(输出)流动,一般用反向传播(BP)来训练。算是一种监督学习。

前馈神经网络和感知机
前馈神经网络和感知机

对应的代码:

https://github.com/danijar/layered

https://github.com/civisanalytics/muffnn

2.2 Radial basis function (RBF)

径向基函数网络,是一种径向基函数作为激活函数的 FFNNs(前馈神经网络)。

径向基函数网络
径向基函数网络

对应的代码:

https://github.com/eugeniashurko/rbfnnpy

2.3 Hopfield network (HN)

Hopfield 网络,是一种每个神经元都跟其它神经元相连接的神经网络。

Hopfield 网络
Hopfield 网络

对应的代码:

https://github.com/yosukekatada/Hopfield_network

2.4 Markov chains (MC or discrete time Markov Chain, DTMC)

马尔可夫链 或离散时间马尔可夫链,算是 BMs 和 HNs 的雏形。

马尔可夫链
马尔可夫链

对应的代码:

Markov chains:https://github.com/jsvine/markovify

DTMC:https://github.com/AndrewWalker/dtmc

2.5 Boltzmann machines (BM)

玻尔兹曼机,和 Hopfield 网络很类似,但是:一些神经元作为输入神经元,剩余的是隐藏层。

玻尔兹曼机
玻尔兹曼机

对应的代码:

https://github.com/yell/boltzmann-machines

2.6 Restricted Boltzmann machines (RBM)

受限玻尔兹曼机,和玻尔兹曼机 以及  Hopfield 网络 都比较类似

受限玻尔兹曼机
受限玻尔兹曼机

对应的代码:

https://github.com/echen/restricted-boltzmann-machines

2.7 Autoencoders (AE)

自动编码,和 FFNN 有些类似,它更像是 FFNN 的另一种用法,而不是本质上完全不同的另一种架构。

自动编码
自动编码

对应的代码:

https://github.com/caglar/autoencoders/blob/master/ae.py

2.8 Sparse autoencoders (SAE)

稀疏自动编码,跟自动编码在某种程度比较相反

稀疏自动编码
稀疏自动编码

对应的代码:

https://github.com/caglar/autoencoders/blob/master/sa.py

2.9 Variational autoencoders (VAE)

变分自动编码,和 AE 架构相似,不同的是:输入样本的一个近似概率分布。这使得它跟 BM、RBM 更相近。

变分自动编码
变分自动编码

对应的代码:

https://github.com/mattjj/svae

2.10 Denoising autoencoders (DAE)

去噪自动编码,也是一种自编码机,它不仅需要训练数据,还需要带噪音的训练数据。

去噪自动编码
去噪自动编码

对应对应的代码:

https://github.com/caglar/autoencoders/blob/master/da.py

2.11 Deep belief networks (DBN)

深度信念网络,由多个受限玻尔兹曼机或变分自动编码堆砌而成。

深度信念网络
深度信念网络

对应的代码:

https://github.com/albertbup/deep-belief-network

2.12 Convolutional neural networks (CNN or deep convolutional neural networks, DCNN)

卷积神经网络,这个不解释也都知道。

卷积神经网络
卷积神经网络

对应的代码:

CNN:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_CNN.py

DCNN:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_DeepCNN.py

2.13 Deconvolutional networks (DN)

去卷积网络,又叫逆图形网络,是一种逆向的卷积神经网络。

去卷积网络
去卷积网络

对应的代码:

https://github.com/ifp-uiuc/anna

2.14 Deep convolutional inverse graphics networks (DCIGN)

深度卷积逆向图网络,实际上是 VAE,且分别用 CNN、DNN 来作编码和解码。

深度卷积逆向图网络
深度卷积逆向图网络

对应的代码:

https://github.com/yselivonchyk/TensorFlow_DCIGN

2.15 Generative adversarial networks (GAN)

生成对抗网络,Goodfellow 的封神之作,这个模型不用解释也都知道

生成对抗网络
生成对抗网络

对应的代码:

https://github.com/devnag/pytorch-generative-adversarial-networks

2.16 Recurrent neural networks (RNN)

循环神经网络,这个更不用解释,做语音、NLP 的没有人不知道,甚至非 AI 相关人员也知道。

循环神经网络
循环神经网络

对应的代码:

https://github.com/farizrahman4u/recurrentshop

2.17 Long / short term memory (LSTM)

长短期记忆网络, RNN 的变种,解决梯度消失/爆炸的问题,也不用解释,这几年刷爆各大顶会。

长短期记忆网络
长短期记忆网络

对应的代码:

https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_LSTM.py

2.18 Gated recurrent units (GRU)

门循环单元,类似 LSTM 的定位,算是 LSTM 的简化版。

门循环单元
门循环单元

对应的代码:

https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_GRU.py

2.19 Neural Turing machines (NTM)

神经图灵机,LSTM 的抽象,以窥探 LSTM 的内部细节。具有读取、写入、修改状态的能力

神经图灵机
神经图灵机

对应的代码:

https://github.com/MarkPKCollier/NeuralTuringMachine

2.20 Bidirectional recurrent neural networks, bidirectional long / short term memory networks and bidirectional gated recurrent units (BiRNN, BiLSTM and BiGRU respectively)

双向循环神经网络、双向长短期记忆网络和双向门控循环单元,把 RNN、双向的 LSTM、GRU 双向,不再只是从左到右,而是既有从左到右又有从右到左。

对应的代码:

BiRNN:https://github.com/cstghitpku/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/tree/master/models

BiLSTM:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_BiLSTM.py

BiGRU:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_BiGRU.py

2.21 Deep residual networks (DRN)

深度残差网络,是非常深的 FFNN,它可以把信息从某一层传至后面几层(通常2-5层)。

深度残差网络
深度残差网络

对应的代码:

https://github.com/KaimingHe/deep-residual-networks

2.22 Echo state networks (ESN)

回声状态网络,是另一种不同类型的(循环)网络。

回声状态网络
回声状态网络

对应的代码:

https://github.com/m-colombo/Tensorflow-EchoStateNetwork

2.23 Extreme learning machines (ELM)

极限学习机,本质上是随机连接的 FFNN。

极限学习机
极限学习机

对应的代码:

https://github.com/dclambert/Python-ELM

2.24 Liquid state machines (LSM)

液态机,跟 ESN 类似,区别是用阈值激活函数取代了 sigmoid 激活函数。

液态机
液态机

对应的代码:

https://github.com/kghose/Liquid

2.25 Support vector machines (SVM)

支持向量机,入门机器学习的人都知道,不解释。

支持向量机
支持向量机

对应的代码:

https://github.com/ajtulloch/svmpy

2.26 Kohonen networks (KN, also self organising (feature) map, SOM, SOFM)

Kohonen 网络,也称之为自组织(特征)映射。

Kohonen 网络
Kohonen 网络

对应的代码KN/SOM:

https://github.com/mljs/som