机器学习实践指南(三)
原文:
annas-archive.org/md5/0c5a0ebc55e1e877629334a7531d9961译者:飞龙
第十一章:深度学习
到目前为止,我们介绍了一些监督学习、半监督学习、无监督学习和强化学习的技术和算法。在本章中,我们将介绍神经网络及其与深度学习实践的关系。传统的学习方法涉及编写告诉计算机做什么的程序,但神经网络是关于学习和使用观察数据来寻找解决方案,这些数据是输入的主要来源。这种技术的成功取决于神经网络是如何训练的(即观察数据的质量)。深度学习指的是学习先前提到的神经网络的方法。
技术的进步将这些技术提升到了新的高度,在这些技术中,它们展示了卓越的性能,并被用于解决计算机视觉、语音识别和自然语言处理(NLP)中的一些关键非平凡需求。Facebook 和 Google 等大型公司以及其他许多公司已经在很大程度上采用了深度学习实践。
本章的主要目的是在概念上掌握神经网络和相关深度学习技术。借助一个复杂的模式识别问题,本章涵盖了开发典型神经网络的步骤,这将使你能够使用它来解决类似复杂性的问题。以下表示展示了本书涵盖的所有学习方法,突出了本章学习的主要主题——深度学习。
本章深入探讨了以下主题:
-
快速回顾机器学习的目的、学习类型以及深度学习的背景,特别是它解决的一个特定问题。
-
神经网络的概述:
-
人类大脑作为神经网络的主要灵感来源
-
神经网络架构的类型和一些神经元的基本模型
-
一个简单的学习示例(数字识别)
-
感知器概述,神经网络的第一代及其所能做到的和不能做到的事情
-
-
线性和逻辑输出神经元的概述。介绍反向传播算法以及应用反向传播算法的导数来解决一些实际问题
-
认知科学的概念、softmax 输出函数以及处理多输出场景
-
应用卷积网络和对象或数字识别的问题
-
循环神经网络(RNN)和梯度下降法
-
信号处理作为成分分析和自编码器的原理;深度和浅度自编码器的类型
-
使用 Apache Mahout、R、Julia、Python(scikit-learn)和 Apache Spark 进行练习的动手实现
背景
让我们先回顾一下机器学习的先决条件,并加强学习方法的宗旨和背景。正如我们所学的,机器学习是通过构建模型来训练机器,使用观察数据,而不是直接编写定义数据模型的特定指令,以解决特定的分类或预测问题。在这个背景下,“模型”这个词不过是一个“系统”。
程序或系统是使用数据构建的,因此看起来与手写的程序非常不同。如果数据发生变化,程序也会适应它以进行新数据的下一级训练。所以它所需要的只是处理大规模数据的能力,而不是让熟练的程序员为所有可能仍然证明是严重错误的条件编写代码。
我们有一个机器学习系统的例子,称为垃圾邮件检测器。这个系统的首要目的是识别哪些邮件是垃圾邮件,哪些不是。在这种情况下,垃圾邮件检测器并没有被编码来处理所有类型的邮件;相反,它是从数据中学习的。因此,这些模型的精确度始终取决于观察数据的好坏。换句话说,从原始数据中提取的特征通常应该覆盖数据模型的所有状态,以便模型准确。特征提取器被构建出来,用于从给定的数据样本中提取标准特征,这些特征被分类器或预测器使用。
一些其他例子包括识别模式,如语音识别、物体识别、人脸检测等。
深度学习是一种机器学习方法,它试图从给定数据中学习显著特征,因此试图减少为每个数据类别(例如,图像、声音等)构建特征提取器的任务。对于人脸检测的需求,深度学习算法记录或学习特征,如鼻子的长度、眼睛之间的距离、眼球的颜色等。这些数据被用来解决分类或预测问题,显然与传统的浅层学习算法非常不同。
人类大脑
人类大脑被认为是人体中最不可思议的器官之一。大脑本质上是我们人类智能的源泉。它负责根据我们关于触觉、嗅觉、视觉、听觉等方面的体验来构建我们的感知。这些体验被收集并存储为记忆和情感。本质上,大脑是我们智能的来源,没有它,我们可能只是世界上的原始生物。
新生儿的脑部能够解决任何复杂且强大的机器都无法解决的问题。实际上,就在出生后的几天内,婴儿就开始识别他/她父母的脸和声音,并在他们不在时表现出渴望见到他们的表情。在一段时间内,他们开始将声音与物体联系起来,甚至可以在看到物体时识别它。那么他们是如何做到这一点的呢?如果他们遇到一只狗,他们是如何识别它为狗的;他们是否将吠声与之联系起来并模仿同样的声音?
它很简单。每次婴儿遇到一只狗时,他/她的父母都会将其定义为狗,这加强了孩子的模型。如果他们判定孩子是错误的,孩子的模型就会吸收这些信息。因此,狗有长长的耳朵、长长的鼻子、四条腿、长长的尾巴,可以是黑色、白色或棕色等不同颜色,并发出吠声。这些特征是通过婴儿大脑记录的视觉和声音来识别的。因此收集到的观察数据驱动了此后对新物体的识别。
现在,假设婴儿第一次看到狼;他/她会通过观察其特征相似性将狼识别为狗。现在,如果父母在第一次看到时就指出明显的差异,例如,狼发出的声音不同,那么这将成为一种新的体验,并存储在记忆中,用于下一次的观察。随着越来越多此类例子的同化,孩子的模型变得越来越准确;这个过程是非常无意识的。
几年来,我们一直在努力构建具有人类大脑智能的机器。我们谈论的是可以像人类一样行为并能够以类似人类的效率完成特定工作的机器人,例如开车、打扫房子等等。现在,要构建这样的机器人需要什么?我们可能需要构建一些超级复杂的计算系统,这些系统能够迅速解决我们大脑可以解决的问题。这个致力于构建人工智能系统的领域被称为深度学习。
以下是一些深度学习的正式定义:
根据维基百科,深度学习是一组机器学习算法,它试图通过使用由多个非线性变换组成的模型架构来模拟数据中的高级抽象。
根据deeplearning.net/,深度学习是机器学习研究的新领域,其目标是使机器学习更接近其最初目标之一——人工智能。
这个主题已经演变了数年;以下表格列出了这些年的研究领域:
| 研究领域 | 年份 |
|---|---|
| 神经网络 | 1960 |
| 多层感知器 | 1985 |
| 限制性玻尔兹曼机 | 1986 |
| 支持向量机 | 1995 |
| 辛顿提出深度信念网络(DBN)对深度学习和 RBM 的新兴趣,以及最先进的 MNIST | 2005 |
| 深度循环神经网络 | 2009 |
| 卷积深度信念网络 | 2010 |
| 最大池化卷积深度信念网络 | 2011 |
在众多贡献者中,这个领域的几位关键贡献者包括杰弗里·辛顿(Geoffrey Hinton)、杨立昆(Yann LeCun)、洪乐克·李(Honglak Lee)、安德鲁·杨(Andrew Y. Ng)和约书亚·本吉奥(Yoshua Bengio)。
以下的概念模型涵盖了深度学习的不同领域,以及本章涵盖的主题范围:
让我们来看一个简单的问题;要求是识别这里给出的手写脚本中的数字:
对于人类大脑来说,这非常简单,因为我们能将数字识别为 287635。我们大脑解释数字的简单性是感知的,它削弱了这一过程中涉及的复杂性。由于视觉皮层的存在,我们的大脑被训练成逐步拦截不同的视觉,每个皮层包含超过 1.4 亿个神经元,它们之间有数十亿个连接。简而言之,我们的大脑不亚于一个经过数百万年演化的超级计算机,并且已知能够很好地适应视觉世界。
如果一个计算机程序需要破解数字识别,应该遵循什么规则来识别和区分一个数字与另一个数字?
神经网络是多年来一直在研究的一个领域,并且已知可以解决多层学习的需求。整体的想法是输入大量手写的数字;以下图像展示了这些数据(训练)的一个例子,并且可以从这些例子中学习。这意味着规则是从提供的训练数据中自动推断出来的。因此,训练数据集越大,预测的准确性就越高。如果我们面临一个问题,需要区分数字 1 和数字 7,或者数字 6 和数字 0,就需要学习一些细微的差异。对于一个零,起点和终点之间的距离是最小或没有。
差异基本上是因为这些学习方法的目标是模仿人类大脑。让我们看看是什么使得这个问题难以解决。
总结来说,深度学习作为机器学习的一个子集,我们知道这涉及到提供示例和评估模式以在出错时进行演化的模型。因此,在一段时间内,这个模型将以最佳可能的准确性解决问题。
如果这需要用数学来表示,让我们定义我们的模型为一个函数 f(x,θ)。
在这里,x 是作为值向量提供的输入,而 θ 是模型用来预测或分类 x 的参考向量。因此,我们需要将 θ 暴露给最大数量的示例,以提高准确性。
让我们举一个例子;如果我们想根据两个因素预测一家餐厅的访客是否会再次光临——一个是账单金额(x[1]),另一个是访客的年龄(x[2])。当我们收集一段时间内的数据并分析其输出值时,这个值可以是 1(如果访客回来了)或-1(如果访客没有回来)。当数据被绘制出来时,可以呈现任何形式——从线性关系到任何其他复杂形式,如图所示:
看起来像线性关系的东西看起来很简单,而更复杂的关系则使模型动态复杂化。参数 θ 是否真的有一个最优值?我们可能需要应用优化技术,在接下来的章节中,我们将介绍这些技术,例如感知器和梯度下降法等。如果我们想开发一个执行此操作的程序,我们需要知道大脑是如何识别这些数字的,即使我们知道了,这些程序也可能非常复杂。
神经网络
神经计算一直是研究的主要兴趣,旨在了解神经元(灵活连接的概念)中的并行计算是如何工作的,以及如何像人类大脑一样解决实际问题。现在让我们看看人类大脑的核心基本单元——神经元:
神经元
人类大脑就是由神经元和连接组成的。神经元是大脑的最小部分,如果我们取一小块大脑,其大小与一小粒米饭粒相当,已知至少包含 10000 个神经元。平均每个神经元与其他神经元有大约 6000 个连接。如果我们观察神经元的总体结构,它看起来如下。
我们人类经历的所有感觉,无论是思考还是情感,都是因为这些被称为神经元的数百万个细胞在大脑中的活动。这些神经元通过传递信息相互沟通,使人类能够感受、行动和形成感知。此处所示的图解描绘了生物神经结构和其组成部分:
每个神经元都有一个中央细胞体;像任何细胞一样,它有一个负责与其他神经元发送和接收信息的轴突和树突。轴突连接到树突的地方称为突触。突触本身有一个有趣的结构。它们包含触发传递的传递分子,这种传递可以是正的或负的。
神经元的输入被汇总,当它们超过阈值时,就会向下一个神经元传递一个电脉冲。
突触
以下图表展示了突触模型,描述了从轴突到树突的消息流动。突触的工作不仅仅是传输消息,实际上,它还会根据信号流动进行适应,并具有从过去活动中学习的能力。
作为机器学习领域的类比,输入连接的强度是根据其被使用的频率来确定的,因此其影响神经元输出的程度也随之确定。这就是人类潜意识中学习新概念的方式。
此外,还可能有外部因素,如药物或身体化学成分,可能会影响这一学习过程。
现在我们将最终通过以下列表总结大脑内部的学习过程:
-
神经元与其他神经元或有时受体进行通信。皮层神经元使用尖峰进行通信。
-
神经元之间的连接强度可以改变。它们可以通过建立和移除神经元之间的连接,或者根据神经元对其他神经元可能产生的影响来加强连接,从而取正值或负值。一个称为长期增强(LTP)的过程发生,从而产生这种长期影响。
-
大约有 10¹¹ 个神经元,它们的权重使得人类大脑的计算比工作站更有效率。
-
最后,大脑是模块化的;大脑皮层的不同部分负责做不同的事情。某些任务在某个区域比其他区域注入更多的血流,从而确保不同的结果。
在将神经元模型 schematizing 到人工神经网络(ANN)之前,让我们首先看看神经元的不同类型、类别或方面,特别是人工神经元或感知器,这是生物神经元的深度学习等效物。这种方法已知在我们在上一节中列出的某些用例中产生了极其高效的结果。ANN 也被称为前馈神经网络、多层感知器(MLP),以及最近,深度网络或学习。其中一个重要特征是需要特征工程,而深度学习则代表需要最少特征工程的应用,学习通过多个学习的神经元层发生。
人工神经元或感知器
很明显,人工神经元是从生物神经元那里获得灵感的,正如之前所展示的那样。人工神经元的特点如下:
-
从其他神经元接收一组输入,这些输入激活了神经元
-
有一个输出传输器,用于传输信号或激活其他神经元
-
最后,核心处理单元负责从输入激活中产生输出激活
理想化神经元是一个应用于构建模型的过程。简而言之,它是一个简化过程。一旦简化,就可以应用数学和建立类比。在这种情况下,我们可以轻松地增加复杂性,并在已识别的条件下使模型更加健壮。在简化过程中,需要特别注意不要删除任何显著贡献的方面。
线性神经元
线性神经元是神经元的最简单形式;它们可以表示如下:
输出 y 是输入 x[i] 和其权重 w[i] 的乘积之和。这可以用以下方式在数学上表示:
这里,b 是偏置。
之前方程的图形表示如下:
矩形线性神经元/线性阈值神经元
矩形线性神经元与线性神经元类似,如前所述,只是在输出参数值小于(<)零(0)时将其设置为零,而在输出值大于(>)零(0)时,它继续作为输入的线性加权和:
二元阈值神经元
二元阈值神经元由 McCulloch 和 Pitts 于 1943 年引入。这类神经元首先计算输入的加权总和,类似于线性神经元。如果这个值超过一个定义的阈值,就会发送一个固定大小的脉冲到活动状态。这个脉冲被称为命题的真值。另一个重要点是输出。在任何给定时间点的输出是二进制的(0 或 1)。
展示这种行为的方程如下:
并且
y = 1 如果 z ≥ θ,
y = 0 否则
这里 θ = -b (偏置)
(或者)
并且
y = 1 如果 z ≥ 0,
y = 0 否则
此外,之前方程的图形表示如下:
Sigmoid 神经元
Sigmoid 神经元在人工神经网络中得到了广泛的应用。这些神经元因其提供平滑、实值输出而闻名,因此是所有输入的有界函数。与迄今为止我们所看到的神经元类型不同,这些神经元使用对数函数。
对数函数因其易于计算的导数而闻名,这使得学习变得容易。这个导数值用于计算权重。以下是 sigmoid 神经元的输出方程:
图形表示如下:
随机二元神经元
随机二进制神经元使用与逻辑单元相同的方程,但有一个重要区别,即输出测量的是概率值,该值衡量在短时间内产生尖峰的概率。因此,方程看起来是这样的:
此外,该方程的图形表示如下:
总体而言,我们可以观察到每个神经元接受了一组输入的加权和,并应用了非线性激活函数。对于解决回归问题,通常应用修正线性函数;对于分类问题,应用逻辑函数。这种通用的表示可以如下给出:
现在,这些输入可以被输入到一系列的神经元层中。让我们看看接下来会发生什么以及它是如何发生的。输入层推动输入值;然后神经元隐藏层将这些值作为输入。在这些隐藏层中可能有多个层,其中一层输出作为下一层的输入。每一层都可以负责专门的学习。此外,最后,隐藏层的最后一个输入到最终输出层。以下图展示了人工神经网络(ANN)的典型结构。下一个图中的每个圆圈代表一个神经元。信用分配路径(CAP)的概念指的是从输入到输出的路径。在前馈网络中,路径的长度是总隐藏层数量加上输出层。以下图显示了一个具有单个隐藏层和层间连接的前馈神经网络:
这里展示了具有两个隐藏层的案例:
神经网络大小
计算神经元或参数的数量如下所示:
-
对于单层网络:
神经元总数 = 4 + 2 = 6(输入不计入)
总权重 = [3 x 4] + [4 x 2] = 20
总偏差 = 4 + 2 = 6,对于 26 个可学习的参数。
-
对于双层网络:
神经元总数 = 4 + 4 + 1 = 9(输入不计入)
总权重 = [3 x 4] + [4 x 4] + [4 x 1] = 12 + 16 + 4 = 32
总偏差 = 4 + 4 + 1 = 9,对于 41 个可学习的参数
那么,神经网络的理想大小是什么?识别每个层的可能大小以及隐藏层的数量非常重要。这些决策决定了网络的能力。更高的值有助于支持更高的能力。
让我们举一个例子,我们将通过获取以下分类器来尝试三种不同大小的隐藏层:
显然,随着神经元数量的增加,可以表达更复杂的函数,这是好事,但我们需要注意过拟合的情况。因此,对于更简单的数据,较小的网络效果较好。随着数据复杂性的增加,需要更大的网络。这种权衡总是在处理模型的复杂性与过拟合之间。深度学习通过应用复杂模型来解决极复杂问题,并通过采取额外措施来处理过拟合。
一个例子
下一个示例展示了使用多层感知器方法进行的人脸识别案例:
多层将此图像作为输入,最终创建并存储分类器定义。
给定一张照片,每一层专注于学习照片的特定部分,最终存储输出像素。
关于权重和误差度量的一些关键点如下:
-
训练数据是学习神经元权重的来源
-
错误度量或损失函数与回归和分类问题不同。对于分类,应用对数函数,而对于回归,使用最小二乘度量。
-
这些方法通过使用凸优化技术(如梯度下降法)更新权重来帮助控制这些误差度量。
神经网络类型
在本节中,我们将介绍一些关键类型的神经网络。以下概念图列出了几种主要的神经网络类型:
多层全连接前馈网络或多层感知器(MLP)
如神经网络简介部分所述,MLP 有多个层,其中一层的输出作为下一层的输入。多层感知器如图所示:
Jordan 网络
Jordan 网络是部分循环网络。这些网络是当前的前馈网络,不同之处在于输入层内部有额外的上下文神经元。这些上下文神经元是自我强制的,并使用来自输入神经元的直接反馈创建。在 Jordan 网络中,上下文神经元的数量始终等于输入神经元。以下图显示了输入层的差异:
Elman 网络
Elman 网络,就像 Jordan 网络一样,是部分递归的前馈网络。这些网络也有上下文神经元,但在这个情况下,主要区别在于上下文神经元接收来自输出神经元的输入,而不是来自隐藏层。上下文神经元的数量与输入神经元的数量之间没有直接关联;相反,上下文神经元的数量与隐藏神经元的数量相同。这反过来使得这个模型更加灵活,就像隐藏神经元的数量在具体情况下一样:
径向偏置函数(RBF)网络
径向偏置函数网络也是前馈神经网络。这些网络有一个特殊的隐藏层,包含称为径向对称神经元的特殊神经元。这些神经元用于使用高斯度量将输入向量与中心之间的距离值进行转换。这个额外层的好处是它提供了确定所需层数的能力,而无需人工干预。线性函数的选择决定了最优输出层。因此,在这些网络中,学习过程相对较快,甚至与反向传播相比也是如此。
这种方法的唯一缺点是处理大型输入向量的能力。下面的图示展示了径向对称神经元的隐藏层。
跳时网络
跳时网络围绕一个称为“网络能量”的概念进行工作。这实际上就是网络的最优局部最小值,它定义了功能性的平衡状态。跳时网络的目标是达到这个平衡状态。平衡状态是指某一层的输出等于前一层的输出。以下图示展示了如何在跳时网络中检查和管理输入和输出状态:
动态学习向量量化(DLVQ)网络
动态学习向量量化(DLVQ)网络模型是神经网络的一种变体,它从较少的隐藏层开始,并动态生成这些隐藏层。对于属于同一类的模式具有相似性是很重要的;因此,这个算法最适合分类问题,如模式识别、数字识别等。
梯度下降法
在本节中,我们将探讨优化神经网络最流行的一种方法之一,即最小化成本函数、最小化错误并提高神经网络准确性的方法:梯度下降法。这里的图表显示了实际值与预测值之间的差异,以及预测不准确的情况:
反向传播算法
在继续讨论网络训练的话题时,梯度下降算法帮助神经网络学习权重和偏置。此外,为了计算损失函数的梯度,我们使用一个称为反向传播的算法。反向传播首次在 20 世纪 70 年代被讨论,直到 20 世纪 80 年代才在应用方面变得突出。已经证明,当使用反向传播算法时,神经网络学习速度更快。
在本章的早期部分,我们看到了基于矩阵的算法是如何工作的;反向传播算法使用了类似的符号。对于一个给定的权重w和偏置b,损失函数 C 有两个偏导数,分别是∂C/∂w和∂C/∂b。
关于反向传播的损失函数的一些关键假设在此处陈述。让我们假设损失函数由以下方程定义:
其中,n = 训练示例的数量
x = 对单个训练集求和
y = *y(x)*是期望输出
L = 神经网络中的总层数
a^L = *a^L(x)*是输出激活向量
假设 1:整体损失函数可以是单个损失函数的平均值。对于x个单独的训练集,损失函数现在可以表述如下:
此外,单个训练集的损失函数可以如下所示:
基于这个假设,由于我们可以计算每个训练集x的偏导数∂[x]C/∂w 和∂[x]C/∂b,所以整体偏导数函数∂C/∂w 和∂C/∂b 可以是每个训练集偏导数的平均值。
假设 2:这个假设是关于损失函数C,即C可以是神经网络输出的函数,如图所示:
将损失函数的先前方程式扩展,每个训练示例集x的二次损失函数现在可以写成如下形式。我们可以看到它如何作为输出激活的函数。
反向传播是关于权重和偏置对整体损失函数值的影响。
首先,我们计算第l层的第j个神经元的误差δ^l[j],然后使用这个值来计算与这个误差*δ^l[j]*相关的偏导数:
第l层的第j个神经元的误差函数*δ^l[j]*可以定义为:
因此,层L的误差δ^L也可以计算。这反过来又帮助计算损失函数的梯度。
反向传播算法按顺序使用以下方程,如图所示:
方程式 1:给定位置 j 的神经元,层 L 的计算误差 δ^L。
方程式 2:给定下一层的误差 δ^(L+1),层 L 的计算误差 δ^L。
注意
Hadamard 积是一种矩阵乘法技术,用于逐元素矩阵乘法,如下所示:
符号 用于表示此方法。
方程式 3:此方程衡量对成本的影响,并给出偏差的变化:
此外,我们还可以从方程式 1 和 2 得到以下内容:
这是因为误差值与偏导数的改变率相同。
方程式 4:此方程用于计算成本变化率与权重的关系。
在这些算法的每个阶段,都有某种学习影响网络的总体输出。
这里解释了编译后的最终反向传播算法:
-
输入层 x,对于 x =1 设置激活为 a¹。
-
对于其他每一层 L = 2, 3, 4 … L,计算激活如下:
-
使用方程式 1 和 2 计算误差 δ^L。
-
使用方程式 3 反向传播误差 l = L-1, L-2, … 2, 1。
-
最后,使用方程式 4 计算成本函数的梯度。
如果我们观察算法,错误向量 δ^l 是从输出层开始反向计算的。这是事实,因为成本是网络输出的函数。为了理解早期权重对成本的影响,需要应用链式法则,该方法通过所有层反向工作。
Softmax 回归技术
Softmax 回归也称为多项式逻辑回归。本节不深入探讨逻辑回归的概念,因为它在本书中关于回归的章节中已有涉及。相反,我们将具体探讨如何将这种技术在深度学习用例中的数字识别相关问题上应用。
这种技术是逻辑回归的一个特例,适用于多类别。正如我们所学的,逻辑回归的结果是一个二进制值 {0,1}。Softmax 回归便于处理 y(i)<--{1,…,n},其中 n 是类别的数量,相对于二进制分类。在 MNIST 数字识别案例中,n 的值是 10,代表 10 个不同的类别。例如,在 MNIST 数字识别任务中,我们会遇到 K=10 个不同的类别。
由于其处理多个类别的能力,这项技术在基于神经网络的解决问题领域中得到了积极的应用。
深度学习分类法
这里展示了深度学习案例的特征学习分类法:
这里列出了用于实现神经网络应用的一些框架:
-
Theano 是一个 Python 库
-
Torch 是 Lua 编程语言
-
Deeplearning4J 是一个开源的基于 Java 的框架,与 Spark 和 Hadoop 一起工作
-
Caffe 是一个基于 C++ 的框架
卷积神经网络 (CNN/ConvNets)
CNN,也称为卷积网(ConvNets),是常规神经网络的变体。
让我们回顾一下常规神经网络的函数。常规神经网络有一个基于向量的单个输入,它通过一系列隐藏层进行转换,其中每一层的神经元与其相邻层的神经元相连。这个系列中的最后一层提供输出。这个层被称为输出层。
当神经网络输入是一个图像,并且不仅仅适合单个向量结构时,复杂性会增加。CNN 有这种轻微的变化,其中输入被假定为具有深度(D)、高度(H)和宽度(W)的三维向量。这种假设改变了神经网络的组织方式和功能方式。以下图比较了标准三层神经网络与 CNN。
如我们所见,前面展示的卷积网以三维方式排列神经元;网络中的每一层都将这些转换为神经元激活的 3D 输出。
卷积网络架构包含一组用于特定功能的固定层。其中最关键的层如下:
-
卷积层 (CONV)
-
池化层 (POOL)
-
全连接 (FC) 层
在某些情况下,激活函数被写成另一个层(RELU);全连接层转换可能存在一个独特的归一化层。
卷积层 (CONV)
卷积层是卷积网的核心。这个层负责以三维格式保持神经元,因此负责三维输出。以下是一个具有 32 x 32 x 3 维度的输入体积的示例。如图所示,每个神经元都连接到特定的输入区域。在深度方向上可以有多个神经元;在示例中我们可以看到五个神经元。
此图展示了网络卷积函数在神经元函数表示中的工作方式:
也就是说,神经元的核心理念保持不变,负责计算权重和输入的乘积,然后观察非线性行为。唯一的区别是对局部区域的连接限制。
池化层 (POOL)
可以有多个卷积层,在这些卷积层之间,可以有池化层。池化层负责通过减少输入体积的空间大小来降低过拟合的可能性。空间大小的减少意味着减少网络中的参数数量或计算量。MAX 函数有助于减少空间大小。池化层使用 MAX 函数,并在三维表示的每个切片上应用它,切片是按深度进行的。通常,池化层应用 2 X 2 大小的过滤器,沿宽度和高度应用。这可以丢弃大约 75%的激活。
总体来说,池化层具有以下特点:
-
总是考虑一个体积大小为 W1×H1×D1 作为输入
-
应用步长 S 和空间范围 F,生成 W2×H2×D2 输出,其中:
W2=(W1−F)/S+1
H2=(H1−F)/S+1
D2=D1
全连接层(FC)
全连接层与常规或传统神经网络非常相似,负责与前一层激活建立广泛的连接。连接激活是通过矩阵乘法技术计算的。更多细节可以参考本章前面的部分。
循环神经网络(RNNs)
RNNs 是神经网络的一种特殊情况,已知在记住信息方面非常高效,因为隐藏状态是以分布式方式存储的,因此它可以存储更多关于经验的信息。这些网络还应用非线性函数来更新隐藏状态。以下图表描述了 RNNs 中隐藏状态是如何连接的:
在大多数现实世界的例子中,输入和输出并不是相互独立的。例如,如果我们必须预测下一个单词,那么了解它之前的单词对我们来说很重要。正如其名所示,“循环”神经网络一次又一次地执行相同的任务,其中一次执行的输入是前一次执行的输出。通常,RNNs 只回溯过去的一步或几步,而不是总是通过所有迭代。以下图表描述了 RNNs 的工作原理;它显示了 RNNs 如何在迭代中展开:
在上一个例子中,要求预测下一个单词,如果输入有五个单词,那么 RNN 展开到五层。
受限玻尔兹曼机(RBMs)
RBMs 的出现是为了解决训练 RNNs 的困难。受限循环模型的出现简化了问题背景,并且还应用了学习算法来解决问题。Hopfield 神经网络是解决之前描述问题的受限模型的一个例子。
作为第一步,玻尔兹曼机出现了。这些模型是具有随机元素的 Hopfield 神经网络的特例。在这种情况下,神经元分为两类:一类产生可见状态,另一类产生隐藏状态。这也类似于隐藏马尔可夫模型。RBM 是玻尔兹曼机的特例,主要区别在于同一层神经元之间没有连接。因此,对于一组神经元的给定状态,另一组神经元的状态是独立的。以下图展示了典型的 RBN 结构和之前的定义:
进一步从这个定义进行深入解释,一些神经元的可见状态是可观察的,还有一些神经元的隐藏状态是不可见的或不能直接看到。基于可用的可见状态,对隐藏状态做出一些概率推断,这就是训练模型形成的方式。
在 RBM 中,连接是受限的,这反过来又简化了推理和学习。通常只需一步就能达到一个平衡状态,其中可见状态被固定。以下公式显示了在提供可见状态信息的情况下,如何计算隐藏状态的概率:
深度玻尔兹曼机 (DBMs)
DBMs 是具有许多缺失连接的传统玻尔兹曼机的特例,并且与顺序随机更新不同,允许并行更新以确保模型效率。
DBMs 限制了隐藏变量之间的连接,主要使用未标记数据来训练模型。标记数据用于微调模型。以下图展示了三层 DBM 的一般结构:
自动编码器
在我们了解自动编码器之前,让我们先了解自联想器(AA)。AA 的目标是以尽可能高的精度接收输入。
AA(自动编码器)的目的是尽可能精确地将输出作为输入图像。AA 分为两大类:一类是生成 AA,另一类是合成 AA。上一节中提到的 RBMs 属于生成 AA,而自动编码器则是合成 AA。
自动编码器是一种具有单个开放层的神经网络。应用反向传播和无监督学习技术,自动编码器从假设目标值等于输入值开始,y = x。以下图展示了一个学习函数h[W,b] (x) ≈ x的自动编码器:
中间层是开放的,如图中所示,为了获得最佳输出,这个层的神经元数量必须少于输入层的神经元数量。这个模型的目标是学习一个近似于恒等函数的函数,使得**层 L[3]的值等于层 L[1]**的值。
数据在通过输入到输出层时被压缩。当将某个像素图像(例如 100 像素,10 X 10 像素)输入到具有 50 个神经元的隐藏层时,网络试图通过保持像素配置不变来压缩图像。这种压缩只有在存在隐藏的互连和其他可以减少输入数据的特征相关性时才可能实现。
自编码器的另一种变体是降噪自编码器(DA)。这种自编码器变体的不同之处在于它具有额外的能力,可以恢复和恢复受损坏输入数据影响的原始状态。
实现 ANN 和深度学习方法
请参考本章提供的源代码来实现本章中涵盖的人工神经网络和其他深度学习方法(源代码路径为.../chapter11/...,位于每个技术文件夹下)。
使用 Mahout
请参考文件夹.../mahout/chapter11/annexample/。
请参考文件夹.../mahout/chapter11/dlexample/。
使用 R
请参考文件夹.../r/chapter11/annexample/。
请参考文件夹.../r/chapter11/dlexample/。
使用 Spark
请参考文件夹.../spark/chapter11/annexample/。
请参考文件夹.../spark/chapter11/dlexample/。
使用 Python(Scikit-learn)
请参考文件夹.../python-scikit-learn/chapter11/annexample/。
请参考文件夹.../python-scikit-learn/chapter11/dlexample/。
使用 Julia
请参考文件夹.../julia/chapter11/annexample/。
请参考文件夹.../julia/chapter11/dlexample/。
摘要
在本章中,我们介绍了生物神经元的模型以及人工神经元如何与其功能相关。你学习了神经网络的核心概念,以及全连接层是如何工作的。我们还探讨了与矩阵乘法结合使用的一些关键激活函数。
第十二章。强化学习
我们在第五章基于决策树的学习中深入探讨了监督学习和无监督学习方法,并介绍了各种算法。在本章中,我们将介绍一种不同于监督学习和无监督学习的新学习技术,称为强化学习(RL)。强化学习是一种特定的机器学习方法,其学习过程由环境的反馈驱动,学习技术是迭代和自适应的。强化学习被认为更接近人类学习。强化学习的主要目标是决策,其核心是马尔可夫决策过程(MDP)。在本章中,我们将介绍一些基本的强化学习方法,如时间差分(TD)、确定性等价、策略梯度、动态规划等。以下图展示了本章将涵盖的不同数据架构范例:
本章将深入探讨以下主题:
-
监督学习、半监督学习和无监督学习的回顾,以及强化学习的背景。
-
理解马尔可夫决策过程(MDP)对于强化学习至关重要。关于这一点,本章将涵盖以下主题:
-
MDP 代表什么,关键属性,状态,奖励,动作和转移(折扣)
-
MDP 的底层过程以及它如何帮助决策过程
-
策略和价值函数(也称为效用,如在奖励组中)以及我们如何对无限序列的奖励进行赋值
-
贝尔曼方程——值迭代和政策迭代
-
-
关于强化学习,我们将涵盖以下内容:
-
在 MDP 中的规划和学习
-
强化学习中的连接规划和功能逼近
-
不同的强化学习方法和对强化学习的不同方法,例如简单的决策理论、时间差分(TD)、动态规划、策略梯度、确定性等价和资格痕迹
-
如 Q-learning、Sarsa 等关键算法
-
强化学习应用
-
强化学习(RL)
让我们回顾一下监督学习、半监督学习和无监督学习,并为强化学习设定背景。在第一章机器学习简介中,我们介绍了监督学习、半监督学习和无监督学习的基本定义。归纳学习是一种推理过程,它使用一个实验的结果来运行下一组实验,并从具体信息中迭代地进化模型。
以下图展示了机器学习的各个子领域。这些子领域是机器学习算法分类的一种方式:
监督学习主要涉及根据已知期望进行操作,在这种情况下,需要从定义的数据中进行分析。在此背景下,输入数据集也被称为标记数据集。属于这一类别的算法专注于建立输入和输出属性之间的关系,并利用这种关系推测性地为新输入数据点生成输出。在前一节中,为分类问题定义的示例也是监督学习的一个例子。标记数据有助于构建可靠的模型,通常成本高昂且有限。以下图表展示了监督学习的工作流程:
因此,这是一个函数逼近,给定 x 和 y 对,我们的目标是找到将新的 x 映射到适当的 y 的函数 f:
y = f(x)
在一些学习问题中,我们并没有特定的目标来解决;这种学习被称为无监督分析或学习。在这种情况下,目标是解析数据中的结构,而不是在数据的输入和输出属性之间建立映射,实际上,输出属性并未定义。这些学习算法由于这个原因在无标记数据集上操作。
因此,给定一系列 x,这里的目的是定义一个函数 f,它可以对一组 x 提供简洁的描述。因此,这被称为聚类:
f(x)
半监督学习涉及使用标记和无标记数据来学习更好的模型。对于无标记数据,必须存在适当的假设,因为任何错误的假设都可能使模型无效。半监督学习从人类的学习方式中汲取灵感。
强化学习的背景
强化学习关注的是最大化结果带来的奖励。例如,在教导幼儿新习惯时,每次幼儿遵循指示就给予奖励非常有效。事实上,他们发现哪些行为有助于他们获得奖励。这正是强化学习所做的事情,它也被称为信用评估学习。
强化学习最重要的地方在于,模型还需要负责做出决策,而这些决策会收到周期性的奖励。在这种情况下,与监督学习不同,结果不是立即的,可能需要执行一系列步骤才能看到最终结果。理想情况下,算法将生成一系列决策,以帮助实现最高的奖励或效用。
这种学习技术的目标是通过对数据和利用进行探索来有效地衡量权衡。例如,当一个人需要从点 A 到点 B 旅行时,会有许多方式,包括空中、水上、路上或步行,考虑这些选项的权衡数据具有很大的价值。另一个重要方面是,奖励的延迟意味着什么?此外,它会如何影响学习?例如,在象棋等游戏中,奖励识别的任何延迟都可能改变或影响结果。
因此,表示与监督学习非常相似,区别在于输入不是 x、y 对,而是 x、z 对。目标是找到一个函数 f,给定 x 和 z 识别一个 y。在接下来的章节中,我们将进一步探讨 z 是什么。目标函数的定义方程如下:
y = f(x) 给定 z。
强化学习的一个正式定义如下:
| *"强化学习被定义为通过奖励和惩罚来编程代理的方法,而不需要指定如何完成任务。" | ||
|---|---|---|
| --凯尔宾、利特曼、摩尔,96 |
因此,总的来说,强化学习既不是一种神经网络类型,也不是神经网络的替代品,而是一种正交的机器学习方法,重点在于学习反馈,用于评估学习者的表现,没有标准的行为目标来衡量表现,例如学习骑自行车。
让我们现在看看正式或基本的强化学习模型,并了解动作中的不同元素。作为第一步,让我们了解一些基本术语。
-
代理:代理是一个既是学习者又是决策者的实体,在这种情况下通常是一个智能程序。
-
环境:环境是一个实体,负责在代理执行动作后产生新的情况。它为动作提供奖励或反馈。所以,简而言之,环境是除了代理之外的一切。
-
状态:状态是动作使实体所处的情形。
-
动作:动作是代理执行的一步,导致状态的变化。
-
政策:政策是在特定时间点代理行为的定义。它阐述了状态和动作之间的映射,通常是一个简单的业务规则或函数。
-
奖励:奖励规定了动作的短期利益,有助于达到目标。
-
价值:在强化学习中还有一个重要的元素,那就是价值函数。虽然奖励函数是关于动作的短期或即时利益,但价值函数是关于长期的好处。这个价值是代理从世界开始时预期获得的奖励的累积。
强化学习的例子
理解强化学习的最简单方法之一是看看它的实际和现实世界应用。在本节中,我们将列出并理解其中的一些。
-
棋类游戏:在棋类游戏中,玩家进行一步棋;这一步棋是由一个经过信息选择的动作驱动的,该动作伴随着对手玩家的反制动作。玩家的下一步动作取决于对手采取了哪些动作。
-
电梯调度:让我们以一栋有许多楼层和许多电梯的建筑为例。这里的关键优化需求是选择哪个电梯应该被派往哪个楼层,这被归类为一个控制问题。这里的输入是一组楼层上(电梯内外)按下的按钮、电梯的位置和一组楼层。在这种情况下,奖励是最少等待时间,即想要使用电梯的人的等待时间。在这里,系统通过在建筑模拟中的学习,再次学习如何控制电梯;通过从过去动作的价值估计中学习。
-
网络数据包路由:这是一个为动态变化的网络定义路由策略的案例。Q 学习技术(在本章稍后部分将简要介绍)用于确定数据包应该路由到哪个相邻节点。在这种情况下,每个节点都有一个队列,并且一次只发送一个数据包。
-
移动机器人行为:移动机器人需要根据它过去能够多快找到充电点的速度来决定是前往充电点还是下一个垃圾点。
评估反馈
强化学习与其他学习类型的关键区别之一在于,它使用信息来评估特定动作的影响,而不是盲目地指示需要采取哪些动作。一方面,评估反馈表明采取的动作有多好,另一方面,指导反馈则表明正确的动作是什么,无论动作是否被采取。尽管这两种机制在方式上有所不同,但在某些情况下,会同时采用一些技术。在本节中,我们将探讨一些评估反馈方法,这将为本章的其余部分奠定基础。
n 臂老虎机问题
这个问题的正式定义,与原始的赌徒类比如下:
注意
根据维基百科,n 臂老虎机问题是一个“赌徒”决定玩哪个机器、游戏的顺序和持续时间的问题,然后他开始玩并收集奖励,以最大化总奖励的问题。
让我们考虑一个有数千个动作可以采取的情况。每个动作都会获得一个奖励,我们的目标是确保我们以这种方式采取动作,使得在一段时间内奖励的总和最大化。选择特定动作的行为被称为 play。
一个解释 n-Armed Bandit 问题类比案例的例子是一位医生需要从一系列选项中选择来治疗严重疾病,其中患者的生存成为选择动作(在这种情况下,治疗)的奖励。在这个问题中,每个动作都与选择动作的预期奖励相关联;这被称为 价值。如果我们知道每个动作的价值,解决 n-Armed Bandit 问题就很容易,我们将选择那些具有最大价值的动作。只有可能的是,我们有价值的估计,而不是实际的价值。
现在我们来看一下探索和利用之间的区别。
假设我们保持对价值的估计,如果我们选择具有最大价值的动作(这种动作被称为贪婪动作),这种情况被称为利用,因为我们正在最好地使用手头的当前知识。此外,所有选择任何非贪婪动作的情况,更多的是探索,这有助于提高非贪婪动作的估计。虽然利用有助于最大化预期奖励,但探索有助于在长期内增加总奖励。在探索的情况下,短期奖励较低,而长期总奖励可能会更好。对于每个动作,可以选择探索或利用的方法,而有效的方法是这两种技术的良好平衡。
因此,有了这个,我们现在将探讨一些最佳估计动作值和选择最适合动作的技术。
动作值方法
如果动作 a 的值是 Q(a),那么第 t 次游戏的评估值是 Q[t](a) I*,即在选择了该动作的情况下给出的奖励的平均值,以下方程表示这一点:
Q[t](a) = (r1+r2+ … r[ka] ) / ka,其中 r 是奖励,ka 是动作 a 被选择的次数。这是估计动作值的一种方法,但不一定是最好的方法。让我们接受这一点,现在来看看选择动作的方法。
最简单的动作选择规则是选择一个动作或动作之一,即 a,它具有最高的估计动作值。所以,对于给定的游戏 t,选择贪婪动作 a 可以表示如下:
Qt = max[a] Qt
这种方法根据定义利用了当前的知识,同时稍微关注一下动作是否是一个更好的选择。作为这种方法的替代,我们可以选择大多数时候采取贪婪策略,偶尔选择一个与价值估计无关的动作。以概率 ԑ,这种方法被称为 ԑ**-贪婪方法**。
强化比较方法
在大多数选择方法中,我们看到具有最大奖励的动作比具有较小奖励的动作更有可能被选中。重要的问题是如何判断奖励是大还是小。我们始终需要有一个参考数字来判断奖励是高值还是低值。这个参考值被称为参考奖励。首先,参考奖励可以是之前收到的奖励的平均值。使用这个想法的学习方法被称为比较强化方法。这些方法比 actor-value 方法更有效,是我们将在后续章节中讨论的 actor-critic 方法的基础。
强化学习问题 – 世界网格示例
我们将尝试使用一个著名的例子来理解强化学习问题:网格世界。这个特定的网格世界是一个 3X4 网格,如下面的截图所示,是对世界复杂性的近似:
这个例子假设世界是一种游戏,你从一个称为起始状态的状态(从位置 1,1)开始。让我们假设可以采取四种动作,包括向左、向右、向上和向下移动。目标是确保使用这些动作,我们能够移动到表示在位置 4,3 的目标。我们需要避免像下一张图片中显示的那样在位置 4,2 显示的红框。
-
起始状态:位置 (1,1) --> 世界从这里开始。
-
成功状态:位置 (4,3) --> 世界在这里以成功状态结束。
-
失败状态:位置 (4,2) --> 世界在这里以失败状态结束。
-
当世界结束时,我们需要重新开始。
-
墙壁:在位置 (2,2) 显示了一个障碍物或墙壁。这个位置无法通过:
-
要从起点 (1,1) 达到目标 (4,3),可以采取以下方向的步骤:
-
每个方向的每一步都会将你从一个位置移动到另一个位置(这里的“位置”只是状态)。例如,从位置 (1,1) 向上移动将带你到位置 (1,2),依此类推。
-
从一个给定的位置不能采取所有方向。让我们考虑以下截图中的示例。从位置 (3,2),只能采取上、下和右。左移动会撞到墙壁,因此不能采取。话虽如此,只有上和下的移动是有意义的,因为右会将你移动到危险位置,导致无法达到目标。
-
类似地,网格边界上的任何位置都将有限制,例如,位置 (1,3) 允许 向右 和 向下 移动,其他任何移动都不会改变位置。
-
现在我们来看从 起点 (1,1) 到 目标 (4,3) 的最短路径。有两种解决方案:
-
解决方案 1:向右 --> 向右 --> 向上 --> 向上 --> 向右 (5 步)
-
解决方案 2:向上 --> 向上 --> 向右 --> 向右 --> 向右 (5 步)
-
-
在现实世界中,并非所有动作都能按预期执行。存在一个可靠性因素,它会影响性能,或者说,存在不确定性。如果我们对示例稍作修改,并说每次从一位置移动到另一位置的动作,移动正确的概率是 0.8。这意味着有 80% 的可能性移动会按预期执行。在这种情况下,如果我们想测量解决方案 1 (R-->R-->U-->U-->R) 成功的概率:
行为发生的预期概率 + 行为未按预期发生的概率
= 0.8 x 0.8 x 0.8 x 0.8 x 0.8 + 0.1 x 0.1 x 0.1 x 0.1 x 0.8
= 0.32768 + 0.00008 = 0.32776
-
如我们所见,不确定性的元素确实会改变结果。在下一节中,我们将讨论捕捉这些不确定性的决策过程框架。
马尔可夫决策过程 (MDP)
马尔可夫决策过程是做出决策的一个基本框架或过程,我们将在后续的强化学习章节中多次提到它。
马尔可夫属性是马尔可夫决策过程的核心,它指出重要的是当前或当前状态,并且情况是稳定的,这意味着规则不会改变。
MDP 尝试捕捉我们在前面章节中讨论的世界,它具有以下特征:
-
状态:在前面的例子中,每个网格位置代表一个状态
-
模型(转移函数):转移函数包括三个属性:给定状态、动作和目标状态。它描述了在当前状态 s 和动作 a 下,结束状态 s 的概率:
T (s, a,s') ~ P(s'/s, a)
-
动作:A(s),A 在前面的例子中,A (1, 2) = 向上 在 向上、向上 向右、向右、向右 解决方案中
-
奖励:R(s),R(s,a),R(s,a,s1) 奖励告诉我们进入状态的有用性
R(s):进入状态 s 的奖励
R(s, a):打开状态 s 的动作 a 的奖励
R(s, a,s1):在状态 s 下执行动作 a 打开状态 s1 的奖励
-
状态、动作、模型和奖励构成了 MDP 的问题陈述
-
策略:它是对问题的解决方案;它说明了在给定状态下应该采取什么行动:
π(s) --> a
基本强化学习模型 – 代理-环境接口
正如我们所发现的,强化学习问题是一种直接从交互中学习以实现目标的方法。代理是学习者或决策者,它与环境互动,而这个环境中的所有外部因素都会产生奖励。它与交互的事物,包括代理之外的所有事物,被称为环境。环境的完整规范定义为任务——强化学习问题的单个实例。
以下模型描述了代理-环境接口:
在这里,环境模型意味着一个代理使用任何东西来预测给定动作的环境行为的上下文。这个环境模型根据动作和当前状态产生对下一个状态和奖励的预测。如果模型是随机的,则可能存在多个下一个状态奖励。再次强调,这些模型可以是分布式的或基于样本的。分布式模型识别所有潜在的概率,而基于样本的模型在给定样本的情况下产生概率。
最后,强化学习的目标可以定义为以下内容:
-
在一个每个动作都会导致新情况出现的环境中,强化学习(RL)关注的是如何采取行动。以下是一些可能的动作:
-
定义一个策略,将动作和结果情况映射
-
确定导致最高奖励的策略
-
强化学习的步骤如下:
-
代理观察输入状态。
-
通过应用策略,这是一个决策函数,可以确定一个动作。
-
执行动作导致状态变化。
-
由于这个动作,代理从环境中获得了一个显著的奖励。
-
根据状态的变化记录奖励的详细信息。
延迟奖励
区分强化学习与监督学习的一个方面是奖励。在本节中,我们将探讨延迟奖励的含义。正如我们所知,每个导致特定状态变化的动作都会产生奖励。在某些情况下,这种奖励的实现并不是立即的。让我们看看一个棋盘游戏的例子。假设棋盘游戏需要 65 步才能结束,只有在第 65 步或移动结束时,我们才能知道我们是否赢得了游戏或输了。哪一步或移动导致了成功或失败在这里是复杂的。因此,奖励直到游戏结束或动作序列结束时才可知。技术上,我们正在寻找识别哪个动作序列导致了所看到的奖励。这个过程被称为时间信用分配。
现在,在这个实现最终奖励(成功+1 或失败-1)的旅程中,每一步或移动或行动都会获得奖励。假设网格世界问题解决方案 1 中的每一步都获得奖励-0.4。导致成功或失败的总奖励将决定长期奖励。
策略
最佳策略是一种最大化预期长期奖励的策略或解决方案,可以用以下公式表示:
现在,让我们衡量一个特定状态(s)的效用,这取决于策略(π):
进入状态(s)的奖励(这是一种即时利益)不等于该状态的效用(这是进入该状态的长远利益)。
现在,我们可以使用状态价值的效用来定义最佳策略:
现在,如果我们必须定义处于状态(s)的效用,它等于进入该状态的奖励,减去从该点开始获得的奖励:
这被称为贝尔曼方程。
V 是策略的价值函数,以下是将最优策略的价值与该状态的最佳预期回报相等的贝尔曼最优方程:
强化学习 – 关键特性
强化学习不是一系列技术,而是一系列问题,它关注的是任务本身,而不是如何处理任务。
强化学习被视为一种工具,机器可以通过更多基于试错法的奖励和惩罚来学习。
强化学习采用评估反馈。评估反馈衡量采取的行动的有效性,而不是衡量该行动是否为最佳或最差。(注意,监督学习更侧重于指导性学习,并确定行动的正确性,而不考虑执行的行动。)
强化学习中的任务更多的是相关任务。关联任务依赖于情况,其中识别并执行最适合给定情况的动作。非关联任务是指独立于特定情况的任务,当任务处于静止状态时,学习者找到最佳动作。
强化学习解决方案方法
在本节中,我们将详细讨论解决强化学习问题的一些方法。特别是动态规划(DP)、蒙特卡洛方法和时序差分(TD)学习。这些方法也解决了延迟奖励的问题。
动态规划(DP)
动态规划(DP)是一组算法,用于在给定环境模型(如马尔可夫决策过程)的情况下计算最优策略。动态规划模型在计算上昂贵,并假设完美模型;因此,它们的采用或效用较低。从概念上讲,DP 是以下章节中使用的许多算法或方法的基础:
-
评估策略:可以通过迭代方式计算策略的价值函数来评估策略。计算策略的价值函数有助于找到更好的策略。
-
改进策略:策略改进是一个使用其价值函数信息计算修订策略的过程。
-
值迭代和策略迭代:策略评估和改进同时推导出值和策略迭代。这些是两种最流行的动态规划方法,用于在完全了解马尔可夫决策过程(MDPs)的情况下计算最优策略和价值函数。
以下算法描述了迭代策略过程:
值迭代结合了坚实的策略改进和过程评估。以下涉及到的步骤:
广义策略迭代(GPI)
GPI 是一种对动态规划(DP)方法进行分类的方法。GPI 涉及两个过程之间的交互——一个围绕近似策略,另一个围绕近似价值。
在第一种情况下,过程直接选择策略并执行策略评估以确定与策略相关联的真实或确切的价值函数。另一种过程以价值函数作为输入,并使用它来改变策略,以便改进策略,即其总奖励。如果你观察,每个过程都改变了另一个过程的基础,并且它们协同工作以找到导致最优策略和价值函数的联合解决方案。
蒙特卡洛方法
在强化学习中,蒙特卡洛方法通过经验样本学习策略和价值。由于以下原因,蒙特卡洛方法在动态规划方法之上具有额外的优势:
-
直接从与环境交互中学习最优行为,而不需要任何模拟模型动态的模型。
-
这些方法可以用于模拟数据或样本模型;这一特性在现实世界的应用中变得至关重要。
-
使用蒙特卡洛方法,我们可以轻松地关注更小的状态集,并且可以在不必要进入完整状态集的情况下探索感兴趣的区域。
-
蒙特卡洛方法对于任何违反马尔可夫属性的情况影响最小,因为价值的估计不是使用任何后续状态来更新的。这也意味着它们不需要自举。
蒙特卡洛方法是由广义策略迭代(GPI)方法设计的。这些方法提供了一种评估策略的替代方法。对于每个状态,而不是独立计算价值,取从该状态开始返回的平均值,这可以很好地近似该状态的价值。重点是应用动作值函数来改进策略,因为这不需要环境转换的变化。蒙特卡洛方法混合了策略评估和改进方法,可以逐步实现。
探索多少是足够的?这是蒙特卡洛方法中需要回答的关键问题。仅仅根据价值选择最佳动作是不够的;了解这些动作中有多少有助于结束奖励也很重要。
在这种情况下可以使用两种方法——在策略或离策略方法。在在策略方法中,智能体负责使用探索技术找到最优策略;而在离策略方法中,智能体的探索不是核心,但与之学习一个确定的最优策略,这个策略不必与遵循的策略相关。简而言之,离策略学习方法都是关于通过行为学习行为。
时序差分(TD)学习
TD 学习是强化学习中的独特技术之一。时序差分学习是蒙特卡洛方法和动态规划方法的结合。在强化学习中讨论最多的技术是时序差分(TD)、动态规划(DP)和蒙特卡洛方法之间的关系:
-
评估一个包含估计给定策略π的价值函数 Vπ的策略。
-
选择一个最优策略。对于策略选择,所有 DP、TD 和蒙特卡洛方法都使用广义策略迭代(GPI)的变体。因此,这三者之间的区别不过是 GPI 中的这些变体。
TD 方法遵循自举技术来得出估计;它们会回退到后续状态和类似的估计。
现在我们来看看 TD 方法相对于 DP 和蒙特卡洛方法的优点。我们将简要介绍,而不深入复杂性。以下是一些关键好处:
-
TD 方法不需要环境模型以及下一状态和奖励的概率分布
-
TD 方法可以轻松优雅地以在线和增量方式运行
Sarsa - 在策略 TD
让我们看看如何使用 TD 方法来解决控制问题。我们将继续使用 GPI 技术,但现在结合 TD 方法进行评估和预测。虽然我们需要在探索和利用选项之间保持平衡,但我们有选择在策略或离策略学习方法中的选项。我们将坚持使用在策略方法:
-
学习与状态值函数相关的动作值函数。我们将为策略 π 定义 Q^π*(s, a)*:
-
学习从一个状态-动作对转换到另一个状态-动作对的值。这通过以下方式迭代计算:
这被定义为 Sarsa 预测方法,并且是 on-policy 的,因为智能体使用识别的策略来完成这个任务。
Sarsa 算法表述如下:
Q-Learning – off-Policy TD
使用离策略学习方法的 Q-Learning 技术是 TD 的突破性策略之一。这种称为 Q-learning 的控制算法(Watkins,1989)以简单形式定义如下:
我们可以看到最优动作值函数 Q* 是直接使用学习到的动作值函数 Q 近似,而不考虑它遵循的策略。这使得它成为一个 off-policy 方法。
由于策略值函数被使用和更新,因此对策略仍有一定的影响。此外,对所有对的勤奋标记标志着收敛。
基于这种理解,Q-learning 算法可以描述如下:
Actor-critic methods (on-policy)
Actor-critic 方法是时间差分学习方法,它使用单独的记忆结构确保策略和值的独立性。在这种情况下,策略结构被称为 actor,值结构被称为 critic。名称 critic 来自于它批评策略的价值。由于这个 critic 总是批评策略的价值,它也被称为 TD 错误。以下截图显示了 actor-critic 方法流程:
R Learning (Off-policy)
R-learning 是一种高级强化学习技术,用于没有折扣且有确定和有限回报的情况。算法如下:
实现强化学习算法
请参考本章提供的源代码来实现强化学习算法。(源代码路径 .../chapter12/... 在每个技术文件夹下。)
使用 Mahout
请参考文件夹 .../mahout/chapter12/rlexample/。
使用 R
请参考文件夹 .../r/chapter12/rlexample/。
使用 Spark
请参考文件夹 .../spark/chapter12/rlexample/。
使用 Python (Scikit-learn)
请参考文件夹 .../python-scikit-learn/chapter12/rlexample/。
使用 Julia
请参考文件夹 .../julia/chapter12/rlexample/。
摘要
在本章中,我们探索了一种名为强化学习的新学习技术。我们看到了它与传统的监督学习和无监督学习技术的不同之处。强化学习的目标是决策,其核心是马尔可夫决策过程(MDP)。我们探讨了 MDP 的要素,并通过一个例子来了解它。然后,我们介绍了强化学习的某些基本技术,包括策略学习和非策略学习,其中一些是间接和直接的学习方法。我们涵盖了动态规划(DP)方法、蒙特卡洛方法,以及一些关键的时序差分(TD)方法,如 Q 学习、Sarsa、R 学习和演员-评论家方法。最后,我们使用为本书确定的标准技术栈对这些算法进行了一些实际应用。在下一章中,我们将介绍集成学习方法。
第十三章。集成学习
本章是所有从第五章基于决策树的学习中学到的学习方法的总结章节。将本章作为学习方法的结尾章节是恰当的,因为这种学习方法解释了如何有效地将这些方法结合起来以最大化学习者的成果。集成方法在监督和无监督解决方案中具有有效、强大的技术,以实现高精度。不同的模型在选定的业务案例中效率高且表现良好。找到一种将竞争模型组合成委员会的方法很重要,在这方面已经进行了大量研究,并取得了相当程度的成功。此外,由于不同的观点产生了大量数据,关键是要巩固不同的概念以进行智能决策。推荐系统和基于流的文本挖掘应用广泛使用集成方法。
在监督学习和无监督学习小组中已经进行了许多独立研究。观察到的共同主题是,当许多混合模型结合在一起时,它们增强了弱模型,并带来了整体更好的性能。本章的一个重要目标是对不同的集成技术进行了系统比较,这些技术结合了监督和无监督技术,并介绍了一种合并结果的方法。
本章涵盖了以下主题:
-
集成方法学习的概述——群体智慧的概念和关键属性。
-
核心集成方法分类、现实世界示例和集成学习应用
-
集成方法类别和多种代表性方法:
-
监督集成方法概述和详细介绍了诸如袋装、提升、梯度提升方法和随机决策树和随机森林等概念。
-
无监督集成方法概述了包括聚类集成在内的生成、直接和间接方法。
-
-
使用 Apache Mahout、R、Julia、Python(scikit-learn)和 Apache Spark 进行动手实现练习
集成学习方法
集成,一般而言,意味着一组通常被视为整体而不是单个价值的事物。集成遵循分而治之的方法,用于提高性能。
我们将从介绍著名的群体智慧概念开始,来理解具体的算法。
群体智慧
当以正确的方式汇总时,不完美的判断会导致集体智慧,从而产生更优越的结果。群体智慧就是关于这种集体智慧。
通常,群体一词通常与不合理性和普遍观念有关,即存在某种影响,在暴民和教派的情况下影响群体的行为。然而,事实并非总是如此负面,并且在与智力汇总合作时效果很好。群体智慧的关键概念是,一群人做出的决策总是比个人做出的决策更稳健和准确。机器学习的集成学习方法有效地利用了这个想法,以产生效率和准确的结果。
“群体智慧”这个术语是由高尔顿在 1906 年提出的。他参加了一个农民集市,那里有一个比赛,猜测被宰杀和加工的牛的重量。最接近猜测的获胜者从 800 名参赛者中赢得了奖品。他选择收集所有响应并进行分析。当他计算猜测的平均值时,他惊讶地发现它们非常接近实际值。这个集体猜测不仅比获奖者更准确,而且与牲畜专家的猜测相比也证明是最好的。思想的民主是明显的赢家。对于这样一个有用的输出,重要的是每个参赛者都有他/她的强有力信息来源。参赛者提供的独立猜测不应受他/她邻居猜测的影响,而且,还有一个无错误的机制来整合整个群体的猜测。所以简而言之,这不是一个容易的过程。另一个重要的方面是,这些猜测比任何个别专家的猜测都要优越。
一些基本的日常例子包括:
-
Google 搜索结果通常将最受欢迎的页面列在顶部
-
在像“谁想成为亿万富翁”这样的游戏中,观众投票用于回答参赛者不知道的问题。通常,大多数投票的答案是正确的。
群体智慧方法的结果并不保证。以下是使用此方法获得最佳结果的基本标准:
-
聚合:需要有一种万无一失的方法将个别响应整合成集体响应或判断。没有这个,集体观点或响应的核心目的就会落空。
-
独立性:在人群中,需要对控制来自一个实体对其他人的响应进行纪律约束。任何影响都会扭曲响应,从而影响准确性。
-
去中心化:个别响应有其来源,并依赖于有限的知识。
-
意见多样性:重要的是每个人都有一个独立的响应;响应的异常性仍然是可接受的。
术语“ensemble”意味着分组。要构建集成分类器,我们首先需要从训练数据中构建一组分类器,汇总这些分类器做出的预测,并使用这些数据预测新记录的类别标签。
下面的图解展示了这个过程:
技术上,核心构建块包括训练集、诱导器和集成生成器。诱导器负责为每个样本训练数据集定义分类器。集成生成器创建分类器以及一个组合器或聚合器,该组合器或聚合器整合组合器之间的响应。有了这些构建块及其之间的关系,我们将使用以下属性来分类集成方法。下一节将介绍这些方法:
-
组合器的使用:这个属性定义了集成生成器和组合器之间的关系
-
分类器之间的依赖性:这个属性定义了分类器相互依赖的程度
-
生成多样性:这个属性定义了确保组合器之间多样性的程序
-
集成的大小:这个属性表示集成中使用的分类器数量
-
交叉诱导器:这个属性定义了分类器如何利用诱导器。有些情况下,分类器被构建成与特定的诱导器集一起工作
总结来说,构建模型集成首先涉及构建专家并让他们提供响应/投票。预期的收益是预测性能的提高,并产生一个单一的全球结构。尽管如此,产生的任何中间结果可能最终难以分析。
让我们全面地看看聚合/组合分类器的性能如何表现得更好。
让我们考虑三个错误率为 0.35(ε)或准确率为 0.65 的分类器。对于每个分类器,分类器预测错误的概率是 35%。
这里给出的是真值表,表示错误率为 0.35(35%)和准确率为 0.65(65%):
在三个分类器组合后,通过在组合器之间使用多数投票过程来预测测试实例的类别标签,计算集成分类器犯错的概率。这在下述公式中给出。
此外,准确率为 71.83%。很明显,当在分类器之间汇总时,错误率会降低。现在,如果我们扩展到 25 个分类器,根据错误率(6%)的计算,准确率会上升到 94%。
因此,集成工作得很好,因为它们提供了更大的视角。
在前一个章节中,我们已经讨论了群体智慧工作的标准。现在,让我们看看我们之前提到的 25 个基分类器的情况,看看集成分类器的准确率如何随着基分类器不同错误率的变化而变化。
小贴士
当基分类器的错误率超过 0.5 时,集成分类器的性能会下降,并且比基分类器表现差得多。
在下一节中,我们将介绍一些应用集成方法的现实世界用例。
关键用例
本节详细讨论了集成学习方法在现实世界中的关键应用。
推荐系统
推荐系统的目的是向可能感兴趣的用户社区产生有意义的推荐。一些例子包括与决策过程相关的建议,例如在亚马逊上阅读哪些书籍,在 Netflix 上观看哪些电影,或在新闻网站上阅读哪些新闻。业务领域,或业务属性的设计的上下文和特征是推荐系统设计的主要输入。用户为每部电影提供的评分(在 1-5 的范围内)是一个重要的输入,因为它记录了用户与系统的互动程度。此外,用户的详细信息(如人口统计和其他个人或配置文件属性)也被推荐系统用于识别项目与潜在用户之间的潜在匹配。
以下截图是 Netflix 上推荐系统结果的示例:
异常检测
异常检测或离群值检测是集成学习方法最流行的用例或应用之一。这全部关于在数据中寻找异常或不寻常的模式。识别异常很重要,因为它可能导致采取任何决定性行动。一些著名的例子包括(许多其他例子中):
-
信用卡欺诈检测
-
医疗保健中的罕见疾病检测
-
飞机发动机中的异常检测
让我们现在扩展关于飞机发动机异常检测的例子。以下是一些用于验证飞机发动机是否异常的特征:
-
产生的热量(x[1])
-
振动的强度 (x[2])
-
在数据集 = x[(1)],x[(2)] … x[(m)] 标记的情况下,以下是对异常和非异常案例的描述:
迁移学习
传统上,所有机器学习算法都假设每个新的学习问题都需要从头开始学习。这个假设是没有任何先前的学习会被利用。在学习问题的领域相关的情况下,将有一些从过去可以获取并使用的经验。一些常见的例子包括:
-
法语的知识可以帮助学生学习西班牙语
-
数学知识可以帮助学生学习物理
-
驾驶汽车的知识可以帮助驾驶员学习驾驶卡车
在机器学习领域,这指的是从相关领域的新任务中识别和应用先前任务积累的知识。这里的关键是识别领域之间的共性。强化学习和分类与回归问题应用迁移学习。迁移学习的过程流程如图所示:
流式挖掘或分类
随着技术进步和社交媒体的兴起,流式数据挖掘已成为众多应用的关键需求。
与传统学习的主要区别在于,随着流数据的到来,训练和测试数据集以分布式方式演变。预测的目标现在变得稍微复杂一些,因为随着时间戳的变化,概率也在不断变化,这使得应用集成学习方法成为理想的环境。下一个图表显示了 P(y) 如何随时间戳和 P(x) 以及 P (y|x) 的变化而变化:
使用集成学习方法,单个模型产生的方差减少,随着分布的演变,预测或结果更加准确或鲁棒。
集成方法
如前几节所述,集成方法现在已被证明是提高监督学习、半监督学习和无监督学习解决方案的准确性和鲁棒性的强大方法。此外,我们也看到了随着不同来源开始持续产生大量数据,决策动态正变得越来越复杂。有效的整合现在是成功和智能决策的关键。
监督学习和无监督集成方法遵循相同的原理,涉及结合多样化的基础模型以增强弱模型。在接下来的章节中,我们将独立且详细地探讨监督、半监督和无监督技术。
下面的模型描述了各种学习类别以及涵盖结合学习和共识方法的各种算法:
来源:关于集成方法的力量:监督学习和无监督方法达成一致(it.engineering.illinois.edu/ews/)
在我们深入探讨每种集成技术之前,让我们了解通过学习结合与通过共识结合之间的区别:
| 优点 | 缺点 | |
|---|---|---|
| 通过学习结合 |
-
使用标记数据作为反馈机制
-
有潜力提高准确性
|
-
仅适用于标记数据
-
存在过拟合的风险
|
| 通过共识结合 |
|---|
-
不需要标记数据
-
具有提高性能的潜力
|
-
标签数据的宝贵反馈信息缺失
-
基于共识是好事的假设
|
监督集成方法
在监督学习方法的情况下,输入始终是标记数据。通过学习组合的方法包括 Boosting 堆叠泛化和规则集成技术。通过共识组合的方法包括 Bagging、随机森林和随机决策树技术。以下展示了通过学习组合的过程流程,随后是另一个通过共识组合的模型:
监督集成方法的问题陈述如下:
-
输入数据集是 D={x[1], x[2], …, x[n]},相应的标签是 L={l[1],l[2],…,l[n]}
-
集成方法现在生成了一组分类器 C = {f[1],f[2],…,f[k]}
-
最后,分类器的组合 f* 通过以下公式最小化泛化误差:f(x)= ω*[1]f[1](x)+ ω[2]f[2](x)+ ….+ ω[k]f[k](x)
Boosting
Boosting 是一种相当直接的方法,通过应用多个模型生成的所有输出的加权平均来计算输出。它是一个弱学习者的框架。通过使用强大的加权公式,可以调整应用的权重,从而得出一个强大的预测模型,该模型解决了这些方法的缺陷,并且适用于更广泛的输入数据,使用不同的狭窄调整模型。
Boosting 在解决二元分类问题方面取得了成功。这项技术是由 Freund 和 Scaphire 在 20 世纪 90 年代通过著名的 AdaBoost 算法引入的。以下是该框架的一些关键特性:
-
它结合了多个基分类器,与基分类器相比,表现出改进的性能
-
弱学习器是按顺序训练的
-
训练每个基分类器所使用的数据基于先前分类器的性能
-
每个分类器投票并贡献于结果
-
该框架工作并使用在线算法策略
-
对于每一次迭代,权重都会重新计算或重新分配,其中错误的分类器将开始减少其权重
-
正确的分类器获得更多的权重,而错误的分类器则减少权重
-
Boosting 方法,虽然最初是为解决分类问题而设计的,但也被扩展到处理回归问题
Boosting 算法如下所述:
-
训练一组弱假设:h[1], …, h[T].
-
将假设 H 作为 T 个较弱假设的加权多数投票组合。
-
每次迭代都专注于错误分类,并重新计算权重 D[t](i)。
AdaBoost
AdaBoost 是一个线性分类器,它将更弱的功能h[t](x)作为线性组合构建了一个更强的分类器H(x)。
下面的图示展示了提升框架是如何工作的:
-
所有数据点都被标记为两个类别*+1和-1*,权重相等—1。
-
应用一个*p (错误)*并按以下方式对数据点进行分类:
-
重新计算权重。
-
让弱分类器再次参与一个新的问题集。
-
通过迭代地使用弱分类器构建了一个强大的非线性分类器。
Bagging
Bagging 也称为自助聚合。这种集成学习方法结合了共识方法。该技术中有三个重要步骤:
-
构建包含大约 63.2%原始记录的自助样本。
-
使用每个自助样本对训练数据进行分类。
-
使用多数投票并识别集成分类器的类别标签。
通过生成基于原始数据集的额外数据生成,结合相同大小的数据集的重复组合,这个过程减少了预测方差。随着方差的减少,模型的准确性增加,而不是通过增加数据集的大小。以下为 Bagging 算法:
根据前面的算法步骤,这里展示了 Bagging 算法的流程和过程示例:
-
训练步骤:对于每个迭代t, t=1,…T,从训练集中创建N个样本(这个过程称为自助抽样),选择一个基模型(例如,决策树、神经网络等),并使用这些样本进行训练。
-
测试步骤:对于每个测试周期,通过结合所有T个训练模型的结果进行预测。在分类问题中,应用多数投票方法,而在回归中,则应用平均方法。
一些错误计算如下:
在以下条件下,Bagging 在过拟合和欠拟合情况下都有效:
-
对于欠拟合:高偏差和低方差情况
-
对于过拟合:小偏差和大方差情况
下面是 Bagging 的一个例子:
Wagging
Wagging是 Bagging 的另一种变体。使用整个数据集来训练每个模型。此外,权重是随机分配的。所以简而言之,Wagging 是带有基于泊松或指数分布的额外权重的 Bagging。以下为 Wagging 算法:
随机森林
随机森林是另一种集成学习方法,它结合了多个决策树。以下图表表示了随机森林集成:
来源:citizennet.com/blog/2012/11/10/random-forests-ensembles-and-performance-metrics/
对于具有 T 个树的随机森林,决策树分类器的训练如下:
-
与标准的 Bagging 技术类似,定义了一个随机替换的 N 个案例样本,以创建大约 62-66%的全面数据集的子集。
-
对于每个节点,执行以下操作:
-
以一种方式选择 m 个预测变量,使得识别的变量给出最佳的分割(二分分割)
-
在下一个节点,选择其他 m 个变量,它们执行相同的操作
-
-
m 的值可以变化
-
对于随机分割选择—m=1
-
对于 Breiman 的袋装器:m=预测变量总数
-
对于随机森林,m 小于预测变量的数量,它可以取三个值:½√m,√m 和 2√m
-
现在,对于随机森林预测的每个新输入,新值会通过所有树运行,并使用平均值、加权平均值或投票多数来获取预测值。
小贴士
在第五章中,我们详细介绍了基于决策树的学习。
梯度提升机(GBM)
GBM 是高度采用的机器学习算法之一。它们用于解决分类和回归问题。GBM 的基础是决策树,它们应用提升技术,其中多个弱算法通过算法组合产生强学习器。它们是随机和梯度提升的,这意味着它们迭代地解决残差。
它们因其可以使用各种损失函数而闻名,可以高度定制。我们已经看到,随机森林集成技术使用简单的平均方法与 GBM 相比,GBM 使用的是实用的集成形成策略。在这个策略中,新模型迭代地添加到集成中,其中每个迭代都训练弱模型以识别下一步。
GBM 灵活且比其他集成学习方法相对更高效。以下表格详细说明了 GBM 算法:
梯度提升回归树(GBRT)与遵循回归技术的 GBM 类似。
无监督集成方法
作为无监督集成学习方法的一部分,基于共识的集成之一是聚类集成。以下图表描述了基于聚类的集成的工作原理:
对于给定的未标记数据集 D={x[1],x[2],…,x[n]}),聚类集成计算一组聚类 C = { C[1],C[2],…,C[k]}),每个聚类将数据映射到一个聚类。形成一个基于共识的统一聚类。以下图表描述了此流程:
实现集成方法
请参考本章节提供的源代码以实现集成学习方法(仅限于监督学习技术)。(源代码路径 .../chapter13/... 位于每个技术文件夹下)。
使用 Mahout
请参考文件夹 .../mahout/chapter13/ensembleexample/。
使用 R
请参考文件夹 .../r/chapter13/ensembleexample/。
使用 Spark
请参考文件夹 .../spark/chapter13/ensembleexample/。
使用 Python (Scikit-learn)
请参考文件夹 .../python (scikit-learn)/chapter13/ensembleexample/。
使用 Julia
请参考文件夹 .../julia/chapter13/ensembleexample/。
摘要
在本章中,我们介绍了机器学习的集成学习方法。我们讨论了“群体智慧”的概念,以及如何在机器学习的背景下应用它,以及如何提高学习者的准确性和性能。具体来说,我们通过一些实际案例研究了某些监督集成学习技术。最后,本章提供了使用 R、Python (scikit-learn)、Julia 和 Spark 机器学习工具以及使用 Mahout 库的推荐引擎的梯度提升算法的源代码示例。
本章涵盖了所有机器学习方法,在接下来的最后一章中,我们将介绍一些机器学习的先进和新兴架构和技术策略。
第十四章:新一代机器学习数据架构
这是我们的最后一章,我们将从我们通常的学习主题中偏离,来涵盖一些机器学习的解决方案方面。这是尝试完成实践者对机器学习解决方案实施方面的看法,涵盖更多关于不同业务案例平台选择的内容。让我们超越 Hadoop、NoSQL 和其他相关解决方案。新范式肯定是一个统一的平台架构,它关注机器学习的所有方面,从数据收集和准备到可视化,重点关注所有关键架构驱动因素,如数据量、来源、吞吐量、延迟、可扩展性、数据质量、可靠性、安全性、自助服务和成本。
以下流程图展示了本章将涵盖的不同数据架构范例:
本章深入探讨了以下主题:
-
传统数据架构是如何实施以及为什么在大数据和分析的当前背景下被认为是可取的简要历史。
-
在机器学习背景下,包括提取、转换和加载(ETL)、存储、处理和报告、分发以及洞察展示的新时代数据架构要求概述。
-
Lambda 架构的介绍,这些架构统一了批处理和实时处理策略,并附带一些示例。
-
Polyglot Persistence 和 Polymorphic 数据库的介绍,这些数据库统一了包括结构化、非结构化和半结构化数据存储的数据存储策略,并集中了跨数据存储的查询方法。以下是如何 Greenplum 数据库支持这些策略以及它如何与 Hadoop 无缝集成的示例。
-
语义数据架构包括本体论演变、目的、用例和技术。
数据架构演变
我们将从了解数据架构传统上是如何遵循的,然后详细说明在大数据背景下现代机器学习或分析平台的需求。
观察一——数据存储始终有目的
传统上,数据架构有明确的目的分隔,OLTP(在线事务处理),通常用于交易需求,以及OLAP(在线分析处理)数据存储,通常用于报告和分析需求。以下表格详细说明了一般差异:
| OLTP 数据库 | OLAP 数据库 | |
|---|---|---|
| 定义 | 这涉及许多小的在线事务(INSERT、UPDATE 和 DELETE)。快速查询处理是核心要求;通过每秒事务数来衡量数据完整性、并发性和有效性。它通常以高度规范化为特征。 | 这涉及相对较小的事务量。复杂查询涉及数据的切片和切块。存储的数据通常是聚合的、历史性的,并且主要存储在多维模式中(通常是星型模式)。 |
| 数据类型 | 运营数据 | 集成/整合/聚合数据 |
| 来源 | OLTP 数据库通常是数据的实际来源 | OLAP 数据库从各种 OLTP 数据库中整合数据 |
| 主要用途 | 这涉及日常业务流程/任务的执行 | 这用于决策支持 |
| CUD | 这是由用户发起的简短、快速的插入和更新 | 定期运行的长作业正在刷新数据 |
| 查询 | 这通常在较小的数据量上工作,并执行简单的查询 | 这通常包括涉及聚合和多维结构切片和切块的复杂查询 |
| 吞吐量 | 由于数据量相对较小且查询运行速度快,这通常非常快 | 这通常以批量方式运行,在更高数据量下可能需要几个小时 |
| 存储容量 | 由于历史数据归档,相对较小 | 由于涉及的数据量较大,这需要更大的存储空间 |
| 模式设计 | 高度规范化,有许多表 | 这通常是去规范化,表较少,并使用星型和/或雪花模式 |
| 备份和恢复 | 这需要虔诚地进行适当的备份;运营数据对业务运营至关重要。数据丢失可能导致重大经济损失和法律责任 | 相比于常规备份,某些环境可能考虑仅重新加载 OLTP 数据作为恢复方法 |
观察二——数据架构是共享磁盘
共享磁盘数据架构指的是一种架构,其中有一个数据磁盘存储所有数据,集群中的每个节点都可以访问这些数据进行处理。所有数据操作都可以由任意节点在特定时间点执行,如果两个节点同时尝试持久化/写入一个元组,为了确保一致性,会传递基于磁盘的锁或预期的锁通信,从而影响性能。随着节点数量的增加,数据库级别的争用增加。这些架构是写入受限的,因为需要处理集群中节点间的锁。
即使在读取的情况下,也应该有效地实施分区以避免完整表扫描。所有传统的 RDBMS 数据库都是共享磁盘数据架构。
观察结果 3——传统 ETL 架构存在局限性。以下列表提供了这些局限性的详细信息:
-
上线和整合数据既缓慢又昂贵。今天存在的许多 ETL 逻辑都是定制编码的,并且与数据库紧密耦合。这种紧密耦合也导致了一个问题,即现有的逻辑代码无法重用。分析和报告需求需要应用不同的调整技术。分析优化既耗时又昂贵。
-
数据来源通常记录不佳。数据含义在翻译中丢失。上线后的维护和分析成本通常非常高。重建数据血缘是手动、耗时且易出错的。没有强大的审计或记录数据转换,通常在电子表格中跟踪。
-
目标数据难以消费。优化倾向于已知分析,但并不适合新需求。使用的是一刀切的标准视图,而不是适合目的的视图,或者缺乏一个易于消费目标数据的概念模型。很难确定哪些数据可用,如何获取访问权限,以及如何整合数据来回答问题。
观察结果 4——数据通常是结构化的
大多数时候,数据库的设计是为了适应关系数据库管理系统(RDBMS)模型。如果传入的数据实际上没有结构,ETLs 就会构建一个结构以便存储在标准的 OLTP 或 OLAP 存储中。
观察结果 5——性能和可扩展性
在给定基础设施的情况下,数据存储或查询的优化在某种程度上是可能的,但超过一定点,就需要重新设计。
新兴的数据架构视角与驱动因素
驱动因素 1——大数据干预。
我们在第二章“机器学习和大规模数据集”中定义了大数据和大型数据集的概念。现在正在被摄取并需要处理的数据通常具有以下特征:
-
来源:根据信息的性质,来源可能是一个实时数据流(例如,交易交易),或者自上次同步以来包含更新的数据批次
-
内容:数据可能代表不同类型的信息。通常,这些信息与其他数据相关,需要连接
以下截图显示了需要支持的数据类型和不同来源:
-
体积:根据数据的性质,正在处理的数据量可能不同。例如,主数据或证券定义数据相对固定,而交易数据与其他两种相比是巨大的。
-
生命周期:主数据有固定的生命周期,很少更新(例如,缓慢变化的维度)。然而,事务数据生命周期非常短,但需要长时间可用于分析、审计等。
-
结构:虽然大部分数据是有结构的,但在金融行业中出现了非结构化数据的新趋势。对于金融系统来说,将非结构化数据纳入其 IT 架构中变得越来越关键。
下一个图表展示了每个数据源的复杂性、速度、体积和各个方面:
来源:SoftServe
驱动因素 2——数据平台需求高级
新时代数据平台需求的地貌正在急剧扩张,统一平台是当前的热点。下一张概念图将详细解释这一点。数据架构的核心元素包括 ETL(提取、转换和加载)、存储、报告、分析、可视化和数据分发。
驱动因素 3——机器学习和分析平台现在有了新的目的和定义
以下图表展示了分析的发展及其自我重塑:
-
历史上,重点仅在于报告。汇总或预处理过的数据被加载到仓库中,以了解发生了什么。这被称为描述性分析,主要是向后一步。
-
随着临时数据包含的出现,需要理解某些行为发生的原因。这被称为诊断分析,其重点是理解行为背后的根本原因,这又基于历史数据。
-
现在,需求已经转变,需要理解将要发生什么。这被称为预测分析,其重点是根据历史行为预测事件。
-
随着实时数据的出现,现在的重点是是否能够实现它?这超越了预测分析,其中补救措施是某个部分的一部分。最终的重点是随着实时事件访问的出现,实现它!以下图表展示了分析在价值及其相关复杂性方面的演变:
下一个表格区分了传统分析(BI)和新时代分析:
| 区域 | 传统分析(BI) | 新时代分析 |
|---|---|---|
| 范围 | 描述性分析诊断分析 | 预测分析数据科学 |
| 数据 | 有限/受控的量预处理/验证基本模型 | 大量数据多种格式和多样性预处理/验证过的数据增长模型复杂性 |
| 结果 | 这里,重点是回顾和根本原因分析 | 这里,重点是预测/洞察力和分析的准确性 |
驱动因素 4—不仅仅关乎历史和批量,还有实时和即时洞察
输入数据量小、速度高是定义 实时 的关键。新一代分析系统预计将处理实时、批量以及近实时处理请求(这些是计划好的,被称为微批量)。以下图表描述了实时和批量数据特性在体积、速度和多样性保持恒定的情况下的属性。
驱动因素 5—传统的 ETL 无法应对 大数据
目标是能够制定一个 ETL 架构策略,以解决以下问题区域:
-
促进实施标准化—处理一个标准的需求
-
支持构建可重用组件
-
构建无差别的函数
-
使用并行处理技术提高性能和可扩展性
-
降低总体拥有成本(TCO)
-
构建专门的技能库
以下表格提供了关键数据加载模式的比较分析:
| ETL 提取、转换和加载 | ELT 提取、加载和转换 | ETLT 提取、转换、加载和转换 | |
|---|---|---|---|
| 概述 | 这是一个传统的数据移动和转换技术,其中 ETL 引擎要么与源数据库分离,要么目标 DBMS 执行数据转换。 | 这是一个将数据从一处移动和转换到另一实例和格式的技术。在这种集成风格中,目标 DBMS 成为转换引擎。 | 在这种技术中,转换部分由 ETL 引擎完成,部分推送到目标 DBMS。 |
| 高亮 | 在 ETL 引擎中进行了大量的转换工作。它使用集成的转换函数。转换逻辑可以通过 GUI 进行配置。这是由 Informatica 支持的。 | 转换工作被委托给 DBMS 层。转换逻辑运行得更接近数据。这是由 Informatica 支持的。 | 转换工作在 ETL 引擎和 DBMS 之间分配。这是由 Informatica 支持的。 |
| 好处 | 这是一个基于图形用户界面的简单配置。转换逻辑独立,位于数据库之外,且可重用。这对于粒度细、简单、面向功能的转换非常有效,这些转换不需要任何数据库调用。可以在 SMP 或 MPP 硬件上运行。 | 这利用了 RDBMS 引擎硬件以实现可扩展性。它始终将所有数据保留在 RDBMS 中。根据数据集进行并行化,并且通常在引擎级别优化磁盘 I/O 以实现更快的吞吐量。只要硬件和 RDBMS 引擎可以继续扩展,它就可以扩展。在适当调整的 MPP RDBMS 平台上可以实现 3 倍到 4 倍的吞吐量。 | 它可以平衡工作负载或与 RDBMS 共享工作负载。 |
| 风险 | 这需要在 ETL 侧有更高的处理能力。成本更高。它包括需要参考数据的复杂转换,这将减慢处理过程。 | 转换逻辑与数据库相关联。涉及较小体积和简单性质的转换不会带来很多好处。 | 这仍将在数据库内部包含一部分转换逻辑。 |
事实 6——没有“一个”数据模型适合高级或复杂的数据处理需求;需要多数据模型平台
不同的数据库被设计用来解决不同的问题。通常使用单个数据库引擎来满足所有需求会导致性能不佳的解决方案。RDBMS 在事务操作方面表现良好,OLAP 数据库用于报告,NoSQL 用于高容量数据处理和存储。一些解决方案统一了这些存储,并为跨这些存储的查询提供了抽象。
适用于机器学习的现代数据架构
从本节开始,我们将详细介绍一些新兴的数据架构、导致这种实现架构的挑战、一些相关的技术堆栈以及这些架构适用的用例(如有相关)。
语义数据架构
在上一节中提到的新兴观点中涵盖的一些事实引发了以下核心架构驱动因素,以构建语义数据模型驱动的数据湖,这些数据湖能够无缝集成更广泛的数据范围,并且为分析做好准备。分析的未来是语义化的。此处的目标是创建一个大规模、灵活、标准驱动的 ETL 架构框架,借助工具和其他架构资产进行建模,以实现以下功能:
-
使一个可以成为标准架构的通用数据架构。
-
与未来基于本体驱动的数据架构和数据湖相结合(重要的是要将此架构策略与数据聚合参考架构相结合)。这将确保有一个单一的数据策略来处理数据质量和数据集成。
-
使产品团队能够快速集成到数据架构中,并将数据存入和从公共数据存储库中提取。
-
根据需要启用即席分析。
-
减少实施新的数据聚合、摄取和转换所需的时间。
-
启用“任何格式到任何格式”的模式(一种涉及数据规范化的格式无关方法)。
-
遵守新兴的语义标准。这将带来灵活性。
-
使共同的 IT 管理成为可能并降低 TCO。
-
为 Broadridge 主业务数据存储库启用一个统一的云(这可能是一个专有的)。
-
使所有应用程序和产品能够“使用一种共同的语言”并构建 Broadridge 数据格式。
-
减少,在某些情况下消除,过多许可证、数据库、实施、堆栈等的泛滥。
-
数据语义化:分析底层架构以从中提取意义是很重要的。语义化过程始终是迭代的,并随着时间的推移而发展。在此过程中,元数据定义将被详细阐述或扩展。
在企业范围内建立聚合数据集市并不是解决之前提出问题的方案。即使建立了这样的数据集市,保持其更新并与其他项目保持一致将是一个主要问题。正如之前所述,需要制定一个系统,该系统能够从多个来源积累数据,而不对数据的使用方式、地点或时间做出任何假设。
我们利用该领域的两个不同进展来解决架构层面的问题。这些是数据湖作为架构模式的演变,以及语义网的兴起及其在电子商务中的日益相关性。
业务数据湖
企业数据湖为数据仓库的概念带来了全新的维度。虽然数据仓库的方法一直是设计一个单一架构并汇总满足该架构所需的最少信息,但数据湖颠覆了传统数据仓库架构的这两个前提。传统的数据仓库是为了特定的目的而设计的(例如,分析、报告和运营洞察)。架构相应设计,所需的最少信息被汇总。这意味着如果使用这个仓库实现其他目标,那只是偶然的,而不是其设计目的。
商业数据湖促进了适当模式的概念——仓库不受固定、预定的模式的约束。这允许数据湖在组织内信息可用时吸收信息。这一重要直接影响是,而不是吸收最少的信息——数据湖可以吸收组织产生的所有信息。由于没有对数据是什么的假设,未来可以使用信息进行任何目的的选项仍然开放。这使得数据湖能够通过提供数据湖中已有的数据来支持新想法,从而提高业务敏捷性。
商业数据湖解决了以下问题:
-
如何处理非结构化数据?
-
如何链接内部和外部数据?
-
如何适应业务变化的速度?
-
如何消除重复的 ETL 周期?
-
如何根据不同的业务需求支持不同层次的数据质量和治理?
-
如何让本地业务单元采取主动?
-
如何确保平台的交付并使其被采用?
语义网技术
当使用在网络上最常找到的外部数据时,最重要的要求是理解数据的精确语义。没有这一点,结果无法信任。在这里,语义网技术提供了帮助,因为它们允许为任何可用的资源指定从非常简单到非常复杂的语义。语义网技术不仅支持捕获被动的语义,还支持对数据进行主动的推理和推理。
语义网技术允许数据被附加额外的元数据(作为 RDF)。这种能力添加的最基本的能力之一是语义计算的AAA 原则——任何人都可以在任何时候添加关于任何事物的任何内容。由于信息由元数据组成,因此可以随时添加更多元数据来丰富信息。
使用 SPARQL 查询 RDF 数据,它允许导航复杂的关系图,从数据存储中提取有意义的信息。推理器(或推理引擎)与 RDF 元数据一起工作,在数据顶部提供推理。这允许系统提取原本在传入数据中不可用的新的见解。
现在,大量的信息正在通过互联网和公司及监管网络变得可用。然而,只要信息被分别存储,没有简单的方法将它们从不同的来源组合起来,对所有可用信息的访问仍然有限。
这加剧了对合适方法的需求,以结合来自各种来源的数据。这被称为“信息系统的合作”。这被定义为能够在透明的方式下,在最终用户之间共享、组合和交换异构源信息的能力。这些异构源通常被认为是始终在孤岛中处理数据,因此它们是不可访问的。为了实现数据互操作性,需要消除数据异质性提出的问题。数据源可以以下方式异构:
-
句法:句法异质性是由使用不同的模型或语言引起的
-
模式:模式异质性源于结构差异
-
语义学:语义异质性是由不同语境中数据的不同含义或解释所引起的
数据集成提供了在多个数据源之间透明地操作数据的能力。基于架构,存在两种系统:
-
中央数据集成:中央数据集成系统通常具有全局模式,它为用户提供了一个统一的接口来访问存储在数据源中的信息。
-
对等网络:相比之下,在对等网络数据集成系统中,数据源(或对等点)上没有一般性的控制点。相反,任何对等点都可以接受用户对整个系统中分布的信息的查询。
信息系统的合作是指能够从多个信息源共享、组合和/或交换信息,以及最终接收者能够透明地访问集成信息的能力。阻碍信息系统合作的主要问题是信息源的自主性、分布、异质性和不稳定性。特别是,我们对可以在几个层面上识别的异质性问题感兴趣:系统、句法、结构和语义异质性。信息系统的合作已被广泛研究,并提出了几种方法来弥合异构信息系统之间的差距,例如:数据库转换、标准化、联邦、调解和 Web 服务。这些方法为句法和基本层面的异质性问题提供了适当的解决方案。
然而,为了实现异构信息系统之间的语义互操作性,交换信息的含义必须在系统中被理解。每当两个语境不使用对信息的相同解释时,就会发生语义冲突。
因此,为了处理语义异构性,需要更多语义专业化的方法,例如本体。在本章中,我们的重点是展示信息系统如何使用语义进行合作。在下一节中,让我们看看语义数据架构的构成。
本体和数据集成
此图表示基于语义数据架构的参考架构:
语义数据架构的关键特性如下:
-
元数据表示:每个来源都可以表示为支持元数据字典以解释术语的本地本体。
-
全局概念化:将有一个全局本体定义,它映射本地本体,并为共同视图提供单一视图或术语。
-
通用查询:将根据消费者/客户端的需求和目的,在本地或全局本体级别提供查询支持。
-
物化视图:一种高级查询策略,用于隐藏术语和同源之间的查询。
-
映射:将支持定义本体属性和值之间的术语表映射。
供应商
| 类型 | 产品/框架 | 供应商 |
|---|---|---|
| 开源和商业版本 | MarkLogic 8 是支持存储和处理 RDF 数据格式的 NoSQL 图存储,可以作为三元组存储。 | MarkLogic |
| 开源和商业版本 | Stardog 是最简单且功能最强大的图数据库:在轻量级、纯 Java 系统中进行搜索、查询、推理和约束。 | Stardog |
| 开源 | 4Store 是一个高效、可扩展且稳定的 RDF 数据库。 | Garlik Ltd. |
| 开源 | Jena 是一个用于构建语义网和链接数据应用的免费开源 Java 框架。 | Apache |
| 开源 | Sesame 是一个强大的 Java 框架,用于处理和操作 RDF 数据。这包括创建、解析、存储、推理和查询此类数据。它提供了一个易于使用的 API,可以连接到所有领先的 RDF 存储解决方案。 | GPL v2 |
| 开源 | Blazegraph 是 SYSTAP 的旗舰图数据库。它专门设计用于支持大型图,提供语义网(RDF/SPARQL)和图数据库(TinkerPop、blueprints 和以顶点为中心)API。 | GPL v2 |
多模型数据库架构/多语言持久性
即使五年前,我们也无法想象关系数据库只会成为数据库技术的一种,而不是数据库技术本身。互联网规模的数据处理改变了我们处理数据的方式。
新一代架构,如 Facebook、Wikipedia、SalesForce 等,在原则和范例上与当前数据管理技术发展的既定理论基础截然不同。
这些架构的主要架构挑战可以概括如下:
-
信息商品化:
苹果应用商店、SaaS、通用计算、移动性和基于云的多租户架构在商业术语上释放了商品化信息交付的能力。这种模型几乎改变了所有的架构决策,因为我们现在需要考虑的是可以提供并作为服务计费的信息“单元”,而不是考虑解决方案的总拥有成本(TCO)。
-
关系型数据库管理系统(RDBMS)的理论局限性:
影响力巨大的数据库理论家迈克尔·斯坦利布雷克(Michael Stonebraker)最近在互联网规模架构的核心所撰写的,是一个新的数据处理和管理理论模型。数据库管理的理论现在已有三十多年历史,当时它们是为大型机类型的计算环境和非常不可靠的电子组件而设计的。自然和系统以及应用的能力已经发生了显著变化。随着可靠性成为底层环境的质量属性,系统由并行处理核心组成,数据创建和使用的性质也发生了巨大变化。为了概念化这些新环境下的解决方案,我们需要从计算的角度来设计解决方案架构,而不仅仅是工程角度。
六大主要力量正在推动今天的数据革命。它们如下:
-
大规模并行处理
-
信息交付商品化
-
通用计算和移动设备
-
非 RDBMS 和语义数据库
-
社区计算
-
云计算
Hadoop 和 MapReduce 在很大程度上释放了数据的并行处理能力,并在程序化平台上实现了复杂的计算算法。这永远地改变了分析和商业智能。同样,基于 Web 服务和 API 驱动的架构在很大基础上实现了信息交付的商品化。如今,可以以这种方式构建极其庞大的系统,使得每个子系统或组件本身就是一个完整的平台,由完全不同的实体托管和管理。
之前的创新已经完全改变了传统的数据架构。特别是,语义计算和基于本体论的信息建模已经彻底颠覆了数据设计。
从哲学上讲,数据架构正在经历事实基础。在传统的数据模型中,我们首先设计数据模型——对世界及其未来的固定、设计时理解。数据模型将数据的含义永远固定在固定的结构中。
表不过是一个类别,一组事物。因此,数据只有在理解它所属的集合/类别时才有意义。例如,如果我们把汽车处理系统设计成一些类别,如四轮车、两轮车、商用车辆等,这种划分本身就包含了一些重要的意义。存储在每个类别中的数据并不能揭示设计嵌入的方式中的设计目的。例如,另一个系统可能会从驱动方式的角度来看待汽车世界——电动、石油驱动、核驱动等。这种分类本身以某种方式揭示了系统的目的,这是无法从任何单个记录的属性中获得的。
“多语言”这个术语通常用来定义能够说多种语言的人。在大数据背景下,这个术语指的是一组使用多种数据库技术的应用程序,其中每种数据库技术解决特定的问题。这种数据架构的基本前提是不同的数据库技术解决各种问题,因为复杂的应用程序有很多问题,选择一个选项来解决特定问题比试图用一个选项解决所有问题更好。当我们谈论数据系统时,它被定义为负责数据存储和查询的系统,其运行时间可达数年,并需要解决所有可能的硬件和维护复杂性。
当遇到复杂问题时,会采用多语言持久化数据架构,将问题分解成更小的部分,并通过应用不同的数据库模型来解决。随后将结果汇总到一个混合数据存储平台,并进行分析。影响数据库选择的一些因素如下:
因素 1—数据模型:
-
我们希望整合哪些类型的数据源?
-
我们希望如何操作/分析数据?
-
数据的量、种类和速度是多少?
-
例子—关系型、键值型、列式、文档型、图等。
因素 2—一致性、可用性和分区(CAP):
-
一致性:每个客户端的对象只有一个值(原子性)
-
可用性:所有对象始终可用(低延迟)
-
分区容错性:数据被分割成多个网络分区(聚类)
CAP 定理要求我们在这两个特性中选择任何一个:
以下图表是一个示例系统,该系统具有多个应用程序,并为其目的构建了数据模型:
来源:ThoughtWorks
影响此解决方案的一些重要方面如下:
-
确保提出的混合环境被清楚地理解,以确保它有助于做出关于数据集成、分析、数据可见性等方面的正确决策,从而确定解决方案如何融入整个大数据和数据分析实施框架。
-
由于存在多个数据模型,因此将需要一个能够与为解决方案和聚合而指定的所有数据库接口的统一平台。这个平台应该解决一些大数据平台的基本期望,如:容错性、高可用性、事务完整性、数据敏捷性和可靠性、可扩展性和性能。
-
根据具体要求,了解/理解哪种数据模型既适用于特定问题,也适用于整体解决方案,这一点非常重要。
-
数据摄取策略解决实时和批量数据更新,以及如何在多模型数据库的上下文中使其工作。由于将会有各种数据存储,系统记录(SOR)将是什么?我们如何确保所有数据源中的数据保持同步或是最新的?
因此,这可能是最好的大数据挑战。需要收集、集成和分析多个来源的、结构非常不同的数据,以解决特定的商业问题。然后,关键是确定数据是否需要按需或实时推送到客户端。显然,这种类型的问题不能简单地或以成本效益的方式使用一种数据库技术来解决。在某些情况下,直接使用 RDBMS 可能可行,但在存在非关系型数据的情况下,需要不同的持久化引擎,如 NoSQL。同样,对于电子商务业务问题,我们还需要一个高度可用和可扩展的数据存储,用于购物车功能。然而,要找到特定群体购买的产品,同一个存储无法提供帮助。这里的需求是采用混合方法,并使用多个数据存储联合使用,这被称为多语言持久化。
供应商
| 类型 | 产品/框架 | 供应商 |
|---|---|---|
| 商业 | FoundationDB 是一个坚如磐石的数据库,提供 NoSQL(键值存储)和 SQL 访问。 | FoundationDB |
| 开源 | ArangoDB 是一个开源的 NoSQL 解决方案,具有灵活的数据模型,适用于文档、图和键值。 | GPL v2 |
Lambda 架构(LA)
Lambda 架构解决了机器学习的一个重要方面;即提供一个统一平台,用于实时和批量分析。我们至今所见的大多数框架都支持批量架构(例如,Hadoop),以便支持与特定框架(例如,Storm)的实时处理集成。
Nathan Marz 提出了 Lambda 架构的概念,这是一个通用的、可扩展的、容错的数据处理架构,它将实时流处理和批量处理作为一个统一的解决方案。
Lambda 架构促进了一个高度容错的数据架构,既对抗硬件故障,也对抗人为错误。同时,它服务于广泛的用途和工作负载,在这些用途和工作负载中,需要低延迟的读取和更新。结果系统应该是线性可扩展的,并且应该向外扩展而不是向上扩展。
从高层次来看,它看起来是这样的:
-
数据层:进入系统的所有数据都被分配到批量层和速度层进行处理。
-
批量层:此层管理主数据,并负责批量预计算。它处理大量数据。
-
速度层:速度层负责处理最近的数据,并补偿服务层更新的高延迟。平均而言,这一层不处理大量数据。
-
服务层:服务层处理批量视图的索引,并促进低延迟的即席查询。
-
查询函数:此函数结合了批量视图和实时视图的结果。
Vendors
| 类型 | 产品/框架 | 供应商 |
|---|---|---|
| 开源和商业 | Spring XD 是一个针对碎片化 Hadoop 生态系统的统一平台。它建立在经过实战检验的开源项目之上,极大地简化了大数据工作负载和数据管道的编排。 | Pivotal (Spring Source) |
| 开源 | Apache Spark 是一个快速的传统大数据处理引擎,内置流、SQL、机器学习和图处理模块。 | Apache |
| 开源 | Oryx 是一个简单、实时和大规模的机器学习基础设施。 | Apache (Cloudera) |
| 开源 | Storm 是一个用于实时处理流数据的系统。 | Apache (Hortonworks) |
摘要
在本章的结尾,我们的重点是机器学习的实现方面。我们已经了解了传统分析平台是什么,以及它们如何无法满足现代数据需求。您还学习了推动新数据架构范式(如 Lambda 架构和多语言持久性[多模型数据库架构])的架构驱动因素,以及语义架构如何帮助实现无缝数据集成。通过本章,您可以假设您已经准备好为任何领域实施机器学习解决方案,并且不仅能够识别出解决学习问题所需应用哪些算法或模型,而且还能找到最佳的平台解决方案。