存档

‘AI-BI-ML-DL-NLP’ 分类的存档

值得关注的开源软件推荐

2017年11月15日 没有评论

作者:灰狐 Allen 来源:GitChat

我们每天的学习、工作、生活大多数都基于开源软件完成,或许你也是这样的,只是没注意到。

  • 一、关于这篇文章
  • 二、开源软件很多很多
  • 三、第一类:框架和编程驱动的应用层
  • 四、第二类:数据驱动的大数据、人工智能层
  • 五、第三类:云计算、基础设施层
  • 六、第四类:操作系统、编译器、虚拟机、编程语言
  • 七、45个开源软件特性、要点
  • 八、资源汇总

一、关于这篇文章

文章标题《值得关注的开源软件推荐》这个话题不是很好理,先按着自己的思路试着写些东西。这篇文章有点流水账,大家多包涵。

我们知道值得关注的开源软件实在是太多太多,选择这个题目也让自己有点为难。不过,试着去理一下对自己来说还是有蛮多收获的,不管正确与否,或许也对大家有所启发和帮助。

本Chat所选的45个开源软件,它们可能不是最流行的,但具有一定的代表性,它们是众多开源软件中的很小一部分。

从这么多开源软件中进行筛选有不少困难,需要我们有个好的思路和方法去有步骤、系统化了解和学习,本Chat就是和大家一起交流和探讨这个话题。希望这篇文章起到抛砖引玉的作用,这里我们只交流、讨论一些思路和方法,并不深入到某个具体项目,这个会留在以后的课程与大家一同学习交流。

开源软件在操作系统、云计算、大数据、编译器、数据库、移动、汽车工业等领域取得了巨大成功,已成主流,这篇文章就先围绕着这些内容展开。

二、开源软件很多很多

开源软件的重要性就不用多说了,它是IT工业的基础。它和我们每个人、每天的学习、工作、生活都息息相关,我们使用的互联网、物联网、车联网都广泛的依赖于它们。

先来看看,如何去寻找开源软件,我这里介绍一个可能是最有效的方式:通过GitHub上AwesomeGitHub Topics的方式去获得,它们已对一些流行热门的开源软件做了梳理和筛选,方便你的选择。这里的开源软件数量足够你在整个职业生涯中去了解、学习和实践的,而且还在持续增加中。

这么多开源软件,我们怎么选?

这需要一个有层次、系统化的了解、学习的方法和步骤。

我们先来看看有层次、系统化的了解、学习、搭建软件堆栈和平台的重要性和必要性。

在我们的工作中,或许都有过这样的经历:前一个团队或核心成员使用的是这个框架或那个平台,新来的团队或核心成员因为自身情况将会使用不同的框架和系统重构或替代前面的产品和架构体系。我自己就经历过用Java平台全面替代.NET平台的经历,其代价也是巨大的,这样的替换相信大家也都有碰到过。若经常性的因为人员变动或其它因素而导致产品和体系架构总是变来变去,带来的研发成本就会不断上升,且因为没有在稳定框架和基础架构上的持续实践和积累,团队的技术沉淀没有,框架和平台价值的体现也就少的可怜,也不能吸引到优秀的人才聚在一起。

所以层次化、系统化的了解、学习、构建公司的技术体系和平台架构就显得尤为重要,这是公司技术委员会或团队Leader的必修课。

举个简单例子:大家可从Anaconda开始Python数据分析之旅,它减少了安装、维护各种Python软件包和版本的工作量和带来的各种不方便,毕竟它整合好了几百个Python软件包。

好了,找到或选型后,接下来就是学习和实践、不断积累的过程。

  • 根据公司发展方向和战略目标,拟定多年计划,不要仅仅只解决眼前问题,要考虑框架、架构、平台的长期有效性和持续发展,不要深度锁定商业服务供应商,尽可能使用开源软件,并可以方便的替换其中部件和重构;
  • 从StackOverflow、知乎等专业网站通过搜索的方式迅速了解一下你所关注的开源软件的基本特性和大家讨论的热点;
  • 以Ecosystem的方式去思考和组织你所关注的开源软件的知识体系,这里给个参考:Node.js ecosystem
  • 在学习和实践的过程中,大家可借助印象笔记或Wiki等方式对不断学习和实践的开源软件做持续的整理。我个人就是通过Wiki的方式不停收集、整理各种开源软件和相关资源的,这个过程持续了11年,有几千个条目,近4000万的浏览量。

本篇文章参考框架涉及的45个开源软件都有Wiki条目进行跟进和维护,不少条目都持续维护了很多年,接下来我们就对它们一一做个大致了解:

  • 应用类:框架、企业应用、编辑器
  • 数据类:数据科学、大数据、机器学习、汽车机器人
  • 服务类:云计算、数据库、消息队列、服务器
  • 系统类:操作系统、编译器、虚拟机、编程语言

类似这样的工作,你自己或团队都可以经常去理一下。

此外,要紧跟所关注开源软件的Conferencce技术大会,这是了解开源软件最新进展和成功应用的一个非常好的方法。我在这里也整理了一些开源软件历年大会幻灯片资料,很有参考价值,欢迎大家收藏。

三、第一类:框架和编程驱动的应用层

通过框架加快应用的开发和上线。

1. 框架:Django、Meteor、Qt

框架类开源软件太多太多,每种语言、不同应用场景都有很多不同的框架可供选择,这里选择了Python、JavaScript、C++三种主流编程语言框架加以简要介绍。

这三个框架都是比较大而全的,覆盖某个领域的大部分应用场景和技术堆栈,它们带来的好处是快速的开发效率和生产力,但同时与会失去灵活性和自由度。喜欢用很多小软件、小工具解决不同问题的用户通常不会选择这些大块头或者说全堆栈的软件平台。

Django是个全堆栈的Python框架,有严格的开发计划和路线图。

django

注意这里的long-term support (LTS),很多开源软件都采用这样的版本支持服务,如:Ubuntu 它在你的版本选择中非常重要。

Django LTS

Django的内容和讨论的话题都很多,入门这块可从Django book 2.0 的中文开始,它把Django重点、要点和内容组织的都很好。

这里我列举一些思路和路线供大家参考:

  • 先动手构建一个最简单的Django项目;
  • 使用Django内置的Admin,再试试一些更好用的Admin解决方案;
  • 看看成功Django项目长什么样的:Mezzanine
  • 浏览Django开发的开源网站,有没有自己喜欢的,有的话先部署一个;
  • 使用Django REST Framework构建REST API;
  • 基于REST API构建一个单页面Web应用(Single Page Application, SPA),这一架构可迅速创建响应式用户交互界面;
  • 如何在Django使用其它MVC框架;
  • 将WebSockets、Tornado和Django结合起来,提供实时Web特性;
  • Django实时服务器除了Tornado外,你也可以使用Erlang等语言编写,这个内容大家自己去扩展下。

Qt是一个跨平台的C++/JavaScript应用框架,是一个桌面、嵌入、移动应用的开发平台,支持Windows、Linux、macOS、Android、iOS、Windows 10操作系统。

2011年,诺基亚出售Qt业务给Digia,该公司将接手Qt商业授权和服务业务,诺基亚也将移交大约3500家商业客户。

Maya、Google Earth、Skype、Telegram、魔兽争霸官方对战平台、网易炉石盒子等都基于Qt构建。Qt在汽车、自动化、医疗、数字电视机顶盒、物联网、移动应用领域都有广泛应用。其中,Qt Automotive Suite值得更多关注。

Qt Automotive Suite

Qt通过整合JavaScript语言,加速用户界面的构建。

QML是种声明式语言(declarative language),它是一个用户界面规范和编程语言,混合JSON语法和JavaScript表达式。

Qt应用目前主流的开发思路是:用QML(Qt Quick)构建交互界面,用C++实现业务逻辑,这也是推荐Qt的一个重要因素。

Meteor是基于JavaScript的框架,用于Web客户端、服务器端以及移动应用。Meteor应用会对数据的变化作出即时响应,因此你将获得即时响应体验,同时,一致的构建过程、前后端统一的包系统以及单个命令的应用部署过程,将在从设计到发布的每一环节上为你节省时间。

这是Meteor简单的堆栈和框架:

Meteor StackMeteor Framework

Meteor带来的优势有:

  • 全栈通用、统一的单一语言 JavaScript;
  • 内置响应式支持;
  • 代码高度重用,提供一大堆基础Packages
  • 提供强大构建工具,帮助快速构建JavaScript Apps;
  • 拥有近13000个软件包的生态系统。

Meteor的更多了解可从七大原则入手:

  • Data on the Wire. Meteor 不发送 HTML,服务器端只负责发送数据,由客户端渲染;
  • One Language. 前后端都是 JavaScript 语言;
  • Database Everywhere. 前后端都可以直接创建存取修改数据库里的数据,且数据安全;
  • Latency Compensation. Meteor 在前端提前获取数据并模拟数据模型,使其看起来像是从服务器端立即返回了数据;
  • Full Stack Reactivity. 实时响应是 Meteor 的缺省配置。在所有层次,从数据库到模板,都会在需要时自动更新;
  • Embrace the Ecosystem. Meteor 完全开源并集成了很多现有的开源工具和框架。如 Angular,React。Meteor 有自己的 AtmosphereJS 包下载管理平台,也可使用 NPM;
  • Simplicity Equals Productivity. Meteor 简单易上手,API 简洁优雅。

除Meteor和Node.js外,Angular和React可能是大家关注最多的两个JavaScript框架和平台,它们背后是Google和Facebook的推动。鉴于React因为版权专利问题,我们先放一下。Angular2官方推荐语言是TypeScript。有关ECMAScript、JavaScript、TypeScript、CoffeeScript、ClojureScript标准、语言和框架的话题有很多很多,大家可去扩展这部分的知识体系。

同时,这里也贴一张Angular2学习路线图供大家参考。

此图来自:知乎

我想,这幅图对Angular2有用,对Meteor等其它框架的学习也有一定的参考价值。

说到选择哪个框架,涉及的就是各种比较,本篇所列举的45个开源软件和项目也是各种比较的一些总结,所以生活在开源软件的世界里,比较就是家常便饭。若是作为开源软件的开发者和维护者,要做的工作也就更多了,除编程基本功扎实,维护和Bug修复外,不停的学习其它优秀的同类项目也是一门必修课,从别人身上学习优点,但又不能完全照搬,需考虑自身项目的个性和特性,又要兼顾通用功能和特性的整合,在保证项目代码和版本稳定的同时,又要不断调整和平衡新版本的需求和特新,又要很好兼容老版本,其过程想想都觉得难。所以一个成功的开源项目,除了独特的个性外,还要平衡和兼容好共性,在这里给开源软件开发者致个敬。

这节话题结束前,放一个Angular2 相比 Vue 有什么优势?项目对比的分析,是Vue作者写得,挺有趣,大家可看看。

2. 应用:odoo、iDempiere、Moqui

在这里我们说说三个企业应用,三个开源ERP/CRM开源软件。

说到企业应用,首选Java语言。除了Java语言,这几年因为数据科学和机器学习的热潮,极大的推动了Python语言在企业的普及。此外,XML作为企业应用的数据表示、存储、转换的标准已被广泛采用,而且各行各业的XML规范已经成熟和稳定。

所以简单讲,企业应用 = Java + Python + XML/JSON + RESTful API (当然, .NET也是一个不错的选择)

odoo是近几年发展非常迅猛的开源ERP/CRM套件,使用Python、XML、PostgreSQL构建。之前,写了篇odoo:开源 ERP/CRM 入门与实践的文章,大家可看看,普及一下odoo的基础知识。

iDempiere = OSGi + Adempiere

OSGi是Java模块化的非官方标准,很强大,也复杂。它是很多开源软件的基础架构,如:Eclispe;也在工业界有很多应用,BMW汽车的应用控制系统就采用OSGI作为其底层架构, 这套系统主要用来控制汽车上的音箱、灯光等设备,总共由1000多个Bundle构成,但BMW汽车的应用控制系统启动时间却只需要3.5秒。

OSGi在汽车工业领域的应用可作为大家了解OSGi的重点。

Adempiere是一个很主流的开源ERP/CRM系统,也是一个完整的企业应用套件和堆栈。

Adempiere

Adempiere衍生自Compiere,因为Compiere越来越封闭和私有,就有了现在的Adempiere,很多开源软件也都是这样产生的。同时,Compiere也失去了可能成为No.1开源ERP/CRM的机会。

说到这,也说说Solaris和OpenSolaris,在Sun被Oracle后,因为Oracle的封闭,现在的它们也基本走向死亡,Oracle同时也玩死了NetBeans和OpenOffice,基于OpenOffice的LibreOffice代表着未来。

类似的故事还有很多很多,当前是个开放开源的时代,封闭自嗨的基本都会走向衰败。就连很封闭的苹果和腾讯也在不断调整自己的开源、开放战略,并陆续推出一些开源软件。

好了,现在说说Moqui。

Moqui的作者是Apache OFBiz的设计者和开发者,在企业数据模型和流程上有非常深的造诣。Moqui基于OFBiz十多年来的项目实施经验以及作者的设计、开发和方法论,包括纯粹的关系 数据层以及面向服务的逻辑层。Moqui框架的核心代码只有OFBiz核心框架代码的15%左右,提供了更多有意义的功能和更多的高级工具,使用Groovy和Java语言。

Mogui是一个企业ERP/CRM的生态系统,一个类似地球:地核、地幔、地壳的的构造结构。

Moqui

  • Moqui Framework: 核心 Core,就像 Linux 的 Kernel 内核一样
  • Moqui Mantle,地幔业务构件: 一组通用的、可作为你各种场景业务系统的基础业务构件集合,包含:
  • 通用的数据模型,Universal Data Model (UDM)
  • 通用业务服务库,Universal Service Library (USL)
  • 通用业务过程/流程库,Universal Business Process Library (UBPL)
  • Moqui Crust,地壳(插件):主题皮肤、 综合的工具集、不同行业的应用支持、大公司规模支持、业务领域支持等

初步体验了Moqui,感觉使用它构建应用很快,大部分工作就是编写XML、脚本和构件,描述数据、业务和流程。介绍它是因为以往大多数企业应用都是硬编码实现、数据、业务、编码紧耦合,而Moqui采用XML定义模型、服务和流程,提高了整个系统的可描述、可维护性。Moqui支持如下的几种类型的构件:

  • 实体 entities : 贯穿于整个业务系统中的关系数据模型(直接使用模型,无需复杂的对象关系映射)
  • 界面 screens 和 表单 forms : 用于基于 web 的应用界面或者其他用户接口(通用方式是基本构件描述存放在 XML 文件中,或者用户指定扩展存放于数据库中)
  • 界面转换 screen transitions : 用于配置页面到页面的流转以及设置页面跳转时,业务处理过程的必要输入
  • 服务 services : 远程调用的方式运行内部逻辑交互或者曝露外部的服务
  • ECA(事件-条件-行为 event-condition-action)规则 : 用于类似实体、服务操作以及 email 信息接收等系统级事件触发

Mouqi应用中通用部分以及构件之间的关系:

Mouqi add-ons

Mouqi先了解到这,让大家对它有一个总体认识,后续我们再深入下去。

3. 编辑器:Emacs、Vim、Atom

编辑器是所有计算机系统上最普遍的应用之一。

除了开发者日常使用的一些大块头IDE外:Eclipse、Visual Studio、Xcode等,这类小巧、轻盈的编辑器也备受程序员喜爱,它们是Emacs、Vim、Atom。

这篇文章由Emacs和Markdown Model编写,在macOS(基于XNU/Dawnin)上完成,呵呵。

  • Emacs:神一般的编辑器,一个不折不扣的“操作系统”,一个终极工具!
  • Vim:改进的vi,命令行编辑器的标准。
  • Atom:用户友好的编辑器,照顾IDE用户的鼠标使用习惯。

Emacs和Vim都鼓励减少鼠标使用,强迫使用键盘,熟练使用键盘编程是进阶和高效编程的必由之路,想想看在整个工作中,没碰过鼠标,全部用键盘完成是不是感觉有点酷。

Vim有自己的语言Vimscript,Emacs有Emacs lisp。

Emacs的设计目标就是,你装了个Unix或者Linux系统,不需要装任何其它软件,只要装一个Emacs就够了,它能帮助你完成所有的任务。也就是说,除了编程,你还可以用它写论文、做幻灯片、浏览网页、收发邮件、聊天、听歌、看照片、玩游戏……目前,好像除了直接在Emacs里看电影还不行,其它的都实现了。(ps:这一段是直接引用,因为太赞同)

通过使用Emacs,接触Emacs社区,让自己感受和学习更多的黑客文化,通过Emacs接触Emacs Lisp,这也是乐趣的开始!

Vim比较适合前端开发,其它语言,如:Java,还是使用IDE比较好。

Vim主要特点有:

  • Vim有多种模式:普通模式,插入模式,可视模式,命令行模式;
  • 使用Vim的主要精力在定位操作上;
  • 常见定位命令如:上下左右的操作,k 上行、j 下行、h 左、l 右;
  • 定位后就是操作,Vim操作命令是原子性的,可随意组合操作命令,如:daw(delete a word)、caw(change a word)。

除了Vim外,Vi家族还有几个其它的克隆项目:

  • nvi:新vi,vi官方的伯克利版本
  • elvis
  • vile:类Emacs的Vi

Atom 是一款基于 Electron framework、node.js 构建的跨平台编辑器。它是 Emacs 和 Vim 之外推荐的开源编辑器,非常适合前端、Web开发,也支持广泛的编程语言。

基于Atom和Electron framework构建的还有微软的Visual Studio Code和Facebook的Nuclide

Visual Studio Code是我很喜欢的,它非常强大和易用,拥有庞大的插件库和资源。

四、第二类:数据驱动的大数据、人工智能层

大数据热了好多年,这几年是人工智能,它们的核心是数据和算法,这是一个数据驱动的时代,我们每天都在产生大量的数据,对数据来说,有个庞大的知识体系:数据科学。

数据科学

4. 数据科学:Jupyter、Pandas、Anaconda

Juypter是一款面向数据科学和人工智能的前端交互工具,基于IPython构建,是IPython的未来发展方向。

Anaconda Python 是自由使用的面向大规模数据处理、预测分析和科学计算的企业级Python发行版。Anaconda 以 Red Hat 和 Debian Linux 发行版的方式来分发 Python企业版。

Anaconda

Anaconda是个大的数据科学软件堆栈和平台,当然,你也可以选择自己去搭建。

使用Python进入数据科学领域的同学就可从Anaconda入手,主要是方便。它提供GUI和命令行两种方式,使用包管理工具Conda,如安装pandas、Jupyter:

conda install pandas

>>> import pandas as pd
>>> pd.show_versions()

conda install jupyter

Pandas是非常重要的数据科学Python软件包,基于NumPy构建,简化了以NumPy为中心的应用开发。NumPy的基础是数组和矢量计算,NumPy的ndarray是一种多维数组对象,利用数组进行数据处理。

Pandas的优势也体现在它的数据结构上,两个主要的数据结构:

  • Series
  • DataFrame

写个简单的例子感受下

Jupyter

总之,进入数据科学领域的同学,这三个开源软件都绕不过。

5. 大数据:HDP、CDH、HPCC

HDP和CDH都是Apache Hadoop分发版,HPCC是一个C++开发的大数据处理和分析平台。

  • HDP:100%开源,零锁定;
  • Hortonworks解决方案包含HDF和HDP;
  • Hortonworks DataFlow(HDF)收集、组织、整理和传送来自设备、传感器、点击流、日志等的实时数据;
  • Hortonworks Data Platform(HDP)用于创建安全的企业数据湖,为企业提供实现快速、实时商业洞察力所需的分析信息。

HDP是一个开源大数据的生态系统

Apache Metron实时大数据安全

CDH除没有HDP那样开放开源外,其它都很类似。Cloudera有很强的商业化解决方案和服务能力,取得了很好的商业价值,应该是目前最赚钱的Hadoop商业化公司,同时也开源了众多优秀的开源软件,如:Impala

HDPCDH文档都组织、整理的不错,可作为了解、学习大数据、Apache Hadoop的一个重要资源。

ODPi: the open ecosystem of big data

在这里提一下ODPi项目,这是Linux基金会下的一个项目,成员包括HDP的开发商Hortonworks。

鉴于Linux基金会的成功运作和治理能力,ODPi可关注,以生态系统的思考方式去了解整个大数据市场,国内已有大数据公司来此占位。

ODPiODPi大数据生态系统

在Apache Hadoop & Spark统治的大数据市场,HPCC显得弥足珍贵,值得更多关注。

HPCC 包括以下核心组件:

  • Thor (the Data Refinery Cluster)
  • Roxie (Rapid Online XML Inquiry Engine, the Query Cluster)
  • ECL (Enterprise Control Language)
  • ECL IDE
  • ESP (Enterprise Services Platform)

HPCC

HPCC在安全、身份和风险管理有众多成功案例。

6. 机器学习(深度学习):Caffe、MXNet、TensorFlow

选择TensorFlow、Caffe(caffe2)、MXNet,一方面是软件很好,另外一个重要因素是背后有Google、Facebook、Amazon等巨头在推动,并在自己的产品服务线广泛部署,其可靠性、可伸缩性得到最大规模和严格的验证。

TensorFlow在GitChat人工智能板块已有了最多的课程和介绍,它的重要性就不多说。

TensorFlow官方文档中文版可作为你学习TensorFlow的重要参考,英文好的直接跳过。

编程语言入门有Hello World,机器学习入门有MNIST。MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片。它也包含每一张图片对应的标签,告诉我们这个是数字几。你可从MNIST开始你的机器学习,熟悉神经网络和MNIST数据集,去构建一个深度卷积神经网络。

ps:一个小道消息:MS因为内斗严重很难发力,所以用CNTK,Torch,TensorFlow,MXNet,Caffe的都有,自家的CNTK很难形成规模。

相对于TensorFlow这种重量型的后端,MXNet的轻量化路线使得可以我们在花费Google brain 1/10的人力的情况下做到类似TensorFlow技术深度的系统。(MXNet开发者李沐)

那到底选择哪个深度学习框架呢?或许贾杨清同学的这段话会给你个答案,他是Caffe(Caffe2)的作者,同时也是TensorFlow的开发者和贡献者。

另外我还要强调的是我最近每个演讲都会提到的“unframework”,或者说“unix philosophy”的观点:framework不重要,重要的是技术,这也是我一直主张把核心软件比如说Gloo,NNPACK,FAISS这些单独放出来,不放在框架里面的原因 – 每个框架都可以拿这些软件来优化,这才是做community的道理。老实说,Caffe我也参加了,TensorFlow我也参加了,C2我也参加了,最重要的是大家开心,能学到技术,能用得方便。

说到机器学习、深度学习,我想表达自己的一个观点。当前,我们都在关心机器学习,其实,我们也应该更多关心一下如何让我们自己更高效的学习,成为一个学习机器。当然,这里的学习机器是有更多思考和创造力的那种。未来是机器学习和学习机器相互学习、共同促进的世界,谁更聪明,谁就有更多支配和主导权,大家相辅相成,共同进化。

7. 汽车机器人:Automotive Grade Linux(AGL)、ROS、Apollo Auto

汽车、机器人是大数据和人工智能重要的应用领域,机器人装上人工智能的大脑将更多从事人的工作,未来很多工作将被人工智能机器人取代,而给机器人喂食的就是大数据。

首先,基于AGL的丰田佳美(Toyota Camry)将于2018亮相北美市场。

AGL是Linux基金会项目,基于Tizen项目构建,最初由韩国三星主导,现在为Linux基金会项目。

美日韩三国高科技公司主要在推动这个项目,其System Architecture Team(SAT)包含5-10个核心成员:Denso, Fujitsu TEN, Microchip, Panasonic, Intel, Renesas/IoT.bzh, Toyota

这张图很重要,它把AGL、Tizen和GENIVI三者以AGL UCB的方式融合在了一起。

AGL UCB

在汽车工业使用LTS: Long Term Stable Kernel,这点很重要,这两份文档可参考。

不知道到百度阿波罗计划的Linux核心是如何评估选择的?

百度Apollo托管在GitHub的开源软件

  • Apollo: An open autonomous driving platform
  • Apollo Platform: based on Robot Operating System(ROS)
  • Apollo Kernel: based on Linux Kernel 4.4.32

因为Apache v2, ROS, Linux Kernel,Apollo Auto也在这介绍一下。

百度Apollo开放平台被称为“汽车界安卓”,我想这个应该在成功后再被称。

Apollo1.5开放五大能力:

  • 障碍物感知
  • 决策规划
  • 云端仿真
  • 高精地图服务
  • 端到端的深度学习(End-to-End)

金龙客车通过Apollo 1.0的成为首例商用车落地实例。

百度Apollo开放平台通过阿波罗基金专注于汽车行业及自动驾驶领域的人民币股权投资,简单讲就是砸钱和收购,快速形成一定规模。

目前,Apollo基金第一期20亿已到位并在快速运行,目前已完成数个项目的投资。也将在未来3年完成100亿&100+个项目的投资。总之就是有钱,自动驾驶创业的同学们这也是很快变现的方式。

我们都知道自动驾驶这件事是个非常复杂、非常庞大的工程,可有人一个人就干成了,天才黑客George Hotz自己开发了一套汽车自动驾驶系统,而且成立了公司Comma.ai专注这件事,点开网页看实测效果还是很不错的。

百度Apollo和comma.i项目对比 (截止2017.11.8上午10点)

  • comma.ai openpilot: 6516 Star
  • comma.research: 3488 Star
  • 百度Apollo: 6362 Star

我也知道这个对比没什么意思,只是出于对天才的仰视。

Robot Operating System(ROS)是一个应用广泛的机器人系统和开源软件框架,ROS的基本原理是无需改动就能够在不同的机器上复用代码。ROS提供了一个标准的操作系统环境,包括硬件抽象、底层设备控制、通用功能实现、进程间消息转发和软件包管理等。

ROS方程式

ROS 提供了 C++ 和 Python 两种主要的编程接口,也可集成 Arduino,ROS 2.0 采用了DDS(数据分发服务)。

ROS & Arduino

随着ROS 2.0的开发,ROS能够兼容除Linux之外更多的操作系统,如Windows、Android;能够支持从工业计算机到Adruino开发板等各类型的硬件;能够采集RGB-D摄像头、普通摄像头和各种类型的传感器数据;能够驱动类人形机器人、四轴飞行器等各类型的机器人。新版本的ROS在采用SOA架构的基础上,集成了MVC框架,更加有利于机器人人机交互界面的开发和机器人控制。

由于ROS极大的开放性和包容性,它能够兼容其他机器人开发工具、仿真工具和操作系统,使之融为一体。这使得ROS不断发展壮大,并成为应用和影响力最广泛的机器人软件平台。

学习ROS,掌握一把通往未来的钥匙。(ps: 这部分内容取自《ROS机器人程序设计》(原书第2版))

关于市场份额:作为一家拥有近37年历史的嵌入式操作系统开发商,QNX在车载信息娱乐系统或车联网系统占据超过50%的市场份额,QNX是仪表盘背后的隐形王者,大家可关注下。

五、第三类:云计算、基础设施层

如何支撑上层的数据分析和应用,需要有个强大的软件基础设施,我们以云计算、数据库、消息队列和Web Server来搭建这个基础设施。

云计算对所有的计算资源、存储资源、网络资源进行系统管理,用数据库进行各种各种类型数据的存储和处理。以消息队列作为数据传输和应用交互的机制,Web Server将各种服务以RESTful的方式部署。

8. 云计算:OpenStack、OpenShift、SaltStack

云计算数据中心是一项具有战略意义的基础设施,其重要性和普及知识就不多讲了。

这里主要简单介绍IaaS、PaaS两种主要的云计算服务模型,其代表有:OpenStack、OpenShift

IaaS,PaaS

OpenStack是开源云平台的事实标准。

OpenStack使用Python语言编写,使用了Django、Tornado和Twisted等框架,使用AMQP消息协议和Redis分布式K/V存储。

OpenStack可以说是Linux之外最大规模的开源项目,有大量公司和开发者参与构建这个开源云平台生态系统,也有很多OpenStack发行版可供用户选择,国内用户可关注这几家OpenStack供应商:

Google加入OpenStack基金会推动着Docker/Kubernetes与混合云加速融合;EasyStack联合创始人&CTO刘国辉谈到:

”Google加入OpenStack体现了对于数据中心控制平面的争夺已经结束,以容器为代表的应用形态与以虚拟化为代表的系统形态将会完美融合于OpenStack之上,并与软件定义网络和软件定义存储一起统治下一代数据中心。“

OpenStack+K8S

OpenStack、Ansible、SaltStack等开源软件也极大奠定了Python在数据中心的地位。

OpenShift是RedHat推出的基于Docker和Kubernetes构建的PaaS开源容器云平台。

OpenShift能给用户带来什么?可参考红帽OpenShift的业务价值

OpenShift业务价值亮点有:

  • 5年平均投资回报率:531%
  • 每年每100名开发人员实现的年度平均效益:129 万美元
  • 应用程序开发生命周期加快:66%
  • 开发每个应用程序所需的IT员工时间减少:35%
  • 每个组织增加的收入:742万美元
  • 每个应用程序的IT基础架构和开发平台成本降低:38%

OpenShift

总结起来:加快产品、服务研发和交付时间,减少研发成本,增加企业收入,降低基础架构投资,获得更高的投资回报率。

为什么在这里把这个提出来说说,也是出于自己的一些经历。

在我们运作开源软件商业化服务时,开源软件需要有个好的商业包装。开源软件对我们开发人员很熟悉,但很多最终用户和客户却不了解,他们可能根本就不知道什么开源软件,你给他们大谈开源软件,他们会一脸茫然。若你把开源软件以类似这样的方式讲给他们听,效果可能会更好,也更容易成交业务,所以基于开源软件做商业化服务的同学很有必要建立起这样的思维模式,将好用、强大的开源软件做更好的商业包装。这方面的成功公司有很多,你可更多跟进Red Hat、Ubuntu、MongoDB、Hortonworks等开源软件公司,它们把开源和商业融合都做得相当出色。

此白皮书也可作为开源软件商业价值分析的参考,大家基于开源软件做商业化公司和运营时可参照这样的思路思考下去。

Docker容器和Kubernetes容器编排已成为企业交付软件和服务的行业标准,OpenShift可直接作为企业DevOps & CI/CD的基础设施, 成为部署微服务的多租户平台。

Red Hat也在积极推动区块链技术在OpenShift的应用部署,与BlockApps的合作,为其提供区块链平台的PaaS基础设施。

BlockApps on OpenShift

BlockApps

OpenShift生态系统已初具规模,这可增强大家选型的信心。不过,因为OpenShift的平台规模也比较大,定制化和扩展的难度也会加大。这也是我们常碰到的问题,选个大块头的开源平台堆栈,还是选择自由装配和维护各种小软件的融合方式。这是两种不同的思路,团队Leader和技术团队要仔细评估和做出平衡。

SaltStack是 Python开发的开源配置管理和自动化工具,SaltStack提供了一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度快,服务器之间秒级通讯。

关于SaltStack,大家可从以下几点去加深了解:

  • 理解Salt的动机,以及它们将影响运维人员的使用方式;
  • 更好地使用云服务,包括EC2、Azure及OpenStack等,支持更大规模云计算平台部署;
  • 学习新的RAET协议,并了解它如何改变自动化工作方式;
  • 使用ZeroMQ消息队列,管理端Master,客户端Minion,如何进行数据交换和消息传递的。

Ansible基于SSH协议传输数据,Saltstack使用消息队列zeroMQ传输数据,MQ通讯和SSH通讯,速度相差大约几十倍。

我们推崇使用消息队列MQ来进行数据传输和通讯。

与Ansible的比较,SaltStack 与 Ansible 选择?供大家选型参考。

9. 数据库(数据仓库):Riak、OrientDB、Apache Kylin

Erlang驱动的数据库,在分布式、消息、并发、可伸缩、容错方面有天然优势,Riak数据库天生就拥有这些能力。

Riak数据库以Riak Core、Riak KV、Riak TS、Riak S2的方式提供了构建分布式系统、键值存储、时序存储、对象存储的核心软件基础设施。

Riak公司在数据库对比选型上做了充分的工作,把几乎主流的开源数据库都对比了一下

  • Riak Compared to Cassandra
  • Riak Compared to Couchbase
  • Riak Compared to CouchDB
  • Riak Compared to HBase
  • Riak Compared to MongoDB
  • Riak Compared to Neo4j
  • Riak Compared to DynamoDB

其实,每个选型的开源软件都可能涉及这样的广泛比较,所以工作量是比较大的,大家可参考。

多范式、多流派(面向对象、模版、函数式、过程式)的混合式语言设计方法帮助C++成为解决复杂、多样性问题的编程语言首选。

多模型数据库OrientDB(对象模型、键值模型、文档模型、图模型)让其集多种数据库类型于一身,使其能应对多种应用场景,减少多种数据库部署运维带来的开销和成本,OrientDB这样的多模型设计是否也能像C++这样被大多数开发者所认可与接受?

strong text对象模型

Relational Model Object Model OrientDB Object Model
Table Class Class or Cluster
Row Object Document or Vertex
Column Object property Document field or Vertex/Edge property
Relationship Pointer Link

键/值模型

Relational Model Key/Value Model OrientDB Key/Value Model
Table Bucket Class or Cluster
Row Key/Value pair Document
Column not available Document field or Vertex/Edge property
Relationship not available Link

文档模型

Relational Model Document Model OrientDB Document Model
Table Collection Class or Cluster
Row Document Document
Column Key/value pair Document field
Relationship not available Link

图模型

Relational Model Graph Model OrientDB Graph Mode
Table Vertex and Edge Class Class that extends “V” (for Vertex) and “E” (for Edges)
Row Vertex Vertex
Column Vertex and Edge property Vertex and Edge property
Relationship Edge Edge

再说说Kylin是什么?

  • 可扩展、超快OLAP引擎:Kylin是为减少在Hadoop上百亿规模数据查询延迟而设计;
  • Hadoop ANSI SQL 接口:Kylin为Hadoop提供标准SQL,支持大部分查询功能;
  • 交互式查询能力:通过Kylin,用户可以与Hadoop数据进行亚秒级交互,在同样的数据集上提供比Hive更好的性能;
  • 多维立方体(MOLAP Cube):用户能够在Kylin里为百亿以上数据集定义数据模型并构建立方体;
  • 与BI工具无缝整合: Kylin提供与BI工具,如Tableau,的整合能力,即将提供对其他工具的整合。

Apache Kylin已成功部署于百度、美团、网易、京东、唯品会、中国移动、中国电信、国泰君安、华泰证券、联想、OPPO、魅族、去哪儿等公司,支撑着用户行为分析、流量日志分析、电商分析,广告效果分析,实时分析等基于数据仓库及多维分析(OLAP)技术的数据服务。是传统数据仓库、商业智能技术在互联网企业大规模应用的真实案例。

Apache Kylin有健康发展的生态系统

Kylin

在这篇文章中,我们多次提及生态系统。这个大家多重视,逐步建立起层次化、系统化、平台化的思考方式。

10. 消息队列(即时通讯):RabbitMQ、Kafka、ejabberd

在介绍RabbitMQ之前,说说 Advanced Message Queuing Protocol (AMQP,高级消息队列协议)

AMQP的愿景是:从任何发布者到任何感兴趣的消费者之间的信息,通过一条软件总线实时动态的连接起来。

RabbitMQ就是要实现AMQP愿景的开源软件,AMQP的就如同电话交换机的架构,选择Erlang也在意料和情理之中。Erlang是一门消息并发编程语言,它为通信而生。

除AMQP标准外,Extensible Messaging and Presence Protocol(XMPP)是开放即时通信标准,其代表产品是Erlang开发的Ejabberd,可以说Erlang支撑起了AMQP和XMPP两大标准的开源软件实现。Erlang是消息队列、即时通信的首选语言。

XMPP是一个有着18年历史的开放消息标准,被广泛应用于物联网、即时通信、社交网络和实时Web领域,支持众多的开发语言和操作系统。

Apache Kafka 是一个高吞吐量的分布式消息系统,使用 Scala 开发,它已是企业应用和大数据生态系统中的核心组件,它是消息、数据、实时流的中心Hub。

Kafka

由阿里巴巴捐赠给Apache基金会的RocketMQ也在健康的发展着,和Kafka很类似,大家下来可做些对比评估和选型。

此外,ZeroMQ大家也可多关注,上面介绍的SaltStack就使用ZeroMQ作为传输机制,且大量的开源软件中也包含了ZeroMQ的使用。

OpenMessaging项目由阿里巴巴发起,与雅虎、滴滴出行、Streamlio公司共同参与创立的分布式消息中间件、流处理领域的应用开发标准,目前已正式入驻Linux基金会。

消息队列是重要的基础设施,因为它解耦、连接各种数据、应用和服务,充分体现互联网连接一切的本质。

11. 服务器:Nginx、Jetty、Cowboy

Nginx是轻量级、高性能 Web Server的首选,几乎部署在所有主流的互联网公司。

除了Nginx官方版本外,大家也可关注Nginx两个分发版本:

Apache Tomcat和Eclipse Jetty是Java Web Server的默认选择。

  • Jetty更轻量、更容易定制;Jetty架构基于Handler,扩展更容易,而Tomcat是基于容器设计,不易扩展;
  • Google GAE选择Jetty,定制足够小的Java Web Server支撑GAE业务;
  • Apache Tomcat和Eclipse Jetty背后是两大开源基金会的合作与竞争。

Cowboy是比较另类的,它使用Erlang开始,是一个小型、快速和模块化的HTTP服务器,常用Cowboy构建嵌入式Web Server。

个人很倾向使用Erlang开发通用的Web Server,因为Erang分布式、消息、并发、可伸缩、容错方面的天然优势,有兴趣的同学可尝试基于Cowboy构建。

六、第四类:操作系统、编译器、虚拟机、编程语言

好了,现在我们来到最底下的一层:系统层,它包含操作系统、编译器等核心软件,是每台计算设备不可或缺的组成部分。

12. 操作系统:GNU/Linux、XNU/Darwin、FreeBSD

首先简单回顾下UNIX/BSD操作系统的历史

UNIX-like

我们只关心图中上面BSD和GNU家族的东东,下面的都是商业的UNIX操作系统,我们就不考虑了。

BSD家族最具代表性的就是FreeBSD,它是GNU/Linux之外最可靠的选择。它强大、稳定、坚如磐石,也是苹果操作系统的重要组成部分。

苹果最近开源了XNU项目

XNU是XNU is Not Unix的首字母缩写,类似GNU是GNU’s Not Unix的缩写,我们暂且也以GNU/Linux的方式来称呼XNU/Darwin。

OpenDarwin以前有发布过,但因为一些原因关停,这里有网站存档

XNU是个混合内核,包含两部分:BSD和Mach。macOS在剥离了Cocoa、Carbon等东西后,剩下的叫Darwin,它包含POSIX兼容、UNIX线程、进程实现。

XNU内核是macOS和iOS的核心,由三个主要部分组成的一个分层体系结构:

  • 内核的内环是Mach层,源自卡纳基-梅隆大学开发的Mach内核;
  • BSD层;
  • I/O Kit。

macOS架构

Darwin和macOS

macOS核心架构

GNU/Linux的分发版很多,除了两大主流Debian/Ubuntu和RedHat/CentOS外,大家可更多关注下:NixOS Linux

它包含几个很有特色的项目:

  • Nix:包管理器,也可用于macOS平台。
  • NixOps:云部署工具
  • Hydra:基于Nix的持续构建系统
  • Disnix:分布式服务部署工具集

GNU/Linux驱动的Android现在已成为移动操作系统的主导,基于它的生态系统会逐渐放大。此外,以OpenWrt、ROS为代表的嵌入式、机器人操作系统也在GNU/Linux的生态系统的驱动下逐渐壮大。

OpenWrt是适合于嵌入式设备的一个Linux发行版,国内主流的路由器:如极路由、小米路由器、魅族路由器、魔豆路由器等都基于OpenWrt构建。相比Android系统,OpenWrt被认为是更加适合智能设备和机器人的软件平台,被誉为下一个时代的Android,值得更多关注。

在操作系统环节,我想聊一下虚拟化和容器技术。

虚拟机技术在操作系统、程序设计语言和计算机体系结构中占据了重要位置,它是系统与进程的通用平台。

在“进程级“ 虚拟机技术可用于实现动态二进制翻译、平台无关的网络计算等能力;而在“系统级”,可以在同一个硬件平台或一个服务器集群上同时提供多个操作系统环境。

可以说,Solaris Zone是操作系统虚拟化做得最出色的解决方案,只可惜。

最近,阿里巴巴也宣布开源它的容器技术:Pouch

13. 编译器:GCC、LLVM、Babel

GCC(GNU Compiler Collection,GNU编译器集合)是最重要的开源软件,因为其它几乎所有开源软件都在某种层次上依赖于它,核心编程语言是C语言。

LLVM(Low Level Virtual Machine)底层虚拟机,是一个开源(BSD)编译器的基础设施,使用C++编写。

LLVM

GCC和LLVM是编译器领域的两大巨头。

GCC和LLVM的体系很庞大,其内容、细节和知识点太多太多,留在后续的课程我们学习交流,后面有推荐的编译器书籍大家可参考。

Babel 是一个通用的多用途 JavaScript 编译器。更确切地讲是源码到源码的编译器,通常也叫做“转换编译器(transpiler)”,简称转译。

Babel 能把用最新标准编写的 JavaScript 代码向下编译成当前可用的老版本,Babel 能够让你提前使用 JavaScript新标准。

Babel 插件体系让其拥有庞大的生态系统。

Babel 三个主要处理步骤是:解析(parse),转换(transform),生成(generate):

  • 解析代码并输出抽象语法树(AST)含词法分析和语法分析;
  • 转换接收AST并对其进行遍历,对节点进行添加、更新及移除等操作, 这是最复杂的过程,同时也是插件将要介入工作的部分;
  • 代码生成把AST转换成字符串形式的代码。

Babel是下一代JavaScript编译器,说到Babel,也会提及TypeScript。TypeScript是JavaScript超集,是JavaScript的强类型版本,通过TypeScript Compiler API,开发者可以自己实现编译器。

可简单理解为:TypeScript = Type + ES6

Babel Handbook可作为你学习Babel的入门参考。

14. 虚拟机(运行时):JVM、.NET Core、BEAM(Erlang)

在前面操作系统章节我们提到过虚拟机,这一节我们也将了解一些有关编程语言虚拟机的技术。

虚拟机技术极大的丰富和繁荣了编程语言的生态系统,我们知道JVM平台有很多编程语言,可能你不知道有超过200多种编程语言运行在JVM平台上,它们共同繁荣了JVM生态系统。

JVM

JVM的实现也有很多,大家可关注以下几个:

  • HotSpot Oracle官方实现
  • IBM最近开源了OpenJ9Java虚拟机项目
  • Kaffe
  • Jikes RVM Java开发的虚拟机,可作为研究项目

常见语言也有很多JVM实现版本:

  • Erlang: Erjang A JVM-based Erlang VM (多关注)
  • JavaScript: Rhino
  • Python: Jython
  • Ruby: JRuby
  • PHP: Caucho Quercus

此外,.NET平台也托管了很多编程语言:C#, F# …

JVM和.NET两大平台外,值得大家更多关注的是Erlang及其虚拟机生态系统。

这三类平台,个人倾向选择将其用于不同的领域,如:

  • JVM平台更多用于企业应用,如:电商ERP、大数据平台等;
  • .NET平台更多用于泛娱乐、游戏等,当前最火的王者荣耀就基于.NET的Unity平台构建,且微软几十年个人电脑操作系统的使用和广泛普及;
  • Erlang平台主攻消息、通信、电信基础设施、软件基础架构。

15. 编程语言:Erlang、Clojure、F#

基于这三大虚拟机的三门主流语言:Erlang、Clojure、F#,它们也是函数式编程语言的代表。

JSR-335(Lambda Expressions for the Java TM Programming Language)中定义的Lambda对Java语言语法产生深远影响,函数式编程将成为主流。

在上面,Erlang被多次提到在Riak数据库、RabbitMQ消息中间件、Cowboy web server中的应用,Erlang的天然优势就是:分布式、消息、并发、可伸缩、容错。你可以在笔记本上轻松创建300万个进程。300万Erlang进程

Clojure 是一种运行在 Java平台上的 Lisp 方言,Lisp 是一门可编程的编程语言 (Lisp is a programmable programming language) Clojure将这门函数式编程语言带到了JVM生态系统。

Java、Scala、Clojure是JVM平台上三种主流的编程语言,它们的定位是怎么样:

Clojure is about Data, Scala is about Types, Java is about Objects.

先了解几个Clojue的成功应用:

  • Apache Storm 是 Twitter 开源的大数据实时处理引擎,采用 Clojure、Java 语言开发,大概一半 Clojure、一半 Java;在进程之间,Storm采用ZeroMQ进行通信;
  • 花旗信用实时风险估值系统Java/Clojure后端(1500节点分布计算)花旗投资信用部实时风险计算系统,逻辑使用Clojure;
  • 沃尔玛: “Our Clojure system just handled its first Walmart black Friday and came out without a scratch.” – Walmart Labs

此外,ClojureScript: Clojure to JavaScript compiler 大家多关注。

F# = Objects + Functional

Mixed OO/Functional Programming Has Won

F#(F sharp)是微软开发的基于.NET语言运行时的程序设计语言,采用 Apache v2 许可协议。这是一门函数式编程语言(FP,Functional programming),函数式编程语言最重要的基础是Lambda Calculus。

F#和OCaml是ML函数式编程语言的两种主要方言,有时F#和OCaml的程序是可以交互编译的。

F#支持高阶函数、柯里化、惰性求值、Continuations、模式匹配、闭包、列表处理和元编程。在早期,F#作为一门适合于金融和计算密集型的语言而闻名。现在,F#既用于算法密集型应用程序,也用于主流业务应用程序。在算法密集型应用程序中,正确性至关重要,而主流业务应用程序则在很大程度上受益于F#支持领域建模并让非法状态不可达。

F#在数据科学领域具有很大优势,基于Atom编辑器的数据编程

F# Data Science

好了,我们走马观花般的过了一遍这45个开源软件,主要让大家大致了解和认识一下它们。

最后,我们把这45个开源软件以核心特新和要点的方式再整理一下。

七、45个开源软件特性、要点

思考、总结、提炼单个开源软件的核心特性和要点,看看它能为团队带来什么帮助,能力有哪些?

1. Django

  • Django和Flask是使用最广泛的Python Web框架;
  • Django提供Web一站式解决方案:会话、缓存、ORM、验证、表单处理、后台管理等,但系统耦合度高,替换内置功能比较麻烦,学习曲线较陡;
  • Django和Flask都基于WSGI,这是同步阻塞接口,不能使用异非阻塞的编程模式,你可考虑使用Klein微框架,用法很像Flask,可以异步方式编写Web应用。

2. Meteor

  • 一个面向Web和App的应用框架和构建平台
  • Meteor 7大原则;
  • 超过12000个包的生态系统。

3. Qt

  • Qt核心:元对象系统、属性系统、对象模型、对象树、信号槽(Signal/Slot),Qt的Signal/Slot很好解决了对象间通讯的问题,被其它语言框架借鉴;
  • Qt使用QML定义用户界面,使用C++编写业务逻辑;
  • Qt在在汽车行业有广泛应用,是GENIVI汽车联盟的推荐技术。

4. odoo

  • odoo不仅仅是开源ERP/CRM;
  • 还是一套伴随企业成长可扩展的商业运营支撑系统;
  • 一个巨大的应用生态系统,有近12500个Apps可供选用。

5. iDempiere

  • iDempiere = OSGi + Adempiere;
  • OSGi是Java模块化一个领先的解决方案;
  • Adempiere是一个世界级的集成的ERP/CRM开源软件。

6. Moqui

  • Apache OFBiz作者的又一力作;
  • 快速的企业应用原型系统开发;
  • 一个框架、一个生态系统。

7. Emacs

  • Emacs是迄今为止功能最为强大的文本编辑器,Emacs是一种信仰,它是神一般的编辑器;
  • Emacs是模块化的,遵循do one thing, and do it well原则,需要什么就安装什么,你可以像搭积木的方式搭建自己的环境和系统;
  • Everything Emacs,你可以在Emacs完成你几乎所有的工作:编程、写作、浏览网页、收发邮件、日程、娱乐游戏、它是个人操作系统。

8. Vim

  • Vim模式:普通模式,插入模式,可视模式,命令行模式;
  • Vim的使用主要放在定位操作上;
  • 常见定位命令如:上下左右的操作,k 上行、j 下行、h 左、l 右;定位后就是操作,vim操作命令是原子性的,可随意组合操作命令,如:daw(delete a word)、caw(change a word)。

9. Atom

  • Atom由GitHub开发维护;
  • Atom使用的Electron framework已有一个庞大的生态系统;
  • 微软Visual Studio Code和Facebook Nuclide都基于Atom/Electron框架构建。

10. Jupyter

  • Jupyter is the new front end for data science and AI.
  • Jupyter的操作过程可存档、传播、分享;
  • Jupyter的核心是IPython,Jupyter是未来。

11. Pandas

  • 在数据科学领域,Pandas是一个非常重要的Python软件包;
  • Pandas基于NumPy构建,让以NumPy为中心的应用变得更简单;
  • Pandas使用的两个主要数据结构:Series和DataFrame。

12. Anaconda

  • Anaconda是一个企业级Python发行版,面向大规模数据处理、预测分析和科学计算;
  • Anaconda 以 Red Hat 和 Debian Linux 发行版的方式来分发 Python;
  • Anaconda 包含近500个最流行的科学、数学、工程和数据分析的Python软件包。

13. HDP

  • Hortonworks公司拥有最多的Apache大数据相关项目开发者和贡献者,开发、发行100%开源的大数据平台;
  • Hortonworks Data Platform (HDP)和Hortonworks DataFlow (HDF)是两大产品;
  • 通过整合、交付统一的 Apache Spark 和 Hadoop,将 Spark 驱动的敏捷分析工作流程与 Hadoop 的海量数据集和经济性相结合,企业可以使用行业最佳安全性、管制和运营能力来部署 Apache Spark。

14. CDH

  • CDH可能是商业化运作最好的大数据平台和解决方案;
  • 开发维护了多个流行大数据开源软件,是HDP最主要的竞争对手;
  • Impala一个C++开发的Hadoop实查询引擎,值得关注。

15. HPCC

16. Caffe(Caffe2)

  • Caffe2 是贾扬清对Caffe的重新思考和重构,目前在Facebook,是Caffe2的核心开发者;
  • Caffe2对移动端的良好支持,15行代码Support WatchOS build 确实够简单;
  • Caffe2可在手机与树莓派上训练和部署模型。

17. MXNet

  • 比TensorFlow更加轻量、高效小巧,更适合自定义需求高的公司和研究者;
  • MXNet允许用户自由把图计算和过程计算混合起来使用;
  • MXNet正在Apache基金会孵化,相信很快孵化成顶级项目。

18. TensorFlow

  • TensorFlow体格庞大,代码量大,抽象层多,深度自定义会很困难;
  • TensorFlow也是一个商业行为,背后是Google,它带来的可行度和高质量;
  • 一个事实:Google内部版的TensorFlow和Google Cloud深度绑定优化与开源的TensorFlow在速度和性能上会又巨大差异,美国的大厂都或多或少的在拒绝它。

19. Automotive Grade Linux(AGL)

  • Automotive Grade Linux(AGL) 是 Linux基金会发布的开源Linux车载系统,AGL 基于 Tizen 构建;
  • AGL + Tizen IVI + GENIVI = AGL UCB(Unified Code Base));
  • Qt Automotive Suite based on GENIVI or Automotive Grade Linux。

20. ROS

  • ROS是一个广泛使用的机器人操作系统和软件框架,ROS的基本原理是无需改动就能在不同的机器人上复用代码;
  • 随着ROS 2.0的开发,ROS能够兼容除Linux之外的更多操作,如Windows、Android;能够支持从工业计算机到Adruino开发板等各种硬件;
  • 百度无人车阿波罗平台基于ROS构建。

21. Apollo Auto

  • 百度 Apollo(阿波罗)是一个开放的、完整的的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统,采用Apache v2许可协议;
  • 阿波罗平台基于ROS构建;
  • 阿波罗核心核心基于Linux Kernel 4.4.32构建。

22. OpenStack

23. OpenShift

  • OpenShift is Enterprise-Ready Kubernetes;
  • Docker容器和Kubernetes容器编排已成为企业交付软件和服务的行业标准,OpenShift可直接作为企业DevOps & CI/CD的基础设施, 成为部署微服务的多租户平台;
  • OpenShift是BlockApps区块链平台的PaaS基础设施。

24. SaltStack

  • SaltStack提供了一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度快,服务器之间秒级通讯;
  • SaltStack使用ZeroMQ,带来极高的通讯效率;
  • SaltStack或许是构建、管理、运营云计算基础设施的最佳方式,它支持广泛的云平台。

25. Riak

  • Riak 是使用 Erlang 开发的开源(Apache V2) 分布式 NoSQL 键/值(K/V) 存储数据库系统;
  • 有 Riak Core、Riak KV 键值存储、Riak TS 时序存储、Riak S2 对象存储的完整产品线;
  • Riak拥有Erlang语言带来的分布式、消息、并发、可伸缩、容错方面的天然优势。

26. OrientDB

  • OrientDB 是一个Java开发的开源(Apache v2)NoSQL文档和图形数据库,也通过 OrientDB SQL 支持 SQL;
  • OrientDB是一个拥有对象模型 键/值模型 文档模型 图模型的多模型数据库;
  • 多范式编程语言(面向对象、模板、函数式编程、过程式 )C++带来极高的生产力,多模型数据库OrientDB能否也带来类似效果。

27. Apache Kylin

  • Apache Kylin:商业数据仓库、商业OLAP引擎的替代品;
  • Kylin是为减少在Hadoop上百亿规模数据查询延迟而设计,Kylin为Hadoop提供标准SQL支持大部分查询功能,通过Kylin,用户可以与Hadoop数据进行亚秒级交互;
  • 一个开源数据仓库、商业智能生态系统。

28. RabbitMQ

  • RabbitMQ是Advanced Message Queuing Protocol (AMQP)标准的Erlang语言实现;
  • RabbitMQ是部署最广泛的开源消息代理;
  • 可以把ZeroMQ看作RabbitMQ这类消息队列系统的补充,而不是替代品。

29. Apache Kafka

  • Apache Kafka:下一代分布式消息系统;
  • Apache Kafka 是一个高吞吐量的分布式消息系统,使用 Scala 开发,最初被用于 LinkedIn;
  • Apache Kafka 解耦企业应用的复杂性,是信息和流数据的交换枢纽。

30. Ejabberd

31. Nginx

  • epoll(freebsd的kqueue)网络IO模型是Nginx高性能的根本理由;
  • 与Apache相比较,最核心的区别在于Apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接可以对应一个进程;
  • 对于后端动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。(此条信息来自:知乎叔度

32. Jetty

  • Eclipse Jetty,一个更轻量、更易扩展和定制的Java Web Server;Jetty架构基于Handler,扩展更容易,而Tomcat是基于容器设计,不易扩展;
  • Google GAE选择Jetty,定制足够小的Java Web Server支撑GAE业务;
  • Apache Tomcat和Eclipse Jetty背后是两大开源基金会的合作与竞争。

33. Cowboy

  • Cowboy适合构建嵌入式应用,它没有配置文件,也不会生成日志,一切都由Erlang控制。
  • Cowboy支持的协议有:HTTP/2、HTTP/1.1、WebSocket、HTTP/1.0、SPDY/3.1、SPDY/3;
  • Erlang很适合开发Web server,可基于Cowboy做扩展和定制;

34. GNU/Linux

  • Linux基金会不仅仅有Linux项目,还有众多其它的开源项目,如AGL;
  • 可更多关注类似Robot Operating System(ROS)这样的机器人操作系统和嵌入式系统;
  • 相比Android系统,OpenWrt被认为是更加适合智能设备和机器人的软件平台。

35. XNU/Darwin

  • XNU是XNU is Not Unix的首字母缩写,GNU是GNU’s Not Unix的缩写;
  • XNU/Darwin与FreeBSD都有着BSD的血统,苹果会持续投资和推动FreeBSD项目?
  • 更深入的学习、研究iOS和macOS,就从Hack XNU开始吧。

36. FreeBSD

  • FreeBSD TCP/IP协议栈实现是个经典;
  • Facebook的WhatsApp是一个FreeBSD + Erlang 的公司,大量的路由器、交换机、防火墙、金融系统在使用FreeBSD,SONY PS4游戏机操作系统基于FreeBSD构建;
  • 苹果与FreeBSD的关系应该是最密切的。

37. GCC

  • GCC:最重要的开源软件(从1987的1.0到2017年7.2历经30年,对整个自由、开源软件贡献卓著),后来者LLVM(14岁)很出色,前途无量;
  • GCC的基本语言是C语言,整个编译系统由C编程程序开始,然后逐渐加入其它语言的支持;
  • C++是C语言的直接扩展,它是GCC的第一个附加语言。C++能够完成的所有事情C语言都可以做到,所以编译器的后端保持不变,只需在前端加入一个新的语法语义分析器就可以了。一旦产生中间语言,编译程序的其它部分就和C语言完全一样了,其它语言的处理方式也类似。

38. LLVM

39. Babel

  • Babel 下一代 JavaScript 编译器(转译器);
  • 简单讲,Babel 就是把一个版本的 JavaScript 转变为其他版本的 JavaScript;
  • The Super Tiny Compiler可能是最小的编译器,先感受和普及下JavaScript编译器的知识。

40. JVM

  • JVM是最大规模的编程语言虚拟机生态系统,有超过200多种编程语言运行在JVM上;
  • Android Dalvik VM不是一个Java虚拟机,它没有遵循JVM规范,不能直接运行Java Class文件,它执行的Dex(Dalvik Executable)可通过Class文件转换而来;
  • 由John Rose领导的the Da Vinci Machine Project正致力于让JVM成为动态语言的最佳归宿。

41. .NET Core

  • .NET Core 是一个通用目的、模块化、跨平台的 .NET 开源实现;
  • 核心项目:.NET Core Libraries (CoreFX)、.NET Core Runtime (CoreCLR)、.NET Compiler Platform (Roslyn);
  • .NET Core 会包含 .NET Framework 的类库,但与 .NET Framework 不同的是 .NET Core 采用包 (Packages) 的管理方式,应用程序只需要获取需要的组件即可,与 .NET Framework 大包式安装的作法截然不同,同时各包也有独立的版本线 (Version line),不再硬性要求应用程序跟随主线版本。

42. Erlang VM(BEAM)

  • Elixir是一门运行在Erlang VM上的编程语言;
  • 可在Erlang VM创建自己的语言
  • 可关注下Erjang:A JVM-based Erlang VM。

43. Erlang

  • Erlang的世界观是一切都是进程(一个Erlang进程包括PCB进程控制块和堆栈只有几K),进程通过消息传递相互通讯;
  • Erlang是参与者模型(Actor model)最佳实践;
  • 可在一台笔记本上轻松跑出几百万个Erlang进程。

44. Clojure

  • Clojure 是一种运行在 Java 平台上的 Lisp 方言;
  • Clojure is about Data, Scala is about Types, Java is about Objects;
  • ClojureScript: Clojure to JavaScript compiler。

45. F#

  • F#和OCaml是ML函数式编程语言的两种主要方言;
  • F# = Objects + Functional ,F#混合面向对象和函数式编程,可“对应”JVM平台的Scala语言;
  • F#支持高阶函数、柯里化、惰性求值、Continuations、模式匹配、闭包、列表处理和元编程,F#作为一门适合于金融和计算密集型的语言而闻名。

八、资源汇总

以开源软件介绍的顺序汇集文档、链接、书籍资源

文档和链接

参考书籍

  • 《轻量级Django》Lightweight Django中文版
  • 《Python Web开发实践》
  • 《Meteor实战》
  • 《JavaScript高级程序设计(第3版)》
  • 《数据模型资源手册 (卷3): 数据模型通用模式》
  • 《C++ Primer(中文版)(第5版)》
  • 《学习GNU Emacs(第二版)》
  • 《学习Vi编辑器(第六版)》
  • 《利用Python进行数据分析》
  • 《Hadoop: The Definitive Guide (4th Edition)》
  • 《数据挖掘概念与技术(原书第3版)》
  • 《机器学习》周志华
  • 《深度学习》
  • 《ROS机器人程序设计》
  • 《视觉SLAM十四讲:从理论到实践》
  • 《概率机器人: Probabilistic Robotics中文版》
  • 《OpenStack设计与实现》
  • 《OpenStack最佳实践:测试与CI/CD》
  • 《Docker:容器与容器云(第2版)》
  • 《SRE Google运维解密》
  • 《精通SaltStack》
  • 《七周七数据库》
  • 《PostgreSQL修炼之道:从小工到专家》
  • 《RabbitMQ实战:高效部署分布式消息队列》
  • 《Kafka: The Definitive Guide》 PDF电子书
  • 《编程语言原理(第10版)》
  • 《七周七语言》
  • 《七周七并发模型》
  • 《七周七数据库》
  • 《OS X与iOS内核编程》
  • 《编译原理(第2版)》著名的龙书中文版
  • 《自制编译器》
  • 《虚拟机–系统与进程的通用平台》《Virtual Machines — Versatile Platforms for Systems and Processes》
  • 《深入理解Java虚拟机(第2版)》
  • 《虚拟机的设计与实现 C/C++》
  • 《Erlang程序设计(第2版)》
  • 《Scala程序设计(第2版)》
  • 《响应式架构:消息模式Actor实现与Scala、Akka应用集成》
  • 《Clojure编程:Java世界的Lisp实践》
  • 《Real World OCaml(中文版)》

还有一些图书,就不罗列了。

book

内容有些多,还是篇流水账,感谢大家耐心阅读。


【百度徐伟】视觉、语言以及人工智能展望

2015年9月14日 没有评论

来源:新智元

参考:百度深度学习实验室

主持人高亮:百度有一位科学家在几个指标下超过了谷歌,超过了微软,成为世界第一。但是这位科学平时比较低调,很少在公开场合发表演讲,这次在百度世界大会组委会的不断努力下,我们终于请他为我们这次的分论坛来做压轴的演讲嘉宾。下面有请百度研究院的杰出科学家徐伟博士,为大家介绍百度在人工智能方面的最新进展!

baidu-world-2015-01

徐伟:谢谢主持人,我叫徐伟,我在百度深度学习实验室,最早开始在清华大学从事人工智能的研究,到现在已经20多年的时间,我感觉最激动的时间是从加入百度开始的。两年多的时间里面,我有幸和百度的同事一起参与了对于人工智能的快速推进,并且推动百度众多的产品,我们能够把最先进的人工智能技术应用到百度的6亿用户里面,这是我觉得非常激动人心的地方。

今天我介绍一下百度最近在人工智能方面的一些研究。包括计算机视觉、语音以及人工智能的应用。

人工智能是一个非常火热的概念,人工智能的讨论有一个非常坚实的技术进步作为基础。最近我们看到是在语音识别、图像识别和传统的人工智能路径上面,都取得了过去几十年不敢想象的进步。这体现了我们对于人工智能未来的期望。

是什么造成了这样巨大和快速的进步呢?一个很主要的研究是大数据和我们能够处理大数据的计算能力。像我们小孩要学习语言一样,我们教他一段时间,通过非常多的交流小孩能够把语言学好,这是因为内在的一些复杂结构需要大量的数据才能够体现出来,但是只有大数据也不够的,我们要教他说话,所以我们还需要一个非常强有力的学习方法。

深度学习有多层次的结构,能够把大数据里面的信息充分地挖掘出来。深度学习和大数据的结合,成为了这次人工智能潮浪的巨大推动力。

baidu-world-2015-02

PADDLE,是百度的深度学习平台。我们在百度有非常多的产品都使用了深度学习技术。这些产品有着有非常多的数据类型,比如说离散的数据,图像的数据,文字的数据,以及数据分析的组合,这些我们可以很好的支持。针对于百度海量的数据资源和应用资源,PADDLE平台都能非常好的支持不同的训练。PADDLE支持灵活的配置,可以根据我们的应用的不同的需求,灵活方便地推出各种不同的深度学习模型的结构,比如说我们可以把这样的网络结合在一起,构造成一个模型,处理图像和文字结合的一些问题。

baidu-world-2015-03

正是因为我们有了非常通用、非常灵活和非常强大的一个深度学习平台,深度学习在百度各种各样的产品里面,得到了非常广泛的应用。这是百度非常核心的两个产品,一个是百度的网页搜索,另外一个是百度的广告排序,这两个产品里面,使用了深度学习以后,它们在搜索的相关性和广告的点击率都有非常大的提升。

除了一些核心产品,还有一些你不太能想到的地方。应用深度学习后,数据中心的管理,病毒的检测,给我们带来了非常大的受益。还有其他的很多的产品都用上了我们的深度学习模型,因为时间有限,就不一一介绍了。

baidu-world-2015-04

随着大数据在深度学习的使用,我们开始看到机器在一些问题上已经逐渐接近甚至超越了人类水平。比如说语音识别在搜索这样的短文本输入上面,已经做得很好了。在这个方面,人的单字错误率现在是8%,我们现在最好的是语音识别系统单字错误率6%,比人还好。另外一个方面是人脸识别,在这个应用上,现在机器人已经做到好很多了。LFW是国际通用人脸测试的评估,是用机器人判断,包括百度在内的一些公司和学校都已经做到了比人还好的识别效果,尤其百度的识别错误率只有0.23%,是世界上目前最好的结果。

baidu-world-2015-05

刚才提到了,百度已经把这么好的人脸识别技术通过API Store开放给大家使用了。开发者使用这样的API可以非常方便的实现人脸注册和认证的功能,我们还提供了整套和配套的SDK,眨眼、张嘴、转头的动作都可以通过系统的人脸认证。

baidu-world-2015-06

另外,我们也开发文字识别技术。在使用了深度学习以后,我们文字识别的应用范围和准确度都有了非常大的提高。比如说可以检测弯曲的文字,还有倾斜视角的文字,还有非常模糊的一些英文和中文,也可以正确地识别。还有比如说公式这样非常复杂结构的文字,也能够正确地处理。

在一些感知问题上,百度用深度学习已经取得非常大的进步。但是我们也知道,人区别于动物一个最大的特点是语言理解能力,接下来我给大家介绍一下百度使用深度学习在语言理解方面的一些具体的进展。

baidu-world-2015-07

这是一个传统的语言理解系统示意图,一开始有语法分析,有词语标注的信息,还有句法分析,最后通过这样的句法树提供语音分析的结果,这样一个流程非常像我20多年前在学校学习英文的时候,非常重视语法的概念,实际上这种学习效果非常不理想,我觉得我个人的英文让这样的学习方法给害了。我们也知道小孩学习英文,实际上不需要语法这样的东西,可以做到非常流利、自然的使用理解母语。

说到这里,我要给大家介绍一下深度学习里面一个非常重要的思想,就是叫做端到端的学习,我们要抛弃人为的硬性分解,还有人为的特征构造,直接通过一个完整的模型,直接学习,这样的思想前面已经用到语音识别,图像识别的任务里面去,剖析了这些特征的东西,取得了几年前完全不可想象的巨大的成功。

baidu-world-2015-08

在百度我们首先把这样的思想用到语言标注里面去,通过这样一个多层的利用网络,直接像小孩学习语言一样,不需要任何的语法分析,直接从文字的训练,直接到这样的关系,取得了非常好的结果。世界上首次不需要语法分析取得了比传统语法分析方法更好的结果。

baidu-world-2015-09

端到端的学习另外一个非常成功的应用是机器翻译,通过这么一个整体的深度学习模型,直接学习从原语言到目标语言的对应关系。今年5月份的时候,百度又首次发布了统计和深度学习的翻译系统,对我们的信息翻译有了非常巨大的提升,如果大家感兴趣的话,可以到百度翻译了解一下。

baidu-world-2015-10

人类语言是一个抽象的东西,是我们对所看到的、听到的和感受到的世界的描述。在百度我们提出把图像识别、语言理解还有语言生成这样传统人工智能上不同的分支,非常紧密地结合在一起,用统一的神经元网络,机器人直接学习和所看到的世界之间的关系。这样一个学习方法,非常像我们小孩学习一样,非常的自然。我们可以想像在不久的将来,我们都可以像教小孩那样教机器人做这样的事情。

这里是我们把图像和语言统一应用的例子,第一个例子是看图说话,机器人看到这样的图以后,可以读出这是一辆火车沿着森林里面的路行驶,第二个例子是冲浪板是什么颜色的,机器人通过对图和问题的理解,可以说出正确的答案,说是黄色的。我们这样的语言和图像的统一的模型,不仅可以理解单一的、静止的图像,也可以理解这样的动态的视频,看到这个视频以后,可以描述说是这是一只狗在桶里玩。

baidu-world-2015-11

百度花了很大的努力来开发人工智能的技术,最终的目的就是为了让我们的生活变得更加美好。今天上午的时候,王劲为大家介绍了DuLight,这款产品就是出于这样的理想诞生的,DuLight是百度深度学习实验室最新开发的可穿戴智能设备,上面集成了图像识别、人脸识别、语音识别、语言理解的核心人工智能技术。我们目的是帮助盲人更好地生活。依托于百度、百度大脑,DuLight可以自动描述,帮助他了解周围环境。另外还有识别纸币面值的功能,解决实际生活问题。还有非常好的人脸识别技术,可以对摄像头的人脸做出识别,让我们更好地融入社会。

baidu-world-2015-12

百度作为一个搜索引擎公司,最重要的使命是让我们的方便便捷地找到信息和服务。比较注重打扮的女生,经常会有这样的烦恼,看到一个漂亮的衣服,自己非常喜欢,不知道什么地方去买。百度的人工智能,让这件事情变得非常容易了,只需要把带有服装的照片上传到百度,百度大脑可以通过连接到电商资源里面,找到最相似的服装,并且直接可以到电商平台进行购买,非常地方便和快捷。

我们看到百度已经把人工智能用到产品的方方面面,我们可以有更好的产品,而更好的产品会给我们带来更多的用户和更大量的数据,更多的数据通过百度大脑强大的深度学习能力,可以给我们带来更强的智能,反过来又会让我们得到更好的产品。这是一个正循环,随着时间的推移,百度大脑的智能会越来越强,我们自然会问,我们现在离图像识别的人工智能还有多远?

baidu-world-2015-13

人工智能的概念是在1955年的时候,由著名的四名计算机科学家提出来,他们要用十个人花两个月时间,对人工智能做出重大的提升,显然回过头来看,他们是大大低估了实现人工智能的难度。半个多世纪过去了,我们现在终于看到了一些人工智能的希望。我们是不是真的离人工智能很近了?其实还不是这样。

baidu-world-2015-14

现在的人工智能还缺少非常重要的几个能力,第一个就是小数据的学习能力,今天大家可能听到非常多的大数据,我现在说小数据的学习能力,大家会觉得有一些奇怪,其实不是这样,我们现在的深度学习算法需要成千上万的图像才能认识一个物体,而小孩只需要教几次。我们需要做到,在非常大量的数据里学到非常好的表述,这样才能通过少量数据快速学习。现在我们在这方面相当缺乏。

另外一个方面,人工智能还缺少自主探索环境进行学习的能力,就像小孩一样,一生下来就有非常强的好奇心,不断地动、摸、爬、咬各种各样的东西,做破坏性的行为。小孩就是在这样的过程中不断感知和认识周围的世界,并且不断的成长。我们现在人工智能还缺乏这样的能力。

还有一个方面,现在的人工智能还缺乏通过和人的自然交流进行学习的能力。我们知道人可以在探索环境的过程当中不断的学习,也通过与人的交流学习非常多的知识。

我们现在还有一些非常困难的东西需要解决,百度的研究者正在积极探索这些问题。我们离真正的人工智能还有相当长的一段路,但是我觉得人工智能未来一定是非常光明的。因为我们已经看到百度和其他很多技术公司,已经把人工智能应用到生活的方方面面,我们正在经历一场人工智能的变革。我希望大家能够加入我们,一块去研究最新的、最先进的人工智能技术,或者使用我们的产品,为我们人工智能的成长提供点点滴滴的数据,我希望大家能够和我们一起创造人工智能的美好未来,谢谢大家。

 


分类: AI-BI-ML-DL-NLP 标签:

Nature重磅:Hinton、LeCun、Bengio三巨头权威科普深度学习

2015年7月23日 没有评论

本文选自Nature,机器之心翻译出品。

翻译|微胖、汪汪、张之乎、Kara、Siouxsie、小力、孟婷、桑夏、张楠、安隐、Rainbow、赤龙飞。

校对|微胖、Fatlucas、孟婷。

借助深度学习,多处理层组成的计算模型可通过多层抽象来学习数据表征( representations)。这些方法显著推动了语音识别、视觉识别、目标检测以及许多其他领域(比如,药物发现以及基因组学)的技术发展。利用反向传播算法(backpropagation algorithm)来显示机器将会如何根据前一层的表征改变用以计算每层表征的内部参数,深度学习发现了大数据集的复杂结构。深层卷积网络(deep convolutional nets)为图像、视频和音频等数据处理上带来突破性进展,而递归网络(recurrent nets )也给序列数据(诸如文本、语言)的处理带来曙光。

机器学习为现代生活诸多方面带来巨大动力:从网页搜索到社交网络内容过滤再到电商网商推荐,在相机、智能手机等消费品中也越来越多见。机器学习系统被用来识别图像中的物体、将语音转为文本,根据用户兴趣自动匹配新闻、消息或产品,挑选相关搜索结果。这类被应用程序越来越多地采用的技术,叫做深度学习。

传统机器学习技术在处理原始输入的自然数据方面能力有限。几十年来,建构模式识别或机器学习系统需要利用严谨的工程学和相当丰富的专业知识设计出一个特征提取器,它能将原始数据(例如图像像素值)转化成适于内部描述或表征的向量( vector ),在提取器中,学习子系统(通常是一个分类器)可以检测或分类输入模式。

表征学习(representation learning)是这样一套学习方法:输入原始数据后,机器能够自动发现检测或分类所需的表征信息。深度学习是一种多层描述的表征学习,通过组合简单、非线性模块来实现,每个模块都会将最简单的描述(从原始输入开始)转变成较高层、较为抽象的描述。通过积累足够多的上述表征转化,机器能学习非常复杂的函数。就分类任务来说,更高层的表征会放大输入信号的特征,而这对区分和控制不相关变量非常关键。比如,图片最初以像素值的方式出现,第一特征层级中,机器习得的特征主要是图像中特定方位、位置边沿之有无。第二特征层级中,主要是通过发现特定安排的边缘来检测图案,此时机器并不考虑边沿位置的微小变化。第三层中会将局部图像与物体相应部分匹配,后续的层级将会通过把这些局部组合起来从而识别出整个物体。深度学习的关键之处在于:这些特征层级并非出自人类工程师之手;而是机器通过一个通用(general-purpose)学习程序,从大量数据中自学得出。

某些根深蒂固的问题困扰了人工智能从业者许多年,以至于人们最出色的尝试都无功而返。而深度学习的出现,让这些问题的解决迈出了至关重要的步伐。深度学习善于在高维度的数据中摸索出错综复杂的结构,因此能应用在许多不同的领域,比如科学、商业和政府。此外,除了图像识别和语音识别,它还在许多方面击败了其他机器学习技术,比如预测潜在药物分子的活性、分析粒子加速器的数据、重构大脑回路、预测非编码DNA的突变对基因表达和疾病有何影响等。也许,最让人惊讶的是,在自然语言理解方面,特别是话题分类、情感分析、问答系统和语言翻译等不同的任务上,深度学习都展现出了无限光明的前景。

在不久的将来,我们认为深度学习将取得更多成就,因为它只需要极少的人工参与,所以它能轻而易举地从计算能力提升和数据量增长中获得裨益。目前正在开发的用于深层神经网络的新型学习算法和体系结构必将加速这一进程。

监督式学习

不管深度与否,机器学习最普遍的形式都是监督式学习(supervised learning)。比如说,我们想构造一个系统,它能根据特定元素对图片进行分类,例如包含一栋房子、一辆车、一个人或一只宠物。首先,我们要收集大量包含有房子、车、人或宠物的图片,组成一个数据集(data set),每张图片都标记有它的类别。在训练时,每当我们向机器展示一张图片,机器就会输出一个相应类别的向量。我们希望的结果是:指定类别的分数最高,高于其他所有类别。然而,如果不经过训练,这将是不可能完成的任务。为此,我们通过一个目标函数来计算实际输出与期望输出之间的误差或距离。接下来,为了减小误差,机器会对其内部可调参数进行调整。这些可调参数常被称为「权重」(weight),是实数,可看做定义机器输入-输出功能的「门把手」。在一个典型的深度学习系统中,可能存在着成千上亿的可调权重及用以训练机器的标记样本。

为了正确地调整权重矢量( weight vector),学习算法会计算出一个梯度矢量( gradient vector)。对每一个权重,这个梯度矢量都能指示出,当权重略微增减一点点时,误差会随之增减多少量。接着,权重矢量就会往梯度矢量的反方向进行调整。

从所有训练范例之上,平均看来,目标函数( objective function)可被视为一片崎岖的山地,坐落于由权重组成的高维空间。梯度矢量为负值的地方,意味着山地中最陡峭的下坡方向,一路接近最小值。这个最小值,也就是平均输出误差最小之处。

在实践中,大多数业内人士都是用一种被称为「随机梯度下降」(SGD – Stochastic Gradient Descent)的算法(梯度下降Grident Descent 是「最小化风险函数」以及「损失函数」的一种常用方法,「随机梯度下降」是此类下的一种通过迭代求解的思路——译者注)。每一次迭代包括以下几个步骤:获取一些样本的输入矢量( input vector),计算输出结果和误差,计算这些样本的平均梯度,根据平均梯度调整相应权重。这个过程在各个从整个训练集中抽取的小子集之上重复,直到目标函数的平均值停止下降。它被称做随机(Stochastic)是因为每个样本组都会给出一个对于整个训练集( training set)的平均梯度(average gradient)的噪音估值(noisy estimate)。较于更加精确的组合优化技术,这个简单的方法通常可以神奇地快速地找出一个权重适当的样本子集。训练过后,系统的性能将在另外一组不同样本(即测试集)上进行验证,以期测试机器的泛化能力( generalization ability) ——面对训练中从未遇过的新输入,机器能够给出合理答案。

很多当今机器学习的实际应用都在人工设定的特征上使用「线性分类」(linear classifiers)。一个「二元线性分类器」(two-class linear classifier)可以计算出特征向量的「加权和」(weighted sum)。如果「加权和」高于阈值,该输入样本就被归类于某个特定的类别。

二十世纪六十年代以来,我们就知道线性分类只能将输入样本划分到非常简单的区域中,即被超平面切分的半空间。但是,对于类似图像及语音识别等问题,要求「输入-输出函数」(input–output function)必须对输入样本的无关变化不敏感,比如,图片中物体的位置,方向或者物体上的装饰图案,又比如,声音的音调或者口音;与此同时「输入-输出函数」又需要对某些细微差异特别敏感(比如,一匹白色的狼和一种长得很像狼的被称作萨摩耶的狗)。两只萨摩耶在不同的环境里摆着不同姿势的照片从像素级别来说很可能会非常地不一样,然而在类似背景下摆着同样姿势的一只萨摩耶和一只狼的照片在像素级别来说很可能会非常相像。一个「线性分类器」(linear classifier),或者其他基于原始像素操作的「浅层(shallow)」分类操作是无论如何也无法将后者中的两只区分开,也无法将前者中的两只分到同样的类别里的。这也就是为什么「浅层」「分类器(classifiers)」需要一个可以出色地解决「选择性-恒常性困境」( selectivity–invariance dilemma)的「特征提取器」(feature extractor)—— 提取出对于辨别图片内容有意义的信息,同时忽略不相关的信息,比如,动物的姿势。我们可以用一些常规的非线性特征来增强「分类器」(classifiers)的效果,比如「核方法」(kernel methods),但是,这些常规特征,比如「高斯核」(Gaussian Kernel)所找出来的那些,很难泛化( generalize )到与训练集差别别较大的输入上。传统的方法是人工设计好的「特征提取器」,这需要相当的工程技巧和问题领域的专业知识。但是,如果好的「特征提取器」可以通过「通用学习程序(General-Purpose learning procedure)」完成自学习,那么这些麻烦事儿就可以被避免了。这就是深度学习的重要优势。

图1| 多层神经网路和反向传播。

a. 一个多层神经网络(如图所示相互连接的点)能够整合(distort)输入空间(图中以红线与蓝线为例)让数据变得线性可分。注意输入空间的规则网格(左侧)如何转被隐藏单元(中间)转换的。例子只有两个输入单元、两个隐藏单元和一个输出单元,但事实上,用于对象识别和自然语言处理的网络通常包含了数十或成千上万个单元。(本节引用改写自 C. Olah (http://colah.github.io/).)

b. 导数链式法则告诉我们,两个微小增量(即x关于y的增量,以及y关于z的增量)是如何构成的。x的增量Δx导致了y的增量Δy,这是通过乘以∂y/∂x来实现的(即偏导数的定义)。同样,Δy的变化也会引起Δz的变化。用一个方程代替另一个方程引出了导数的链式法则( the chain rule of derivatives),即增量Δx如何通过与∂y/∂x及 ∂z/∂x相乘使得z也发生增量Δz。当x,y 和 z都是向量时这一规律也同样适用(使用雅克比矩阵)。

c. 这个公式用于计算在包含着两个隐层和一个输出层的神经网络中的前向传输,每个层面的逆向传递梯度都构成了一个模组。在每一层,我们首先计算面向每个单元的总输入值z,即上一层的输出单元的加权和;然后,通过将一个非线性函数f(.)应用于z来得出这个单元的输出。为了简化流程,我们忽略掉一些阈值项(bias terms)。在神经网络中使用的非线性函数包含了近些年较为常用的校正线性单元(ReLU) f(z) = max(0,z),以及更传统的 sigmoid函数,比如,双曲线正切函数, f(z) = (exp(z) − exp(−z))/(exp(z) + exp(−z)) 和 逻辑函数f(z) = 1/(1 + exp(−z)).

d. 该公式用于计算反向传递。在每一个隐藏层中,我们都会计算每个单元输出的导数误差,即上述层中上一层所有单元输入的导数误差的加权总和。 然后,将关于输出的导数误差乘以函数f(z)的梯度(gradient),得到关于输入的导数误差。 在输出层中,通过对成本函数进行微分计算,求得关于输出单元的误差导数。因此我们得出结论 yl – tl 如果对应于单元l的成本函数是 0.5(yl – tl) 2 (注意tl是目标值)。一旦∂E/∂zk已知,那么,就能通过yj ∂E/∂zk调整单元j的内星权向量wjk。


图2 | 卷积网络的内部。一个典型的卷积网络架构的每一层(水平)输出(不是过滤器)应用到一个萨摩耶犬的图像(图2左下方,RGB输入(红绿蓝),下方右侧)。 每一个长方形图片都是一张对应于学习到的输出特征的特征地图,这些特征可以在图片的各个位置被侦测到。信息流是从下往上的,低级的特征充作导向性边际检测因子( edge detectors),每个输出图像类都会被计算出一个分值。ReLU,整流线性单元。

深度学习架构由简单模组多层堆叠而成,全部(或绝大部分)模组都从事学习,大部分会计算非线性的输入输出映射。堆叠架构中的每个模组都会转换它的输入,同时增强可选择性和所呈现状态的一致性。 通过多个非线性层面(例如,深度5-20层),系统可以实现对于输入数据的极其微小细节的敏感性功能 — 例如,区别开白色的狼和萨摩耶犬 — 并且对于较大的无关变量会不敏感(例如,主体周围的环境、姿势、光照条件和周围物体。)

训练多层架构的反向传播算法

从最早的模式识别开始,研究者们就一直试图用可训练的多层网络代替人工设计特征,尽管这种解决方案很简单,直到20世纪80年代中期,它才得到人们的广泛认可。事实证明,多层架构可以通过简单的随机梯度下降法得以训练。只要模组是由它们的输入值及其内部权重构成的相对平滑的函数(relatively smooth functions),人们就可以使用反向传播算法来计算梯度。20世纪70至80年代,几个不同的研究小组分别发现这一方法确实可行、有用。

计算一个目标函数关于一个多层堆叠模组的权重梯度的反向传播过程,只不过是导数链式法则的一个实际应用。其中关键之处在于,关于模组输入值的函数的导数(或梯度),可以借助关于该模组的输出值(或序列模组的输入值)的梯度反向计算出来(图1)。反向传播方程可在所有模组中传播梯度时被反复应用,从顶部(top)(神经网络产生预测的那一层)输出开始,一直到底部(bottom)(被接收外部输入的那一层)。这些梯度一经计算,就可直接计算出关于每个模组权重的梯度。

深度学习的许多应用,都会使用前馈神经网络架构( feedforward neural network architectures)(图1)——该架构可学习将一个固定大小的输入映射到(例如,一幅图像)到一个固定大小的输出上(例如,每种分类的概率)。从一层到下一层,单元组计算其前一层输入的加权总和,并通过一个非线性函数输出结果。目前,最受欢迎的非线性函数是整流线性单元(ReLU),一个简单的半波整流器f(z) = max(z, 0)。在过去的几十年里,神经网络使用的是更平滑的非线性,比如,tanh(z)或1 /(1 + exp(−z)),但ReLU在多层网络中的学习速度通常更快,可允许在没有无监督预训练(without unsupervised pre-training)的情况下进行深度监督网络训练。不在输入或输出层中的单元通常被称为隐层单元(hidden units)。隐层可被看作是以非线性方式变换输入,从而使所有类别在最后一层变得线性可分( linearly separable by the last layer)(图1)。

20世纪90年代末,神经网络和反向传播被机器学习社区大量遗弃,同时也被计算机视觉和语音识别领域忽略。人们普遍认为,学习有用的、多层级的、几乎不靠先验知识的特征提取器并不现实可行。尤其是,人们通常认为简单的梯度下降法会深陷局部极小的泥潭——在这种权重配置当中,除非进行大的改动,否则很难降低平均误差。

实践中,对大型网络而言,局部极小几乎不构成问题。无论初始条件如何,系统基本总能得到质量非常相似的解决方案。最近的理论和实证研究结果均有力地表明,总的来说,局部极小不是一个严重问题。相反,解空间( landscape)充满了大量梯度为0的鞍点( saddle points ),且在多数维度中表面向上弯曲,少数维度中表面向下弯曲。分析结果似乎表明,向下弯曲的鞍点在整体中占比相对较小,但这些鞍点的目标函数值大多相近。因此,算法陷入这些鞍点(不能继续寻优),无关紧要。

2006年前后,加拿大高级研究所(CIFAR)聚集了一批研究人员,他们重燃了人们对深度前馈网络的兴趣。这些研究人员引入无监督学习程序——无需标记数据便可创建特征检测器层。各层特征检测器的学习目标便是在下一层重构或模拟特征检测器(或原始输入)的活动。利用这种重构学习目标来「预训练(pre-training)」几层复杂度递增的特征检测器,深层网络的权重可以被初始化为合理值。接着,最终层的输出单元可被添加到网络顶端,整个深度系统可被微调至使用标准的反向传播。在识别手写数字或检测行人时,特别是当标记的数据量非常有限的时候,这一程序非常有效。

这种预训练的方法的首次重要应用是在语音识别上,这之所以可行归功于便于编程的GPUs的诞生,它让研究人员可以用10到20倍的速度训练神经网络。2009年,这个方法被用来计算一段声音采样中提取短时系数窗口对应的一系列概率值,这些概率值反映出由窗口中帧表示语音各个段落的可能性。在小词汇表的标准语音识别测试上,这种方法的训练效果打破纪录,很快它又发展到打破大词汇表的标准语音测试纪录。

到2012年,2009年以来的各种深度网络一直的得到多个主要语音研究小组持续开发并被布局在安卓手机上。对于较小数据集来说,无监督预训练有助于防止过拟合( overfitting), 当标注数据样本小( number of labelled examples is small)或需要迁移( in a transfer setting )——有很多源领域的标注数据样本但缺少目标领域的标注数据样本——的时候,深度网络的泛化( generalization)效果显著提升。深度学习重新获得认识,人们发现,预训练阶段只是小规模数据集的必需品。

然而,还有一种特殊类型的深度前馈网络( deep feedforward network),不仅更易训练而且泛化能力要比那些相邻两层完全相连的神经网络强大很多。这就是卷积神经网络 (ConvNet)。 在神经网络「失宠 」的日子里,卷积神经网络在实践运用中获得许多成功,最近已被计算机视觉领域广泛采用。

卷积神经网络

卷积神经网络最初是用来处理多维数组数据,比如,一张由三个2D数组组成、包含三个彩色通道像素强度的彩色图像。大量的数据模式都是多个数组形式:1D用来表示信号和序列信号包括人类语言;2D用来表示图片或声音;3D代表视频或有声音的图像。卷积神经网络利用自然信号特征的核心理念是:局部连接(local connections),权重共享,池化(pooling)和多网络层的使用。

典型的卷积神经网络的架构(图二)包括一系列阶段:最初的几个阶段由卷积层和池化层组成,卷积层的单元被组织到特征图(feature map)中,每个单元通过一组被称作滤波器(filter bank)的权值被连接到前一层的特征图的局部数据块。接下来,得到的局部加权和会传递至一个非线性函数,例如ReLU。同一个特征图中的所有单元共享相同的滤波器,不同特征图使用不同滤波器。采用这种架构有两方面的原因。首先,在诸如图像这样的数组数据中,数值与附近数值之间通常是高度相关的,容易生成易被探测到的局部特征(motif)。其次,图像和其他类似信号的局部统计特征通常又与位置无关,易言之,出现在某处的某个特征也可能出现在其他任何地方,因此,不同位置的单元会共享同样的权值并且可以探测相同模式。数学上,由一个特征图完成的过滤操作是一个离线的卷积,卷积神经网络由此得名。

和卷积层用来探测前一层中特征之间的局部连接不同,池化层的作用则是对语义相似的特征进行合并。由于构成局部主题的特征之间的相对位置关系不是一成不变的,可以通过粗粒度检测每个特征的位置来实现较可靠的主题识别。一个池化层单元通常会计算一个或几个特征图中一个局部块的最大值,相邻的池化单元则会移动一列或一行从小块读取输入,这种设计不仅减少了数据表征需要的维数,而且也能对数据小规模的偏移、扭曲保持不变。两到三个卷积层,非线性层和池化层被叠加起来,后面再加上更多的卷积和全连接层。在卷积神经网络的反向传播算法和在一般深度网络上一样简单,能让所有滤波器中的权值得到训练。

多数自然信号都是分级组合而成,通过对较低层信号组合能够获得较高层的信号特征,而深度神经网络充分利用了上述特性。在图像中,线条组合形成图案,图案形成部件,部件组成物体。类似的层次结构存在于由声音到电话中的语音及文本形成过程,音素组成音节,音节组成单词,单词组成句子。当输入数据在前一层中的位置有变化的时候,池化操作让这些特征表示对变化具有鲁棒性。

卷积神经网络中的层次的卷积和汇聚的灵感直接来源于视觉神经科学中的简单细胞和复杂细胞的经典概念,并且其整体架构让人想起视觉皮层腹侧通路的LGN-V1-V2-V4-IT层次结构。当向卷积神经网络模型和猴子同时展示相同的画面时,卷积神经网络的高级单元被激活,解释了猴子颞下皮层随机设置的160个神经元的变化。卷积神经网络有着神经认知机的基础,两者的体系结构有些类似,但是,卷积神经网络没有诸如反向传播的那种端对端的监督学习算法。原始的1D卷积神经网络被称为「延时神经网络(time-delay neural net )」,用于识别语音和简单的单词。

早在20世纪90年代初,卷积网络就已有非常广泛的应用 ,最开始延时神经网络被用在语音识别和文档阅读上。文本阅读系统使用了受过训练的延时神经网络以及一个实现了语言约束的概率模型。到20世纪90年代末,该系统能够读取美国超过十分之一的支票。随后,微软发明了许多基于卷积神经网络的光学字符识别和手写识别系统。卷积神经网络在20世纪90年代初就被尝试用于包括脸、手、面部识别的自然图像目标检测中。

使用深层卷积网络进行图像识别

从21世纪初开始,卷积神经网络就被成功用于检测、分割和物体识别以及图像各区域。这些应用都使用了丰富的标签数据,比如,交通标志识别、生物图像(特别是神经链接组学方面)分割、面部探测、文本、行人和自然图像中的人体的检测。近些年来,卷积神经网络的一项重要成功应用就是人脸识别。

值得注意的是,图像可以在像素级别上被标记,这样就能被用于诸如自主移动机器人(autonomous mobile robots)和无人驾驶汽车等技术中。像Mobileye和NVIDIA 这些公司正在将这些基于卷积神经网络的方法应用于即将面世的汽车视觉系统中。其他重要的应用程序涉及到自然语言理解和语音识别。

尽管取得了这些成就,但在2012年ImageNet竞争之前,卷积神经网络在很大程度上并未获得主流计算机视觉和机器学习团体的青睐。当深层卷积网络被应用于来源于包含1000个不同类型约100万个图像的数据集中,它们取得了惊人的成果,错误率仅是当时最佳方法的一半。该成功源于高效利用了GPUs和ReLUs、一项新的被称为「dropout 」的正规化技术( regularization technique )以及分解现有样本产生更多训练样本的技术。成功给计算机视觉领域带来一场革命。如今,卷积神经网络几乎覆盖所有识别和探测任务,在有些任务中,其表现接近人类水平。最近一个令人震惊的例子,利用卷积神经网络结合递归网络模块来生成图像标题( image captions )(如图3)。

图3 |从图像到文本。将递归神经网络(RNN)生成的标题作为额外输入,深度卷积神经网络(CNN)会从测试图片中提取表征,再利用训练好的RNN将图像中高级( high-level )表征「翻译成 」标题(上图)。当RNN一边生成单词(黑体所示),一边能将注意力集中在输入图像的不同位置(中间和底部;块状越亮,给予的注意力越多)的时候,我们发现,它能更好地将图像「翻译成」标题。

当前的卷积神经网络由10~20层ReLUs,数百万个权值及数十亿个连接组成。两年前,训练如此庞大的网络可能需要数周时间,而随着硬件、软件和算法并行化(algorithm parallelization)的进步,训练时间已经缩短至几个小时。

卷积神经网络的视觉系统良好表现促使包括谷歌、Facebook、微软、IBM、雅虎、推特和Adobe在内的多数主要科技公司以及数量激增的创业公司开始启动研发项目,部署基于卷积神经网络的图像识别产品和服务。

卷积神经网络易于在芯片或现场可编程门列阵(FPGA)中得以高效实现。为了实现智能手机、相机、机器人和无人驾驶汽车上的实时视觉应用,NVIDIA、Mobileye、因特尔、高通和三星等许多公司都正在开发卷积神经网络芯片。

分布式表征和语言处理

深度学习理论显示,与不适用分布式表征的经典学习算法相比,深度网络有两处异常明显的优势。这些优势源于节点权重(the power of composition)以及底层数据生成分布具有适当的组成结构。第一,学习分布式表征能够将通过训练而学习获得的特性值泛化为新的组合(例如,n元特征有2n 组合可能)。第二,深度网络中的表征层相互组合带来了另一个指数级优势的潜力(指数性的深度)。

多层神经网络的隐藏层学会以一种易于预测目标输出的方式来再现网络输入。一个很好的示范就是训练多层神经网络根据局部文本中的前述语句预测下一个词。文本的每个词表示成网络中的N分之一向量,也就是说,每个成分的值为1,余下的为0。在第一层中,每个字创建一个不同模式的激活或单词向量(如图4所示)。在语言模型中,网络中的其他层学习如何将输入的单词向量转化成输出单词向量来预测下一个单词,也能用来预测词汇表中单词作为文本中下一个单词出现的概率。正如学习分布表征符号文本最初展示的那样,网络学习了包含许多激活节点(active components )、且每一个节点都可被解释成一个单词独立特征的单词向量。这些语义学特征并没有在输入时被清晰表现出来。而是在学习过程中被发现的,并被作为将输入与输出符号结构化关系分解为微规则(micro-rules)的好方法。当词序列来自一个大的真实文本语料库,单个微规则并不可靠时,学习单词向量也一样表现良好。当网络被训练用于预测新文本中的下一个词时,一些单词向量非常相似,比如Tuesday和Wednesday,Sweden和Norway 。这种表征被称为分布式表征,因为它们的元素(特性)并非相互排斥,且它们构造信息与观测到的数据变化相对应。这些单词向量由所习得的特性组成,这些特性并非由科学家们事先决定而是由神经网络自动发现。现在,从文本中习得的单词向量表征被非常广泛地使用于自然语言应用。

表征问题是逻辑启发与神经网络启发认知范式争论的核心问题。在逻辑启发范式中,一个符号实体表示某一事物,因为其唯一的属性与其他符号实体相同或者不同。它并不包含与使用相关的内部结构,而且为理解符号含义,就必须与审慎选取的推理规则的变化相联系。相比之下,神经网络使用大量活动载体( big activity vectors)、权重矩阵和标量非线性,实现一种快速「直觉 」推断,它是轻松常识推理的基础。

在介绍神经语言模型前,语言统计模型的标准方法并没有使用分布式表征:它是基于计算短符号序列长度N(称为N-grams,N元文法)出现的频率。N-grams可能出现的次数与VN一致,这里的V指的是词汇量的大小,考虑到词汇量大的文本,因此需要更庞大的一个语料库。N-grams把每一个词作为一个原子单位,因此它不能在语义紧密相关的单词序列中,一概而论,但是,神经语言模型可以实现上述功能,因为它们将每个单词与真实特征值的向量关联起来,并且语义相关的单词在该向量空间中更为贴近。(如图4)。


图4|已完成学习的单词向量的可视化展现。左边介绍了为了建模语言而习得的词汇表征,通过使用 t-SNE算法[103]非线性映射至二维空间中以便于观察。右边是一个由实现英-法互翻的递归神经网络学习短语的二维空间表示。由图可知,语义或排序相似的单词表征映射较为接近 。词汇的分布式表征通过使用反向传播获得,以此来学习每个单词的表征形式及预测目标数量的功能,比如序列中的后续单词(如语言建模)或者翻译文字的全部序列(机器翻译)。

递归神经网络

最初引入反向传播时,最令人激动的应用便是训练递归神经网络(简称RNNs)。对于那些需要序列连续输入的任务(比如,语音和语言),RNNs是上乘之选(图5)。RNNs一次处理一个输入序列元素,同时维护隐式单元中隐含着该序列过去所有元素的历史信息的「状态向量」。当我们考虑隐式单元在不同的离散时间步长的输出,就好像它们是在多层网络深处的不同神经元的输出(图五,右)如何利用反向传播训练RNNs,一目了然。

RNNs是非常强大的动力系统,但训练它们也被证实存在一些问题,因为反向传播梯度在每个时间间隔内或增长或下降,因此,一段时间之后通常会导致结果激增或者降为零。

因先进的架构和训练的方式,RNNs不仅被证实擅长预测文本中下一个字符或句子中下一个单词,还可应用于更加复杂的任务。例如,某时刻阅读英文句子中的单词后,一个英语的「编码器」网络将被生成,从而帮助隐式单元的最终状态向量很好地表征句子所传达的思想。这种「思想向量(thought vector)」可以作为一个集大成的法语「编码器」网络的初始化隐式状态(或额外的输入),其输出为法语翻译首单词的概率分布。如果从概率分布中选择一个特定首单词作为编码网络的输入,将会输出翻译句子中第二个单词的概率分布,依此类推,直到停止选择为止。总体而言,这一过程是根据英语句子的概率分布而生成的法语单词序列。这种近乎直接的机器翻译方法的表现很快和最先进(state-of-the-art)的方法不相上下,同时引发人们对于理解句子是否需要使用推理发掘内部符号表示质疑。这与日常推理中涉及到根据合理结论类推的观点是匹配的。

除了将法语句子翻译成英语句子,还可以学习将图片内容「翻译」为英语句子(如图3)。编码器是一种在最后隐层将像素转换为活动向量的深度卷积网络。解码器是一种类似机器翻译和神经网络语言模型的递归神经网络。近年来,引发了人们对深度学习该领域的热议。RNNs一旦展开(如图5),可被视作是所有层共享同样权值的深度前馈神经网络。虽然它们的主要目的是长期学习的依赖性,但有关理论和经验的例证表明很难学习并长期储存信息。

为了解决这一问题,一个扩展网络存储的想法出现。第一种方案是采用了特殊隐式单元的LSTM,该自然行为便是长期的保存输入。一种类似累加器和门控神经元的称作记忆细胞的特殊单元:它通过在下一个时间步长拥有一个权值并联接到自身,从而拷贝自身状态的真实值和累积外部信号,但这种自联接是另一个学习并决定何时清除记忆内容的单元的乘法门所操控。

LSTM网络最终被证明比传统的递归神经网络(RNNs)更为有效,尤其是,每一个时间步长内有若干层时,整个语音识别系统能够完全一致地将声学转录为字符序列。目前,LSTM网络及其相关形式的门控单元同样也用于编码与解码网络,并在机器翻译中表现良好。

过去几年里,几位学者提出一些不同的方案来增强RNNs存储器模块。这些建议包括,神经图灵机——通过加入RNNs可读可写的“类似磁带”的存储来增强网络,而记忆网络中的常规网络通过联想记忆来增强。记忆网络在标准的问答基准测试中表现良好,记忆是用来记住稍后要求回答问题的事例。

除了简单记忆化、神经图灵机和记忆网络被用于通常需要推理和符号操作的任务以外,还可以教神经图灵机「算法」。除此以外,他们可以从未排序的输入符号序列(其中每个符号都有与其在列表中对应的表明优先级的真实值)中,学习输出一个排序的符号序列。可以训练记忆网络用来追踪一个设定与文字冒险游戏和故事的世界的状态,回答一些需要复杂推理的问题。在一个测试例子中,网络能够正确回答15句版的《指环王》中诸如「Frodo现在在哪?」的问题。


图5 |一个递归神经网络在时间中展开的计算和涉及的相关计算。人工神经元(例如,隐式样单元分组节点在时间t的标准值下)获得其他神经元的输入——在之前的步骤中(黑色区域呈现,代表一步延迟,如左)。这样,一个递归神经网络可由xt的输入序列元素,映射到一个输出序列与元素ot,每次ot值取决于所有前面的xtʹ(tʹ≤t)。相同的参数(U,V矩阵W)在每步中使用。许多其他结构是可行的,包括一个变体的网络可以生成的输出序列(例如,词语),每一个都作为下次的输入步骤。反向传播算法(图1)可以直接应用于计算机图形展开网络,并对所有的标准陈述和参数,计算其总误差的导数(例如,生成正确的输出序列的对数概率)。

深度学习的未来

无监督学习促进了人们重燃对深度学习的兴趣,但是,有监督学习的成功盖过了无监督学习。虽然我们没有关注这方面的评论,但是,从长远来看,我们还是期望无监督学习能够变得更加重要。(因为)人类和动物的学习方式大多为无监督学习:我们通过观察世界来发现它的结果,而不是被告知每个对象的名称。

人类视觉是一个智能的、基于特定方式的利用小或大分辨率的视网膜中央窝与周围环绕区域对光线采集成像的活跃的过程。我们希望机器视觉能够在未来获得巨大进步,这些进步来自于那些端对端的训练系统,并集合卷积神经网络(ConvNets)和递归神经网络(RNNs),利用强化学习来决定走向。结合了深度学习和强化学习的系统尚处在婴儿期,但是,在分类任务上,它们已经超越了被动视觉系统,并在尝试学习操作视频游戏方面,产生了令人印象深刻的结果。

未来几年,理解自然语言会是深度学习产生巨大影响的另一个领域。我们预测,当它们学习了某时刻选择性地加入某部分的策略,那些使用递归神经网络(RNNs)的系统将会更好地理解句子或整个文档。

最终,人工智能的重大进步将来自将表征学习与复杂推理结合起来的系统。尽管深度学习和简单推理已经用于语音和手写识别很长一段时间了,我们仍需要通过大量向量操作的新范式替换基于规则的字符表达操作。


分类: AI-BI-ML-DL-NLP 标签:

深度学习,神经网络为人工智能展示了新希望

2014年10月4日 没有评论

本文转载自:《程序员》

作者余凯,百度技术副总监,千人计划国家特聘专家。贾磊,百度主任架构师,语音技术负责人。陈雨强,百度商务搜索部资深研发工程师,负责搜索广告CTR预估。

摘要:深度学习带来了机器学习的新浪潮,推动“大数据+深度模型”时代的来临,以及人工智能和人机交互大踏步前进。如果我们能在理论、建模和工程方面突破深度学习面临的一系列难题,人工智能的梦想不再遥远。

2012年6月,《纽约时报》披露了Google Brain项目,吸引了公众的广泛关注。这个项目是由著名的斯坦福大学机器学习教授Andrew Ng和在大规模计算机系统方面的世界顶尖专家Jeff Dean共同主导,用16000个CPU Core的并行计算平台训练一种称

为“深层神经网络”(DNN,Deep Neural Networks)的机器学习模型,在语音识别和图像识别等领域获得了巨大的成功。2012年11月,微软在中国天津的一次活动上公开演示了一个全自动的同声传译系统,讲演者用英文演讲,后台的计算机一气呵成自动完成语音识别、英中机器翻译,以及中文语音合成,效果非常流畅。据报道,后面支撑的关键技术也是DNN,或者深度学习(DL,Deep Learning)。

2013年1月,在百度的年会上,创始人兼CEO李彦宏高调宣布要成立百度研究院,其中第一个重点方向就是深度学习,并为此而成立Institute of Deep Learning(IDL)。这是百度成立十多年以来第一次成立研究院。2013年4月,《麻省理工学院技术评论》杂志将深度学习列为2013年十大突破性技术(Breakthrough Technology)之首。

读者一定非常好奇,什么是深度学习?为什么深度学习受到学术界和工业界如此广泛的重视?深度学习技术研发面临什么样的科学和工程问题?深度学习带来的科技进步将怎样改变人们的生活?

机器学习的两次浪潮:从浅层学习到深度学习

在解释深度学习之前,我们需要了解什么是机器学习。机器学习是人工智能的一个分支,而在很多时候,几乎成为人工智能的代名词。简单来说,机器学习就是通过算法,使得机器能从大量历史数据中学习规律,从而对新的样本做智能识别或对未来做预测。从1980年代末期以来,机器学习的发展大致经历了两次浪潮:浅层学习(Shallow Learning)和深度学习(Deep Learning)。需要指出是,机器学习历史阶段的划分是一个仁者见仁,智者见智的事情,从不同的维度来看会得到不同的结论。这里我们是从机器学习模型的层次结构来看的。

第一次浪潮:浅层学习

1980年代末期,用于人工神经网络的反向传播算法(也叫Back Propagation算法或者BP算法)的发明,给机器学习带来了希望,掀起了基于统计模型的机器学习热潮。这个热潮一直持续到今天。人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习出统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显示出优越性。这个时候的人工神经网络,虽然也被称作多层感知机(Multi-layer Perceptron),但实际上是一种只含有一层隐层节点的浅层模型。

90年代,各种各样的浅层机器学习模型相继被提出,比如支撑向量机(SVM,Support Vector Machines)、Boosting、最大熵方法(例如LR, Logistic Regression)等。这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点(如LR)。这些模型在无论是理论分析还是应用都获得了巨大的成功。相比较之下,由于理论分析的难度,加上训练方法需要很多经验和技巧,所以这个时期浅层人工神经网络反而相对较为沉寂。

2000年以来互联网的高速发展,对大数据的智能化分析和预测提出了巨大需求,浅层学习模型在互联网应用上获得了巨大成功。最成功的应用包括搜索广告系统(比如Google的AdWords、百度的凤巢系统)的广告点击率CTR预估、网页搜索排序(例如Yahoo!和微软的搜索引擎)、垃圾邮件过滤系统、基于内容的推荐系统等。

第二次浪潮:深度学习

2006年,加拿大多伦多大学教授、机器学习领域泰斗——Geoffrey Hinton和他的学生Ruslan Salakhutdinov在顶尖学术刊物《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。这篇文章有两个主要的信息:1. 很多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2. 深度神经网络在训练上的难度,可以通过“逐层初始化”(Layer-wise Pre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。

自2006年以来,深度学习在学术界持续升温。斯坦福大学、纽约大学、加拿大蒙特利尔大学等成为研究深度学习的重镇。2010年,美国国防部DARPA计划首次资助深度学习项目,参与方有斯坦福大学、纽约大学和NEC美国研究院。支持深度学习的一个重要依据,就是脑神经系统的确具有丰富的层次结构。一个最著名的例子就是Hubel-Wiesel模型,由于揭示了视觉神经的机理而曾获得诺贝尔医学与生理学奖。除了仿生学的角度,目前深度学习的理论研究还基本处于起步阶段,但在应用领域已显现出巨大能量。2011年以来,微软研究院和Google的语音识别研究人员先后采用DNN技术降低语音识别错误率20%~30%,是语音识别领域十多年来最大的突破性进展。2012年,DNN技术在图像识别领域取得惊人的效果,在ImageNet评测上将错误率从26%降低到15%。在这一年,DNN还被应用于制药公司的Druge Activity预测问题,并获得世界最好成绩,这一重要成果被《纽约时报》报道。

正如文章开头所描述的,今天Google、微软、百度等知名的拥有大数据的高科技公司争相投入资源,占领深度学习的技术制高点,正是因为它们都看到了在大数据时代,更加复杂且更加强大的深度模型能深刻揭示海量数据里所承载的复杂而丰富的信息,并对未来或未知事件做更精准的预测。

大数据与深度学习

在工业界一直有个很流行的观点:在大数据条件下,简单的机器学习模型会比复杂模型更加有效。例如,在很多的大数据应用中,最简单的线性模型得到大量使用。而最近深度学习的惊人进展,促使我们也许到了要重新思考这个观点的时候。简而言之,在大数据情况下,也许只有比较复杂的模型,或者说表达能力强的模型,才能充分发掘海量数据中蕴藏的丰富信息。运用更强大的深度模型,也许我们能从大数据中发掘出更多有价值的信息和知识。

为了理解为什么大数据需要深度模型,先举一个例子。语音识别已经是一个大数据的机器学习问题,在其声学建模部分,通常面临的是十亿到千亿级别的训练样本。在Google的一个语音识别实验中,发现训练后的DNN对训练样本和测试样本的预测误差基本相当。这是非常违反常识的,因为通常模型在训练样本上的预测误差会显著小于测试样本。因此,只有一个解释,就是由于大数据里含有丰富的信息维度,即便是DNN这样的高容量复杂模型也是处于欠拟合的状态,更不必说传统的GMM声学模型了。所以从这个例子中我们看出,大数据需要深度学习。

浅层模型有一个重要特点,就是假设靠人工经验来抽取样本的特征,而强调模型主要是负责分类或预测。在模型的运用不出差错的前提下(如假设互联网公司聘请的是机器学习的专家),特征的好坏就成为整个系统性能的瓶颈。因此,通常一个开发团队中更多的人力是投入到发掘更好的特征上去的。要发现一个好的特征,就要求开发人员对待解决的问题要有很深入的理解。而达到这个程度,往往需要反复地摸索,甚至是数年磨一剑。因此,人工设计样本特征,不是一个可扩展的途径。
深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。所以“深度模型”是手段,“特征学习”是目的。区别于传统的浅层学习,深度学习的不同在于:1. 强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2. 明确突出了特征学习的重要性,也就是说,同过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,使分类或预测更加容易。

与人工规则构造特征的方法相比,利用大数据来学习特征,更能刻画数据丰富的内在信息。所以,在未来的几年里,我们将看到越来越多的例子:深度模型应用于大数据,而不是浅层的线性模型。

深度学习的应用

语音识别

语音识别系统长期以来,在描述每个建模单元的统计概率模型时,大多采用的是混合高斯模型(GMM)。这种模型由于估计简单,适合海量数据训练,同时有成熟的区分度训练技术支持,长期以来,一直在语音识别应用中占有垄断性地位。但这种混合高斯模型本质上是一种浅层网络建模,不能充分描述特征的状态空间分布。另外,GMM建模的特征维数一般是几十维,不能充分描述特征之间的相关性。最后,GMM建模本质上是一种似然概率建模,虽然区分度训练能够模拟一些模式类之间的区分性,但能力有限。

微软研究院语音识别专家邓立和俞栋从2009年开始和深度学习专家Geoffery Hinton合作。2011年微软宣布基于深度神经网络的识别系统取得成果并推出产品,彻底改变了语音识别原有的技术框架。采用深度神经网络后,可以充分描述特征之间的相关性,可以把连续多帧的语音特征并在一起,构成一个高维特征。最终的深度神经网络可以采用高维特征训练来模拟。由于深度神经网络采用模拟人脑的多层结果,可以逐级地进行信息特征抽取,最终形成适合模式分类的较理想特征。这种多层结构和人脑处理语音图像信息时,是有很大的相似性的。深度神经网络的建模技术,在实际线上服务时,能够无缝地和传统的语音识别技术相结合,在不引起任何系统额外耗费情况下,大幅度提升了语音识别系统的识别率。其在线的使用方法具体如下:在实际解码过程中,声学模型仍然是采用传统的HMM模型,语音模型仍然是采用传统的统计语言模型,解码器仍然是采用传统的动态WFST解码器。但在声学模型的输出分布计算时,完全用神经网络的输出后验概率乘以一个先验概率来代替传统HMM模型中的GMM的输出似然概率。百度在实践中发现,采用DNN进行声音建模的语音识别系统相比于传统的GMM语音识别系统而言,相对误识别率能降低25%。最终在2012年11月,百度上线了第一款基于DNN的语音搜索系统,成为最早采用DNN技术进行商业语音服务的公司之一。

国际上,Google也采用了深层神经网络进行声音建模,是最早突破深层神经网络工业化应用的企业之一。但Google产品中采用的深度神经网络只有4-5层,而百度采用的深度神经网络多达9层。这种结构差异的核心其实是百度更好地解决了深度神经网络在线计算的技术难题,因此百度线上产品可以采用更复杂的网络模型。这将对于未来拓展海量语料的DNN模型训练有更大的优势。

图像识别

图像是深度学习最早尝试的应用领域。早在1989年,Yann LeCun (现纽约大学教授) 和他的同事们就发表了卷积神经网络(Convolution Neural Networks, 简称CNN)的工作。CNN是一种带有卷积结构的深度神经网络,通常至少有两个非线性可训练的卷积层,两个非线性的固定卷积层(又叫Pooling Laye)和一个全连接层,一共至少5个隐含层。CNN的结构受到著名的Hubel-Wiesel生物视觉模型的启发,尤其是模拟视觉皮层V1和V2层中Simple Cell和Complex Cell的行为。在很长时间里,CNN虽然在小规模的问题上,如手写数字,取得过当时世界最好结果,但一直没有取得巨大成功。这主要原因是,CNN在大规模图像上效果不好,比如像素很多的自然图片内容理解,所以没有得到计算机视觉领域的足够重视。这个情况一直持续到2012年10月,Geoffrey Hinton和他的两个学生在著名的ImageNet问题上用更深的CNN取得世界最好结果,使得图像识别大踏步前进。在Hinton的模型里,输入就是图像的像素,没有用到任何的人工特征。

这个惊人的结果为什么在之前没有发生? 原因当然包括算法的提升,比如dropout等防止过拟合技术,但最重要的是,GPU带来的计算能力提升和更多的训练数据。百度在2012年底将深度学习技术成功应用于自然图像OCR识别和人脸识别等问题,并推出相应的桌面和移动搜索产品,2013年,深度学习模型被成功应用于一般图片的识别和理解。从百度的经验来看,深度学习应用于图像识别不但大大提升了准确性,而且避免了人工特征抽取的时间消耗,从而大大提高了在线计算效率。可以很有把握地说,从现在开始,深度学习将取代“人工特征+机器学习”的方法而逐渐成为主流图像识别方法。

自然语言处理

除了语音和图像,深度学习的另一个应用领域问题是自然语言处理(NLP)。经过几十年的发展,基于统计的模型已经成为NLP的主流,但作为统计方法之一的人工神经网络在NLP领域几乎没有受到重视。最早应用神经网络的NLP问题是语言模型。加拿大蒙特利尔大学教授Yoshua Bengio等人于2003年提出用embedding的方法将词映射到一个矢量表示空间,然后用非线性神经网络来表示N-Gram模型。世界上最早的最早的深度学习用于NLP的研究工作诞生于NEC美国研究院,其研究员Ronan Collobert和Jason Weston从2008年开始采用embedding和多层一维卷积的结构,用于POS Tagging、Chunking、Named Entity Recognition、Semantic Role Labeling等四个典型NLP问题。值得注意的是,他们将同一个模型用于不同任务,都能取得与业界最前沿相当的准确率。最近以来,斯坦福大学教授Chris Manning等人在将深度学习用于NLP的工作也值得关注。

总的来说,深度学习在NLP上取得的进展没有在语音图像上那么令人影响深刻。一个很有意思的悖论是:相比于声音和图像,语言是唯一的非自然信号,是完全由人类大脑产生和处理的符号系统,但模仿人脑结构的人工神经网络却似乎在处理自然语言上没有显现明显优势? 我们相信,深度学习在NLP方面有很大的探索空间。从2006年图像深度学习成为学术界热门课题到2012年10月Geoffery Hinton在ImageNet上的重大突破,经历了6年时间。我们需要有足够的耐心。

搜索广告CTR预估

搜索广告是搜索引擎的主要变现方式,而按点击付费(Cost Per Click,CPC)又是其中被最广泛应用的计费模式。在CPC模式下,预估的CTR(pCTR)越准确,点击率就会越高,收益就越大。通常,搜索广告的pCTR是通过机器学习模型预估得到。提高pCTR的准确性,是提升搜索公司、广告主、搜索用户三方利益的最佳途径。

传统上,Google、百度等搜索引擎公司以Logistic Regression(LR)作为预估模型。而从2012年开始,百度开始意识到模型的结构对广告CTR预估的重要性:使用扁平结构的LR严重限制了模型学习与抽象特征的能力。为了突破这样的限制,百度尝试将DNN作用于搜索广告,而这其中最大的挑战在于当前的计算能力还无法接受1011级别的原始广告特征作为输入。作为解决,在百度的DNN系统里,特征数从1011数量级被降到了103,从而能被DNN正常地学习。这套深度学习系统已于2013年5月开始服务于百度搜索广告系统,每天为数亿网民使用。

DNN在搜索广告系统中的应用还远远没有成熟,其中DNN与迁移学习的结合将可能是一个令人振奋的方向。使用DNN,未来的搜索广告将可能借助网页搜索的结果优化特征的学习与提取;亦可能通过DNN将不同的产品线联系起来,使得不同的变现产品不管数据多少,都能互相优化。我们认为未来的DNN一定会在搜索广告中起到更重要的作用。

深度学习研发面临的重大问题

理论问题

理论问题主要体现在两个方面,一个是统计学习方面的,另一个是计算方面的。我们已经知道,深度模型相比较于浅层模型有更好的对非线性函数的表示能力。具体来说,对于任意一个非线性函数,根据神经网络的Universal Approximation Theory,我们一定能找到一个浅层网络和一个深度网络来足够好地表示。但深度网络只需要少得多的参数。但可表示性不代表可学习性。我们需要了解深度学习的样本复杂度,也就是我们需要多少训练样本才能学习到足够好的深度模型。从另一方面来说,我们需要多少计算资源才能通过训练得到更好的模型?理想的计算优化方法是什么?由于深度模型都是非凸函数,这方面的理论研究极其困难。

建模问题

在推进深度学习的学习理论和计算理论的同时,我们是否可以提出新的分层模型,使其不但具有传统深度模型所具有的强大表示能力,还具有其他的好处,比如更容易做理论分析。另外,针对具体应用问题,我们如何设计一个最适合的深度模型来解决问题?我们已经看到,无论在图像深度模型,还是语言深度模型,似乎都存在深度和卷积等共同的信息处理结构。甚至对于语音声学模型,研究人员也在探索卷积深度网络。那么一个更有意思的问题是,是否存在可能建立一个通用的深度模型或深度模型的建模语言,作为统一的框架来处理语音、图像和语言?

工程问题

需要指出的是,对于互联网公司而言,如何在工程上利用大规模的并行计算平台来实现海量数据训练,是各家公司从事深度学习技术研发首先要解决的问题。传统的大数据平台如Hadoop,由于数据处理的Latency太高,显然不适合需要频繁迭代的深度学习。现有成熟的DNN训练技术大都是采用随机梯度法(SGD)方法训练的。这种方法本身不可能在多个计算机之间并行。即使是采用GPU进行传统的DNN模型进行训练,其训练时间也是非常漫长的,一般训练几千小时的声学模型所需要几个月的时间。而随着互联网服务的深入,海量数据训练越来越重要,DNN这种缓慢的训练速度必然不能满足互联网服务应用的需要。Google搭建的DistBelief,是一个采用普通服务器的深度学习并行计算平台,采用异步算法,由很多计算单元独立地更新同一个参数服务器的模型参数,实现了随机梯度下降算法的并行化,加快了模型训练速度。与Google采用普通服务器不同,百度的多GPU并行计算平台,克服了传统SGD训练的不能并行的技术难题,神经网络的训练已经可以在海量语料上并行展开。可以预期,未来随着海量数据训练的DNN技术的发展,语音图像系统的识别率还会持续提升。

深度学习带来了机器学习的一个新浪潮,受到从学术界到工业界的广泛重视,也导致了“大数据+深度模型”时代的来临。在应用方面,深度学习使得语音图像的智能识别和理解取得惊人进展,从而推动人工智能和人机交互大踏步前进。同时,pCTR这样的复杂机器学习任务也得到显著提升。如果我们能在理论、建模和工程方面,突破深度学习技术面临的一系列难题,人工智能的梦想将不再遥远。


分类: AI-BI-ML-DL-NLP 标签: