您的位置:首页 > 大数据 > 人工智能

AI发展历程及机器学习、深度学习开发流程

2019-04-27 09:55 1281 查看

1AI实现方法及发展历程

人工智能在计算机上实现时有2种不同的方式。一种是采用传统的编程技术,使系统呈现智能的效果,而不考虑所用方法是否与人或动物机体所用的方法相同。这种方法叫工程学方法(ENGINEERING APPROACH),它已在一些领域内作出了成果,如文字识别、电脑下棋等。另一种是模拟法(MODELING APPROACH),它不仅要看效果,还要求实现方法也和人类或生物机体所用的方法相同或相类似。遗传算法(GENERIC ALGORITHM,简称GA)和人工神经网络(ARTIFICIAL NEURAL NETWORK,简称ANN)均属后一类型。遗传算法模拟人类或生物的遗传-进化机制,人工神经网络则是模拟人类或动物大脑中神经细胞的活动方式。为了得到相同智能效果,两种方式通常都可使用。采用前一种方法,需要人工详细规定程序逻辑,如果游戏简单,还是方便的。如果游戏复杂,角色数量和活动空间增加,相应的逻辑就会很复杂(按指数式增长),人工编程就非常繁琐,容易出错。而一旦出错,就必须修改原程序,重新编译、调试,最后为用户提供一个新的版本或提供一个新补丁,非常麻烦。采用后一种方法时,编程者要为每一角色设计一个智能系统(一个模块)来进行控制,这个智能系统(模块)开始什么也不懂,就像初生婴儿那样,但它能够学习,能渐渐地适应环境,应付各种复杂情况。这种系统开始也常犯错误,但它能吸取教训,下一次运行时就可能改正,至少不会永远错下去,用不到发布新版本或打补丁。利用这种方法来实现人工智能,要求编程者具有生物学的思考方法,入门难度大一点。但一旦入了门,就可得到广泛应用。由于这种方法编程时无须对角色的活动规律做详细规定,应用于复杂问题,通常会比前一种方法更省力。

AI的历史发展历程:

图1.1中概括了AI技术60年的发展历程,期间包括两起两落,以及2013年开始,由深度学习(Deep Learning)算法的成功带来的第三个黄金期。技术上,除了算法方面的突破,数据资源和计算能力的增长也对AI的发展起着关键作用。

图1.1 AI技术60年的发展历程

 

如图1.2所示,人工智能是一类非常广泛的问题,它表现为为机器赋予了人的智能。机器学习是解决这类问题的一个重要手段,也是实现人工智能的方法之一。深度学习则是机器学习的一个分支。在很多人工智能问题上,深度学习的方法突破了传统机器学习方法的瓶颈,推动了人工智能领域的发展,使人工智能的未来一片光明。

图1.2 人工智能、机器学习以及深度学习之间的关系

AI发展到现在,机器学习是AI最主要的实现方式之一,深度学习作为机器学习的一个分支,激起了机器学习的又一次浪潮,是目前AI研究最火热的一门技术。因此本文主要针对机器学习的开发流程进行介绍,然后介绍深度学习与机器学习开发流程的主要不同(特征处理),最后给出深度学习的一个简要开发流程。

 

2、机器学习的开发流程

2.1、机器学习项目开发流程

2.1.1 将实际问题抽象为机器学习能处理的数学问题

    理解实际业务场景问题是机器学习的第一步,机器学习中特征工程和模型训练都是非常费时的,深入理解要处理的问题,能避免走很多弯路。理解并抽象实际问题为机器学习能处理的数学问题,包括明确可以获得的数据,机器学习的目标是分类、回归还是聚类。如果都不是的话,考虑将它们转变为机器学习问题。

2.1.2 获取数据

  获取数据包括获取原始数据以及从中经过特征工程从原始数据中提取训练、测试数据。机器学习比赛中原始数据都是直接提供的,但是实际问题还是需要自己获得原始数据。“数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限”,可见数据在机器学习中的作用。总的来说数据要具有“代表性”,对于分类问题、数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。不仅如此,还要对评估数据的量级,样本数量、特征数量,估算训练模型对内存的消耗。如果数据量太大可以考虑减少训练样本、降维或者使用分布式机器学习系统。

2.1.3 特征工程

  特征工程是非常能体现一个机器学习者的功底的。特征工程包括从原始数据中特征构建、特征提取、特征选择,非常有讲究。深入理解实际业务场景下的问题,丰富的机器学习经验能帮助我们更好的处理特征工程。特征工程做的好能发挥原始数据的最大效力,能够使得算法的效果和性能得到显著的提升,有时能使简单模型的效果比复杂模型的效果好。特征预处理、数据清洗是很关键的步骤,往往能够使算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。

  筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

2.1.4 模型的训练、诊断与调优

  现在有很多机器学习算法的工具包,能够封装成黑盒供人使用,例如sklearn,使用非常方便,真正考验水平的是根据对算法的理解调节参数,使模型达到最优。当然,能自己实现算法的是最牛的。如何确定模型调优的方向与思路呢?这就需要对模型进行诊断。模型诊断中至关重要的是判断过拟合、欠拟合,常见的方法是绘制学习曲线,交叉验证。通过增加训练的数据量、降低模型复杂度来降低过拟合的风险,提高特征的数量和质量、增加模型复杂来防止欠拟合。诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。

2.1.5 模型验证及误差分析

  模型验证和误差分析也是机器学习中至关重要的步骤,通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因,往往能使得我们找到提升算法性能的突破点。误差分析主要是分析出误差来源,包括是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题等。

2.1.6 模型融合

在工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。一般来说,模型融合后都能使得效果有一定提升,而且效果很好。

2.1.7 上线运行

  这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

  上述项目开发工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分也只是一个指导性的说明,只有自己多实践,多积累项目经验,才会有自己更深刻的认识。

2.2、开发机器学习应用程序的步骤(参考机器学习实战)

图2.1 开发机器学习应用程序的步骤

如图2.1所示,书中学习和使用机器学习算法开发应用程序,通常遵循以下的步骤。

(1)收集数据。

我们可以使用很多方法收集样本数据,如:制作网络爬虫从网站上抽取数据、从RSS反馈或者API中得到信息、设备发送过来的实测数据(风速、血糖等)。提取数据的方法非常多,为了节省时间与精力,可以使用公开可用的数据源。

(2)准备输入数据。

得到数据之后,必须确保数据格式符合要求,此外还需要为机器学习算法准备特定的数据格式,如某些算法要求特征值使用特定的格式,一些算法要求目标变量和特征值是字符串类型,而另一些算法则可能要求是整数类型。与收集数据的格式相比,处理特殊算法要求的格式相对简单得多。

(3)分析输入数据。

此步骤主要是人工分析以前得到的数据。为了确保前两步有效,最简单的方法是用文本编辑器打开数据文件,査看得到的数据是否为空值。此外,还可以进一步浏览数据,分析是否可以识别出模式;数据中是否存在明显的异常值,如某些数据点与数据集中的其他值存在明显的差异。通过一维、二维或三维图形展示数据也是不错的方法,然而大多数时候我们得到数据的特征值都不会低于三个,无法一次图形化展示所有特征。因此需要掌握绍提炼数据的方法,使得多维数据可以压缩到二维或三维,方便图形化展示数据。

这一步的主要作用是确保数据集中没有垃圾数据。如果是在产品化系统中使用机器学习算法并且算法可以处理系统产生的数据格式,或者我们信任数据来源,可以直接跳过第3步。此步骤需要人工干预,如果在自动化系统中还需要人工干预,显然就降低了系统的价值。

(4)训练算法。

机器学习算法从这一步才真正开始学习。根据算法的不同,第4步和第5步是机器学习算法的核心。我们将前两步得到的格式化数据输入到算法,从中抽取知识或信息。这里得到的知识需要存储为计算机可以处理的格式,方便后续步骤使用。

如果使用无监督学习算法,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容都集中在第5步。

(5)测试算法。

这一步将实际使用第4步机器学习得到的知识信息。为了评估算法,必须测试算法工作的效果。对于监督学习,必须已知用于评估算法的目标变量值;对于无监督学习,也必须用其他的评测手段来检验算法的成功率。无论哪种情形,如果不满意算法的输出结果,则可以回到第4步,改正并加以测试。问题常常会跟数据的收集和准备有关,这时你就必须跳回第1步重新开始。

(6)使用算法。

将机器学习算法转换为应用程序,执行实际任务,以检验上述步骤是否可以在实际环境中正常工作。此时如果碰到新的数据问题,同样需要重复执行上述的步骤。

 

3、深度学习与机器学习

3.1、深度学习与机器学习的主要区别

(1)数据依赖性

深度学习与传统的机器学习最主要的区别在于随着数据规模的增加其性能也不断增长。当数据很少时,深度学习算法的性能并不好。这是因为深度学习算法需要大量的数据来完美地理解它。另一方面,在这种情况下,传统的机器学习算法使用制定的规则,性能会比较好。下图总结了这一事实。

图3.1 深度学习与传统的机器学习的数据依赖性

(2)特征处理

如图3.2所示,大部分情况下,在训练数据达到一定程度之前,越多的训练数据可使机器学习算法的预测精度越高。之所以说是大多数情况下,是由于机器学习算法的效果除了依赖于训练数据,还依赖于从数据中提取的特征。如果数据特征提取不正确,那么再多的训练数据也不能提高预测精度。

目前传统机器学习提取特征主要是人工提取,受人为影响较大。特征不同,则同样数据的表达方式不同,造成最后预测精度也有较大差异。人工方式去抽取实体或数据特征,往往是根据经验,无法很好的去抽取合适的特征,那么有没有自动抽取实体或数据特征的呢?

深度学习解决的核心问题之一就是自动的将简单的特征组合成更复杂的特征,并且使用这些组合特征解决问题。深度学习可以从数据中抽取更加复杂的特征表达式,使的最后一步权重学习变得更加简单且高效。

图3.2 传统机器学习算法与深度学习算法的流程对比

特征处理是将领域知识放入特征提取器里面来减少数据的复杂度并生成使学习算法工作的更好的模式的过程。特征处理过程很耗时而且需要专业知识。在机器学习中,大多数应用的特征都需要专家确定然后编码为一种数据类型。特征可以使像素值、形状、纹理、位置和方向。大多数机器学习算法的性能依赖于所提取的特征的准确度。深度学习尝试从数据中直接获取高等级的特征,这是深度学习与传统机器学习算法的主要的不同。基于此,深度学习削减了对每一个问题设计特征提取器的工作。

(3)硬件依赖

深度学习算法需要进行大量的矩阵运算,GPU 主要用来高效优化矩阵运算,所以 GPU 是深度学习正常工作的必须硬件。与传统机器学习算法相比,深度学习更依赖安装 GPU 的高端机器。

(4) 问题解决方式

当应用传统机器学习算法解决问题的时候,传统机器学习通常会将问题分解为多个子问题并逐个子问题解决最后结合所有子问题的结果获得最终结果。相反,深度学习提倡直接的端到端的解决问题。

图3.3 多物体检测

如图3.3所示,假设有一个多物体检测的任务需要图像中的物体的类型和各物体在图像中的位置。传统机器学会将问题分解为两步:物体检测和物体识别。首先,使用一个边界框检测算法扫描整张图片找到可能的是物体的区域;然后使用物体识别算法(例如 SVM 结合 HOG )对上一步检测出来的物体进行识别。相反,深度学习会直接将输入数据进行运算得到输出结果。例如可以直接将图片传给 YOLO 网络 (一种深度学习算法),YOLO 网络会给出图片中的物体和名称。

(5)执行时间

通常情况下,训练一个深度学习算法需要很长的时间。这是因为深度学习算法中参数很多,因此训练算法需要消耗更长的时间。最先进的深度学习算法ResNet完整地训练一次需要消耗两周的时间,而机器学习的训练会消耗的时间相对较少,只需要几秒钟到几小时的时间。但两者测试的时间上是完全相反。深度学习算法在测试时只需要很少的时间去运行。如果跟 k-nearest neighbors (一种机器学习算法)相比较,测试时间会随着数据量的提升而增加。不过这不适用于所有的机器学习算法,因为有些机器学习算法的测试时间也很短。

(6)可解释性

至关重要的一点,我们把可解释性作为比较机器学习和深度学习的一个因素。我们看个例子。假设我们适用深度学习去自动为文章评分。深度学习可以达到接近人的标准,这是相当惊人的性能表现。但是这仍然有个问题。深度学习算法不会告诉你为什么它会给出这个分数。当然,在数学的角度上,你可以找出来哪一个深度神经网络节点被激活了。但是我们不知道神经元应该是什么模型,我们也不知道这些神经单元层要共同做什么。所以无法解释结果是如何产生的。

另一方面,为了解释为什么算法这样选择,像决策树( decision trees )这样机器学习算法给出了明确的规则,所以解释决策背后的推理是很容易的。因此,决策树和线性、逻辑回归 这样的算法主要用于工业上的可解释性。

3.2、深度学习项目开发流程

下面是一个深度学习项目开发流程,仅供参考:

第一:启动一个深度学习项目。对现有任务情况进行深入研究,理解要处理的问题以及可能会出现的问题,分析项目的成本(涉及使用GPU计算)、时间线等。学会站在巨人的肩膀上解决问题,我们可以提前了解相关的研究和开源项目,许多人在开始实践之前至少要看几十篇论文和项目。

第二:创建一个深度学习数据集。深度学习项目的成功取决于数据集的质量。高质量数据集应该包括以下特征:类别均衡,数据充足,数据和标记中有高质量信息,数据和标记错误非常小,与你的问题相关。可以选择公开及学术数据集,也可以自定义数据集。

第三:设计深度模型。根据数据集及实际问题情况选择合适的深度学习模型和框架来进行模型训练。

第四:可视化深度网络模型及度量指标。在为深度神经网络排除故障方面,人们总是太快、太早地下结论了。在了解如何排除故障前,我们要先考虑要寻找什么,再花费数小时时间追踪故障。

第五:深度学习网络中的调试。深度学习网络调试检查列表如下:

对于数据:可视化并检查输入数据(在数据预处理之后,馈送到模型之前);检查输入标签的准确率(在数据扰动之后);不要一遍又一遍的馈送同一 batch 的数据;适当的缩放输入数据(一般可缩放到区间 (-1, 1) 之间,且具有零均值);检查输出的范围(如,在区间 (-1, 1) 之间);总是使用训练集的平均值/方差来重新调节验证/测试集;模型所有的输入数据有同样的维度;获取数据集的整体质量(是否有太多异常值或者坏样本)。

对于模型:模型参数准确的初始化,权重不要全部设定为 0;对激活或者梯度消失/爆炸的网络层做 debug(从最右边到最左边);对权重大部分是 0 或者权重太大的网络层做 debug;检查并测试损失函数;对预训练模型,输入数据范围要匹配模型中使用的范围;推理和测试中的 Dropout 应该总是关掉。

第六:改善深度学习模型性能及网络调参。以下是提升性能的检查列表:在验证数据集中分析误差(糟糕的预测结果);监控激活函数。在激活函数不以零为中心或非正态分布时,考虑批归一化或层归一化;监控无效节点的比例;使用梯度截断(尤其是 NLP 任务中)来控制梯度爆炸问题;Shuffle 数据集(手动或通过程序);平衡数据集(每个类别具备相似数量的样本)。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: