催生这轮人工智能热潮的原因有三个重要因素:大数据的积累、超大规模的计算能力支撑、机器学习尤其是深度学习算法取得了突破性进展,本章我们将围绕以上重要的三方面因素展开介绍。
本小节将围绕以下内容进行介绍:
随着各个领域数字化发展,信息系统和软件平台上不断沉淀了大量数据。人工智能的算法是数据驱动(Data Driven)的方式解决问题,从数据中不断学习出规律和模型,进而完成预测任务。正是这些数据为人工智能提供了基础“原料”。
互联网公司由于有海量的用户,大规模的数据中心,信息系统完善,所以可以较早沉淀出大规模数据,并应用人工智能技术,投入研发创新人工智能技术。
互联网服务和大数据平台给深度学习带来了大量的数据集。例如,以下几种服务中沉淀和形成了相应领域代表性的数据集:
- 搜索引擎(Search Engine)
- 图像检索(Image Search)服务: ImageNet,Coco 等计算机视觉数据集
- 文本检索(Text Search)服务: Wikipedia 等自然语言处理数据集
- 商业网站
- 亚马逊, 淘宝: 推荐系统数据集, 广告数据集
- 其他互联网服务(Internet Services)
- 对话机器人服务 XiaoIce, Siri, Cortana:问答数据集
- ...
互联网公司通过不断爬取互联网数据沉淀了大量数据,同时因为其有海量的用户,这些用户不断使用互联网服务,上传文字,图片,音频等数据,又积累了更为丰富的用户生成数据。这些数据随着时间的流逝和新业务功能的推出,数据量越来越大,数据模式越来越丰富。所以互联网公司较早的开发和部署了大数据存储与分析平台。基于这些海量数据,互联网公司通过数据驱动的方式,训练人工智能模型,进而优化和提升业务用户体验(例如,点击率预测让用户获取感兴趣的信息),让更多的用户使用服务,进而形成良性循环。由于随着业务发展遇到更多需要应用人工智能技术的实际场景和需求,相较于学术界,互联网公司作为工业界的代表,较早地将深度学习的发展推到了更加实用,落地的阶段,并不断投入研发推动人工智能算法与系统的不断演进和发展。
以表 1.2.1 中为例,同样是图像分类问题,从最开始数据规模较小的 MNIST[1] 手写数字识别数据集(其只有 6 万样本,10 个分类),到更大规模的 ImageNet(其有 1600 万样本,1000 个分类)再到互联网 Web 服务中沉淀了数亿量级的图像数据。海量的数据让人工智能问题变得愈发挑战的同时,实质性的促进了人工智能模型效果的提升。因为当前的以深度学习为核心的代表性人工智能算法,其本身是数据驱动的方式从数据中学习规律与知识,数据的质与量决定了模型的本身的天花板。
表 1.2.1 不同图像分类问题数据集的数据量MNIST | ImageNet | Web Images |
---|---|---|
6万样本 | 1600万样本 | 10亿量级图像样本 |
10分类 | 1000分类 | 开放分类 |
这些海量的数据集为深度学习系统的发展产生了以下的影响:
- 推动深度学习算法不断在指定任务上产生更高的准确度与更低的误差。让深度学习有更广泛的应用,进而产生商业价值,让工业界和学术界看到其应用潜力并投入更多资源进行研究。这样产生了针对深度学习的系统与硬件发展的用户基础,应用落地场景驱动力和研发资源投入。
- 海量的数据集让单机越来越难以完成深度学习模型的训练,进而产生了分布式训练和平台的需求,让传统的机器学习库不能满足相应的需求。
- 多样的数据格式和任务,产生了模型结构的复杂性,驱动框架或针对深度学习的程序语言需要有更灵活的表达能力对问题进行表达与映射。
- 同时伴随着性能等需求得到满足,数据安全与模型安全问题挑战也变的日益突出。
综上所述,深度学习系统本身的设计相较于传统机器学习库有更多样的表达需求,更大规模和多样的数据集和更广泛的用户基础。
除了数据本身不断的沉淀,算法研究员和工程师不断设计新的算法和模型提升预测效果,深度学习算法和模型的预测效果不断取得突破性进展。但是新的算法和模型结构需要前端框架提供编程的表达力和灵活性,对执行层系统优化有可能会改变原有假设,进而产生了系统前端设计和执行过程优化新的挑战。
接下来我们从几个代表性数据集上看算法与模型的进步:
1. 深度学习在已有数据集(MNIST数据集)上超越机器学习算法
MNIST[1] 手写数字识别图像数据库是在早期通常用于训练和研究各种图像分类的深度学习模型,由于其样本与数据规模较小,当前也常常用于教学或神经网络结构(NAS)搜索的研究。
我们可以观察图 1.2.1,了解不同的机器学习算法取得的效果。
图 1.2.1 MNIST数据集上各算法的测试误差百分比(Test Error %)从图中可以观察到这样的趋势:
1998 年,一个简单的卷积神经网络可以取得和 SVM 取得的最好效果接近。
2012 年,一个深度卷积神经网络可以将错误率降低到 0.23% (2012),这样的结果已经可以和人所达到的错误率 0.2% 非常接近。
深度学习模型在 MNIST[1] 数据集上相比传统机器学习模型的表现,让研究者们看到了深度学习模型提升预测效果的潜力,进而不断尝试新的深度学习模型和更复杂的数据集进行验证。
所以我们看到,深度学习算法在不同应用场景上的问题取得突破进展,让领域相关研发人员看到相应潜力,驱动机构和研究人员不断投入研发新的深度学习算法与模型。
2. 深度学习在公开数据集(ImageNet)上不断取得突破
随着每年 ImageNet 数据集上的新模型取得突破,我们看到新的深度学习模型结构和训练方式的潜力。通过图 1-2-2,我们观察到,更深的模型结构有潜力提升当前预测的效果。
图 1.2.2 更深层和更高效的深度学习模型结构在 ImageNet 数据集上的效果不断取得突破从图中可以看到,1998 年的 Lenet,到 2012 年的 AlexNet,不仅效果提升,模型变大,同时引入了 GPU 训练,新的算子(ReLU等)。到 2015 年的 Inception,模型的计算图进一步复杂,且有新的层被提出,错误率进一步降低到 6.7%。到 2015 年的 ResNet,模型层数进一步加深,甚至达到上百层。到 2019 年 NAS,模型设计逐渐出现通过自动化的方式进行设计。
我们可以观察到,新的模型不断在以下方向演化进而提升效果:
- 效果更好,计算效率更高的激活函数和算子: ReLU,Batch Normalization 等。
- 更复杂更深的网络结构和更大的模型权重。
- 更好的训练方法: 正则化(Regularization),初始化(Initialization),学习方法(Learning Methods),自动化机器学习与模型结构搜索等。
算法工程师与研究员不断研发取得更好的模型效果的设计和方法。同时也驱动深度学习系统及系统工程师不断提供新的算子(Operator)支持,优化算子,加速训练算法。
3. 其他领域算法的进步
除了我们看到的计算机视觉,深度学习在多个领域也取得了不俗的表现,并取得超越原有方案的里程碑式的效果。
例如,在下面的领域中相关代表性工作:
- 计算机视觉(Computer Vision)领域
例如:2015 年, ImageNet 数据集上 微软亚洲研究院(MSRA)研发的 Resnet[2] 取得了当年的 5 项第一,并又一次刷新了 CNN 模型在 ImageNet 上的历史最好效果。
- 自然语言处理(Natural Language Processing)领域
例如:2019 年,在斯坦福大学举办的 SQuAD(Stanford Question Answering Dataset)[3] 和 CoQA(Conversational Question Answering)[4]挑战赛中,微软亚洲研究院(MSRA) 的 NLP 团队通过多阶段(Multi-Stage),多任务(Multi-Task)学习的方式取得第一。
- 语音识别(Speech Recognition)领域
例如:2016 年,微软研究院(MSR)提出的 Combined 模型[5]系统的在 NIST 2000[6] 数据集上错误率为 6.2%,超越之前报告的基准测试结果。
- 强化学习(Reinforcement Learning)领域
2016 年,Google DeepMind 研发的 AlphaGo[7] 在围棋比赛中以 4:1 的高分击败了世界大师级冠军李世石。OpenAI 训练出了名为 OpenAI Five[8] 的 Dota 2 游戏智能体。2019 年 4 月,OpenAI Five 击败了一支 Dota 2 世界冠军战队,这是首个击败电子竞技游戏世界冠军的人工智能系统。
由于不同领域的输入数据格式不同,预测输出结果不同,数据获取方式不同,造成模型结构和训练方式产生非常多样的需求,各家公司和组织不断研发新的针对特定领域的框架或上层接口封装(例如,Facebook 推出的 Caffe 与 Torch 演化到 PyTorch,Google TensorFlow 及新推出的 JAX),工具与框架本身也是随着用户的模型构建与程序书写与部署需求不断演进。框架支持特定领域数据科学家快速验证和实现新的想法,工程化部署和批量训练成熟的模型。所以我们可以看到,由最开始 AlexNet 是作者直接通过 CUDA 实现深度学习模型,到目前有通过 Python 语言灵活和轻松调用的框架,到大家习惯使用 Hugging Face 进行神经网络语言模型训练,背后是系统工程师贴合实际需求不断研发新的工具,并推动深度学习生产力提升的结果。所以即使作为系统工程师,也需要密切关注算法和应用的演进,才能紧跟潮流设计出贴合应用实际的工具与系统。
图 1.2.3 计算机体系结构和计算能力的进步从 1960 年以来,计算机性能的增长主要来自摩尔定律,到二十世纪初大概增长了
于是,人们就开始为应用定制专有芯片,通过消除通用处理器中冗余的功能部分,来进一步提高对特定应用的计算性能。 比如,图形图像处理器 GPU 就对图像类算法做专用加速。后来出现 GPGPU,也就是通用 GPU,对适合于抽象为单指令流多数据流(SIMD)的并行算法与工作负载都能起到不错的加速效果。
为了更高的性能,这些年人工智能芯片也大行其道。其中一个代表就是 Google TPU(Tensor Processing Unit)[9]。通过对深度学习模型中的算子进行抽象,转换为矩阵乘法或非线性变换,根据专用负载特点进一步定制流水线化执行的脉动阵列(Systolic Array),进一步减少访存,提升计算密度,提高了性能。除了算子层面驱动的定制,深度学习负载本身在算法层常常应用的稀疏性和量化等加速手段也逐渐被硬件厂商根据通用算子定制到专用加速器中(例如,英伟达在 H 系列 GPU 中推出的 Transformer Engine),在专用计算领域进一步引入以往算法框架层才会涉及的优化,进一步优化加速深度学习负载 。
通过定制化硬件,厂商又将处理器性能提升了大约
然而可惜的是,经过这么多年的发展,虽然处理器性能提升这么多,我们机器的数值运算能力早已是人类望尘莫及了,里面的程序仍然是人类指定的固定代码,智能程度还远远不及生物大脑。从智力程度来说,大约也就只相当于啮齿动物,距离人类还有一定距离。
我们可以看到随着硬件的发展,虽然算力逐渐逼近人脑,让深度学习取得了突破。但是我们也看到,计算力还是可能在短期内成为瓶颈,那么人工智能系统的性能下一代的出路在哪?我们在后面会看到,除了单独芯片的不断迭代进行性能放大(Scale Up),系统工程师不断设计更好的分布式计算系统将计算并行开来达到向外扩展(Scale Out),同时发掘深度学习的作业特点,如稀疏性等通过算法,系统硬件协同设计,进一步提升计算效率和性能。
算法工程师和研究员为了搭建深度学习模型,完成训练,部署模型进行推理,抛开其他需求,这其中都离不开深度学习框架的支持(例如:PyTorch,TensorFlow 等)。框架对用户提供编程接口,隐藏硬件细节,同时将用户书写的深度学习程序进行编译优化并部署在设备上进行执行。在众多的人工智能系统中深度学习框架属于其中的核心系统,构建了算法工程师和底层硬件之间的桥梁。通过业界的开源社区发展和学术研究进展,我们观察到,深度学习框架大致经过以下的发展脉络。
第一代框架:
以 Theano[10],Caffe[11],DisBelief[12] 为代表的第一代框架,其设计初衷为数值计算或特定机器学习问题或算法而设计。例如,Caffe 设计之初主要为支持卷积神经网络,DisBelief[12] 只支持以参数服务器模式在 CPU 集群训练特定的深度学习模型。接下来我们从前端,后端和生态角度再做进一步分析:
(1)前端:例如,有的初代框架编程范式为通过配置文件进行模型构建,框架将模型翻译成粗粒度的算子(例如,卷积层,池化层),并调用底层硬件提供的优化算子库(如NVIDIA cuDNN,CUDA)等进行高效执行。其特点是简单构建方便,但是灵活性不足,算子类型支持有限,用户直接书写配置文件也容易写出有缺陷(Bug)的程序,难以做静态程序分析。还有些框架需要用户关注声明张量形状(Shape),用户开发代码量较高,容易出错,书写复杂模型工作量较大。
(2)后端:对更加灵活的模型分布式训练及部署模式支持有限。
(3)生态:对某领域模型支持较好但其他领域模型动物园(Model Zoo)支持有限。
随着用户的模型构建需求和应用场景越来越灵活和多样化,逐渐衍生出应用更加广泛的第二代框架。
第二代框架:
以 TenorFlow[13] 和 PyTorch[17] 为代表的第二代框架,目前是有最为广泛用户基础的计算框架。其中通常业界将框架按照编程范式分类两类:
-
声明式编程(Declarative Programming)
-
命令式编程(Imperative Programming)
第二代框架以 Python 语言作为前端语言,通过框架构建模型和训练,并结合使用 Numpy,Scipy 等数据处理库构建深度学习的程序。
虽然框架解决了大部分的问题,但是我们也可以看到,控制流,数据预处理等其他语言层的逻辑与深度学习模型计算图的割裂造成不便于统一编译与优化,除深度学习模型之外的库不方便卸载计算和利用 GPU 等专有硬件进而造成低效数据流水线,没有侧重面向方面设计造成作业调试诊断困难,运维负担较大等。同时 Python 语言本身特点是简单,但是并发支持效率不高,不利于静态优化与错误检测等,对大规模工程化实践不友好。由于以上问题造成在不断演化的深度学习研究与工程化对性能和稳定性越来越极致要求的趋势下现有编程方式仍有提升空间。目前也有趋势是提供静态语言前端(例如,Swift,Julia 等)从语言层提供静态程序分析,后端提供编译器(例如,TVM,TensorFlow XLA 等)进行编译优化尝试规避和解决当前框架已有的问题。
第三代框架:
我们除了设计框架解决当前的问题,还应该思考关注和设计下一代的框架以支持未来的模型趋势。
图 1.2.3 第二代框架到第三代框架的发展趋势-
框架应在有更加全面功能的编程语言前端下构建,并提供灵活性和表达力,例如:控制流(Control Flow)的支持,递归和稀疏性的原生表达与支持。这样才能应对大的(Large)、动态(Dynamic)的和自我修改(Self-Modifying)的深度学习模型趋势。我们无法准确预估深度学习模型在多年后会是什么样子,但从现在的趋势看,它们将会更大、更稀疏、结构更松散。下一代框架应该更好地支持像 Pathways[20] 模型这样的动态模型,像预训练神经语言模型(NLM)或多专家混合模型(MoE)这样的大型模型,以及需要与真实或模拟环境频繁交互的强化学习模型等多样的需求。
-
框架同时应该不断跟进并提供针对多样且新的硬件特性下的编译优化与运行时调度的优化支持。例如:单指令流多数据流(SIMD)到 多指令流多数据流(MIMD)的支持,稀疏性和量化的硬件内支持,异构与分布式计算,虚拟化支持,关联处理等。
本章我们主要围绕深度学习系统的算法,框架与体系结构展开。对系统研究,除了理解上层深度学习算法,也需要理解底层的体系结构,并利用两者之前的巨大的优化空间进行抽象和权衡取舍选取最优解决方法。
请读者思考未来的深度学习框架和系统应该是怎样的?