【AI设计模式】机器学习设计模式概述

作者:王磊

更多精彩分享,欢迎访问和关注:https://www.zhihu.com/people/wldandan

摘要

本系列将介绍机器学习领域的设计模式以及如何使用MindSpore的代码进行实现,本篇概述将介绍机器学习领域设计模式的背景,以及设计模式解决的问题等。

为什么需要设计模式

随着软件的代码规模的增加,如何增强扩展性,提升可维护性并尽可能的实现软件的复用成为了软件工程的挑战。在建筑领域,美国加州大学Christopher Alexander博士中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。90年代初,软件领域开始借用建筑领域的设计模式的概念,将模式的概念应用于软件开发领域。1995 年,Erich Gamma等人出版了《设计模式:可复用面向对象软件的基础》一书,并收录了 23 个设计模式,这是设计模式领域里程碑的事件,设计模式从此正式进入软件领域。

设计模式不光用来指导软件开发,为程序员提供可重用的解决方法,来更好的应对软件的变更,降低维护成本。并且随着软件开发的发展,拓展到并发设计模式、架构设计模式等,如近些年来大火的微服务设计模式。同时,设计模式的理念也逐渐嵌入到高级语言或者框架中,让设计模式的实践更容易被开发者使用。

设计模式对于软件工程的价值主要有如下三点:

  1. 实现更好的封装,提升软件系统的可扩展性。软件系统的设计原则为高内聚,低耦合,对扩展开放,对修改关闭。设计模式可以很好的做到这点,如代码需要支持不同的手机产品,通过创建型模式的工厂模式,新增产品时增加新的工厂类即可,不用修改原有的代码。
  2. 实现更好的复用性。如开发者常用的开发框架SpringBoot,实现了十几种设计模式,让开发者更好的复用框架的能力。
  3. 提升代码的可维护及理解性。应用设计模式的代码对业务实现了很好的抽象,开发者可以比较容易的阅读和理解代码,从而帮助开发者更轻松的完成代码的修改,提升可维护性。

高级语言/框架原生集成了设计模式,让设计模式融入语言和框架中,开发者可能会在不经意间就使用了设计模式,从而更容易产出高质量代码。如JDK 的 java.util 包中,提供了 Observable 类以及 Observer 接口,实现对观察者模式的支持;在Ruby on Rails框架中,开发者只要使用before_action关键字,即可实现面向切面编程的模式。

因此,现代软件开发过程中,开发者已经很难脱离设计模式,它已经和软件开发融为了一体。

为什么AI领域需要新的设计模式

早在上个世纪的60年代,人类已经开始了对人工智能领域的探索。而直到2006年深度学习(神经网络)的出现,在物理算力、大数据等发展的基础上,逐渐大规模在产业领域落地。AI软件的开发方式和传统的软件存在一些差异。传统软件通常由程序员编写行为逻辑、基于用例验证、然后发布上线。软件运行时会基于行为逻辑(Rules) + 外部输入(Data),得到可预期的结果。AI软件开发的的流程是基于数据和标签、输出规则。AI软件运行时基于规则对输入数据进行处理,结果不完全达到预期。

在AI软件的开发过程中,设计模式的选择会影响到效率以及结果的准确程度,比如以下三个场景:

  1. 对于机器学习训练数据中存在高基数(字段可能有上百万个入口)的分类特征数据,如果使用常用的独热编码(one-hot encoding)方式会造成输入数据稀疏,增加了模型在训练时的计算量。通过嵌入模式(Embeddings)对稀疏的数据进行压缩,可以成百上千倍的降低训练时计算的规模。
  2. 使用多层神经网络解决分类问题时所需的计算量较大,训练耗时。通过特征交叉模式(Feature Cross)将多个特征合并生成单个新特征,减少输入特征值,将非线性问题降维为线性问题,可以让训练的性能带来量级的提升。如《机器学习设计模式》一书中提到的基于孕妇和胎儿数据实现胎儿重量预测的模型案例,通过特征合并实现问题规模降维后,训练时间从48分钟降低到1分钟以内。
  3. 单个模型的预测精度提升比较困难,通过集成学习模式(Ensemble)结合几个具有不同偏差的模型并聚合它们的输出,实现更高的预测精度。比如,对病人的X光、CT扫描等结果,综合X光片、CT的模型,实现对病症的更好的预测。

从上面的例子不难看出,AI软件开发需要重点考虑数据处理和具体算法问题,传统软件的设计模式侧重于解决业务代码封装抽象问题,无法对AI软件开发关心的重点问题产生实质性的帮助,所以需要拓展新的设计模式来解决AI领域常见的开发问题。

AI设计模式总览

当前业界已有针对AI设计模式的总结,整体上可分为设计和运行类,从端到端的流程上可分为数据表示、数据处理、问题表示、网络设计、数据处理、模型训练和弹性部署。每个分类下针对不同的问题提供了具体的模式。在AI框架,如MindSpore,从框架层面已经支持了部分模式。

AI设计模式总览

数据表示

机器学习模型的可靠性取决于数据的可靠性。如果数据集不完整、特征选择不当,模型的预测结果会出现较大偏差。因此,会有“garbage in, garbage out”这样的说法。数据的类型多种多样,但对于机器学习来说,输入的数据必须是数值型的数据,数据转换的方法或者过程被称作是数据表示。在数据表示时,会存在如下的问题和挑战:

  1. 分类数据不完整,生产环境中对于新出现的分类,处理出错(冷启动问题);
  2. 特征值高基数(字段可能有上百万个类别),通过独热编码方式会造成稀疏矩阵,不适合机器学习算法处理;
  3. 模型的复杂度不足以处理数据;
  4. 模型通常只针对特定类型数据,如果数据非结构化,如何输出结构化的数据。
注:冷启动是生产环境中碰到了训练时没有遇到的数据,导致模型预测出现错误。

针对这些问题,可以通过上图中的特征值哈希(Hashed Feature)、嵌入(Embedding)等模式来解决。

问题表示

机器学习适用于不同类型的问题,比如分类问题、回归问题等,而模型的结构需要根据问题而变化。例如,有监督机器学习问题的输出可能会根据所解决的问题是分类还是回归而有所不同。针对特定类型的输入数据(图像、语音、文本和其他具有时空相关性的数据)问题,需要神经网络层、卷积,顺序数据的递归网络等去解决。问题表示时存在常见问题包括:

  1. 如何定义问题?问题属于监督学习还是非监督学习范畴,特征值是什么?如果是监督学习,标签是什么?
  2. 训练的例子需要多个标签怎么处理?
  3. 模型在生产环境的预测错误率高怎么办?
  4. 模型如何在特殊场景下也给出正确推测?
  5. 模型如何处理类似一个病症可以开出多种不同药方的场景?
  6. 如何解决模型数据不平衡的问题,比如风控场景,异常交易的数量要远远少于正常交易数量?

针对这些问题,可以通过重构(Reframing)、多标签(Multilabel)、聚合(Ensamebles)等模式解决。

网络设计

神经网络有很多种类型,面向不同的领域,比如用于图像分类的卷积神经网络,用于对象检测和跟踪的网络、用于自然语言处理的网络等等,通过将网络的构建结构化,形成通用的模式,可以让开发者或者科研人员能更快的基于网络模式的框架,实现快速的创新。

数据处理

开发者在处理数据时,编码阶段需要易于调试,运行阶段需要高效率,因此需要通过框架(如MindSpore)提供的渴望模式(Eager)和流水线模式(Pipeline)来满足开发者在数据处理时的诉求。

模型训练

机器学习模型通常是迭代训练的,这个迭代过程通常称为训练循环。在每次训练中,处理同等批量大小数据,如下图,典型的训练循环分为三轮(epoch),每轮都处理同等大小的批处理数据块。第三轮结束时,在测试数据集上评估模型,并保存为模型,后续可作为Web服务部署。

模型训练存在的常见问题包括:

  1. 机器学习训练通常需要很长时间,如果发生故障,进度丢失该怎么办?
  2. 如果缺乏模型训练的大型数据集,如何获得可靠的模型?
  3. 大型神经网络的训练通常需要很长时间,如何通过并行的方式缩短该时间?
  4. 如何找到机器学习模型的最优的参数?

针对这些问题,可以通过检查点(CheckPoints)、转移学习(Transfer Learning)等模式来解决。

弹性部署

机器学习训练后产生的模型目的是对生产环境的数据进行推断。因此,模型训练完成通常会部署到生产环境中,并对传入的请求进行预测。部署到生产环境中需要有弹性,并且几乎不需要人工干预来保持其运行。

弹性部署存在的具体问题包括:

  1. 机器学习生产环境需要处理大规模的预测请求,如何能保证生产环境的可扩展性?
  2. 机器学习训练通常需要很长时间,如果发生故障,进度丢失该怎么办?
  3. 如果缺乏模型训练的大型数据集,如何获得可靠的模型?
  4. 大型神经网络的训练通常需要很长时间,如何通过并行的方式缩短该时间?
  5. 如何找到机器学习模型的最优的参数?

针对这些问题,可以通过无状态部署(Stateless Serving Function)、批量推理模式(Batch Serving)等模式来解决。

总结

本文主要介绍了为什么机器学习领域需要模式,以及基于业界对机器学习(深度学习)模式总结。后续系列文章将基于业界的总结,结合MindSpore详细介绍每个维度下各种模式解决的问题,具体的解决方案,适用的场景以及trade-off等。

参考资料

  1. 《机器学习设计模式》:https://www.oreilly.com/library/view/machine-learning-design/9781098115777/
  2. 《深度学习模式和实践》:https://www.manning.com/books/deep-learning-patterns-and-practices

说明:严禁转载本文内容,否则视为侵权。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值