
本系列将介绍机器学习领域的设计模式以及如何使用MindSpore的代码进行实现,本篇概述将介绍机器学习领域设计模式的背景,以及设计模式解决的问题等。
随着软件的代码规模的增加,如何增强扩展性,提升可维护性并尽可能的实现软件的复用成为了软件工程的挑战。在建筑领域,美国加州大学Christopher Alexander博士中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。90年代初,软件领域开始借用建筑领域的设计模式的概念,将模式的概念应用于软件开发领域。1995 年,Erich Gamma等人出版了《设计模式:可复用面向对象软件的基础》一书,并收录了 23 个设计模式,这是设计模式领域里程碑的事件,设计模式从此正式进入软件领域。
设计模式不光用来指导软件开发,为程序员提供可重用的解决方法,来更好的应对软件的变更,降低维护成本。并且随着软件开发的发展,拓展到并发设计模式、架构设计模式等,如近些年来大火的微服务设计模式。同时,设计模式的理念也逐渐嵌入到高级语言或者框架中,让设计模式的实践更容易被开发者使用。
设计模式对于软件工程的价值主要有如下三点:
高级语言/框架原生集成了设计模式,让设计模式融入语言和框架中,开发者可能会在不经意间就使用了设计模式,从而更容易产出高质量代码。如JDK 的 java.util 包中,提供了 Observable 类以及 Observer 接口,实现对观察者模式的支持;在Ruby on Rails框架中,开发者只要使用before_action关键字,即可实现面向切面编程的模式。
因此,现代软件开发过程中,开发者已经很难脱离设计模式,它已经和软件开发融为了一体。
早在上个世纪的60年代,人类已经开始了对人工智能领域的探索。而直到2006年深度学习(神经网络)的出现,在物理算力、大数据等发展的基础上,逐渐大规模在产业领域落地。AI软件的开发方式和传统的软件存在一些差异。传统软件通常由程序员编写行为逻辑、基于用例验证、然后发布上线。软件运行时会基于行为逻辑(Rules) + 外部输入(Data),得到可预期的结果。AI软件开发的的流程是基于数据和标签、输出规则。AI软件运行时基于规则对输入数据进行处理,结果不完全达到预期。
在AI软件的开发过程中,设计模式的选择会影响到效率以及结果的准确程度,比如以下三个场景:
从上面的例子不难看出,AI软件开发需要重点考虑数据处理和具体算法问题,传统软件的设计模式侧重于解决业务代码封装抽象问题,无法对AI软件开发关心的重点问题产生实质性的帮助,所以需要拓展新的设计模式来解决AI领域常见的开发问题。
当前业界已有针对AI设计模式的总结,整体上可分为设计和运行类,从端到端的流程上可分为数据表示、数据处理、问题表示、网络设计、数据处理、模型训练和弹性部署。每个分类下针对不同的问题提供了具体的模式。在AI框架,如MindSpore,从框架层面已经支持了部分模式。

AI设计模式总览
机器学习模型的可靠性取决于数据的可靠性。如果数据集不完整、特征选择不当,模型的预测结果会出现较大偏差。因此,会有“garbage in, garbage out”这样的说法。数据的类型多种多样,但对于机器学习来说,输入的数据必须是数值型的数据,数据转换的方法或者过程被称作是数据表示。在数据表示时,会存在如下的问题和挑战:
注:冷启动是生产环境中碰到了训练时没有遇到的数据,导致模型预测出现错误。
针对这些问题,可以通过上图中的特征值哈希(Hashed Feature)、嵌入(Embedding)等模式来解决。
机器学习适用于不同类型的问题,比如分类问题、回归问题等,而模型的结构需要根据问题而变化。例如,有监督机器学习问题的输出可能会根据所解决的问题是分类还是回归而有所不同。针对特定类型的输入数据(图像、语音、文本和其他具有时空相关性的数据)问题,需要神经网络层、卷积,顺序数据的递归网络等去解决。问题表示时存在常见问题包括:
针对这些问题,可以通过重构(Reframing)、多标签(Multilabel)、聚合(Ensamebles)等模式解决。
神经网络有很多种类型,面向不同的领域,比如用于图像分类的卷积神经网络,用于对象检测和跟踪的网络、用于自然语言处理的网络等等,通过将网络的构建结构化,形成通用的模式,可以让开发者或者科研人员能更快的基于网络模式的框架,实现快速的创新。
开发者在处理数据时,编码阶段需要易于调试,运行阶段需要高效率,因此需要通过框架(如MindSpore)提供的渴望模式(Eager)和流水线模式(Pipeline)来满足开发者在数据处理时的诉求。
机器学习模型通常是迭代训练的,这个迭代过程通常称为训练循环。在每次训练中,处理同等批量大小数据,如下图,典型的训练循环分为三轮(epoch),每轮都处理同等大小的批处理数据块。第三轮结束时,在测试数据集上评估模型,并保存为模型,后续可作为Web服务部署。

模型训练存在的常见问题包括:
针对这些问题,可以通过检查点(CheckPoints)、转移学习(Transfer Learning)等模式来解决。
机器学习训练后产生的模型目的是对生产环境的数据进行推断。因此,模型训练完成通常会部署到生产环境中,并对传入的请求进行预测。部署到生产环境中需要有弹性,并且几乎不需要人工干预来保持其运行。
弹性部署存在的具体问题包括:
针对这些问题,可以通过无状态部署(Stateless Serving Function)、批量推理模式(Batch Serving)等模式来解决。
本文主要介绍了为什么机器学习领域需要模式,以及基于业界对机器学习(深度学习)模式总结。后续系列文章将基于业界的总结,结合MindSpore详细介绍每个维度下各种模式解决的问题,具体的解决方案,适用的场景以及trade-off等。