精通-Java-机器学习-三-

59 阅读1小时+

精通 Java 机器学习(三)

原文:annas-archive.org/md5/ae0ef35bdc04e7c0f29c1a93734045dd

译者:飞龙

协议:CC BY-NC-SA 4.0

第七章:深度学习

在*《实际应用中的监督学习》*的第二章中,我们讨论了不同的一般监督分类技术,这些技术可以广泛应用于各种应用。在监督非线性技术的领域,特别是在计算机视觉中,深度学习及其变体正产生显著影响。我们发现深度学习及其相关方法可以应用于图像识别、图像和对象标注、电影描述,甚至包括文本分类、语言建模、翻译等领域。(参考文献 [1, 2, 3, 4, 和 5])

为了为深度学习做准备,我们将首先描述神经元是什么以及它们如何被排列来构建多层神经网络,展示这些网络的核心元素,并解释它们的工作原理。然后,我们将讨论与神经网络相关的问题和挑战,这些挑战导致了深度学习在技术和结构上的进步。我们将了解深度学习的一些构建块,如受限玻尔兹曼机和自编码器。然后,我们将通过监督学习和无监督学习的不同变体来探索深度学习。接下来,我们将游览卷积神经网络(CNN),并通过一个用例,通过分解 CNN 在计算机视觉领域的应用来展示它们的工作原理。我们将介绍循环神经网络(RNN)及其变体,以及它们在文本/序列挖掘领域的应用。最后,我们将通过使用 MNIST 图像的真实数据案例研究来比较/对比不同的技术。我们将使用 DeepLearning4J 作为我们的 Java 工具包来执行这些实验。

多层前馈神经网络

从历史上看,人工神经网络主要被识别为多层前馈感知器,因此我们将从讨论这类网络的结构的基本元素开始,包括如何训练它们、过拟合问题以及解决该问题的技术。

输入、神经元、激活函数和数学符号

单个神经元或感知器与第二章中线性回归主题所描述的单位相同,即*《实际应用中的监督学习》。在本章中,数据实例向量将由x表示,具有d个维度,每个维度可以表示为输入、神经元、激活函数和数学符号。与每个维度相关联的权重表示为一个具有d个维度的权重向量w*,每个维度可以表示为输入、神经元、激活函数和数学符号。每个神经元都有一个额外的输入b,称为偏置。

神经元预激活执行由以下给出的输入线性变换:

输入、神经元、激活函数和数学符号

激活函数由输入、神经元、激活函数和数学符号给出,它将神经元输入输入、神经元、激活函数和数学符号转换为以下形式:

输入、神经元、激活函数和数学符号输入、神经元、激活函数和数学符号

图 1. 具有输入、权重和偏置的感知器生成输出。

多层神经网络

多层神经网络是理解深度学习网络的第一步,因为多层网络的基本概念和原语构成了所有深度神经网络的基础。

结构和数学符号

在本节中,我们介绍了神经网络的一般结构。大多数神经网络都是这里概述的结构变体。我们还展示了本章其余部分我们将使用的相关符号。

结构和数学符号

图 2. 展示输入层、两个隐藏层和输出层的多层神经网络。

与神经网络相关的最常见监督学习算法使用多层感知器。输入层由几个神经元组成,每个神经元独立连接到输入,并有自己的权重和偏置集。除了输入层之外,还有一层或更多被称为隐藏层的神经元。输入层神经元连接到第一隐藏层中的每个神经元,该层同样连接到下一隐藏层,依此类推,形成一个全连接网络。连接到最后隐藏层的神经元层被称为输出层。

每个隐藏层由结构和数学符号表示,其中k是层。对于*0 < k * < l层的预激活由以下给出:

结构和数学符号

结构和数学符号的隐藏层激活:

结构和数学符号

最终输出层激活为:

结构和数学符号

输出通常是每个神经元一个类别,并且调整方式使得只有一个神经元激活,其他所有神经元的输出都是 0。使用结构和数学符号的 softmax 函数来给出结果。

神经网络中的激活函数

在以下章节中给出了神经网络中使用的一些最著名的激活函数,它们之所以被使用,是因为学习过程中所需的导数可以用函数本身来表示。

Sigmoid 函数

Sigmoid 激活函数由以下方程给出:

Sigmoid 函数

它可以被视为一个有界、严格递增且正的变换函数,将值压缩在 0 和 1 之间。

双曲正切("tanh")函数

Tanh 函数由以下方程给出:

双曲正切("tanh")函数

它可以被视为有界、严格递增的,但作为一个将值压缩在-1 和 1 之间的正或负变换函数。

训练神经网络

在本节中,我们将讨论从输入训练集训练神经网络的要素,这与我们在第二章中讨论的方式非常相似,即实际应用世界监督学习。数据集用 D 表示,由单个数据实例组成。实例通常表示为训练神经网络的集合。每个实例的标签表示为训练神经网络的集合。整个带标签的数据集,具有数值或实值特征,表示为集合中的配对元素,如训练神经网络所示。

经验风险最小化

经验风险最小化是一个通用的机器学习概念,在许多分类或监督学习中得到应用。这种技术背后的主要思想是将训练或学习问题转化为一个优化问题(参考文献 [13])。

给定神经网络的参数为 ? = ({W¹, W², … W ^l ^(+1)}, {b¹, b², …b ^L ^(+1)}),训练问题可以看作是寻找最佳参数 (?),使得

经验风险最小化

其中 经验风险最小化 随机梯度下降(SGD)在第二章(ch02.html "第二章. 实际应用世界监督学习")和第五章(ch05.html "第五章. 实时流机器学习")中讨论,实际应用世界监督学习实时流机器学习,通常用作优化过程。应用于训练神经网络的 SGD 如下:

  1. 初始化 ? = ({W¹, W², … W*^l* ^(+1)}, {b¹, b², …b*^L* ^(+1)})

  2. 对于 i=1 到 N 个 epoch

    1. 对于每个训练样本(x^t,y^t)经验风险最小化//找到函数 2 的梯度 ?= ?+ a? //沿方向移动

这里使用的学习率(a)将通过减少接近最优解的振荡来影响算法的收敛;选择正确的 a 值通常是一个超参数搜索,需要使用第二章中描述的验证技术。

因此,为了学习神经网络的参数,我们需要选择一种参数初始化的方法,选择一个损失函数 经验风险最小化,计算参数梯度 经验风险最小化,将损失反向传播,选择正则化/惩罚函数 O(?),并计算正则化的梯度 经验风险最小化。在接下来的几节中,我们将逐步描述这一过程。

参数初始化

神经网络的参数是输入层、通过隐藏层到输出层的每一层的权重和偏置。在这个领域已经进行了很多研究,因为优化取决于起始或初始化。偏置通常设置为 0。权重初始化取决于激活函数,因为一些函数,如 tanh,其值 0 不能使用。通常,初始化每一层权重的办法是使用具有用户定义边界的对称函数进行随机初始化。

损失函数

损失函数的主要作用是最大化预测输出标签与输入数据向量类别的匹配程度。

因此,最大化 损失函数 等同于最小化负对数似然或交叉熵:

损失函数

梯度

我们将描述输出层和隐藏层的梯度,而不涉及推导,因为这超出了本书的范围。感兴趣的读者可以在 Rumelhart、Hinton 和 Williams 的文本中看到推导(参考文献 [6])。

输出层的梯度

输出层的梯度可以计算为:

输出层的梯度输出层的梯度输出层的梯度

其中 e(y) 被称为“独热向量”,其中向量的一个值是 1,对应正确的类别 y,其余都是 0。

输出层预激活的梯度可以类似地计算:

输出层的梯度

= – (e(y) – f(x))

隐藏层梯度

隐藏层梯度是使用偏微分链式法则计算的。

隐藏层梯度 隐藏层的梯度

隐藏层的梯度

隐藏层预激活的梯度可以表示为:

隐藏层的梯度隐藏层的梯度

由于隐藏层预激活需要如前所述的激活函数的偏导数(g'(a^kx[j])),因此之前描述的一些著名激活函数在方程本身中有偏导数,这使得计算非常容易。

例如,sigmoid 函数的偏导数为 *g'(a) = g(a)(*1 – g(a)),而对于 tanh 函数,它是 1 – g(a)²。

参数梯度

参数的损失梯度必须使用权重和偏差的梯度来计算。权重的梯度可以表示为:

参数梯度参数梯度

偏差的梯度可以表示为:

参数梯度参数梯度

前向传播和反向传播

神经网络训练的目的是调整每一层的权重和偏差,以便基于输出层的反馈和损失函数(该函数估计预测输出与实际输出之间的差异),最小化这种差异。

基于初始权重和偏差的神经网络算法可以看作是按层逐层前向计算,如图所示的单隐藏层无环流程图,以演示流程:

前向传播和反向传播

图 3:前向传播中神经网络作为图的流程。

从输入向量和预初始化的权重和偏差值开始,计算后续的每个元素:预激活、隐藏层输出、最终层预激活、最终层输出以及相对于实际标签的损失函数。在反向传播中,流向正好相反,从输出层的损失到第一层的权重和偏差,如下图所示:

前向传播和反向传播

图 4:反向传播中神经网络作为图的流程。

它是如何工作的?

反向传播算法(参考文献 [6 和 7])整体上可以总结如下:

计算激活前的输出梯度:

它是如何工作的?

对于隐藏层 k=l+1 到 1

计算隐藏层参数的梯度:

它是如何工作的?它是如何工作的?

计算当前隐藏层以下的隐藏层梯度:

它是如何工作的?

计算激活前的层梯度:

它是如何工作的?

正则化

在之前定义的经验风险最小化目标中,正则化用于解决机器学习中的过拟合问题,如第二章《实际应用中的监督学习》中所述。以下给出了众所周知的正则化函数。

L2 正则化

这只应用于权重,而不应用于偏差,并且对于连接 (i,j) 元件的层给出如下:

L2 正则化L2 正则化

此外,正则化器的梯度可以计算为 L2 正则化。它们通常被解释为权重分布上的“高斯先验”。

L1 正则化

这只应用于权重,而不应用于偏差,并且对于连接 (i,j) 组件的层给出如下:

L1 正则化

而这个正则化器的梯度可以计算为 L1 正则化。它通常被解释为权重分布上的“拉普拉斯先验”。

神经网络的局限性

在本节中,我们将详细讨论神经网络面临的问题,这将成为构建深度学习网络的垫脚石。

消失梯度、局部最优和慢速训练

神经网络的主要问题之一是“消失梯度”问题 (参考文献 [8])。我们将尝试给出对该问题的简单解释,而不是深入探讨数学推导。我们将选择 sigmoid 激活函数和两层神经网络,如图所示,以演示该问题:

消失梯度、局部最优和慢速训练

图 5:消失梯度问题。

正如我们在激活函数描述中看到的,sigmoid 函数将输出压缩在 0 和 1 之间。sigmoid 函数的导数 *g'(a) = g(a)(*1 – g(a)) 的范围在 0 和 0.25 之间。学习的目标是使输出损失最小化,即 消失梯度、局部最优和慢速训练。一般来说,输出误差不会降到 0,所以最大迭代次数;一个用户指定的参数决定了学习的质量和误差的反向传播。

简化以说明输出误差对输入权重层的影响:

消失梯度、局部最优和慢速训练

每个转换,例如,从输出到隐藏,涉及两个小于 1 的项的乘法:

消失梯度、局部最优和慢速训练

因此,当它达到输入层时,值变得如此之小,以至于梯度的传播几乎消失。这被称为消失梯度问题。

当你需要添加更多层来使隐藏层中的特征更加有趣时,就会出现一个矛盾的情况。但添加更多层也会增加错误。随着你添加更多层,输入层变得“训练缓慢”,这导致输出层更加不准确,因为它们依赖于输入层;进一步地,对于相同的迭代次数,随着层数的增加,错误也会增加。

在固定最大迭代次数的情况下,更多的层和缓慢的误差传播可能导致“局部最优”。

基本神经网络的一个问题是参数的数量。随着层数的增加,找到每个隐藏层和偏置的有效大小和权重变得更加具有挑战性。如果我们增加层数,参数将以多项式增长。为数据拟合参数需要大量的数据样本。这可能导致之前讨论过的问题,即过拟合。

在接下来的几节中,我们将开始学习帮助克服这些问题的深度学习构建块。

深度学习

深度学习包括用于监督学习和无监督学习的架构和技术,它能够使用由构建块组成的网络来内化高维数据的抽象结构,以创建判别性或生成模型。这些技术在近年来证明取得了巨大成功,任何希望掌握这些技术的读者都必须首先熟悉深度学习的基本构建块,并了解从业者使用的各种网络类型。如果你打算更深入地了解该主题,那么实际构建和调整深度神经网络的经验是无价的。在图像分类和文本学习等各个领域,深度学习在其结构中融合了特征生成,从而使得在许多应用中挖掘特征的任务变得多余。以下章节提供了概念、构建块、架构组合技术和训练深度网络的指南。

深度学习的构建块

在以下章节中,我们将介绍深度学习中最重要的组件,包括受限玻尔兹曼机、自编码器和去噪自编码器,它们的工作原理以及它们的优缺点。

矩形线性激活函数

Reclin 函数由以下方程给出:

g(a) = reclin (a) = max (0*,* a)

它可以看作是下限为 0 且没有上限,严格递增,并且仅对正数进行线性变换的正变换函数。

可以更容易地看出,修正线性单元或 ReLu 对于大于 0 的值具有 1 或恒等导数。这作为一个显著的好处,因为导数没有被压缩,并且在链式操作中不具有递减值。ReLu 的一个问题是对于负输入值,其值为 0,相应的神经元充当“死亡”状态,尤其是在偏置项学习到较大的负值时。ReLu 无法从这种情况中恢复,因为输入和导数都是 0。这通常通过具有“泄漏 ReLu”来解决。这些函数对于负输入值具有较小的值,并由以下公式给出 矩形线性激活函数,其中 ? = 0.01,通常是。

受限玻尔兹曼机

受限玻尔兹曼机(RBM)是一种无监督学习神经网络(参考文献 [11])。RBM 的想法是从标记或未标记数据中提取“更有意义的特征”。它还旨在在获取标记数据成本高昂或困难时,从许多领域中的大量未标记数据中“学习”。

定义和数学符号

在其基本形式中,RBM 假设每个维度上的输入是二进制值 0 或 1。RBM 是无向图模型,具有两层,一个表示为x的可见层和一个隐藏层h,以及连接W

RBM 定义了一个涉及隐藏层潜在变量的可见层分布。首先定义一个能量函数来捕捉可见层和隐藏层之间在向量形式上的关系:

分布的定义和数学符号

在标量形式中,能量函数可以定义为:

分布的定义和数学符号

分布的概率由分布的定义和数学符号给出,其中Z被称为“配分函数”,它是对所有* x 和 h*值的枚举,它们是二进制值,导致指数项,因此使其难以处理!

分布的定义和数学符号

图 6:可见层和隐藏层之间的连接。

相同内容的马尔可夫网络视图可以用所有成对因子表示,如下图所示。这也清楚地说明了为什么它被称为“受限”玻尔兹曼机,因为给定隐藏层或可见层内的单元之间没有连接:

分布的定义和数学符号分布的定义和数学符号

图 7:输入和隐藏层作为标量

我们已经看到,整个概率分布函数分布的定义和数学符号难以处理。现在我们将推导出x, h的基本条件概率分布。

条件分布

虽然计算整个*p(x, h)是难以处理的,但p(x|h)p(h|x)*的条件分布可以很容易地定义并证明是伯努利分布且可处理:

条件分布条件分布条件分布

类似地,由于对称和无向性:

条件分布条件分布条件分布

RBM 中的自由能

输入或观察变量的分布是:

RBM 中的自由能RBM 中的自由能RBM 中的自由能RBM 中的自由能

函数*F(x)*被称为自由能。

训练 RBM

RBM 是通过在整个训练数据上最小化平均负对数似然度来训练的。这可以表示为:

训练 RBM

优化是通过使用随机梯度下降来进行的:

训练 RBM

术语训练 RBM被称为“正相”,而术语训练 RBM被称为“负相”,因为它们对概率分布的影响——正相,因为它通过减少自由能来增加训练数据的概率,而负相,因为它减少了模型生成的样本的概率。

已经证明,由于“负相”,整体梯度难以从理论上计算,因为它是在模型形成的分布下计算输入数据的所有可能配置的期望,这使得它变得难以处理!

为了使计算可行,使用固定数量的模型样本进行估计,并将它们称为“负粒子”,用N表示。

梯度现在可以写成近似形式:

训练 RBM

其中粒子训练 RBM是通过一些采样技术(如蒙特卡洛方法)采样的。

RBM 中的采样

吉布斯抽样通常用于生成样本并学习p(x,h)的概率,这是基于p(x|h)p(h|x),它们相对容易计算,如前所述。

对 N 个随机变量进行联合采样的吉布斯抽样RBM 中的采样是通过 N 个形式RBM 中的采样的采样子步骤来完成的,其中S [-i]包含从步骤S [i]到但不包括步骤S *[i]*的样本。从图形上看,可以表示如下:

RBM 中的采样

图 8:隐藏层和输入层之间采样的图形表示。

RBM 中的采样所示,采样表示实际的分布p(x,h)

对比散度

对比散度(CD)是用于加速先前描述的吉布斯抽样过程的一个技巧,它停止在过程的步骤k而不是长时间继续以保证收敛。已经看到,即使k=1也是合理的,并且给出了良好的性能(参考文献 [10])。

输入和输出

这些是算法的输入:

  • 训练数据集

  • 吉布斯抽样的步数,k

  • 学习率 a

  • 输出是更新后的参数集

它是如何工作的?

使用自由能函数和偏导数的 CD 的完整训练伪代码可以表示为:

  1. 对于训练中的每个实例x^t:

    1. 使用* k* 步吉布斯抽样生成一个负粒子如何工作?

    2. 更新参数:

    它是如何工作的?它是如何工作的?它是如何工作的?

持续对比散度

持续对比散度是另一种用于计算联合概率 p(x,h) 的技巧。在此方法中,有一个单链,在观察每个样本后不会重新初始化,以找到负粒子 持续对比散度。它保持其状态,并且参数仅通过运行这些 k 状态并通过使用前一步的粒子来更新。

自编码器

自编码器是神经网络中另一种无监督学习技术。它与开头描述的前馈神经网络非常相似,唯一的区别是它不生成输出层的类别,而是在输出层尝试复制输入。(参考文献[12 和 23]) 目标是让隐藏层捕获输入的潜在或隐藏信息作为特征,这些特征在无监督或监督学习中可能是有用的。

定义和数学符号

以下图中展示了自编码器的单个隐藏层示例:

定义和数学符号

图 9:层之间的自编码器流程

输入层和输出层具有与前馈网络相同的神经元数量,对应于输入向量 x。每个隐藏层可以比输入层或输出层有更多的神经元,也可以相等或更少,并且有一个执行信号的非线性变换的激活函数。它可以看作是使用无监督或潜在隐藏结构来“压缩”数据。

隐藏层通过数据编码器或输入变换如下所示:

定义和数学符号

并且数据通过输出层的解码器或输出变换如下所示:

定义和数学符号

通常,在层中使用描述在神经网络部分的信号线性变换的 Sigmoid 函数是流行的:

定义和数学符号定义和数学符号)

损失函数

损失函数的工作是减少训练误差,就像之前一样,以便可以使用如随机梯度函数之类的优化过程。

在二元值输入的情况下,损失函数通常是平均交叉熵,如下所示:

损失函数

可以很容易地验证,当输入信号和输出信号匹配 0 或 1 时,误差为 0。同样,对于实值输入,使用平方误差:

损失函数

用于随机梯度过程的损失函数的梯度与前馈神经网络相似,可以通过推导在实值和二进制中展示如下:

损失函数

通过反向传播损失函数来获得参数梯度,这与神经网络中的操作完全相同。

自动编码器的局限性

自动编码器存在一些已知的缺点,这些问题将在后续章节中讨论。这些局限性包括:

当自动编码器的大小等于输入层中的神经元数量时,存在一种可能性,即自动编码器学习到的权重只是身份向量,整个表示仅仅将输入原封不动地传递为输出,损失为零。因此,它们模拟了“死记硬背”或“记忆”而没有任何泛化。

当自动编码器的大小大于输入层中的神经元数量时,这种配置称为“过完备”隐藏层,可能存在与之前提到的问题相似的问题。一些单元可能被关闭,而其他单元可能成为身份,使其仅成为复制单元。

当自动编码器的大小小于输入层中的神经元数量,称为“欠完备”时,可以在数据中发现潜在结构或重要的隐藏组件。

去噪自动编码器

如前所述,当自动编码器的隐藏层大小大于或等于输入层时,并不能保证学习到权重,它可能仅仅是一个将输入复制到输出的单元开关。这个问题通过去噪自动编码器得到解决。在这里,在输入和隐藏层之间增加了一个额外的层。这个层使用已知的分布去噪自动编码器或使用随机噪声(例如将二进制输入中的一个位转换为 0)向输入添加一些噪声。这个“噪声”输入随后通过从隐藏层到输出层的精确学习过程,就像自动编码器一样。去噪自动编码器的损失函数将输出与实际输入进行比较。因此,添加的噪声和更大的隐藏层使得学习潜在结构或添加/删除冗余以在输出端产生精确信号成为可能。这种架构——其中噪声层中的非零特征在信号向前推进时由激活层转换成隐藏层中的特征——为学习过程提供了鲁棒性和隐式结构(参考文献 [15])。

去噪自动编码器

图 10:去噪自动编码器

无监督预训练和监督微调

正如我们在神经网络问题部分所讨论的,过拟合问题在深度学习中尤为突出,因为层数和参数数量都很大。解决过拟合的一种方法是对数据进行特定正则化。在本节中,我们将描述在隐藏层中进行的“无监督预训练”方法,以克服过拟合问题。请注意,这通常是许多深度学习算法中使用的“初始化过程”。

无监督预训练算法以层级的贪婪方式工作。如图所示,在给定时间考虑一个可见和隐藏结构的一层。使用之前描述的无监督技术(如 RBM)对该层的权重进行几次迭代学习。然后,隐藏层的输出被用作“可见”或“输入”层,训练继续进行到下一层,依此类推。

每层的学习可以被视为一个“特征提取或特征生成”过程。当实际数据输入被转换时,在给定层形成高级特征,然后进一步组合形成更高层次的特征,依此类推。

无监督预训练和监督微调

图 11:通过无监督学习逐层增量学习。

一旦在预训练中使用之前描述的无监督技术学习所有隐藏层参数,接下来将进行监督微调过程。在监督微调过程中,添加一个最终输出层,就像在神经网络中一样,通过前向和反向传播进行训练。其想法是大多数权重或参数几乎完全调整,只需要微小变化就能在输出产生判别性类别映射。

无监督预训练和监督微调

图 12:最终调整或监督学习。

深度前馈神经网络

深度前馈神经网络涉及使用预训练和微调阶段。

根据使用的无监督学习技术——RBM、自编码器或降噪自编码器——形成不同的算法:堆叠 RBM、堆叠自编码器和堆叠降噪自编码器,分别。

输入和输出

给定深度前馈神经网络的架构,以下是为训练网络提供的输入:

  • 层数数量 L

  • 没有标签的数据集 D

  • 带有标签的数据集 D

  • 训练迭代次数 n

它是如何工作的?

所有三种的通用学习/训练算法如下所示:

  1. 对于层 l=1 到 L(预训练):

    1. 没有标签的数据集 如何工作?

    2. 执行逐步层无监督学习(RBM、自编码器或降噪自编码器)

    3. 从前一步骤中最终确定参数 W^l, b^l

  2. 对于输出层 (L+1) 执行参数 W*^L*^(+1), b*^L* ^(+1) 的随机初始化。

  3. 对于层 l=1 到 L+1(微调):

    1. 带标签的数据集 它是如何工作的?

    2. 使用从 1.(W^l, b^l)预初始化的权重。

    3. 进行 n 次前向-反向传播。

深度自编码器

深度自编码器具有许多隐藏单元层,这些层缩小到一个非常小的维度,然后对称地增长到输入大小。

深度自编码器

图 13:深度自编码器

深度自编码器背后的想法是使用深度网络创建能够捕捉输入的潜在复杂结构的特征,同时克服由于深度结构导致的梯度消失和欠拟合问题。已经证明,这种方法生成的特征在许多数据集上比 PCA 表现更好(参考文献 [13])。

深度自编码器使用预训练、编码器/解码器和微调的概念来执行无监督学习:

在预训练阶段,使用 RBM 方法学习编码器的贪婪逐步参数,如图所示,用于初始化:

深度自编码器

图 14:RBM 的逐步学习

在展开阶段,相同的参数对称地应用于解码器网络进行初始化。

最后,使用全网络的反向传播微调来调整参数。

深度信念网络

深度信念网络(DBNs)是无监督预训练概念的起源(参考文献 [9])。无监督预训练起源于 DBNs,后来发现它在前馈监督深度网络中也同样有用和有效。

深度信念网络不是监督的前馈网络,而是一个生成模型,用于生成数据样本。

输入和输出

输入层是数据的实例,每个输入特征用一个神经元表示。DBN 的输出是从学习到的特征层次中重建的输入,这些特征具有越来越大的抽象性。

它是如何工作的?

如何使用三层深度信念网络(DBN)架构来解释 DBN 学习输入数据的联合分布。

它是如何工作的?

图 15:深度信念网络

如所示,具有三个隐藏层的 DBN 包含一个无向的 RBM 层,该层连接到两层贝叶斯网络。具有 sigmoid 激活函数的贝叶斯网络被称为 sigmoid 贝叶斯网络(SBN)。

生成模型的目标是学习由 p(x,h^((1)),h^((2)),h^((3))) 给出的联合分布

p(x,h^((1)),h^((2)),h^((3))) = p(h²),h^((3)))p(h^((1))|h^((2))) p(x|h^((1)))

如前所述的 RBM 计算给我们:

它是如何工作的?

下一两层中的贝叶斯网络是:

它是如何工作的?它是如何工作的?

对于二进制数据:

如何工作?如何工作?

具有丢弃法的深度学习

另一种用于克服深度神经网络中提到的“过拟合”问题的技术是使用丢弃技术来学习参数。在接下来的几节中,我们将定义、说明并解释具有丢弃法的深度学习是如何工作的。

定义和数学符号

丢弃背后的想法是通过随机移除一些隐藏单元来“削弱”深度神经网络结构,如图所示,在参数学习之后。这些单元被设置为 0,丢弃概率通常设置为 p=0.5

灵感类似于向输入添加噪声,但这是在所有隐藏层中完成的。当随机移除某些特征(或特征的组合)时,神经网络必须以更稳健的方式学习潜在特征,而不依赖于某些特征之间的相互依赖性。

定义和数学符号

图 16:通过用深色阴影表示丢弃某些单元来指示具有丢弃法的深度学习。

每个隐藏层由 h^k*(x)* 表示,其中 k 是层。对于 0<k<l 层的预激活由以下给出:

定义和数学符号

对于 1< k < l 的隐藏层激活。二进制掩码在每个隐藏层由 m^k 表示:

定义和数学符号

最终输出层激活为:

定义和数学符号

输入和输出

对于使用丢弃法的训练,输入如下:

  • 网络架构

  • 训练数据集

  • 丢弃概率 p(通常为 0.5)

输出是一个经过训练的深度神经网络,可用于预测用途。

它是如何工作的?

我们现在将描述具有丢弃法的深度学习的工作原理的不同部分。

使用丢弃法的训练和测试

使用梯度从输出损失函数反向传播学习权重和偏置与传统的神经网络学习非常相似。唯一的区别是应用了适当的掩码,如下所示:

在激活之前计算输出梯度:

使用丢弃法的训练和测试

对于隐藏层 k=l+1 到 1

计算隐藏层参数的梯度:

使用丢弃法的训练和测试使用丢弃法的训练和测试

h^(k-1) 的计算已考虑应用二进制掩码 m^(k-1)。

在激活之前计算当前以下隐藏层的梯度:

使用丢弃法的训练和测试

在激活之前计算以下层的梯度:

使用丢弃法的训练和测试

在测试模型时,我们不能使用二值掩码,因为它是不确定的;使用掩码的“期望”值。如果 dropout 概率是p=0.5,则在测试或模型应用时间点的单元期望值使用相同的值 0.5。

稀疏编码

稀疏编码是另一种用于无监督学习和特征生成的神经网络(参考文献 [22])。它基于在高维空间中寻找捕获模式的潜在结构的原则,从而在无监督学习之外执行特征提取。

形式上,对于每个输入x^((t)),学习一个潜在表示h^((t)),它具有稀疏表示(向量中的大多数值都是 0)。这是通过以下目标函数的优化来完成的:

稀疏编码

其中第一个项稀疏编码用于控制重建误差,第二个项,使用正则化器?用于稀疏控制。矩阵D也被称为字典,因为它与字典中的单词具有等价性,h^((t))类似于词频;它们共同捕捉到在执行文本挖掘时,单词在提取模式中的影响。

卷积神经网络

卷积神经网络或 CNNs 已成为突出且在计算机视觉领域得到广泛应用。计算机视觉涉及处理图像/视频以捕获知识和模式。标注图像、分类图像/视频、纠正它们、讲故事或描述图像等,是计算机视觉中的一些广泛应用[16]。

计算机视觉问题通常需要处理无结构数据,这些数据可以描述为:

输入是具有单色或多色通道的 2D 图像或高维向量的 3D 视频。

这些 2D 或 3D 表示中的特征具有众所周知的空间拓扑结构、层次结构和一些可利用的重复元素。

图像/视频基于诸如光照、噪声等因素具有大量变换或变体。同一个人或汽车可以根据几个因素看起来不同。

接下来,我们将描述在 CNNs 中使用的某些构建块。我们将使用简单的图像,如字母表中的 X,来解释涉及的概念和数学。例如,尽管由于平移、缩放或扭曲,以下图中相同的字符 X 以不同的方式表示,但人眼可以轻松地将其识别为 X,但对于计算机来说,识别模式变得复杂。图像显示已获得作者的许可(参考文献 [19]):

卷积神经网络

图 17:以不同方式表示的字符 X 的图像。

下一个图示说明了如何将一个简单的灰度图像 X 具有的共同特征,如从左上角到右上角的斜线,以及左和右交叉的斜线重复并组合成更大的 X:

卷积神经网络

图 18:字符 X 图像中表示的常见特征。

局部连通性

这就是将整个图像划分为“补丁”或“接收场”并将每个补丁分配给隐藏层的简单概念。如图所示,而不是完整的样本图像的 9 X 9 像素,左上角的 3 X 3 像素补丁被送到第一个隐藏单元,重叠的第二补丁被送到第二个,依此类推。

由于完全连接的隐藏层会有大量的参数,拥有较小的补丁完全减少了参数或高维空间问题!

局部连通性

图 19:整个图像上的补丁概念。

参数共享

参数共享的概念是构建一个权重矩阵,可以在不同的补丁或接收场中重复使用,如前图所示在局部共享中构建。如图所示,具有相同参数W[1,1]和W[1,4]的特征图创建出两个不同的特征图,特征图 1 和 4,都捕捉到相同的特征,即两侧的对角线边缘。因此,特征图捕捉图像中的“相似区域”并进一步降低输入空间的维度。

参数共享

离散卷积

我们将解释离散卷积的步骤,通过一个简单的、经过简化的数学示例来说明这个操作。

假设代表对角线特征的核在整个图像上作为一个 3 X 3 的补丁进行扫描。如果这个核落在输入图像中的相同特征上,并且我们必须通过我们所说的卷积算子来计算中心值,由于匹配,我们得到精确的值为 1,如下所示:

离散卷积

图 21:离散卷积步骤。

当整个图像通过这个核和卷积算子运行时,会得到如下值的矩阵:

离散卷积

图 22:经过核和卷积算子变换后的字符图像。

我们可以看到如何通过这个扫描突出显示左对角线特征。同样,通过运行其他核,如图所示,我们可以得到一个“过滤图像堆叠”:

离散卷积

图 23:不同的特征通过核运行,生成一系列图像。

过滤后的图像中的每个单元格可以表示为:

离散卷积离散卷积离散卷积

池化或子采样

池化或子采样在过滤图像堆栈上工作,进一步缩小图像或压缩它,同时保持模式不变。池化中执行的主要步骤如下:

  1. 选择窗口大小(例如,2 X 2)和步长大小(例如,2)。

  2. 在步长中移动窗口,覆盖所有过滤图像。

  3. 在每个窗口中,选择“最大”值。

池化或子采样

图 24:使用 2 X 2 窗口大小和 2 步长进行的最大池化,计算第一个单元格的最大值为 1.0,下一个为 0.33,依此类推。

池化也扮演着重要角色,由于使用了最大值,即使特征被移动或缩放,也可以检测到相同的特征。同一组堆叠的过滤图像被转换成池化图像,如下所示:

池化或子采样

图 25:展示如何将一叠过滤图像转换为池化图像的转换。

使用 ReLU 进行归一化

如我们在深度学习的基石中讨论的那样,ReLU 通过将其压缩到 0 来移除负值,并保持正值不变。它们在反向传播中的梯度计算中也扮演着重要的角色,解决了梯度消失的问题。

使用 ReLU 进行归一化

图 26:使用 ReLU 的转换。

CNN 层

在本节中,我们将把之前讨论的构建块组合起来,形成 CNN 的完整图景。通过结合卷积层、ReLU 和池化层形成一个连接的网络,生成缩小后的图像,并在最终输出中捕获模式,我们得到下一个复合构建块,如图所示:

CNN 层

图 27:CNN 的基本单元,展示了卷积、ReLU 和池化的组合。

因此,这些层可以组合或“深度堆叠”,如图所示,形成一个复杂的网络,输出一个小图像池:

CNN 层

图 28:通过重复堆叠基本单元来形成 CNN 层。

输出层是一个如所示的全连接网络,它使用投票技术并学习所需输出的权重。全连接输出层也可以堆叠。

CNN 层

图 29:CNN 的输出层为全连接层。

因此,最终的 CNN 可以完全如图所示:

CNN 层

图 30:显示所有层的 CNNS 输入和输出的图。

如前所述,梯度下降被选为学习技术,使用损失函数来计算差异并反向传播错误。

如果可以将数据映射到“图像”并且存在“局部空间”模式,CNN 可以用于其他领域,如声音模式识别、文本挖掘等。以下图示了将声音和文本映射到图像以供 CNN 使用的一种方法:

CNN 层

图 31:时间数据(如声音)映射到空间数据(如图像)的映射示意图。

循环神经网络

当你有有限输入且输入示例或实例之间没有相互依赖时,使用正常的深度网络。当存在可变长度输入且它们之间存在时间依赖性时,即序列相关数据,神经网络必须修改以处理此类数据。循环神经网络(RNN)是广泛用于解决此类问题的神经网络的例子,我们将在以下章节中讨论它们。RNN 用于许多与序列相关的问题,如文本挖掘、语言建模、生物信息学数据建模等,仅举一些符合这一元级描述的领域(参考文献 [18 和 21])。

循环神经网络的结构

我们将首先描述 RNN 的最简单单元,然后展示它是如何组合起来以理解其功能和数学原理,并说明不同组件如何相互作用和工作。

循环神经网络的结构

图 32:人工神经元与具有反馈的神经元的区别。

让我们考虑基本输入,一个具有激活的神经元及其在给定时间 t 的输出:

循环神经网络的结构循环神经网络的结构

一个具有反馈的神经元保持一个矩阵 W[R],以包含时间 t-1 的前一个输出,方程如下:

循环神经网络的结构循环神经网络的结构循环神经网络的结构

图 33:具有反馈连接的神经元链。

基本 RNN 堆叠隐藏单元的结构,如图所示,从前一层反馈连接。在时间 t 的激活不仅依赖于输入 x^((t)),还依赖于由 W[R]h^((t-1)) 给出的前一个单元。RNN 反馈连接中的权重通常在所有单元中相同,W[R]。此外,RNN 不是在前馈神经网络的末端发出输出,而是每个单元持续发出输出,这些输出可用于损失函数的计算。

RNN 中的学习和相关问题

与 RNN 一起工作会带来一些特定于它们的挑战,但也有在其他类型神经网络中也遇到的一些共同问题。

  1. 单元在任何时间 t 的输出损失函数中使用的梯度具有回溯到第一个单元或 t=0 的依赖性,如图所示。这是因为单元的偏导数依赖于前一个单元,因为:RNN 中的学习和相关问题

    时间反向传播(BPTT)是用于说明该过程的术语。

    RNN 中的学习和相关问题

    图 34:时间反向传播。

  2. 与我们在前馈神经网络部分看到的情况类似,由于单元的连接性,梯度爆炸和消失的情况在 RNN 中变得更加明显。

  3. 解决梯度爆炸的一些方法包括:

    1. 截断 BPTT 是对 BPTT 过程的小幅修改。不是将学习传播回时间t=0,而是截断到固定时间向后到t=k

    2. 梯度裁剪,当梯度急剧上升时,将其裁剪到阈值以上。

    3. 自适应学习率。学习率根据反馈和值进行调整。

  4. 解决梯度消失的一些方法包括:

    1. 使用 ReLU 作为激活函数;因此梯度将为 1。

    2. 自适应学习率。学习率根据反馈和值进行调整。

    3. 使用扩展,如长短期记忆(LSTM)和门控循环单元(GRU),我们将在下一部分进行描述。

RNN 有许多应用,例如在下一个字母预测、下一个单词预测、语言翻译等方面。

RNN 中的学习和相关问题

图 35:展示使用 RNN 结构在下一个字母/单词预测中的应用。

长短期记忆

解决 RNN 中梯度消失问题的一种神经网络架构或修改,被称为长短期记忆或 LSTM。我们将解释 LSTM 的一些构建块,然后将其组合起来供读者参考。

RNN 的第一个修改是将反馈学习矩阵改为 1,即W[R] = 1,如图所示:

长短期记忆

图 36:LSTM 的构建块,其中反馈矩阵设置为 1。

这将确保从旧细胞或记忆单元的输入直接传递到下一个单元。因此需要一些修改。

输出门,如图所示,结合了两个计算。第一个是从单个单元输出的,通过激活函数传递,第二个是经过 sigmoid 缩放的老单元的输出。

长短期记忆

图 37:LSTM 的构建块输出门。

从数学上讲,单元的输出门由以下公式给出:

长短期记忆长短期记忆

遗忘门位于两个记忆单元之间。它根据学习权重和变换生成 0 或 1。遗忘门如图所示:

长短期记忆

图 38:LSTM 中添加的遗忘门构建块。

从数学上讲,长短期记忆可以看作是遗忘门的表示。接下来,输入门和新门结合,如图所示:

长短期记忆

图 39:添加了新门和输入门以完成 LSTM。

新的记忆生成单元通过激活函数使用当前输入 x[t] 和旧状态 h[t-1],生成新的记忆 C[t]。输入门结合输入和旧状态,并确定是否保留新的记忆或输入。

因此,更新方程看起来是这样的:

长短期记忆

门控循环单元

门控循环单元 (GRUs) 是经过修改的简化 LSTMs。许多门通过使用一个“更新”单元进行了简化,如下所示:

门控循环单元

图 40:带有更新单元的 GRUs。

对方程所做的更改如下:

门控循环单元门控循环单元门控循环单元门控循环单元

案例研究

对于图像分类,存在几个基准测试。我们将使用 MNIST 图像数据库进行本案例研究。当我们使用 MNIST 在第三章中时,无监督机器学习技术,包括聚类和异常检测技术,每个像素都被视为一个特征。除了像以前实验中那样从像素值中学习外,我们还将使用深度学习技术从训练数据集的结构中学习新特征。深度学习算法将在 60,000 张图像上进行训练,并在 10,000 张图像的测试数据集上进行测试。

工具和软件

在本章中,我们介绍了名为 DeepLearning4J (DL4J)的开源 Java 深度学习框架。DL4J 包含实现众多深度学习技术的库,它们可以在分布式 CPU 和 GPU 上使用。

DeepLearning4J: deeplearning4j.org/index.html

我们将展示如何使用一些 DL4J 库从 MNIST 训练图像中学习,并将学到的模型应用于测试集中的图像分类。

商业问题

图像分类是评估深度学习网络的特别有吸引力的测试平台。我们之前遇到了 MNIST 数据库,它由手写数字的灰度图像组成。这次,我们将展示如何使用无监督和监督的深度学习技术从同一数据集中学习。MNIST 数据集包含 28x28 像素的单通道图像。这些图像被分类为 10 个标签,代表数字 0 到 9。目标是训练 60,000 个数据点,并在剩余的 10,000 张图像上测试我们的深度学习分类算法。

机器学习映射

这包括应用于有 10 个可能输出类别的分类问题的监督和无监督方法。一些技术使用一个初始的预训练阶段,这个阶段本质上是无监督的,正如我们在前面的章节中看到的。

数据采样和转换

数据集可在以下位置获取:

yann.lecun.com/exdb/mnist

在本案例研究的实验中,MNIST 数据集已经被标准化,使得像素值在 0 到 255 的范围内被归一化到 0.0 到 1.0。例外的是在堆叠 RBM 的实验中,训练数据和测试数据已经被二值化,即如果标准化值大于或等于 0.3 则设置为 1,否则为 0。10 个类别在训练集和测试集中都有相同的代表性。此外,使用用户提供的随机数生成器种子对示例进行随机排序。

特征分析

输入数据特征是每张图像中像素的灰度值。这是原始数据,我们将使用深度学习算法从原始像素值中学习高级特征。数据集已经被准备,使得训练集和测试集中每个类别的示例数量相等。

模型、结果和评估

我们将从简单的 MLP、卷积网络、变分自编码器、堆叠 RBM 和 DBN 开始进行不同的实验。我们将逐步讲解代码中的重要部分,突出网络结构或专门的调整,提供参数以帮助读者重现实验,并给出每种网络类型的结果。

基本数据处理

以下代码片段显示:

如何使用分隔符强制结构的 CSV 读取数据。

如何迭代数据并获取记录。

如何在内存中打乱数据并创建训练/测试或验证集:

RecordReader recordReader = new  ] CSVRecordReader(numLinesToSkip,delimiter);
recordReader.initialize(new FileSplit(new ClassPathResource(fileName).getFile()));
DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses);
DataSet allData = iterator.next();
allData.shuffle();
SplitTestAndTrain testAndTrain = allData.splitTestAndTrain(trainPercent); 
DataSet trainingData = testAndTrain.getTrain();
DataSet testData = testAndTrain.getTest();

DL4J 有一个特定的 MNIST 包装器来处理我们所使用的数据,如下面的代码片段所示:

DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, randomSeed);
DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, randomSeed);

多层感知器

在第一个实验中,我们将使用一个基本的多层感知器,包含输入层、一个隐藏层和一个输出层。以下是代码中使用的参数的详细列表:

用于 MLP 的参数
参数变量
迭代次数m1
学习率rate0.0015
动量momentum0.98
L2 正则化正则化0.005
输入行数numRows28
输入列数numColumns28
第 0 层输出大小,第 1 层输入大小outputLayer0, inputLayer1500
第 1 层输出大小,第 2 层输入大小outputLayer1, inputLayer2300
第 2 层输出大小,第 3 层输入大小outputLayer2, inputLayer3100
第 3 层输出大小outputNum10
MLP 代码

在下面的列表中,我们可以看到我们首先通过 Builder 模式传递超参数来配置 MLP。

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(randomSeed) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) // use SGD
.iterations(m)//iterations
.activation(Activation.RELU)//activation function
.weightInit(WeightInit.XAVIER)//weight initialization
.learningRate(rate) //specify the learning rate
.updater(Updater.NESTEROVS).momentum(momentum)//momentum
.regularization(true).l2(rate * regularization) // 
.list()
.layer(0, 
new DenseLayer.Builder() //create the first input layer.
.nIn(numRows * numColumns)
.nOut(firstOutput)
.build())
.layer(1, new DenseLayer.Builder() //create the second input layer
.nIn(secondInput)
.nOut(secondOutput)
.build())
.layer(2, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) //create hidden layer
.activation(Activation.SOFTMAX)
.nIn(thirdInput)
.nOut(numberOfOutputClasses)
.build())
.pretrain(false).backprop(true) //use backpropagation to adjust weights
.build();

下面的代码片段展示了 MLP 的训练、评估和测试。注意初始化可视化后端代码,这使您能够在浏览器中监控模型训练,特别是模型得分(每次迭代的训练误差)和参数更新:

MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(5));  //print the score with every iteration
//Initialize the user interface backend
UIServer uiServer = UIServer.getInstance();
//Configure where the network information (gradients, activations, score vs. time etc) is to be stored
//Then add the StatsListener to collect this information from the network, as it trains
StatsStorage statsStorage = new InMemoryStatsStorage();             //Alternative: new FileStatsStorage(File) - see UIStorageExample
int listenerFrequency = 1;
net.setListeners(new StatsListener(statsStorage, listenerFrequency));
//Attach the StatsStorage instance to the UI: this allows the contents of the StatsStorage to be visualized
uiServer.attach(statsStorage);
log.info(""Train model...."");
for( int i=0; i<numEpochs; i++ ){
log.info(""Epoch "" + i);
model.fit(mnistTrain);
        }
log.info(""Evaluate model...."");
Evaluation eval = new Evaluation(numberOfOutputClasses); 
while(mnistTest.hasNext()){
DataSet next = mnistTest.next();
INDArray output = model.output(next.getFeatureMatrix()); //get the networks prediction
eval.eval(next.getLabels(), output); //check the prediction against the true class
        }
log.info(eval.stats());

下面的图表显示了 MLP 模型的训练误差与训练迭代次数的关系。这条曲线应该随着迭代次数的增加而降低:

MLP 代码

图 41:使用训练迭代次数测量的 MLP 模型的训练误差。

在下面的图中,我们可以看到 MLP 的第 0 层参数的分布以及参数更新的分布。这些直方图应该具有大约高斯(正态)形状,这表明良好的收敛。有关如何使用图表调整模型的信息,请参阅 DL4J 可视化页面(deeplearning4j.org/visualization):

MLP 代码

图 42:显示层参数和更新分布的直方图。

卷积网络

在第二个实验中,我们使用内置的多层配置(MultiLayerConfiguration)配置了一个卷积网络(ConvNet)。网络的架构由总共五层组成,如下代码片段所示。在输入层之后,两个交替的 5x5 卷积层和最大池化层之后,是一个使用 ReLu 激活层的全连接密集层,最终以 Softmax 激活结束在输出层。使用的优化算法是随机梯度下降,损失函数是负对数似然。

ConvNet 的各种配置参数(或超参数)在表中给出。

ConvNet 使用的参数
参数变量
随机数种子seed123
输入大小numRows, numColumns28, 28
训练轮数numEpochs10
迭代次数iterations1
L2 正则化regularization0.005
学习率learningRate0.1
动量momentum0.9
卷积滤波器大小xsize, ysize5, 5
卷积层步长大小x, y1, 1
输入通道数numChannels1
下采样层步长大小sx, sy2, 2
第 0 层输出大小nOut020
第 2 层输出大小nOut150
第 4 层输出大小nOut2500
第 5 层输出大小outputNum10
CNN 代码

如您所见,使用 DL4J API 配置多层神经网络,无论是构建 MLP 还是 CNN,都是相似的。算法特定的配置只需在每一层的定义中完成。

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(iterations) .regularization(true).l2(regularization)
.learningRate(learningRate)
.weightInit(WeightInit.XAVIER) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .updater(Updater.NESTEROVS).momentum(momentum)
.list()
.layer(0, new ConvolutionLayer.Builder(xsize, ysize)
.nIn(nChannels)
.stride(x,y)
.nOut(nOut0)
.activation(Activation.IDENTITY)
.build())
.layer(1, new SubsamplingLayer
.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(width, height)
.stride(sx,sy)
.build())
.layer(2, new ConvolutionLayer.Builder(xsize, ysize)
.stride(x,y)
.nOut(nOut2)
.activation(Activation.IDENTITY)
.build())
.layer(3, new SubsamplingLayer
.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(width, height)
.stride(sx,sy)
.build())
.layer(4, new DenseLayer.Builder()
.activation(Activation.RELU)
.nOut(nOut4).build())
.layer(5, new OutputLayer. Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nOut(outputNum)
.activation(Activation.SOFTMAX)
.build())
.setInputType(InputType.convolutionalFlat(numRows,numColumns,1)) 
.backprop(true).pretrain(false).build();

变分自动编码器

在第三个实验中,我们将变分自动编码器配置为分类器。

变分自动编码器使用的参数

用于配置 VAE 的参数在表中显示。

参数变量
RNG 种子rngSeed12345
迭代次数Iterations1
学习率learningRate0.001
RMS 衰减rmsDecay0.95
L2 正则化regularization0.0001
输出层大小outputNum10
VAE 编码器层大小vaeEncoder1, vaeEncoder2256, 256
VAE 解码器层大小vaeDecoder1, vaeDecoder2256, 256
潜在变量空间大小latentVarSpaceSize128
变分自动编码器的代码

我们已配置了编码器和解码器各两层,并使用伯努利分布重构输入。

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(rngSeed)
.iterations(iterations)
.optimizationAlgo(
OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.learningRate(learningRate)
.updater(Updater.RMSPROP).rmsDecay(rmmsDecay)
.weightInit(WeightInit.XAVIER)
.regularization(true).l2(regulaization)
.list()
.layer(0, new VariationalAutoencoder.Builder()
.activation(Activation.LEAKYRELU)
                .encoderLayerSizes(vaeEncoder1, vaeEncoder2)        //2 encoder layers
                .decoderLayerSizes(vaeDecoder1, vaeDecoder2)        //2 decoder layers
.pzxActivationFunction(""identity"")  //p(z|data) activation function
.reconstructionDistribution(new BernoulliReconstructionDistribution(Activation.SIGMOID.getActivationFunction()))     //Bernoulli distribution for p(data|z) (binary or 0 to 1 data only)
.nIn(numRows * numColumns) //Input size                      
.nOut(latentVarSpaceSize) //Size of the latent variable space: p(z|x).
.build())
.layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).activation(Activation.SOFTMAX)
.nIn(latentVarSpaceSize).nOut(outputNum).build())
.pretrain(true).backprop(true).build();

DBN

DBN 中使用的参数如下表所示:

参数变量
输入数据大小numRows, numColumns28, 28
RNG 种子seed123
训练迭代次数iterations1
动量momentum0.5
**层 0(输入)****层 0(输出)****层 1(输入,输出)****层 2(输入,输出)**层 3(输入,输出)numRows * numColumnsnOut0nIn1, nOut1nIn2, nOut2nIn3, outputNum28 * 28500500, 250250, 200200, 10

使用 DL4J API 配置 DBN 的示例在此案例研究中使用。网络配置的代码在此处显示。

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.gradientNormalizationThreshold(1.0)
.iterations(iterations)
.updater(Updater.NESTEROVS)
.momentum(momentum)
.optimizationAlgo(OptimizationAlgorithm.CONJUGATE_GRADIENT)
.list()
.layer(0, new RBM.Builder().nIn(numRows*numColumns).nOut(nOut0)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(1, new RBM.Builder().nIn(nIn1).nOut(nOut1)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(2, new RBM.Builder().nIn(nIn2).nOut(nOut2)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(3, new OutputLayer.Builder().nIn(nIn3).nOut(outputNum)
.weightInit(WeightInit.XAVIER).activation(Activation.SOFTMAX)
.build())
.pretrain(true).backprop(true)
.build();
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(listenerFreq));

使用 Arbiter 进行参数搜索

DeepLearning4J 提供了一个框架,通过移除模型师手动调整的负担来微调超参数;相反,它允许指定搜索的参数空间。在下面的示例代码片段中,配置是通过使用 MultiLayerSpace 而不是 MutiLayerConfiguration 对象来指定的,其中超参数的范围是通过 Arbiter DL4J 包中的 ParameterSpace 对象来指定的,用于调整的参数:

ParameterSpace<Double> learningRateHyperparam = new ContinuousParameterSpace(0.0001, 0.1);  //Values will be generated uniformly at random between 0.0001 and 0.1 (inclusive)
ParameterSpace<Integer> layerSizeHyperparam = new IntegerParameterSpace(16,256);            //Integer values will be generated uniformly at random between 16 and 256 (inclusive)
MultiLayerSpace hyperparameterSpace = new MultiLayerSpace.Builder()
//These next few options: fixed values for all models
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.iterations(1)
.regularization(true)
.l2(0.0001)
//Learning rate: this is something we want to test different values for
.learningRate(learningRateHyperparam)
.addLayer( new DenseLayerSpace.Builder()
//Fixed values for this layer:
.nIn(784)  //Fixed input: 28x28=784 pixels for MNIST
.activation(""relu"")
//One hyperparameter to infer: layer size
.nOut(layerSizeHyperparam)
.build())
.addLayer( new OutputLayerSpace.Builder()
//nIn: set the same hyperparemeter as the nOut for the last layer.
.nIn(layerSizeHyperparam)
//The remaining hyperparameters: fixed for the output layer
.nOut(10)
.activation(""softmax"")
.lossFunction(LossFunctions.LossFunction.MCXENT)
.build())
.pretrain(false).backprop(true).build();

结果和分析

在以下表格中给出了评估四个网络在测试数据上性能的结果:

 MLPConvNetVAEDBN
准确率0.98070.98930.97430.7506
精度0.98060.98930.97420.7498
召回率0.98050.98910.97410.7454
F1 分数0.98060.98920.97410.7476

实验的目标不是在每个神经网络结构中匹配基准结果,而是向读者提供一个综合的架构实现,并在代码中提供详细的参数供他们探索。

在深度学习网络中调整超参数是一项相当大的挑战,尽管 Arbiter 和在线资源如 gitter(gitter.im/deeplearning4j/deeplearning4j)有助于 DL4J,但与包括 SVM 在内的其他分类技术相比,超参数搜索的时间和成本相当高。

MNIST 数据集上的基准结果和相应的论文在此处可用:

从基准测试结果来看,线性 1 层神经网络(NN)的错误率为 12%,增加更多层可以将其降低到大约 2%。这表明了数据的非线性性质以及需要复杂算法来拟合模式的需求。

与基准测试中神经网络的最佳结果相比,其错误率从 2.5%到 1.6%,我们的结果与 2%的错误率非常相似。

大多数基准测试结果都显示卷积网络架构的错误率在 1.1%到 0.5%之间,我们的超参数搜索已经将那些模型中的最佳模型与错误率略低于 1.1%相匹配。

我们对深度信念网络(DBN)的结果远远低于基准测试,仅为 25%多。没有理由怀疑进一步的调整不能提高性能,将其提升到 3-5%的范围内。

摘要

深度学习的历史与早期在机器学习和人工智能中使用神经网络尝试的局限性紧密相连,以及这些局限性是如何通过新技术、技术改进和大量数据的可用性而被克服的。

感知器是基本的人工神经网络。多层网络用于监督学习,通过连接几个隐藏层的神经元来传播激活,并使用反向传播来减少训练误差。常用的激活函数包括 sigmoid 和 tanh 函数。

神经网络的问题包括梯度消失或爆炸、训练缓慢和陷入局部最小值陷阱。

深度学习通过几种有效的技术成功地解决了这些问题,这些技术可以用于无监督学习以及监督学习。

深度学习网络的基本构建块包括受限玻尔兹曼机(RBM)、自编码器和去噪自编码器。RBM 是两层无向网络,能够从其输入中提取高级特征。对比散度用于加速训练。自编码器也是用于无监督学习的深度学习网络,它们通过首先在编码层中编码学习到的特征,然后通过一组解码层重建输入来尝试复制输入。去噪自编码器解决了自编码器的一些局限性,有时会导致它们简单地学习恒等函数。

深度学习网络通常以无监督的方式预训练,然后通过监督微调来调整其参数。在预训练阶段使用堆叠的 RBM 或自编码器,而在分类的情况下,微调通常通过输出层的 softmax 激活来完成。

深度自编码器擅长学习数据中的复杂潜在结构,并通过使用自编码器构建块进行预训练和微调在无监督学习中使用。深度信念网络(DBN)是生成模型,可用于创建更多样本。它使用一个带有顶部无向 RBM 层的有向贝叶斯网络构建。通过使用带有随机“关闭”一些网络节点的 dropout 进行学习,可以解决深度学习网络中的过拟合问题。

卷积神经网络(CNN)在计算机视觉中有许多应用。CNN 可以学习数据中的模式,这些模式对数据的平移不变性和线性缩放具有鲁棒性。它们使用卷积滤波器和池化层来降低数据的维度,并在分类任务中实现非常有效的结果。一个涉及数字图像分类的用例被提出。

当数据以序列形式到达且数据之间存在时间关系时,使用循环神经网络(RNN)进行建模。RNN 使用来自先前层的反馈并持续输出。在 RNN 中,梯度消失和梯度爆炸的问题会再次出现,并通过修改架构的几种方法来解决,例如长短期记忆(LSTM)和门控循环网络(GRU)。

在本章的案例研究中,我们展示了使用各种深度学习网络从 MNIST 手写数字图像数据集中学习的实验。展示了使用 MLP、ConvNet、变分自编码器和堆叠 RBM 的结果。

我们认为,深度神经网络能够逼近底层数据所基于的关键结构的显著和代表性子集。此外,数据的层次结构可以通过不同的隐藏层轻松捕获。最后,图像的旋转、平移和尺度的不变性是深度神经网络性能的最后关键要素。这种不变性使我们能够减少神经网络需要捕获的可能状态的数量(参考文献 [19])。

参考文献

  1. Behnke, S. (2001). 在神经抽象金字塔中学习迭代图像重建。国际计算智能与应用杂志,1(4),427–438。

  2. Behnke, S. (2002). 使用分层循环神经网络进行人脸定位。载于第 12 届国际人工神经网络会议论文集(第 1319–1324 页)。

  3. Behnke, S. (2003). 使用卷积非负矩阵分解发现层次语音特征。载于国际神经网络联合会议论文集,第 4 卷(第 2758–2763 页)。

  4. Behnke, S. (2003). LNCS,计算机科学讲义:第 2766 卷。用于图像解释的层次神经网络。Springer。Behnke, S. (2005). 神经抽象金字塔中的人脸定位和跟踪。神经计算与应用,14(2),97–103。

  5. Casey, M. P. (1996). 离散时间计算的动力学,及其在循环神经网络和有限状态机提取中的应用。神经计算杂志,第 8 卷,第 6 期,第 1135–1178 页。

  6. Rumelhart, D. E., Hinton, G. E., 和 Williams, R. J. (1986). 通过误差传播学习内部表示。在 Rumelhart, D. E. 和 McClelland, J. L. 编著的《并行分布式处理》第 1 卷,第 318–362 页。麻省理工学院出版社。

  7. Goller, C.; Küchler, A (1996). ""通过结构反向传播进行任务相关分布式表示的学习"". 神经网络,IEEE。doi:10.1109/ICNN.1996.548916

  8. Hochreiter, Sepp. 在学习循环神经网络时梯度消失问题及其解决方案。国际不确定性、模糊性和基于知识的系统杂志,第 6 卷,第 2 期,第 107–116 页,1998 年。

  9. G. E. Hinton, S. Osindero, 和 Y. The (2006). "深度信念网的快速学习算法," 神经计算杂志,第 18 卷,第 1527–1554 页。

  10. G. E. Hinton (2002). "通过最小化对比散度训练专家乘积," 神经计算杂志,第 14 卷,第 1771–1800 页。

  11. G. E. Hinton 和 R. R. Salakhutdinov (2006). "使用神经网络降低数据维度," 科学,第 313 卷,第 5786 号,第 504–507 页。

  12. Hinton, G. E., 和 Zemel, R. S. (1994). 自编码器、最小描述长度和亥姆霍兹自由能。神经信息处理系统进展,第 6 卷,第 3–10 页。

  13. Y. Bengio, P. Lamblin, D. Popovici, 和 H. Larochelle. (2007). "深度网络的贪婪层叠训练," 在《神经信息处理系统进展》第 19 卷(NIPS'06)第 153–160 页。

  14. H. Larochelle, D. Erhan, A. Courville, J. Bergstra, 和 Y. Bengio (2007). "在具有许多变化因素的问题上对深度架构的经验评估," 在第 24 届国际机器学习会议(ICML'07)论文集,第 473–480 页。

  15. P. Vincent, H. Larochelle, Y. Bengio, 和 P.-A. Manzagol (2008), "使用降噪自编码器提取和组合鲁棒特征," 在第 25 届国际机器学习会议(ICML'08)论文集,第 1096–1103 页。

  16. F.-J. Huang 和 Y. LeCun (2006). "使用 SVM 和卷积网进行通用对象分类的大规模学习," 在计算机视觉和模式识别会议(CVPR'06)论文集。

  17. F. A. Gers, N. N. Schraudolph, 和 J. Schmidhuber (2003). 使用 LSTM 循环网络学习精确的时间。机器学习研究杂志。

  18. Kyunghyun Cho 等人 (2014). 使用 RNN 编码器-解码器学习短语表示以进行统计机器翻译。arxiv.org/pdf/1406.1078.pdf

  19. brohrer.github.io/how_convolutional_neural_networks_work.html

  20. Henry W. Lin, Max Tegmark, David Rolnick (2016). 为什么深度学习和低成本学习工作得如此之好?arxiv.org/abs/1608.08225

  21. Mike Schuster 和 Kuldip K. Paliwal (1997). 双向循环神经网络,信号处理杂志。

  22. H Lee, A Battle, R Raina, AY Ng (2007). 高效稀疏编码算法,载于《神经信息处理系统进展》

  23. Bengio Y. (2009). 为人工智能学习深度架构,载于《机器学习基础与趋势》第 1 卷第 2 期,第 1-127 页。

第八章:文本挖掘与自然语言处理

自然语言处理(NLP)如今在各种应用中无处不在,如移动应用、电子商务网站、电子邮件、新闻网站等。检测电子邮件中的垃圾邮件、描述电子邮件、语音合成、分类新闻、搜索和推荐产品、对社交媒体品牌进行情感分析——这些都是 NLP 和挖掘文本信息的不同方面。

数字文本信息呈指数级增长——以网页、电子书、短信、各种格式的文档、电子邮件、社交媒体消息(如推文和 Facebook 帖子)等形式,现在达到泽字节(1 泽字节等于 1,018 字节)。历史上,最早依赖自动机和概率建模的基础性工作始于 20 世纪 50 年代。20 世纪 70 年代见证了诸如随机建模、马尔可夫建模和句法解析等变化,但在“人工智能寒冬”年份,它们的进展有限。20 世纪 90 年代见证了文本挖掘和统计革命的兴起,包括语料库统计、监督机器学习和文本数据的标注等思想。从 2000 年开始,随着计算和大数据的巨大进步,以及监督学习和无监督学习中复杂机器学习算法的引入,该领域重新引起了人们的兴趣,现在成为学术界和商业企业研发部门研究的热点话题之一。在本章中,我们将讨论 NLP 和文本挖掘在机器学习中的关键方面。

本章首先介绍了自然语言处理(NLP)中的关键领域,然后解释了使文档更适合机器学习(无论是监督学习还是无监督学习)的重要处理和转换步骤。接下来是主题建模、聚类和命名实体识别的概念,以及简要介绍了两个提供强大文本处理能力的 Java 工具包。本章的案例研究使用另一个广为人知的数据集,通过使用 KNIME 和 Mallet 工具进行实验,展示了这里描述的几种技术。

本章组织如下:

  • NLP,子领域和任务:

    • 文本分类

    • 词性标注

    • 文本聚类

    • 信息提取和命名实体识别

    • 情感分析

    • 共指消解

    • 词义消歧

    • 机器翻译

    • 语义推理和推断

    • 摘要

    • 问答

    • 数据挖掘和无结构数据的问题

  • 文本处理组件和转换:

    • 文档收集和标准化

    • 分词

    • 停用词去除

    • 词干提取/词元还原

    • 本地/全局字典

    • 特征提取/生成

    • 特征表示和相似性

    • 特征选择和降维

  • 文本挖掘主题:

    • 主题建模

    • 文本聚类

    • 命名实体识别

    • 深度学习和 NLP

  • 工具和用法:

    • Mallet

    • KNIME

  • 案例研究

NLP,子领域和任务

实际世界的信息以结构化数据的形式存在,通常由自动化过程生成,或者以非结构化数据的形式存在,在文本的情况下,它是由直接的人类活动以书面或口头语言的形式创造的。观察现实世界情况并使用自动化过程或让人类感知并将该信息转换为可理解数据的过程,在结构化和非结构化数据中都非常相似。将观察到的世界转化为非结构化数据涉及诸如文本的语言、存在的格式、不同观察者对同一数据的解释差异等复杂性。此外,所选语言的语法和语义的歧义、表达的微妙之处、数据中的上下文等,使得挖掘文本数据变得非常困难。

接下来,我们将讨论一些涉及 NLP 和文本挖掘的高级子领域和任务。NLP 的主题非常广泛,以下话题远非全面。

文本分类

这个领域是最为成熟的之一,其基本形式是将包含非结构化文本数据的文档分类到预定义的类别中。这可以被视为在非结构化文本世界中监督机器学习的直接扩展,通过学习历史文档来预测未来未见文档的类别。在电子邮件垃圾邮件检测或新闻分类中的一些基本方法,是这个任务最突出的应用之一。

文本分类

图 1:文本分类显示分类到不同的类别

词性标注(POS 标注)

在自然语言处理(NLP)中,另一个取得巨大成功的子任务是,根据上下文和与相邻词语的关系,将语言的词性(如名词、形容词、动词)与文本中的词语关联起来。如今,我们不再进行手动词性标注,而是由自动化且复杂的词性标注器来完成这项工作。

词性标注(POS 标注)

图 2:与文本片段关联的词性标注

文本聚类

文本聚类是将非结构化数据聚类以组织、检索和基于相似性的分组,这是文本聚类的子领域。这个领域也得到了很好的发展,不同聚类和适合学习的文本表示方法都有所进步。

文本聚类

图 3:将操作系统新闻文档聚类到各种操作系统特定集群

信息提取和命名实体识别

提取特定元素的任务,如时间、地点、组织、实体等,属于信息提取的范畴。命名实体识别是一个在多个领域有广泛应用子领域,从历史文件的评论到生物信息学中的基因和药物信息。

信息提取和命名实体识别

图 4:句子中的命名实体识别

情感分析和意见挖掘

在自然语言处理(NLP)领域的另一个子领域涉及推断观察者的情感,以便用可理解的指标对他们进行分类,或者提供他们对意见的见解。这个领域不如前面提到的某些领域先进,但在这个方向上正在进行大量研究。

情感分析和意见挖掘

图 5:情感分析显示句子的正面和负面情感

指代消解

理解文本中存在的多个实体的引用并消除歧义是自然语言处理(NLP)中另一个流行的领域。这被认为是进行更复杂任务(如问答和摘要)的垫脚石,这些内容将在后面讨论。

指代消解

图 6:指代消解显示代词如何被消歧

词义消歧

在像英语这样的语言中,由于同一个词可以根据上下文有多种含义,自动解析这一点是自然语言处理(NLP)的一个重要部分,也是词义消歧(WSD)的焦点。

词义消歧

图 7:展示如何使用上下文将单词“mouse”与正确的单词关联起来

机器翻译

将文本从一种语言翻译成另一种语言,或者在不同语言中将语音转换为文本,这在机器翻译(MT)领域得到了广泛的涵盖。这个领域在过去的几年里取得了显著的进步,机器学习算法在监督学习、无监督学习和半监督学习中的应用。使用 LSTM 等技术的深度学习已被证明是这个领域最有效的技术,并被 Google 广泛用于其翻译服务。

机器翻译

图 8:机器翻译显示英语到中文的转换

语义推理和推断

从非结构化文本中推理、推导逻辑和进行推断是自然语言处理(NLP)进步的下一个层次。

语义推理和推断

图 9:语义推断回答复杂问题

文本摘要

在自然语言处理(NLP)中,一个越来越受欢迎的子领域是将大型文档或文本段落自动总结成易于理解的小型代表性文本。这是 NLP 中一个新兴的研究领域。搜索引擎使用摘要、为专家提供的多文档摘要等,都是从这个领域受益的应用之一。

自动化问答

用自然语言回答人类提出的问题,这些问题从特定领域的具体问题到通用、开放式问题不等,是自然语言处理(NLP)领域另一个新兴的领域。

矿掘非结构化数据的问题

与基于计算机的程序相比,人类更容易阅读、解析和理解非结构化文本/文档。以下是为什么文本挖掘比一般的监督学习或无监督学习更复杂的一些原因:

  • 术语和短语的不确定性。单词“bank”有多个含义,人类读者可以根据上下文正确地将其关联起来,但这需要预处理步骤,如词性标注和词义消歧,正如我们所看到的。根据牛津高阶英汉双解大词典,单词“run”在动词形式下就有不少于 645 种不同的用法,我们可以看到这样的单词确实会在解决意图含义(例如,run、put、set 和 take 这些词之间有超过一千种含义)时带来问题。

  • 与文本相关的上下文和背景知识。考虑一个使用后缀“gate”来表示政治丑闻的新词,例如,“随着弹劾的呼声和民意调查的急剧下降,Russiagate 最终给他的总统生涯带来了致命一击”。人类读者可以通过联想,通过前缀与另一个美国政治历史上的重大丑闻“Watergate”的关联,推断出“Russiagate”所指的是什么,即回忆起高调阴谋的感觉。这对机器来说尤其难以理解。

  • 推理,即从文档中进行推断,是非常困难的,因为将非结构化信息映射到知识库本身就是一大障碍。

  • 执行监督学习的能力需要标记的训练文档,并且根据领域,对文档进行标记可能既耗时又昂贵。

文本处理组件和转换

在本节中,我们将讨论在大多数文本挖掘过程中执行的一些常见的预处理和转换步骤。一般概念是将文档转换为具有特征或属性的结构化数据集,这些特征或属性是大多数机器学习算法可以用来执行不同类型学习的基础。

我们将在下一节简要描述一些最常用的技术。文本挖掘的不同应用可能使用以下图中显示的组件的不同部分或变体:

文本处理组件和转换

图 10:文本处理组件和流程

文档收集和标准化

在大多数文本挖掘应用中的第一步通常是收集以文档形式存在的数据——在文本挖掘领域通常被称为语料库。这些文档可以与预定义的分类相关联,或者它可能只是一个未标记的语料库。这些文档可以是异构格式,或者为了下一阶段的分词过程而标准化为一种格式。拥有多种格式,如文本、HTML、DOCs、PDGs 等,可能会导致许多复杂性,因此大多数应用中通常首选一种格式,如 XML 或JavaScript 对象表示法JSON)。

输入和输出

输入是大量同质或异质来源的集合,输出是一组标准化为一种格式(如 XML)的文档集合。

它是如何工作的?

标准化涉及到确保工具和格式基于应用需求达成一致:

  1. 就标准格式达成一致,如 XML,其中预定义的标签提供了关于文档元属性(如<author><title><date>等)和实际内容(如<document>)的信息。

  2. 大多数文档处理器都可以转换为 XML,或者可以编写转换代码来执行此操作。

分词

分词的任务是从包含这些单词的文本流中提取单词或有意义的字符。例如,文本The boy stood up. He then ran after the dog可以被分词成标记,如*{the, boy, stood, up, he, ran, after, the, dog}*。

输入和输出

输入是一组如上一节所述的已知格式的文档,输出是包含所需单词或字符标记的文档。

它是如何工作的?

任何自动化的分词系统都必须解决它预期处理的语言(们)所提出的特定挑战:

  • 在像英语这样的语言中,由于存在空白、制表符和换行符来分隔单词,分词相对简单。

  • 每种语言都有不同的挑战——即使在英语中,像*Dr.*这样的缩写、代数字符(B12)、不同的命名方案(O'Reilly)等,也必须适当地分词。

  • 编写特定于语言的规则,以 if-then 指令的形式从文档中提取标记。

停用词移除

这涉及到移除没有区分性或预测价值的常用词。如果每个词都可以被视为一个特征,这个过程就会通过显著减少特征向量的维度来降低特征数量。介词、冠词和代词是形成停用词的一些例子,这些停用词被移除,而不会影响许多应用中文本挖掘的性能。

输入和输出

输入是一组已提取标记的文档,输出是一组通过移除停用词来减少标记的文档。

它是如何工作的?

在过去几年中,已经发展出各种技术,从手动预编译的列表到基于术语或互信息的统计消除。

  • 对于许多语言来说,最常用的技术是手动预编译的停用词列表,包括介词(in、for、on)、冠词(a、an、the)、代词(his、her、they、their)等等。

  • 许多工具使用 Zipf 定律(参考文献 [3]),其中移除了高频词、单音节词和独特术语。Luhn 的早期工作(参考文献 [4]),如图 11 所示,显示了单词频率的上限和下限阈值,这些阈值为我们提供了可用于建模的显著单词:如何工作?

    图 11:单词频率分布,显示了在语料库中频繁使用、显著和罕见单词的存在

词干提取或词形还原

将相似单词的标记归一化为一个的想法被称为词干提取或词形还原。因此,将文档中所有"talking"、"talks"、"talked"等出现归一化到一个根词"talk"的例子就是词干提取。

输入和输出

输入是带有标记的文档,输出是带有减少标记并归一化到其词干或根词的文档。

它是如何工作的?

  1. 基本上有两种词干提取类型:变化词干提取和根词提取。

  2. 变化词干提取通常涉及去除词缀,使动词时态正常化并去除复数形式。因此,英语中的"ships"变为"ship","is"、"are"和"am"变为"be"。

  3. 将词干提取到根词通常比变化词干提取更为激进,后者将单词归一化到其根词。这种例子是"applications"、"applied"、"reapply"等等,都减少到根词"apply"。

  4. Lovin 的词干提取算法是第一批词干提取算法之一(参考文献 [1])。Porter 的词干提取,在 20 世纪 80 年代发展起来,有 60 条规则分 6 步进行,仍然是应用最广泛的词干提取形式(参考文献 [2])。

  5. 当前的应用推动了基于词干提取的广泛统计技术,包括使用 n-gram(给定文本序列中 n 个连续项的连续序列,可以是字母或单词)、隐马尔可夫模型HMM)和上下文敏感词干提取。

局部/全局字典或词汇表?

一旦执行了将文档转换为标记的预处理任务,下一步就是创建一个语料库或词汇表,作为一个单一的字典,使用所有文档中的所有标记。或者,根据类别创建几个字典,使用较少文档中的特定标记。

在主题建模和文本分类的许多应用中,当按主题/类别创建字典时,即所谓的本地字典,表现良好。另一方面,在文档聚类和信息提取的许多应用中,当从所有文档标记中创建一个单一的全局字典时,表现良好。创建一个或多个特定字典的选择取决于核心 NLP 任务,以及计算和存储需求。

特征提取/生成

将包含非结构化文本的文档(s)转换为具有结构化特征的集合的关键步骤是将它们转换为类似于我们在迄今为止的机器学习数据集中所看到的结构化特征集合。从文本中提取特征以便在机器学习任务中使用,如监督学习、无监督学习和半监督学习,这取决于许多因素,例如应用目标、特定领域的需求以及可行性。可以从任何文档中提取各种特征,例如单词、短语、句子、词性标注的单词、排版元素等。我们将给出在不同的机器学习应用中常用的一系列特征。

词汇特征

词汇特征是文本挖掘应用中最常用的特征。词汇特征是下一级特征的基础。它们是构建在未尝试捕获关于意图或与文本相关的各种含义的信息的简单字符或单词级别的特征。词汇特征可以进一步细分为基于字符的特征、基于单词的特征、词性特征和分类法,例如。在下一节中,我们将更详细地描述其中的一些。

基于字符的特征

单个字符(单语元)或字符序列(n-gram)是从文本文档中可以构建的最简单形式的特征。字符包或单语元字符没有位置信息,而高阶 n-gram 捕获了一定程度的内容和位置信息。这些特征可以用不同的方式编码或赋予数值,例如二进制 0/1 值或计数,如下一节中所述。

让我们以难忘的苏斯博士的韵文作为文本内容——“the Cat in the Hat steps onto the mat”。虽然字符袋(1-gram 或单词特征)将生成唯一的字符{"t","h", "e", "c","a","i","n","s","p","o","n","m"}作为特征,但 3-gram 特征为{"\sCa" ,"\sHa", "\sin" , "\sma", "\son", "\sst", "\sth", "Cat", "Hat", "at\s", "e\sC", "e\sH", "e\sm", "eps", "he\s", "in\s ", "mat", "n\st", "nto", "o\st", "ont", "ps\s", "s\so" , "ste"," t\si"," t\ss" , "tep", "the", "to\s "}。正如所见,随着“n”的增加,特征的数量呈指数增长,很快变得难以控制。n-gram 的优势在于,在增加总特征数量的同时,组装的特征往往似乎捕捉到了比单个字符本身更有趣的字符组合。

基于单词的特征

与从字符生成特征不同,特征也可以以单词和 n-gram 的方式从单词中构建。这些是最流行的特征生成技术。单词或 1-gram 标记也被称为词袋模型。因此,当“the Cat in the Hat steps onto the mat”作为单词特征考虑时,其例子为{"the", "Cat", "in", "Hat", "steps", "onto", "mat"}。同样,同一文本上的二元特征将产生{"the Cat", "Cat in", "in the", "the Hat", "Hat step", "steps onto", "onto the", "the mat"}。与基于字符的特征类似,通过在 n-gram 中增加到更高的“n”,特征的数量增加,但捕捉单词意义的能力也随之增强。

词性标注特征

输入是包含单词的文本,输出是每个单词都与语法标签关联的文本。在许多应用中,词性提供了上下文,并在识别命名实体、短语、实体消歧等方面很有用。在“the Cat in the Hat steps onto the mat”的例子中,输出为{"the\Det", "Cat\Noun", "in\Prep", "the\Det", "Hat\Noun", "steps\Verb", "onto\Prep", "the\Det", "mat\Noun"}。在此过程中,通常使用基于语言规则的标记器或基于马尔可夫链的概率标记器。

分类学特征

从文本数据创建分类法并使用它来理解单词之间的关系在不同情境中也很有用。各种分类学特征,如上位词、下位词、成员、成员-of、部分、部分-of、反义词、同义词、首字母缩略词等,为搜索、检索和许多文本挖掘场景中的匹配提供了有益的词汇上下文。

语法特征

低于文本文档中的字符或单词的下一级特征是基于句法的特征。文本中句子的句法表示通常以句法树的形式出现。句法树捕获句子中使用的术语作为节点,节点之间的关系以链接的形式捕获。句法特征还可以捕获关于句子和使用的更复杂特征——例如聚合——这些特征可用于机器学习。它还可以捕获关于句法树的统计数据——例如句子是左重、右重或平衡——这些数据可用于理解不同内容或作者的签名。

两个句子在词汇分析中可能有相同的字符和单词,但它们的句法树或意图可能完全不同。将文本中的句子分解成不同的短语——名词短语NP)、介词短语PP)、动词短语(或动名词短语)VP)等——并捕获句子的短语结构树是这一处理任务的一部分。以下是我们示例句子的句法分析树:

(S (NP (NP the cat)
       (PP in
           (NP the hat)))
   (VP steps
       (PP onto
           (NP the mat))))

句法语言模型SLM)是确定术语序列的概率。语言模型特征用于机器翻译、拼写校正、语音翻译、摘要等应用,仅举几例。语言模型还可以在其计算中使用分析树和句法树。

链式法则用于计算句子中术语的联合概率:

句法特征

在示例 "the cat in the hat steps onto the mat" 中:

句法特征

通常,由于需要大量此类句子的示例,基于任何语料库使用计数来估计长句的概率是困难的。大多数语言模型在实际实现中采用马尔可夫独立假设和 n-gram(2-5 个单词)(参考文献 [8])。

语义特征

语义特征试图捕捉文本的“意义”,然后用于文本挖掘的不同应用。语义特征的最简单形式之一是对文档添加注释的过程。这些注释或元数据可以包含描述或捕捉文本或文档意图的附加信息。使用协作标记添加标签以捕获描述文本的关键字是常见的语义特征生成过程。

另一种语义特征生成形式是文本的本体表示过程。在知识库中可用的通用和领域特定本体捕获了对象之间不同的关系,并且具有众所周知的规范,例如语义网 2.0。这些本体特征有助于在文本挖掘中推导复杂的推理、摘要、分类和聚类任务。文本或文档中的术语可以映射到本体中的“概念”并存储在知识库中。这些本体中的概念具有语义属性,并以多种方式与其他概念相关联,例如泛化/特殊化、成员-of/是成员、关联等,仅举几例。这些概念或关系的属性或属性可以进一步用于搜索、检索甚至在预测建模中。许多语义特征使用词汇和句法过程作为语义过程的先导,并使用输出,如名词,将其映射到本体中的概念,例如。将概念添加到现有本体或用更多概念对其进行注释,使结构更适合学习。例如,在“the cat in the ..”这个句子中,“cat”具有诸如{age, eats, ...}等属性,并且有不同的关系,如{ "isA Mammal", "hasChild", "hasParent",等等}。

特征表示和相似性

在上一节中描述的词汇、句法和语义特征,通常具有完全不同的表示。同一特征类型的表示,即词汇、句法或语义,可以根据它们被用于的计算或挖掘任务而有所不同。在本节中,我们将描述最常用的基于词汇特征表示,即向量空间模型。

向量空间模型

向量空间模型VSM)是将非结构化文档转换为数值向量表示的一种转换,其中语料库中的术语形成向量的维度,我们使用某种数值方式将这些维度与值关联。

如在字典章节所述,语料库是由来自一个领域或一个局部子类别中所有文档的独特单词和短语组成的。这样一个字典的每个元素都是向量的维度。这些术语——可以是单个单词或短语,如 n-gram——形成维度,并且在一个给定的文本/文档中可以与它们相关联不同的值。目标是按反映整个语料库中术语(参考文献 [11])的相关性的方式捕获维度中的值。因此,每个文档或文件都表示为一个高维数值向量。由于术语的稀疏性,数值向量表示在数值空间中具有稀疏表示。接下来,我们将介绍一些将这些术语与值关联的知名方法。

二进制

这是最简单的将值关联到术语或维度的形式。在二进制形式中,语料库中的每个术语根据术语在文档中的出现与否被赋予 0 或 1 的值。例如,考虑以下三个文档:

  • 文档 1: "The Cat in the Hat steps onto the mat"

  • 文档 2: "The Cat sat on the Hat"

  • 文档 3: "The Cat loves to step on the mat"

在使用单语元或词袋模型,通过去除停用词{on, the, in, onto}和词干提取{love/loves, steps/step}进行预处理后,{cat, hat, step, mat, sat, love}是语料库的特征。现在每个文档都表示为一个二元向量空间模型,如下所示:

术语cathatstepmatsatlove
文档 1111100
文档 2110010
文档 3101101
术语频率(TF)

词频TF)中,正如其名所示,整个文档中术语的频率构成了特征的数值。基本假设是,术语的频率越高,该术语与文档的相关性就越大。术语的计数或归一化计数被用作每个术语列的值:

tf(t) = count(D, t)

下表给出了我们示例中三个文档的术语频率:

TF / 术语cathatstepmatsatlove
文档 1111100
文档 2110010
文档 3101101
逆文档频率(IDF)

逆文档频率IDF)有多种形式,但计算它的最常见方法是使用以下方法:

逆文档频率 (IDF)

这里,逆文档频率 (IDF) 逆文档频率 (IDF) IDF 主要青睐那些在文档中相对不常出现的术语。研究(参考文献 [7])中也提出了对 IDF 的一些基于经验动机的改进。

TF 对于我们示例语料库:

术语cathatstepmatsatlove
N/nj3/33/23/23/23/13/1
IDF0.00.400.400.401.101.10
术语频率-逆文档频率(TF-IDF)

将术语频率和逆文档频率结合在一个指标中,我们得到术语频率-逆文档频率值。其思想是重视那些在语料库中相对不常见(高 IDF),但对于文档来说相对相关(高 TF)的术语。TF-IDF 是许多文本挖掘过程中最常见的值关联形式:

术语频率-逆文档频率 (TF-IDF)

这为我们提供了每个文档中所有术语的 TF-IDF 值:

TF-IDF/术语cathatstepmatsatlove
文档 10.00.400.400.401.101.10
文档 20.00.400.00.01.100.0
文档 30.00.00.400.400.01.10

相似度度量

监督学习、无监督学习和半监督学习中的许多技术在其底层算法中使用“相似度”度量来寻找相似模式或分离不同模式。相似度度量与数据的表示紧密相关。在文档的 VSM 表示中,向量是高维且稀疏的。这在分类、聚类或信息检索的大多数传统相似度度量中提出了一个严重问题。基于角度的相似度度量,如余弦距离或 Jaccard 系数,在实践中更常被使用。考虑由 t[1] 和 t[2] 表示的两个向量,它们对应于两个文本文档。

欧几里得距离

这是文档特征空间中的 L2 范数:

欧几里得距离

余弦距离

这种基于角度的相似度度量仅考虑向量之间的方向,而不考虑它们的长度。它等于向量之间角度的余弦值。由于向量空间模型是一个正空间,余弦距离从 0(正交,没有共同项)变化到 1(所有项都是两个文档共有的,但不一定是相同的词频):

余弦距离

成对自适应相似度

这种度量通过仅考虑两个文档中最重要的特征来在降维特征空间中测量距离:

成对自适应相似度

这里,t[i,k] 是由 t[i] (i = 1, 2) 的特征子集形成的向量,包含 t[1] 和 t[2] 中出现的 K 个最大特征的并集。

扩展 Jaccard 系数

这种度量是文档之间共享项与项的并集之比:

扩展 Jaccard 系数

Dice 系数

Dice 系数由以下公式给出:

Dice 系数

特征选择和降维

目标与第二章 实际应用中的监督学习 和第三章 无监督机器学习技术 中的目标相同。随着文本挖掘和高维特征的出现,维度诅咒问题变得更加明显。

特征选择

大多数特征选择技术是监督技术,依赖于标签或结果来评分特征。在大多数情况下,我们执行基于过滤器的特征选择而不是基于包装器的特征选择,因为性能成本较低。即使在基于过滤器的方 法中,一些方法,如第二章中描述的涉及多元技术的方法,如基于相关性的特征选择(CFS),也可能因为高维性而成本高昂或导致次优性能(参考文献 [9])。

信息论技术

如第二章所示,实际应用中的监督学习方法,在预处理和特征提取完成后,基于过滤器的单变量特征选择方法,如信息增益(IG)和增益比率(GR),是最常用的。

在他们的研究中,Yang 和 Pederson(参考文献 [10])清楚地展示了使用 IG 进行特征选择和降低,可以移除近 98%的术语,同时提高分类器的预测能力。

许多基于信息论或熵的方法具有更强的边际概率影响。当术语具有相等的条件概率 P(t|class)时,这可能会成为一个问题,即较不常见的术语可能比常见术语有更好的得分。

基于统计的技术

卡方特征选择是文本挖掘中用于特征选择的最常见的基于统计的技术之一。卡方统计量,如第二章所示,实际应用中的监督学习方法,给出了文本中的标记与类别之间的独立性关系。

已有研究表明,当存在低频项时,特征选择的卡方统计量可能并不有效(参考文献 [19])。

基于频率的技术

使用特征表示部分中描述的词频或文档频率,可以手动设置一个阈值,并且只允许高于或低于一定阈值的术语用于分类或聚类任务中的建模。请注意,词频(TF)和文档频率(DF)方法倾向于常见词汇,而一些基于信息论或统计的方法则倾向于不常见词汇。特征选择的选择取决于领域、特定预测学习的应用,以及更重要的是,使用这些特征的模型如何评估,尤其是在未见数据集上的评估。

维度降低

在第三章中,我们看到了另一种方法,即使用无监督技术通过某种形式的转换来减少特征,以决定其有用性。

主成分分析PCA)从文档-词矩阵计算协方差或相关矩阵。它将数据转换成输入中术语的线性组合,使得转换后的特征或术语组合具有比输入术语更高的区分能力。PCA 在转换特征上使用截止值或阈值,如第三章中所示(ch03.html "第三章。无监督机器学习技术"),可以显著降低维度,甚至提高或与高维输入空间具有可比的性能。使用 PCA 的唯一问题是转换后的特征不可解释,对于理解哪些术语或组合产生更好的预测模型,这种技术在某些领域有限制。

潜在语义分析LSA)是另一种使用从词和文档构建的输入矩阵并将其转换为具有通过文档中使用的术语组合发现的潜在概念的低维度的方法(参考文献 [5])。以下图展示了使用奇异值分解SVD)方法对输入文档-词矩阵进行因式分解的过程:

维度缩减

图 12:输入文档-词向量的 SVD 分解和 LSA 文档向量以及 LSA 词向量

LSA 已被证明是一种非常有效的降低维度并提高模型预测性能的方法。LSA 的缺点是需要存储向量 U 和 V 以执行检索或查询。确定较低维度 k 是困难的,需要一些类似于第三章中讨论的 k-means 的启发式方法。

文本挖掘中的主题

正如我们在第一部分所看到的,文本挖掘和文本上的机器学习涵盖了广泛的主题。每个讨论的主题都有对主流算法的一些定制,或者在该领域已经开发出特定的算法来执行所需的任务。我们选择了四个广泛的主题,即文本分类、主题建模、文本聚类和命名实体识别,并将对每个主题进行一些详细的讨论。

文本分类/分类

文本分类问题在不同的应用中表现出来,例如文档过滤和组织、信息检索、意见和情感挖掘、电子邮件垃圾邮件过滤等。与第二章中讨论的分类问题类似,即《面向现实世界监督学习的实用方法》,其基本思想是在带有标签的训练数据上训练,并预测未见文档的标签。

如前文所述,预处理步骤有助于将非结构化的文档集合转换成以文档-词矩阵形式排列的已知数值或分类/二进制结构化数据。是否执行某些预处理步骤,例如词干提取或自定义停用词,取决于数据和应用程序。特征选择通常是基本的词汇特征,单词的 n-gram 作为术语,只有在某些情况下,我们才使用整个文本作为字符串,而不将其分解成术语或标记。对于文档-词结构化数据,通常使用二进制特征表示或基于频率的表示。一旦这种转换完成,我们就使用单变量分析,如信息增益或卡方检验,来选择得分高于一定阈值的判别特征。在许多应用中,也可以执行特征转换和降维,如 PCA 或 LSA。

一旦我们从前面的过程中得到结构化数据,选择分类器的范围就非常广泛。在研究和商业应用中,我们看到大多数常见的建模技术都被使用,包括线性(线性回归、逻辑回归等)、非线性(SVM、神经网络、KNN)、生成性(朴素贝叶斯、贝叶斯网络)、可解释性(决策树、规则)和基于集成(bagging、boosting、随机森林)的分类器。许多算法使用相似度或距离度量,其中余弦距离是最受欢迎的选择。在某些分类器中,如 SVM,文档的字符串表示可以直接使用,通过选择合适的字符串核和基于字符串的相似度度量来计算点积。

验证和评估方法与监督分类方法类似——将数据分为训练/验证/测试集,在训练数据上训练,在验证数据上调整算法的参数,并在保留或测试数据上估计模型的性能。

由于大多数文本分类涉及大量文档,且目标类别很少见,因此用于评估、调整或选择算法的指标通常是精确度、召回率和 F 分数,如下所示:

文本分类/分类文本分类/分类文本分类/分类

主题建模

主题是一个固定词汇表上的分布。主题建模可以定义为捕捉各种文档中不同核心思想或主题的能力。这有广泛的应用范围,例如文档摘要、理解情感、趋势、新闻等。以下图示展示了主题建模如何从语料库中识别用户指定的主题数量k,然后为每个文档分配比例,表示文档中每个主题出现的程度:

主题建模

图 13:文档的概率主题权重分配

文献中关于使用监督和无监督学习进行主题建模的技术有很多(参考文献 [13])。我们将讨论最常见的技术,即概率潜在语义索引PLSI)。

概率潜在语义分析(PLSA)

PLSA 的想法,类似于用于特征降维的 LSA,是通过发现共现术语之间的关联,并将文档视为这些概念的混合物来寻找语料库中隐藏的潜在概念。这是一种无监督技术,类似于降维,但其目的是用它来模拟文档中的主题或潜在概念的混合(参考文献 [12])。

如以下图所示,模型可能会将语料库中经常一起出现的术语与一个潜在概念关联起来,然后每个文档可以被认为在较小或较大的程度上表现出该主题:

概率潜在语义分析(PLSA)

图 14:棒球潜在概念图,捕捉文档与相关术语之间的关联

输入和输出

输入如下:

  • 按照一定格式和结构组织的文档集合。我们将给出以下符号:输入和输出

  • 需要建模或发现的主题数量k

输出如下:

  • 识别k个主题,T = {T[1], T[2],…T[k]}。

  • 对于每个文档,给定文档d[i]的主题覆盖范围可以表示为 = {p[i1], p[i2], …p[ik]},其中p[ij]是文档di 覆盖主题 T[j]的概率。

它是如何工作的?

PLSA 的实现通常遵循以下步骤:

  1. 基本预处理步骤,如之前所述,包括分词、去除停用词、词干提取、构建词汇表、特征提取(单词或 n-gram 等)以及特征选择(无监督技术),如有必要,则执行这些步骤。

  2. 该问题可以简化为估计文档中术语的分布,并给定分布,根据与主题对应的最大术语选择主题。

  3. 引入一个“潜在变量”z帮助我们选择一个术语是否属于一个主题。请注意,z不是“观察到的”,但我们假设它与从主题中选择术语有关。因此,给定文档t的术语t的概率可以用这个潜在变量表示:如何工作?

  4. 通过使用两组变量(?, p),方程可以写成:如何工作?

    在这里,p(t|z; ?)是术语中的潜在概念的概率,p(z|d; p)是文档特定混合中潜在概念的概率。

  5. 使用对数似然估计参数以最大化:如何工作?

  6. 由于这个方程涉及非凸优化,EM 算法通常用于迭代寻找参数,直到收敛或完成总迭代次数(参考文献 [6]):

    1. EM 算法的 E 步骤用于确定潜在概念的后验概率。文档 d 中术语 t 出现的概率可以用潜在概念 z 来解释:如何工作?

    2. EM 算法的 M 步骤使用从 E 步骤获得的价值,即 p(z|d, t),并进行参数估计:如何工作?

    3. 如何工作? = 术语t与概念z关联的频率:如何工作?

    4. 如何工作?= 文档d与概念z关联的频率。

优点和局限性

优点和局限性如下:

  • 尽管广泛使用,PLSA 也有一些缺点,这些缺点已被更近期的技术所克服。

  • 该算法的无监督性质及其通用适用性使其能够应用于各种类似的文本挖掘应用,例如聚类文档、关联作者/时间相关的主题等。

  • 使用 EM 算法的 PLSA,如前几章所述,面临“陷入局部最优”的问题,这与其他全局算法,如进化算法不同。

  • PLSA 算法只能在已知文档中执行主题识别,但不能进行任何预测建模。PLSA 已被推广,并被称为潜在狄利克雷分配LDA)以克服这一点(参考文献 [14])。

文本聚类

聚类的目标,如第三章中所述的“无监督机器学习技术”,是找到组内彼此相似的数据、文本或文档。非结构化数据的粒度可以从短语或句子、段落和文本段落到文档集合不等。文本聚类在许多领域都有应用,例如信息检索、摘要、主题建模和无监督情况下的文档分类,仅举几例。一旦通过预处理将非结构化文本数据转换为结构化数据,就可以使用传统的聚类技术。传统聚类技术的困难在于使用转换后的文档-术语矩阵表示获得的具有高维和稀疏性的数据集。许多传统的聚类算法仅适用于特征的数值。由于这种限制,不能使用术语的分类或二进制表示,通常使用 TF 或 TF-IDF 来表示文档-术语矩阵。

在本节中,我们将讨论聚类中的一些基本过程和技术。我们将从预处理和转换开始,然后讨论一些广泛使用的技术及其修改。

特征转换、选择和减少

本节中讨论的大多数预处理步骤通常用于获取文档中术语的单词或 n-gram 表示。降维技术,如 LSA,通常用于将特征转换为更小的潜在空间。

聚类技术

文本聚类的技术包括概率模型以及使用基于距离的方法,这些方法在我们学习结构化数据时是熟悉的。我们还将讨论非负矩阵分解NNMF)作为一种具有良好性能和可解释性的有效技术。

生成概率模型

在生成方法中,主题建模和文本聚类之间存在共性。如图所示,聚类将一个文档与单个聚类(通常)关联起来,而主题建模中每个文档可以在多个主题中具有覆盖概率。主题建模中的每个词可以由多个主题独立生成,而在聚类中,所有词都来自同一个聚类:

生成概率模型

图 15:文档到 K-聚类的独占映射

从数学上讲,这可以用两个主题 T = {T[1],T[2]}和两个聚类 c = {c[1],c[2]}来解释。

在聚类中,文档的可能性可以表示为:

生成概率模型

如果文档有 L 个术语,这可以进一步展开为:

生成概率模型

因此,一旦“假设”一个簇,所有单词都来自该簇。计算所有术语的乘积,然后对所有簇进行求和。

在主题建模中,文档的似然可以表示为:

生成概率模型

因此,每个术语 ti 可以独立地从主题中选择,因此求和是在内部进行的,而乘积是在外部进行的。

输入和输出

输入是:

  • 以以下符号表示的遵循一定格式和结构的文档集合:

    D = {d1, d2, … dn}

  • 需要建模或发现的簇数k

输出如下:

  • k个识别出的簇 c = {c[1], c[2], … c[k]}。

  • 对于每个文档,p(d[i])被映射到簇k中的一个。

如何工作?

这里是步骤:

  1. 基本预处理步骤,如之前所述,包括分词、去除停用词、词干提取、形成词汇表、术语的特征提取(单词或 n-gram 等),以及特征转换(LSA)甚至特征选择。令t为最终特征集中的术语;它们对应于词汇表或词汇如何工作?

  2. 与 PLSA 类似,我们引入一个“潜在变量”,z,帮助我们选择文档所属的簇是否落在z={1, 2, … k}的范围内,对应于簇。令*?参数为我们为每个潜在变量估计的参数,使得p(?[i])对应于簇z = i*的概率。

  3. 文档属于簇的概率由p(?[i])给出,并且从该簇生成的文档中的每个术语由p(t|?[i]*)*给出。似然方程可以写成:如何工作?

    注意,我们不是通过文档进行,而是用词汇表如何工作?中术语t出现的次数作为指数重新编写。

  4. 以与我们之前使用的方法类似的方式执行 EM 算法来估计参数,如下所示:

    1. EM 算法的 E 步用于推断文档生成的簇:如何工作?

    2. EM 算法的 M 步用于使用 E 步的结果重新估计参数,如下所示:

    如何工作?如何工作?

  5. 对于每个文档的最终概率估计可以使用最大似然估计或使用具有先验概率的贝叶斯算法,如下所示:如何工作?如何工作?

优点和局限性
  • 基于生成的模型与 LSA 和 PLSA 有类似的优点,我们为簇中的文档得到一个概率分数。通过应用领域知识或先验知识,使用簇的大小,可以对分配进行进一步的微调。

  • 与 EM 算法相关的缺点,即陷入局部最优和敏感于起始点,在这里仍然成立。

基于距离的文本聚类

大多数基于距离的聚类算法依赖于相似度或距离度量,用于确定实例在特征空间中的距离。通常在具有数值数据的数据集中,欧几里得距离或其变体工作得非常好。在文本挖掘中,即使在将非结构化文本转换为具有数值值的结构化特征项之后,也发现余弦和 Jaccard 相似度函数表现更佳。

通常,如第三章中讨论的聚合或层次聚类,无监督机器学习技术,用于根据相似性合并文档,如前所述。合并文档或组通常使用单链接、组平均链接和完全链接技术。聚合聚类还产生一个可用于信息检索和文档搜索的结构。

基于划分的聚类技术 k-means 和 k-medoids,伴随着一个合适的相似度或距离方法也被采用。k-means 的问题,如聚类技术讨论中所示,是对起始条件的敏感性,以及计算空间和时间。k-medoids 对稀疏数据结构敏感,并且也有计算空间和时间限制。

非负矩阵分解(NMF)

非负矩阵分解是另一种将大型数据-特征矩阵分解为两个非负矩阵的技术,这不仅执行降维,而且更容易检查。NMF 在文档聚类中获得了流行,现在已证明许多具有不同优化函数的 NMF 变体在聚类文本方面非常有效(参考文献 [15])。

输入和输出

输入为:

  • 按照给定符号的格式和结构组织的一组文档:

    D = {d[1], d[2], … d[n]}

  • 需要建模或发现的簇的数量为k

输出结果为:

  • 识别 k 个簇,c = {c[1],c[2],… c[k]},文档分配到簇中。
它是如何工作的?

NMF 的数学细节和解释如下:

  1. NMF 背后的基本思想是使用低秩近似分解输入矩阵,如下所示:如何工作?

  2. 使用如下非线性优化函数:如何工作?

    在 W 或 H 中是凸的,但不是两者都是,因此无法保证全局最小值。各种使用约束最小二乘法(如均方误差和梯度下降)的算法被用来解决优化函数。

  3. NMF 的解释,特别是在基于术语理解潜在主题方面,使其非常有用。术语和文档的输入 A[m x n],可以用低秩近似表示为 W[m x k] H[k x n] 矩阵,其中 W[m x k] 是术语-主题表示,其列是 NMF 基向量。W 的第 1 列的非零元素,由 W[1] 给出,对应于特定的术语。因此,w[ij] 可以解释为关于术语 j 的基向量 W[i]。H[i1] 可以解释为文档 1 给定的文档对主题向量 W[i] 方向的亲和力。

  4. 从论文(参考文献 [18])中清楚地展示了为医学摘要(称为 Medlars 数据集)获得的基向量,这些基向量具有高度的解释性。这些基向量中最权重的术语直接对应于概念,例如,W[1] 对应于与“心脏”相关的主题,而 W[5] 与“发育障碍”相关。如何工作?

    图 16:来自 Langville 等人(2006)的展示,用于解释医疗数据集的一些基向量。

优点和局限性

NMF 已被证明在信息检索和查询方面与顶级算法(如 LSI)几乎性能相当:

  • 与使用 SVD 的 LSA 或 LSI 相比,NMF 在可扩展性、计算和存储方面表现更好。

  • NMF 存在一个问题,即优化不是全局的,并且会陷入局部最小值。

  • NMF 因素的产生取决于优化算法和选择的参数,并且不是唯一的。

文本聚类的评估

在标记数据集的情况下,第三章 中讨论的所有外部度量,如 F 度量和 Rand 指数,对于评估聚类技术是有用的。当数据集没有标签时,可以采用一些描述为内部度量的技术,如 Davies–Bouldin 指数、R-Squared 和 Silhouette 指数。

一般的良好实践是适应并确保在应用于文本挖掘数据时,如本节所述,文档之间的相似性用于测量簇的接近度、距离和分布。类似的使用取决于算法,并且与问题也有一定的相关性。在基于距离的划分算法中,可以使用均值向量或质心来计算文档的相似性。在层次算法中,可以使用组中最相似或最不相似的文档来计算相似性。

命名实体识别

命名实体识别NER)是文本挖掘中信息检索最重要的主题之一。许多复杂的挖掘任务,如关系的识别、事件的标注以及实体之间的相关性,都将 NER 作为初始组件或基本预处理步骤。

从历史上看,手动基于规则和正则表达式的技术被用于实体识别。这些手动规则依赖于基本的预处理,使用词性标注作为特征,以及手工设计的特征,如大写单词的存在、单词前的标点符号使用等。

基于统计学习的技巧现在更多地用于 NER 及其变体。NER 可以被映射到机器学习中的序列标注和预测问题。BIO 表示法,其中每个实体类型 T 有两个标签 B-T 和 I-T,分别对应于开始和中间,被标注,学习涉及在未见数据中找到模式和预测它。O 代表文本序列中的外部或不相关实体。实体类型 T 在基本形式上进一步被分类为人物、组织、数据和地点。

在本节中,我们将讨论两种最常用的算法:基于生成模型的隐马尔可夫模型和基于判别模型的最大熵模型。

虽然我们是在讨论命名实体识别的上下文中这些算法,但相同的算法和过程也可以用于其他 NLP 任务,如词性标注(POS Tagging),其中标签与一个序列相关联,而不是与 NER 类别相关联。

命名实体识别的隐马尔可夫模型

隐马尔可夫模型,如第六章《概率图建模》中所述,是基于序列的生成模型,它假设存在一个生成序列的潜在分布。通过用正确的 NER 类别标注序列获得训练数据可以用来学习分布和参数,以便对于未见未来的序列,可以执行有效的预测。

输入和输出

训练数据由文本序列 x = {x[1], x[2], ... x[n]}组成,其中每个 xi 是文本序列中的一个词,每个词的标签作为 y = {y[1], y[2], ... y[n]}提供。算法生成一个模型,以便在测试未见数据时,可以生成新序列的标签。

如何工作?
  1. 在最简单的情况下,假设马尔可夫假设,即序列的隐藏状态和标签仅依赖于前一个状态。对带标签的单词序列的适应在以下图中展示:如何工作?

    图 17:隐马尔可夫链中 NER 对应的文本序列和标签

  2. 序列分类的 HMM 公式有助于在训练数据上估计最大化的联合概率:如何工作?

  3. 每个 y[i]被假定为基于 y[i–1]和 x[i]生成的。实体的第一个单词是在当前和前一个标签的条件下生成的,即 y[i]和 y[i–1]。如果实例已经是命名实体,则条件仅基于前一个实例,即 x[i–1]。像"visited"和"in"这样的外部单词被认为是"非名称类别"。

  4. 使用前向-后向算法的 HMM 公式可以用来确定从训练数据中学习到的参数的观察序列的概率。

优点和局限性

优点和局限性如下:

  • HMM 对于短序列很好,如图所示,只有一个单词或术语,并且假设独立性。对于具有较长实体范围的序列,结果将违反这些假设。

  • HMM 需要大量的训练数据来估计参数。

命名实体识别的最大熵马尔可夫模型

最大熵马尔可夫模型MEMM)是一种流行的命名实体识别(NER)技术,它利用马尔可夫链和最大熵模型的概念来学习和预测命名实体(参考[16]和[17])。

输入和输出

训练数据由文本序列 x={x1,x2,... xn}组成,其中每个 xi 是文本序列中的一个单词,每个单词的标签作为 y={y1,y2,... yn}可用。算法生成模型,以便在测试未见数据时,可以生成新序列的标签。

它是如何工作的?

以下说明了 MEMM 方法是如何用于学习命名实体的。

  1. MEMM 中的特征可以是单词特征或其他类型的特征,如"isWordCapitalized"等,这给它提供了一点更多的上下文,并且与仅基于单词的 HMM 相比,提高了性能。

  2. 接下来,让我们看看一种称为最大熵模型(MaxEnt 模型)的最大熵模型,它是一个指数概率模型,但也可以被视为多项式逻辑回归模型。在基本的 MaxEnt 模型中,给定特征{f[1],f[2]…f[N]}和类别 c[1],c[2]…c[C],使用从训练数据中得到的优化方法为每个类别学习这些特征的权重{w[c1],w[c2]…w[cN]},可以估计特定类别的概率如下:如何工作?

  3. 特征 fi 正式表示为 fi,这意味着对于类别 c 和观察 x 的特征 f[i]。在大多数 NER 模型中,fi 通常是二元的,值为 1/0。因此,它可以写成:如何工作?

    基于预测概率跨类最大似然可以用来选择单个类别:

    如何工作?

  4. 对于每个单词,我们使用当前单词、"附近"单词的特征以及附近单词的预测来创建一个联合概率模型。这也被称为局部学习,因为测试和分布的块是在与单词对应的局部特征周围学习的。

    从当前单词和最后预测中,我们可以从数学上看到如何创建一个判别模型:

    它是如何工作的?它是如何工作的?

    对于 k 个特征进行泛化:

    它是如何工作的?

  5. 因此,在 MEMM 中,我们计算状态的概率,即命名实体识别(NER)中的类别,尽管我们基于 y[i–1]给出的邻近单词的预测进行条件化,但通常我们可以使用更多特征,这就是相对于之前讨论的 HMM 模型的优势:它是如何工作的?它是如何工作的?

    图 18:带标签的文本序列和观察概率

  6. 维特比算法用于在 HMM 中对单词或解码/推理进行类别估计,即得到 p(y[i]|y[i–1], X[i])的估计

  7. 最后,使用状态变化的优化方法,MaxEnt 模型被用来估计权重,就像之前一样:它是如何工作的?

优点和局限性
  • MEMM 在使用特征方面具有更大的灵活性,这些特征不仅基于单词,甚至不是由人类设计的,这使得它更加丰富,并使其模型具有更强的预测能力。

  • MEMM 可以检测比 HMM 更大的跨度,具有比 HMM 更大的检测优势。

深度学习和 NLP

在过去几年中,深度学习和其在自然语言处理(NLP)各个领域的应用取得了巨大成功,被认为是当今技术的尖端。使用深度学习的主要优势在于一小部分工具和方法,这些工具和方法在广泛的 NLP 问题中都很有用。它通过自动学习来解决特征工程和精心创建的手动表示的基本问题,从而解决了需要大量语言专家处理广泛问题的问题,例如文本分类、情感分析、词性标注和机器翻译等。在本节中,我们将尝试涵盖深度学习和 NLP 领域的重要概念和研究。

在他的开创性论文中,Bengio 介绍了深度学习最重要的构建块之一,称为词嵌入或词向量(参考文献 [20])。词嵌入可以被定义为将单词映射到高维向量(通常基于应用,25 到 500 维)的参数化函数。

形式上,这可以写成深度学习和 NLP

例如,深度学习和 NLP深度学习和 NLP,等等。

一个神经网络(R),其输入是句子中的单词或句子的 n-gram,用于二分类,例如 n-gram 中单词序列是否有效,用于训练和学习WR

深度学习和 NLP

图 19:一个模块化神经网络学习 5-gram 单词进行有效-无效分类

例如:

  • R(W(cat),W(sat ),W(on),W(the),W(mat)) = 1(有效)

  • R(W(cat),W(sat),W(on),W(the),W(mat)) = 0 (无效)

训练这些句子或 n-gram 的想法不仅是为了学习短语的正确结构,也是为了学习WR的正确参数。单词嵌入也可以使用第三章中介绍的线性和非线性特征降维/可视化技术投影到低维空间,例如二维空间,这些技术人类可以轻松可视化。使用 t-SNE 等技术将单词嵌入在二维空间中的可视化揭示了基于语义意义单词的接近性以及该区域单词的聚类信息,如下所示图所示:

深度学习和 NLP

图 20:整个单词映射的小部分 t-SNE 表示。罗马数字和单词在左侧聚集在一起显示,而语义相近的单词在右侧聚集在一起。

进一步扩展这些概念,Collobert 和 Mikolov 都展示了学习单词嵌入的副作用在多种 NLP 任务中非常有用,例如相似短语学习(例如,W("the color is red") ? W("the color is yellow")),寻找同义词(例如,W("nailed") ? W("smashed")),类比映射(例如,W("man")?W("woman")然后 W("king")?W("queen")),甚至复杂的关联映射(例如,W("Paris")?W("France")然后 W("Tokyo")?W("Japan")) (参考文献 [21 和 22])。

将单词嵌入概念扩展到一种通用表示,帮助我们以(稍作扩展)的方式重用该表示来解决各种 NLP 问题,这是许多最近深度学习在 NLP 中取得成功的主要原因。Socher 在他的研究中将单词嵌入概念扩展到产生双语单词嵌入,即把来自两种不同语言的单词,如中文(普通话)和英语嵌入到一个共享空间中 (参考文献 [23])。通过独立学习两种语言的单词嵌入,然后将它们投影到同一个空间,他的工作为我们提供了关于跨语言单词相似性的有趣见解,这些见解可以扩展到机器翻译。Socher 还就使用 CNN 学习到的图像与单词嵌入投影到同一个空间进行了有趣的工作,以将单词与图像关联起来作为一个基本的分类问题 (参考文献 [24])。大约在同一时间,谷歌也在研究类似的概念,但规模更大,用于单词-图像匹配和学习 (参考文献 [26])。

将词嵌入概念扩展到具有组合器或关联模块,这些模块可以帮助组合所有组合的词语、词语-短语、短语-短语,以学习复杂句子,这是递归神经网络(Recursive Neural Networks)的理念。以下图示展示了如何使用递归神经网络学习复杂的关联 ((the cat)(sat(on (the mat))))。它还由于递归组合的能力而消除了神经网络中“固定”输入数量的限制:

深度学习和 NLP

图 21:递归神经网络展示了如何学习复杂短语。

递归神经网络在 NLP 任务中显示出巨大的潜力,例如情感分析,其中许多正面词语开头的单个负面词语会对句子产生整体负面的影响,如下图所示:

深度学习和 NLP

图 22:一个复杂的句子,展示了通过 RNN 连接的带有负面(红色圆圈)、正面(绿色圆圈)和中立(空,0)的词语,整体呈现负面情感。

现在通过编码器和解码器的构建块扩展递归神经网络的概念,以学习可逆的句子表示——即从输入句子中重建具有大致相同意义的原始句子(参考文献 [27])。这已成为神经机器翻译背后的核心主题。使用 RNN 的编码器-解码器框架建模对话也取得了巨大的突破(参考文献 [28])。

工具和用法

我们现在将讨论一些在 Java 中用于各种 NLP 和文本挖掘应用的最知名的工具和库。

Mallet

Mallet 是一个用 Java 编写的机器学习工具包,用于文本处理,附带几个自然语言处理库,包括一些用于文档分类、序列标记和主题建模的库,以及各种机器学习算法。它是开源的,在 CPL 下发布。Mallet 提供了一个广泛的 API(见以下截图),用于创建和配置“管道”序列以进行预处理、向量化、特征选择等,以及扩展分类和聚类算法的实现,以及一系列其他文本分析和机器学习功能。

MalletMallet

KNIME

KNIME 是一个具有 OpenGL 许可的开源分析平台,提供了一系列强大的工具,用于执行数据科学的各个方面。文本处理模块可以从 KNIME Labs 单独下载。KNIME 具有直观的拖放 UI,并提供从其工作流服务器下载的示例。

注意

KNIME: www.knime.org/

KNIME Labs: tech.knime.org/knime-text-processing

该平台包括一个节点仓库,其中包含所有必要的工具,可以方便地通过节点的嵌套组合您的流程,这些节点可以很容易地通过复制粘贴来重复使用。工作流程的执行很简单。调试错误可能需要一些习惯,因此我们的建议是使用文本挖掘示例,使用不同的数据集作为输入,并确保工作流程无错误执行。这是熟悉平台的最快方式。

使用 Mallet 进行主题建模

现在我们将展示如何使用 API 和 Java 代码实现主题建模,以向用户展示如何在 Java 中构建一个文本学习流程:

//create pipeline
ArrayList<Pipe> pipeList = new ArrayList<Pipe>();
  // Pipes: lowercase, tokenize, remove stopwords, map to features
pipeList.add( new CharSequenceLowercase() );
pipeList.add( new CharSequence2TokenSequence(Pattern.compile("\\p{L}[\\p{L}\\p{P}]+\\p{L}")) );
pipeList.add( new TokenSequenceRemoveStopwords(new File("stopReuters/en.txt"), "UTF-8", false, false, false) );
//add all 
pipeList.add( new TokenSequence2FeatureSequence() );
InstanceList instances = new InstanceList (new SerialPipes(pipeList));
//read the file
Reader fileReader = new InputStreamReader(new FileInputStream(new File(reutersFile)), "UTF-8");
instances.addThruPipe(new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
3, 2, 1)); // name fields, data, label

Mallet 中的 ParallelTopicModel 具有一个 API,包含如主题数量、alpha 和 beta 等参数,这些参数控制着使用 Dirichlet 分布调整 LDA 的底层参数。并行化得到了很好的支持,正如系统中可用的线程数量增加所显示的那样:

ParallelTopicModel model = new ParallelTopicModel(10, 1.0, 0.01);//10 topics using LDA method
model.addInstances(instances);//add instances
model.setNumThreads(3);//parallelize with threading
model.setNumIterations(1000);//gibbs sampling iterations
model.estimate();//perform estimation of probability

主题和术语关联如下截图所示,是运行 Mallet 中的 ParallelTopicModel 的结果。很明显,在许多情况下,如 exec、acq、wheat、crude、corn 和 earning 等类别,顶级术语和主题的关联都得到了很好的发现:

使用 Mallet 进行主题建模

商业问题

Reuters 语料库将每个文档标记为 10 个类别之一。本案例研究的实验目的是利用本章学到的文本处理技术,通过向量空间模型为这些文档提供结构。这是以三种不同的方式完成的,并且使用了四种分类算法来训练和预测在每个案例中转换后的数据集。开源 Java 分析平台 KNIME 用于文本处理和学习。

机器学习映射

在无结构数据的学习技术中,例如文本或图像,给定带有标签的训练集将数据分类到不同的类别是一个监督学习问题。然而,由于数据是无结构的,一些统计或信息论方法对于从数据中提取可学习特征是必要的。在本研究的构思中,我们在使用线性、非线性以及集成方法进行分类之前,对文档进行了特征表示和选择。

数据收集

实验中使用的数据集是来自 UCI 机器学习仓库的 Reuters-21578 Distribution 1.0 文本分类数据集的一个版本:

注意

Reuters-21578 数据集:archive.ics.uci.edu/ml/datasets/Reuters-21578+Text+Categorization+Collection

该数据集是一个包含 9,981 个文档的 Modified-Apte 分割,每个文档都有一个类别标签,指示文档的类别。数据集中有 10 个不同的类别。

数据采样和转换

在导入数据文件后,我们进行了一系列预处理步骤,以便在训练任何模型之前丰富和转换数据。这些步骤可以在 KNIME 创建的工作流程快照中看到。它们包括:

  • 标点符号擦除

  • N 字符过滤(移除长度小于四个字符的标记)

  • 数字过滤

  • 案例转换 - 将所有内容转换为小写

  • 停用词过滤

  • 词干提取

在学习步骤之前,我们将数据随机分为 70-30 的比例进行训练和测试。每个实验中使用了五折交叉验证。

数据采样和转换

上述截图显示了第一个实验集的工作流程,它使用特征的二进制向量。数据导入后,一系列预处理节点随后,数据集被转换为文档向量。在添加回目标向量后,工作流程分支为四个分类任务,每个任务使用五折交叉验证设置。结果在评分节点中汇总。

特征分析和降维

我们总共进行了三组实验。在第一组中,预处理后,我们使用了术语的二进制向量化,这添加了一个表示术语是否出现在文档中的表示:

特征分析和降维

在第二次实验中,我们使用了每个术语的相对词频TF)值,结果在 0 到 1 之间。

特征分析和降维

在第三组中,我们通过过滤掉相对 TF 分数小于 0.01 的术语来进行特征选择。

模型、结果和评估

对于这三组实验中的每一组,我们使用了两种线性分类器(朴素贝叶斯和线性核的 SVM)以及两种非线性分类器(决策树和以朴素贝叶斯为基础学习器的 AdaBoost)。在文本挖掘分类中,通常选择精确率/召回率指标作为评估指标,而不是准确率,后者在传统的、平衡的分类问题中更为常见。

三组实验的结果在表中给出。分数是所有类别的平均值:

二进制术语向量:

分类器召回率精确率灵敏度特异性F 度量准确率科亨κappa 系数
基于朴素贝叶斯0.50790.52810.50790.96340.50870.70630.6122
决策树0.49890.50420.49890.95180.50130.7427(2)0.6637(2)
AdaBoost(NB)0.5118(2)0.5444(2)0.5118(2)0.9665(2)0.5219(2)0.72850.6425
LibSVM0.6032(1)0.5633(1)0.6032(1)0.9808(1)0.5768(1)0.8290(1)0.7766(1)

相对 TF 向量:

分类器召回率精确率灵敏度特异性F 度量准确率科亨κappa 系数
朴素贝叶斯0.48530.5480(2)0.48530.96410.5113(2)0.72480.6292
决策树0.4947(2)0.49540.4947(2)0.9703(2)0.49500.7403(2)0.6612(2)
AdaBoost(NB)0.46680.53260.46680.96690.48420.69630.6125
LibSVM0.6559(1)0.6651(1)0.6559(1)0.9824(1)0.6224(1)0.8433(1)0.7962(1)

相对 TF 向量与阈值过滤(rel TF > 0.01):

分类器召回率精确率敏感性特异性F 度量准确率科亨κ系数
朴素贝叶斯0.46890.5456(2)0.46890.96220.49880.71330.6117
决策树0.5008(2)0.50420.5008(2)0.9706(2)0.5022(2)0.7439(2)0.6657(2)
AdaBoost(NB)0.44350.49920.44350.96170.45980.68700.5874
LibSVM0.6438(1)0.6326(1)0.6438(1)0.9810(1)0.6118(1)0.8313(1)0.7806(1)

文本处理结果分析

在这里展示了从我们的 Reuters 数据集实验中获得的结果分析,并附带一些关键观察:

  • 如第一张表所示,使用项的二进制表示,朴素贝叶斯得分为约 0.7,这表明生成的特征具有良好的区分能力。在相同配置的朴素贝叶斯上进一步使用 AdaBoost 可以提升所有指标,如精确率、召回率、F1 度量以及准确率,大约提高 2%,这表明了提升和元学习的优势。

  • 如第一张表所示,非线性分类器,如决策树,在大多数指标上仅略优于线性朴素贝叶斯。使用线性分类器的 SVM 比线性朴素贝叶斯提高了 17%的准确率,并且在几乎所有指标上都有更好的表现。SVM 和核函数,在处理高维数据时没有问题,解决了文本分类的诅咒,因此是建模的较好算法之一,结果也证实了这一点。

  • 将表示从二进制转换为 TF(词频)改进了许多指标,如准确率,对于线性朴素贝叶斯(从 0.70 提高到 0.72)和 SVM(从 0.82 提高到 0.84)。这确实证实了基于 TF 的表示在许多基于数字的算法中,如 SVM。当底层分类器贝叶斯在性能上变得更强大时,如许多理论和实证结果所示,AdaBoost 与朴素贝叶斯在大多数指标上的性能会下降。

  • 最后,通过使用阈值 TF > 0.01 减少特征,正如这里所使用的,我们在大多数分类器中得到了几乎相似或略有降低的性能,这表明尽管某些术语似乎很少见,但它们具有区分能力,减少它们会产生负面影响。

摘要

数字世界中的大量信息是文本形式。文本挖掘和自然语言处理是关注从这种非结构化数据形式中提取信息的领域。该领域中的几个重要子领域现在是活跃的研究主题,对这些领域的理解对于数据科学家来说是必不可少的。

文本分类关注将文档分类到预先确定的类别中。文本可以通过标注单词(如词性标注)来丰富,以便为后续处理任务提供更多结构。聚类等无监督技术也可以应用于文档。信息提取和命名实体识别有助于识别信息丰富的具体内容,如地点、人名或组织名称等。摘要也是另一个重要应用,用于生成较大文档或文档集的简洁摘要。语言和语义的多种歧义,如上下文、词义和推理,使得自然语言处理(NLP)的任务具有挑战性。

文本内容的转换包括分词、停用词去除和词干提取,所有这些通过标准化内容来准备语料库,以便机器学习技术能够有效地应用。接下来,提取词汇、语义和句法特征,以便使用向量空间模型以更传统的方式用数值表示文档结构。然后可以应用相似性和距离度量来有效地比较文档的相似性。由于通常存在大量特征,降维是关键。本章描述了主题建模技术、PLSA 和文本聚类以及命名实体识别的技术细节。最后,介绍了在自然语言处理的各个领域中应用深度学习的最新技术。

Mallet 和 KNIME 是两种开源 Java 工具,它们提供了强大的自然语言处理和机器学习功能。案例研究考察了使用 KNIME 在 Reuters 语料库上不同分类器的性能。

参考文献

  1. J. B. Lovins (1968). 词干算法的开发, 机械翻译与计算机语言学, 第 11 卷,第 1/2 期,第 22-31 页。

  2. Porter M.F (1980). 后缀剥离算法, 程序; 14, 130-137。

  3. ZIPF, H.P. (1949). 人类行为与最小努力原则, 哈德逊出版社,马萨诸塞州剑桥。

  4. LUHN, H.P. (1958). 自动生成文献摘要, IBM 研究与发展杂志, 2, 159-165。

  5. Deerwester, S., Dumais, S., Furnas, G., & Landauer, T. (1990), 基于潜在语义分析的索引, 美国信息科学学会杂志, 41, 391–407。

  6. Dempster, A. P., Laird, N. M., & Rubin, D. B. (1977), 通过 EM 算法从不完全数据中估计最大似然. 英国皇家统计学会,系列 B,39(1),1–38。

  7. Greiff, W. R. (1998). 基于探索性数据分析的词权重理论. 在第 21 届国际 ACM SIGIR 信息检索研究与发展会议,纽约,纽约。ACM。

  8. P. F. Brown, P. V. deSouza, R. L. Mercer, V. J. Della Pietra, 和 J/ C. Lai (1992), 基于类别的自然语言 n-gram 模型, 计算语言学, 18, 4, 467-479.

  9. T. Liu, S. Lin, Z. Chen, W.-Y. Ma (2003),文本聚类特征选择的评估,ICML 会议。

  10. Y. Yang, J. O. Pederson (1995). 文本分类中特征选择的比较研究,ACM SIGIR 会议。

  11. Salton, G. & Buckley, C. (1998). 自动文本检索中的词频加权方法,《信息处理与管理》,24(5),513–523。

  12. Hofmann, T. (2001). 无监督学习通过概率潜在语义分析. 机器学习杂志,41(1),177–196。

  13. D. Blei, J. Lafferty (2006). 动态主题模型,ICML 会议。

  14. D. Blei, A. Ng, M. Jordan (2003). 潜在狄利克雷分配,机器学习研究杂志,3: pp. 993–1022。

  15. W. Xu, X. Liu, 和 Y. Gong (2003). 基于非负矩阵分解的文档聚类,SIGIR'03 会议论文,多伦多,加拿大,pp. 267-273。

  16. Dud´ik M. 和 Schapire (2006). R. E. 广义正则化下的最大熵分布估计,Lugosi, G. 和 Simon, H. (编),COLT,柏林,pp. 123–138,Springer-Verlag。

  17. McCallum, A., Freitag, D., 和 Pereira, F. C. N. (2000). 信息提取和分割的最大熵马尔可夫模型,ICML,pp. 591–598。

  18. Langville, A. N, Meyer, C. D., Albright, R. (2006). 非负因子分解的初始化,KDD,费城,美国。

  19. Dunning, T. (1993). 准确计算惊喜和巧合的统计方法,《计算语言学》,19,1,pp. 61-74。

  20. Y. Bengio, R. Ducharme, P. Vincent 和 C. Jauvin (2003). 神经概率语言模型,机器学习研究杂志。

  21. R. Collobert, J. Weston, L. Bottou, M. Karlen, K. Kavukcuoglu, 和 P. Kuksa. (2011). 从零开始的自然语言处理,机器学习研究杂志,12:2493–2537。

  22. T. Mikolov, K. Chen, G. Corrado 和 J. Dean (2013). 在向量空间中高效估计词表示,arXiv:1301.3781v1。

  23. R. Socher, Christopher Manning, 和 Andrew Ng. (2010). 使用递归神经网络学习连续短语表示和句法解析,NIPS 2010 深度学习和无监督特征学习研讨会。

  24. R. Socher, J. Pennington, E. H. Huang, A. Y. Ng, 和 C. D. Manning. (2011). 半监督递归自动编码器用于预测情感分布,EMNLP。

  25. M. Luong, R. Socher 和 C. Manning (2013). 使用递归神经网络为形态学获得更好的词表示,CONLL。

  26. A. Frome, G. S. Corrado, J. Shlens, S. Bengio, J. Dean, T. Mikolov, 等人 (2013). Devise:一种深度视觉-语义嵌入模型,NIPS 论文。

  27. Léon Bottou (2011). 从机器学习到机器推理。arxiv.org/pdf/1102.1808v3.pdf

  28. Cho, Kyunghyun, 等人 (2014). 使用 RNN 编码器-解码器学习短语表示以进行统计机器翻译,arXiv 预印本 arXiv:1406.1078。

第九章. 大数据机器学习 – 最终边疆

近年来,我们见证了人类和机器生成数据的指数级增长。包括家庭传感器、与医疗相关的监测设备、新闻源、社交媒体上的对话、图像和全球商业交易在内的各种来源——这是一个无休止的列表——每天都会产生大量数据。

2017 年 3 月,Facebook 有 12.8 亿每日活跃用户分享了近四百万条非结构化信息,包括文本、图像、URL、新闻和视频(来源:Facebook)。1.3 亿 Twitter 用户每天分享约 5 亿条推文(来源:Twitter)。物联网IoT)中的传感器,如灯光、恒温器、汽车中的传感器、手表、智能设备等,到 2020 年将从 500 亿增长到 2000 亿(来源:IDC 估计)。YouTube 用户每五分钟上传 300 小时的新视频内容。Netflix 有 3000 万观众每天流式传输 77,000 小时的视频。亚马逊销售了约 4.8 亿件产品,拥有约 2.44 亿客户。在金融领域,即使是单一大型机构产生的交易数据量也非常巨大——美国约有 2500 万户家庭将美国银行(一家主要金融机构)作为其主要银行,每年共同产生数百万兆字节的数据。总体而言,预计到 2017 年,全球大数据产业的价值将达到 430 亿美元(来源:www.statista.com)。

上述公司以及许多类似的公司都面临着存储所有这些数据(结构化和非结构化)、处理数据以及从数据中学习隐藏模式以增加收入和提高客户满意度的真实问题。我们将探讨当前的方法、工具和技术如何帮助我们在大数据规模环境中从数据中学习,以及作为该领域从业者,我们必须认识到这一特定问题空间所特有的挑战。

本章结构如下:

  • 大数据的特征是什么?

  • 大数据机器学习

    • 通用大数据框架:

      • 大数据集群部署框架

      • HortonWorks 数据平台 (HDP)

      • Cloudera CDH

      • Amazon Elastic MapReduce (EMR)

      • Microsoft HDInsight

    • 数据采集:

      • 发布-订阅框架

      • 源-汇框架

      • SQL 框架

      • 消息队列框架

      • 自定义框架

    • 数据存储:

      • Hadoop 分布式文件系统 (HDFS)

      • NoSQL

    • 数据处理和准备:

      • Hive 和 Hive 查询语言 (HQL)

      • Spark SQL

      • Amazon Redshift

      • 实时流处理

    • 机器学习

    • 可视化和分析

  • 批量大数据机器学习

    • H2O:

    • H2O 架构

      • H2O 中的机器学习

      • 工具和用法

      • 案例研究

      • 商业问题

      • 机器学习映射

      • 数据收集

      • 数据采样和转换

      • 实验、结果和分析

    • Spark MLlib:

      • Spark 架构

      • MLlib 中的机器学习

      • 工具和用法

      • 实验、结果和分析

  • 实时大数据机器学习

    • 可扩展的高级大规模在线分析(SAMOA):

      • SAMOA 架构

      • 机器学习算法

      • 工具和用法

      • 实验、结果和分析

      • 机器学习的未来

大数据的特征有哪些?

大数据有许多与普通数据不同的特征。在这里,我们将它们突出为四个“V”,以表征大数据。每个“V”都使得使用专门的工具、框架和算法进行数据采集、存储、处理和分析成为必要。

  • 体积:大数据的一个特征是内容的大小,无论是结构化还是非结构化,都不适合单台机器的存储容量或处理能力,因此需要多台机器。

  • 速度:大数据的另一个特征是内容生成的速率,这有助于增加数据量,但需要以时间敏感的方式处理。社交媒体内容和物联网传感器信息是高速大数据的最佳例子。

  • 多样性:这通常指的是数据存在的多种格式,即结构化、半结构化和非结构化,而且每种格式都有不同的形式。包含图像、视频、音频、文本以及关于活动、背景、网络等结构化信息的社交媒体内容是必须分析来自各种来源的数据的最佳例子。

  • 真实性:这涉及到数据中的各种因素,如噪声、不确定性、偏差和异常,必须加以解决,尤其是在数据量、速度和多样性的情况下。我们将讨论的一个关键步骤是处理和清理这些“不干净”的数据,正如我们将在大数据机器学习背景下讨论的那样。

许多人已经将价值、有效性和波动性等特征添加到前面的列表中,但我们认为它们在很大程度上是从前四个特征派生出来的。

大数据机器学习

在本节中,我们将讨论大数据机器学习所需的一般流程和组件。尽管许多组件,如数据采集或存储,与机器学习方法没有直接关系,但它们不可避免地对框架和流程产生影响。提供所有可用组件和工具的完整目录超出了本书的范围,但我们将讨论涉及任务的一般职责,并介绍一些可用于完成这些任务的技术和工具。

通用大数据框架

以下图示为通用大数据框架:

通用大数据框架

图 1:大数据框架

在集群中如何设置和部署大数据框架的选择是影响工具、技术和成本决策的因素之一。数据采集或收集组件是第一步,它包括多种同步和异步技术,用于将数据吸收到系统中。组件中提供了从发布-订阅、源-汇、关系型数据库查询和自定义数据连接器等各种技术。

根据各种其他功能需求,数据存储选择包括从分布式文件系统如 HDFS 到非关系型数据库(NoSQL)。NoSQL 数据库在数据存储部分进行了描述。

数据准备,即转换大量存储的数据,使其能够被机器学习分析所消费,是一个重要的处理步骤。这依赖于存储中使用的框架、技术和工具。它还依赖于下一步:选择将要使用的机器学习分析/框架。以下子节将讨论广泛的选择处理框架。

回想一下,在批量学习中,模型是在之前收集的多个示例上同时训练的。与批量学习相反,实时学习模型训练是连续的,每个到达的新实例都成为动态训练集的一部分。有关详细信息,请参阅第五章,实时流机器学习。一旦数据根据领域要求收集、存储和转换,就可以采用不同的机器学习方法,包括批量学习、实时学习和批量-实时混合学习。选择监督学习、无监督学习或两者的组合也取决于数据、标签的可用性和标签质量。这些将在本章后面详细讨论。

开发阶段以及生产或运行时阶段的分析结果也需要存储和可视化,以便于人类和自动化任务。

大数据集群部署框架

基于核心 Hadoop (参考资料 [3]) 开源平台构建了许多框架。每个框架都为之前描述的大数据组件提供了一系列工具。

Hortonworks 数据平台

Hortonworks 数据平台 (HDP) 提供了一个开源分布,包括其堆栈中的各种组件,从数据采集到可视化。Apache Ambari 通常是用于管理服务和提供集群配置和监控的用户界面。以下截图展示了用于配置各种服务和健康检查仪表板的 Ambari:

Hortonworks 数据平台

图 2:Ambari 仪表板用户界面

Cloudera CDH

与 HDP 类似,Cloudera CDH (参考文献[4]) 提供了类似的服务,Cloudera 服务管理器可以像 Ambari 一样用于集群管理和健康检查,如下面的截图所示:

Cloudera CDH

图 3:Cloudera 服务管理器用户界面

Amazon Elastic MapReduce

Amazon Elastic MapReduce (EMR) (参考文献[5]) 是另一个类似于 HDP 和 Cloudera 的大数据集群平台,它支持广泛的框架。EMR 有两种模式——集群模式步骤执行模式。在集群模式下,您可以选择 EMR 或 MapR 的大数据堆栈供应商,而在步骤执行模式下,您可以为执行提供从 JAR 文件到 SQL 查询的各种作业。以下截图显示了配置新集群以及定义新作业流的界面:

Amazon Elastic MapReduce

图 4:Amazon Elastic MapReduce 集群管理用户界面

Microsoft Azure HDInsight

Microsoft Azure HDInsight (参考文献[6]) 是另一个平台,它允许使用包括存储、处理和机器学习在内的大多数服务进行集群管理。如下面的截图所示,Azure 门户用于创建、管理和帮助学习集群各个组件的状态:

Microsoft Azure HDInsight

图 5:Microsoft Azure HDInsight 集群管理用户界面

数据采集

在大数据框架中,采集组件在从不同的源系统收集数据并将其存储在大数据存储中方面发挥着重要作用。根据源类型、数量、速度、功能以及性能要求,存在各种采集框架和工具。我们将描述一些最知名框架和工具,以给读者提供一些洞察。

发布-订阅框架

在基于发布-订阅的框架中,发布源将数据以不同格式推送到代理,该代理有不同的订阅者等待消费。发布者和订阅者彼此之间不知情,由代理在中间调解。

Apache Kafka (参考文献[9]) 和 Amazon Kinesis 是基于此模型的两个知名实现。Apache Kafka 定义了发布者、消费者和主题的概念——事物在此发布和消费,以及一个用于管理主题的代理。Amazon Kinesis 基于类似的概念,通过 Kinesis 流连接生产者和消费者,这些流类似于 Kafka 中的主题。

源-汇框架

在源-汇模型中,源将数据推入框架,框架将系统推送到汇。Apache Flume (参考文献[7]) 是此类框架的一个知名实现,具有各种源、用于缓冲数据的通道以及在大数据世界中存储数据的多个汇。

SQL 框架

由于许多传统数据存储以基于 SQL 的关系型数据库管理系统(RDBMS)的形式存在,基于 SQL 的框架提供了一种通用的方式来从 RDBMS 导入数据并将其存储在大数据中,主要是 HDFS 格式。Apache Sqoop(参考文献 [10])是一个知名的实现,可以从任何基于 JDBC 的 RDBMS 导入数据并将其存储在基于 HDFS 的系统。

消息队列框架

消息队列框架是基于推送-拉取的框架,类似于发布-订阅系统。消息队列将生产者和消费者分开,并可以在队列中存储数据,采用异步通信模式。已经开发了许多协议,例如高级消息队列协议(AMQP)和 ZeroMQ 消息传输协议(ZMTP)。RabbitMQ、ZeroMQ、Amazon SQS 等是一些此框架的知名实现。

自定义框架

针对不同来源(如 IoT、HTTP、WebSockets 等)的专用连接器导致了许多特定连接器的出现,例如 Amazon IoT Hub、REST 连接器、WebSocket 等。

数据存储

数据存储组件在连接获取和其他组件方面发挥着关键作用。在决定数据存储时,应考虑性能、对数据处理的影响、成本、高可用性、易于管理等因素。对于纯实时或近实时系统,有基于内存的存储框架,但对于基于批次的系统,主要有分布式文件系统,如 HDFS 或 NoSQL。

HDFS

HDFS 可以在大型节点集群上运行,并提供所有重要功能,如高吞吐量、复制、故障转移等。

HDFS

HDFS 的基本架构包含以下组件:

  • NameNode:HDFS 客户端始终将请求发送到 NameNode,它保存文件的元数据,而实际数据以块的形式分布在 DataNode 上。NameNode 只负责处理文件的打开和关闭,而读取、写入和追加的其余交互发生在客户端和数据节点之间。NameNode 将元数据存储在两个文件中:fsimageedit文件。fsimage包含文件系统元数据作为快照,而 edit 文件包含对元数据的增量更改。

  • Secondary NameNode:Secondary NameNode 通过在每个预定义检查点保留fsimageedit文件的副本,为 NameNode 中的元数据提供冗余。

  • DataNode:DataNode 管理实际的数据块并促进对这些数据块的读写操作。DataNode 通过心跳信号与 NameNode 保持通信,以表明它们处于活动状态。存储在 DataNode 中的数据块也进行了冗余复制。DataNode 中的数据块复制受制于机架感知放置策略。

NoSQL

非关系型数据库,也称为 NoSQL 数据库,在大数据世界中越来越受欢迎。高吞吐量、更好的水平扩展、检索性能的提高以及以牺牲较弱的一致性模型为代价的存储是大多数 NoSQL 数据库的显著特征。在本节中,我们将讨论一些重要的 NoSQL 数据库形式及其实现。

键值数据库

键值数据库是最突出的 NoSQL 数据库,主要用于半结构化或非结构化数据。正如其名所示,存储结构相当基本,具有独特的键将数据值(可以是字符串、整数、双精度等类型,甚至 BLOBS)与之关联。对键进行哈希处理以快速查找和检索值,以及将数据跨多个节点分区,提供了高吞吐量和可伸缩性。查询能力非常有限。Amazon DynamoDB、Oracle NoSQL、MemcacheDB 等是一些键值数据库的例子。

文档数据库

文档数据库以 XML、JSON 或 YAML 文档的形式存储半结构化数据,以下是一些最流行的格式。文档具有独特的键,它们被映射到这些键上。尽管在键值存储中存储文档是可能的,但文档存储提供的查询能力更强,因为构成文档结构的原语(可能包括名称或属性)也可以用于检索。当数据不断变化且字段数量或长度可变时,文档数据库通常是一个不错的选择。文档数据库不提供连接能力,因此所有信息都需要在文档值中捕获。MongoDB、ElasticSearch、Apache Solr 等是一些著名的文档数据库实现。

列式数据库

列作为存储的基本单元,具有名称、值和通常的时间戳,这区分了列式数据库与传统的关系数据库。列进一步组合形成列族。行通过行键索引,并关联多个列族。某些行可能只能使用已填充的列族,这使其在稀疏数据中具有很好的存储表示。列式数据库没有像关系数据库那样的固定模式;新列和列族可以随时添加,这给了它们显著的优势。HBaseCassandraParquet是一些著名的列式数据库实现。

图数据库

在许多应用中,数据具有固有的图结构,包括节点和链接。在图数据库中存储此类数据使其在存储、检索和查询方面更加高效。节点有一组属性,通常代表实体,而链接表示节点之间的关系,可以是定向的或非定向的。Neo4JOrientDBArangoDB是一些著名的图数据库实现。

数据处理和准备

数据准备步骤涉及在数据准备好由分析和机器学习算法消费之前的各种预处理步骤。涉及的一些关键任务包括:

  • 数据清洗:涉及对原始数据进行错误纠正、类型匹配、元素归一化等所有内容。

  • 数据抓取和整理:将数据元素从一种结构转换为另一种结构并进行归一化。

  • 数据转换:许多分析算法需要基于原始或历史数据的聚合特征。在这个步骤中,会进行这些额外特征的转换和计算。

Hive 和 HQL

Apache Hive (参考文献[11]) 是在 HDFS 系统中执行各种数据准备活动的强大工具。Hive 将底层 HDFS 数据组织成类似于关系数据库的结构。HQL 类似于 SQL,有助于执行各种聚合、转换、清理和归一化,然后数据被序列化回 HDFS。Hive 中的逻辑表被分区并在子分区中划分以提高速度。Hive 中的复杂连接和聚合查询会自动转换为 MapReduce 作业以实现吞吐量和速度提升。

Spark SQL

Spark SQL,Apache Spark 的主要组件 (参考文献[1]和[2]),提供了类似 SQL 的功能——类似于 HQL 提供的功能——用于对大数据进行更改。Spark SQL 可以与底层数据存储系统(如 Hive 或 NoSQL 数据库如 Parquet)一起工作。我们将在 Spark 部分的章节中涉及 Spark SQL 的某些方面。

Amazon Redshift

Amazon Redshift 在 Amazon EMR 设置上提供了一些仓库功能。它可以使用其 大规模并行处理 (MPP) 数据仓库架构处理 PB 级的数据。

实时流处理

在许多大数据部署中,必须对之前指定的转换在实时数据流上而不是从存储的批量数据中实时进行处理。有各种 流处理引擎 (SPE),如 Apache Storm (参考文献[12]) 和 Apache Samza,以及内存处理引擎如 Spark-Streaming,它们用于流处理。

机器学习

机器学习有助于对大数据进行描述性、预测性和规范性分析。本章将涵盖两个广泛的极端:

  • 机器学习可以在批量历史数据上执行,然后可以将学习/模型应用于新的批量/实时数据

  • 机器学习可以在实时数据上执行,并同时应用于实时数据

本章的剩余部分将详细讨论这两个主题。

可视化和分析

在建模时间完成批量学习,在运行时完成实时学习,预测——将模型应用于新数据的输出——必须存储在某种数据结构中,然后由用户进行分析。可视化工具和其他报告工具经常被用来提取和向用户展示信息。根据领域和用户的需求,分析和可视化可以是静态的、动态的或交互式的。

Lightning 是一个框架,使用不同的绑定 API(通过 REST 为 Python、R、Scala 和 JavaScript 语言)在 Web 上执行交互式可视化。

Pygal 和 Seaborn 是基于 Python 的库,它们帮助在 Python 中绘制所有可能的图表和图形,用于分析、报告和可视化。

批量大数据机器学习

批量大数据机器学习涉及两个基本步骤,如第二章《实际应用中的监督学习》、第三章《无监督机器学习技术》和第四章《半监督和主动学习》中所述,即从历史数据集中学习或训练数据,并将学习到的模型应用于未见过的未来数据。以下图展示了这两个环境以及完成这些任务的组件任务和一些技术/框架:

批量大数据机器学习

图 6:大数据和提供者的建模时间和运行时组件

我们将讨论在批量数据背景下进行机器学习的两个最著名的框架,并使用案例研究来突出执行建模的代码或工具。

H2O 作为大数据机器学习平台

H2O(参考文献[13])是一个领先的开源大数据机器学习平台,专注于将人工智能引入企业。该公司成立于 2011 年,拥有几位在统计学习理论和优化领域的杰出科学家作为其科学顾问。它支持多种编程环境。虽然 H2O 软件是免费提供的,但客户服务和产品的定制扩展可以购买。

H2O 架构

以下图展示了 H2O 的高级架构及其重要组件。H2O 可以访问来自各种数据存储的数据,例如 HDFS、SQL、NoSQL 和 Amazon S3 等。H2O 最流行的部署方式是使用之前讨论过的部署堆栈之一与 Spark 一起使用,或者在其自己的 H2O 集群中运行。

H2O 的核心是在内存中处理大数据的优化方式,以便可以有效地处理通过相同数据的迭代算法,并实现良好的性能。在监督学习和无监督学习中,重要的机器学习算法被特别实现以处理跨多个节点和 JVM 的水平可伸缩性。H2O 不仅提供了自己的用户界面,称为 flow,用于管理和运行建模任务,而且还具有不同的语言绑定和连接器 API,用于 Java、R、Python 和 Scala。

H2O 架构

图 7:H2O 高级架构

大多数机器学习算法、优化算法和实用工具都使用了分叉-合并或 MapReduce 的概念。如图 8 所示,整个数据集在 H2O 中被视为一个数据框,并包含向量,这些向量是数据集中的特征或列。行或实例由每个向量中的一个元素并排排列组成。行被分组在一起形成一个称为的处理单元。多个块在一个 JVM 中组合。任何算法或优化工作都是从最顶层的 JVM 发送信息到下一个 JVM 进行分叉,然后继续到下一个,以此类推,类似于 MapReduce 中的 map 操作。每个 JVM 在块中的行上执行任务,并最终在 reduce 操作中将结果流回:

H2O 架构

图 8:使用分块进行 H2O 分布式数据处理

H2O 中的机器学习

下图显示了 H2O v3 支持的所有监督学习和无监督学习的机器学习算法:

H2O 中的机器学习

图 9:H2O v3 机器学习算法

工具和用法

H2O Flow 是一个交互式 Web 应用程序,帮助数据科学家执行从导入数据到使用点击和向导概念运行复杂模型的各种任务。

H2O 以本地模式运行如下:

java –Xmx6g –jar h2o.jar

启动 Flow 的默认方式是将浏览器指向以下 URL:http://192.168.1.7:54321/。Flow 的右侧捕获在概要标签下执行的每个用户操作。这些操作可以编辑并保存为命名的流程以供重用和协作,如图 10 所示:

工具和用法

图 10:浏览器中的 H2O 流

图 11显示了从本地文件系统或 HDFS 导入文件的界面,并显示数据集的详细摘要统计以及可以执行的操作。一旦数据被导入,它就在 H2O 框架中获得一个以.hex为扩展名的数据框引用。摘要统计有助于理解数据的特征,如缺失平均值最大值最小值等。它还有一个简单的方法将特征从一种类型转换为另一种类型,例如,具有少量唯一值的数值特征转换为 H2O 中称为enum的分类/名义类型。

可以在数据集上执行的操作包括:

  1. 可视化数据。

  2. 将数据分割成不同的集合,如训练、验证和测试。

  3. 构建监督和无监督模型。

  4. 使用模型进行预测。

  5. 下载并导出各种格式的文件。工具和用法

    图 11:以框架、摘要和可执行操作导入数据

在 H2O 中构建监督或无监督模型是通过交互式屏幕完成的。每个建模算法都有其参数,分为三个部分:基本、高级和专家。任何支持超参数搜索以调整模型的参数旁边都有一个复选框网格,并且可以使用多个参数值。

一些基本参数,如training_framevalidation_frameresponse_column,是每个监督算法共有的;其他参数特定于模型类型,例如 GLM 的求解器选择、深度学习的激活函数等。所有这些通用参数都在基本部分中。高级参数是允许模型器在必须覆盖默认行为时获得更多灵活性和控制的设置。其中一些参数在算法之间也是通用的——两个例子是分配折指数的方法选择(如果在基本部分中选择了交叉验证),以及选择包含权重的列(如果每个示例单独加权),等等。

专家参数定义了更复杂的元素,例如如何处理缺失值、需要更多算法理解的模型特定参数,以及其他神秘变量。在图 12中,GLM,一个监督学习算法,正在使用 10 折交叉验证、二项式(双类)分类、高效的 LBFGS 优化算法和分层采样进行交叉验证分割进行配置:

工具和用法

图 12:建模算法参数和验证

模型结果屏幕包含了对结果的详细分析,使用重要的评估图表,具体取决于所使用的验证方法。屏幕顶部是可能采取的操作,例如在未见数据上运行模型进行预测、下载模型为 POJO 格式、导出结果等。

一些图表是算法特定的,例如评分历史记录显示了在 GLM 中迭代过程中训练损失或目标函数如何变化——这使用户能够了解收敛速度以及迭代参数的调整。我们在验证数据中看到了 ROC 曲线和曲线下面积指标,以及增益和提升图表,分别给出了验证样本的累积捕获率和累积提升。

图 13 展示了 GLM 在 CoverType 数据集上 10 折交叉验证的 评分历史ROC 曲线增益/提升 图表:

工具和用法

图 13:建模和验证 ROC 曲线、目标函数和提升/增益图表

验证输出的输出提供了详细的评估指标,如准确率、AUC、误差、错误、f1 指标、MCC(马修斯相关系数)、精确率和召回率,对于交叉验证中的每个验证折以及所有计算出的平均值和标准差。

工具和用法

图 14:验证结果和总结

预测操作使用未见过的保留数据运行模型来估计样本外性能。重要的指标,如错误、准确率、曲线下面积、ROC 图等,作为预测的输出给出,可以保存或导出。

工具和用法

图 15:运行测试数据、预测和 ROC 曲线

案例研究

在本案例研究中,我们使用 CoverType 数据集来展示 H2O、Apache Spark MLlib 和 SAMOA 机器学习库在 Java 中的分类和聚类算法。

商业问题

可从 UCI 机器学习仓库获取的 CoverType 数据集(archive.ics.uci.edu/ml/datasets/Covertype)包含 581,012 个 30 x 30 m2 尺寸的森林土地的未缩放地图数据,并附带实际的森林覆盖类型标签。在此处进行的实验中,我们使用数据的归一化版本。包括两种分类类型的 one-hot 编码,每行总共有 54 个属性。

机器学习映射

首先,我们将问题视为一个分类问题,使用数据集中包含的标签执行多个监督学习实验。使用生成的模型,我们对未见过的保留测试数据集的森林覆盖类型进行预测。对于后续的聚类实验,我们忽略数据标签,确定要使用的聚类数量,然后报告使用 H2O 和 Spark MLLib 中实现的多种算法对应的成本。

数据收集

此数据集仅使用地图测量收集,没有使用遥感。它来源于最初由 美国森林服务局USFS)和美国地质调查局USGS)收集的数据。

数据采样和转换

训练和测试数据—数据集被分成两个集合,测试占 20%,训练占 80%。

土壤类型分类的表示由 40 个二元变量属性组成。值为 1 表示观测中存在土壤类型;值为 0 表示不存在。

野生动植物区域分类同样是一个分类属性,有四个二元列,其中 1 表示存在,0 表示不存在。

所有连续值属性在使用前都已归一化。

实验、结果和分析

在本案例研究的第一个实验集中,我们使用了 H2O 框架。

特征相关性和分析

尽管 H2O 没有显式的特征选择算法,但许多学习器如 GLM、随机森林、GBT 等,基于模型的训练/验证提供特征重要性指标。在我们的分析中,我们使用了 GLM 进行特征选择,如图 16 所示。有趣的是,特征高程与一些转换为数值/二进制分类特征(如Soil_Type2Soil_Type4等)一起成为最具区分性的特征。许多土壤类型分类特征没有相关性,可以从建模角度删除。

本组实验中包含的学习算法有:广义线性模型 (GLM)、梯度提升机 (GBM)、随机森林 (RF)、朴素贝叶斯 (NB) 和 深度学习 (DL)。H2O 支持的深度学习模型是多层感知器 (MLP)。

特征相关性和分析

图 16:使用 GLM 进行特征选择

测试数据的评估

使用所有特征的结果显示在表中:

算法参数AUC最大准确率最大 F1最大精确率最大召回率最大特异性
GLM默认0.840.790.840.981.0(1)0.99
GBM默认0.860.820.861.0(1)1.0(1)1.0(1)
随机森林 (RF)默认0.88(1)0.83(1)0.87(1)0.971.0(1)0.99
朴素贝叶斯 (NB)Laplace=500.660.720.810.681.0(1)0.33
深度学习 (DL)Rect,300, 300,Dropout0.0.780.830.881.0(1)0.99
深度学习 (DL)300, 300, MaxDropout0.820.80.841.0(1)1.0(1)1.0(1)

移除在特征相关性评分中表现不佳的特征后的结果如下:

算法参数AUC最大准确率最大 F1最大精确率最大召回率最大特异性
GLM默认0.840.800.851.01.01.0
GBM默认0.850.820.861.01.01.0
随机森林 (RF)默认0.880.830.871.01.01.0
朴素贝叶斯 (NB)Laplace=500.760.740.810.891.00.95
深度学习 (DL)300,300, RectDropout0.810.790.841.01.01.0
深度学习 (DL)300, 300, MaxDropout0.850.800.840.890.901.0

表 1:包含所有特征的模型评估结果

结果分析

从结果分析中获得的主要观察结果非常有启发性,在此处展示。

  1. 特征相关性分析显示了海拔特征是一个高度区分性的特征,而许多转换为二进制特征的分类属性,如SoilType_10等,其相关性几乎为零或没有。

  2. 包含所有特征的实验结果,如表 1所示,清楚地表明,非线性集成技术随机森林(Random Forest)是最佳算法,这从包括准确率、F1、AUC 和召回率在内的多数评估指标中可以看出。

  3. 表 1也突出了这样一个事实:虽然较快的线性朴素贝叶斯(Naive Bayes)算法可能不是最佳选择,但属于线性算法类别的 GLM 表现出更好的性能——这表明特征之间存在一些相互依赖性!

  4. 如我们在第七章中看到的,深度学习算法通常需要大量的调整;然而,即使只有少数小的调整,深度学习(DL)的结果与随机森林(Random Forest)相比也是可以相提并论的,尤其是在使用 MaxDropout 的情况下。

  5. 表 2显示了从训练集中移除低相关性特征后所有算法的结果。可以看出,由于基于特征之间独立性的假设进行概率乘法,朴素贝叶斯(Naive Bayes)的影响最大,因此它获得了最大的利益和性能提升。大多数其他算法,如随机森林(Random Forest),如我们在第二章中讨论的,面向现实世界监督学习的实用方法,内置了特征选择,因此移除不重要的特征对它们的性能影响很小或没有影响。

Spark MLlib 作为大数据机器学习平台

Apache Spark 始于 2009 年,在加州大学伯克利分校的 AMPLab,于 2013 年在 Apache License 2.0 下捐赠给了 Apache 软件基金会。Spark 的核心思想是构建一个集群计算框架,以克服 Hadoop 的问题,特别是对于迭代和内存计算。

Spark 架构

图 17所示的 Spark 堆栈可以使用任何类型的数据存储,如 HDFS、SQL、NoSQL 或本地文件系统。它可以在 Hadoop、Mesos 或独立部署。

Spark 最重要的组件是 Spark Core,它提供了一个框架,以高吞吐量、容错和可扩展的方式处理和操作数据。

建立在 Spark 核心之上的各种库,每个库都针对大数据世界中处理数据和进行数据分析所需的各种功能。Spark SQL 为我们提供了一种使用类似于 SQL 的查询语言在大数据存储中进行数据操作的语言,SQL 是数据库的通用语言。Spark GraphX 提供了执行图相关操作和基于图的算法的 API。Spark Streaming 提供了处理流处理中所需实时操作的 API,从数据操作到对流的查询。

Spark-MLlib 是一个机器学习库,拥有广泛的机器学习算法,可以执行从特征选择到建模的监督和未监督任务。Spark 有各种语言绑定,如 Java、R、Scala 和 Python。MLlib 在 Spark 引擎上运行具有明显的优势,尤其是在跨多个节点缓存数据以及在内存中运行 MapReduce 作业方面,从而与 Mahout 和其他大规模机器学习引擎相比,性能得到了显著提升。MLlib 还具有其他优势,如容错性和可伸缩性,无需在机器学习算法中显式管理。

Spark 架构

图 17:Apache Spark 高级架构

Spark 核心组件如下:

  • 弹性分布式数据集RDD):RDD 是 Spark Core 知道如何分区和分布到集群以执行任务的不可变对象的基本集合。RDD 由“分区”组成,这些分区依赖于父 RDD 和关于数据放置的元数据。

  • 在 RDD 上执行两种不同的操作:

    • 转换:这些操作是延迟评估的,可以将一个 RDD 转换为另一个 RDD。延迟评估尽可能推迟评估,这使得一些资源优化成为可能。

    • 操作:触发转换并返回输出值的实际操作

  • 血缘图:描述特定任务的计算流程或数据流,包括在转换和操作中创建的不同 RDD,称为任务的血缘图。血缘图在容错中扮演着关键角色。Spark 架构

    图 18:Apache Spark 血缘图

Spark 对集群管理是中立的,可以与 YARN 和 Mesos 等多个实现一起工作,以管理节点、分配工作和通信。转换和操作在集群中的任务分配是由调度器完成的,从创建 Spark 上下文的驱动节点开始,到如图 19 所示的许多工作节点。当与 YARN 一起运行时,Spark 允许用户在节点级别选择执行器的数量、堆大小和每个 JVM 的核心分配。

Spark 架构

图 19:Apache Spark 集群部署和任务分配

MLlib 中的机器学习

Spark MLlib 拥有一个全面的机器学习工具包,提供的算法比写作时的 H2O 更多,如图 20 所示:

MLlib 中的机器学习

图 20:Apache Spark MLlib 机器学习算法

为 Spark 编写了许多扩展,包括 Spark MLlib,用户社区还在继续贡献更多包。您可以在 spark-packages.org/ 下载第三方包或注册您自己的包。

工具和用法

Spark MLlib 除了 Java 之外,还为 Scala、Python 和 R 等语言提供了 API。当创建SparkContext时,它会在端口4040启动一个监控和仪表化 Web 控制台,使我们能够查看有关运行时的关键信息,包括计划的任务及其进度、RDD 大小和内存使用情况等。还有可用的外部分析工具。

实验、结果和分析

我们在这里解决的业务问题与之前使用 H2O 进行实验所描述的问题相同。我们总共使用了 MLlib 中的五种学习算法。第一个是使用从计算大量k值得到的成本(特别是平方和误差SSE))确定的k值进行 k-Means 聚类,并选择曲线的“肘部”。确定最优的k值通常不是一个容易的任务;通常,为了选择最佳的k,会比较如轮廓等评估指标。尽管我们知道数据集中类的数量是7,但如果假设我们没有标记数据,看到此类实验的走向也是有益的。使用肘部方法找到的最优k值为 27。在现实世界中,业务决策可能经常指导k的选择。

在以下列表中,我们展示了如何使用 MLlib 套件中的不同模型来进行聚类分析和分类。代码基于 MLlib API 指南中提供的示例(spark.apache.org/docs/latest/mllib-guide.html)。我们使用 CSV 格式的标准化 UCI CoverType数据集。请注意,使用较新的spark.ml包中的spark.sql.Dataset更为自然,而spark.mllib包则更紧密地与JavaRDD协同工作。这为 RDD 提供了抽象,并允许对底层的转换进行优化。对于大多数无监督学习算法来说,这意味着数据必须进行转换,以便用于训练和测试的数据集默认包含一个名为 features 的列,该列包含观察到的所有特征作为向量。可以使用VectorAssembler对象进行这种转换。源代码中给出了对 ML 管道的使用示例,这是一种将任务链式连接起来的方法,用于训练随机森林分类器。

k-Means

以下 k-Means 实验的代码片段使用了来自org.apache.spark.ml.clustering包的算法。代码包括设置SparkSession(Spark 运行时的句柄)的最小模板代码。请注意,在设置中指定了本地模式下的八个核心:

SparkSession spark = SparkSession.builder()
    .master("local[8]")
    .appName("KMeansExpt")
    .getOrCreate();

// Load and parse data
String filePath = "/home/kchoppella/book/Chapter09/data/covtypeNorm.csv";
// Selected K value 
int k =  27;

// Loads data.
Dataset<Row> inDataset = spark.read()
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .option("inferSchema", true)
    .load(filePath);
ArrayList<String> inputColsList = new ArrayList<String>(Arrays.asList(inDataset.columns()));

//Make single features column for feature vectors 
inputColsList.remove("class");
String[] inputCols = inputColsList.parallelStream().toArray(String[]::new);

//Prepare dataset for training with all features in "features" column
VectorAssembler assembler = new VectorAssembler().setInputCols(inputCols).setOutputCol("features");
Dataset<Row> dataset = assembler.transform(inDataset);

KMeans kmeans = new KMeans().setK(k).setSeed(1L);
KMeansModel model = kmeans.fit(dataset);

// Evaluate clustering by computing Within Set Sum of Squared Errors.
double SSE = model.computeCost(dataset);
System.out.println("Sum of Squared Errors = " + SSE);

spark.stop();

通过评估和绘制不同值的平方和误差,并选择曲线的肘部值,得到了最佳聚类数量值。这里使用的值是27

带 PCA 的 k-Means

在第二个实验中,我们再次使用了 k-Means,但首先通过 PCA 减少了数据中的维度。在这里,我们使用了一个经验法则,即选择 PCA 参数的维度值,以确保在降维后至少保留了原始数据集 85%的方差。这从最初的 54 个特征产生了转换数据集中的 16 个特征,并且这个数据集被用于本实验和后续实验。以下代码显示了 PCA 分析的相关代码:

int numDimensions = 16
PCAModel pca = new PCA()
    .setK(numDimensions)
    .setInputCol("features")
    .setOutputCol("pcaFeatures")
    .fit(dataset);

Dataset<Row> result = pca.transform(dataset).select("pcaFeatures");
KMeans kmeans = new KMeans().setK(k).setSeed(1L);
KMeansModel model = kmeans.fit(dataset);
Bisecting k-Means (with PCA)

第三个实验使用了 MLlib 的 Bisecting k-Means 算法。这个算法类似于一种自上而下的层次聚类技术,其中所有实例最初都在同一个簇中,然后进行连续的分割:

// Trains a bisecting k-Means model.
BisectingKMeans bkm = new BisectingKMeans().setK(k).setSeed(1);
BisectingKMeansModel model = bkm.fit(dataset);
高斯混合模型

在下一个实验中,我们使用了 MLlib 的高斯混合模型GMM),另一种聚类模型。该模型固有的假设是每个簇中的数据分布本质上是高斯分布,具有未知参数。这里指定了相同数量的簇,并且已使用默认值作为最大迭代次数和容忍度,这些值决定了算法何时被认为已收敛:

GaussianMixtureModel gmm = new GaussianMixture()
    .setK(numClusters)
    .fit(result);
// Output the parameters of the mixture model
for (int k = 0; k < gmm.getK(); k++) {
  String msg = String.format("Gaussian %d:\nweight=%f\nmu=%s\nsigma=\n%s\n\n",
              k, gmm.weights()[k], gmm.gaussians()[k].mean(), 
              gmm.gaussians()[k].cov());
  System.out.printf(msg);
  writer.write(msg + "\n");
  writer.flush();
}
随机森林

最后,我们运行了随机森林,这是唯一可用的能够处理多类分类的集成学习器。在以下代码中,我们可以看到这个算法在训练之前需要执行一些预备任务。预处理阶段被组合成一个由 Transformers 和 Estimators 组成的管道。然后使用该管道来拟合数据。您可以在 Apache Spark 网站上了解更多关于管道的信息(spark.apache.org/docs/latest/ml-pipeline.html):

// Index labels, adding metadata to the label column.
// Fit on whole dataset to include all labels in index.
StringIndexerModel labelIndexer = new StringIndexer()
  .setInputCol("class")
  .setOutputCol("indexedLabel")
  .fit(dataset);
// Automatically identify categorical features, and index them.
// Set maxCategories so features with > 2 distinct values are treated as continuous since we have already encoded categoricals with sets of binary variables.
VectorIndexerModel featureIndexer = new VectorIndexer()
  .setInputCol("features")
  .setOutputCol("indexedFeatures")
  .setMaxCategories(2)
  .fit(dataset);

// Split the data into training and test sets (30% held out for testing)
Dataset<Row>[] splits = dataset.randomSplit(new double[] {0.7, 0.3});
Dataset<Row> trainingData = splits[0];
Dataset<Row> testData = splits[1];

// Train a RF model.
RandomForestClassifier rf = new RandomForestClassifier()
  .setLabelCol("indexedLabel")
  .setFeaturesCol("indexedFeatures")
  .setImpurity("gini")
  .setMaxDepth(5)
  .setNumTrees(20)
  .setSeed(1234);

// Convert indexed labels back to original labels.
IndexToString labelConverter = new IndexToString()
  .setInputCol("prediction")
  .setOutputCol("predictedLabel")
  .setLabels(labelIndexer.labels());

// Chain indexers and RF in a Pipeline.
Pipeline pipeline = new Pipeline()
  .setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});

// Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(trainingData);

// Make predictions.
Dataset<Row> predictions = model.transform(testData);

// Select example rows to display.
predictions.select("predictedLabel", "class", "features").show(5);

// Select (prediction, true label) and compute test error.
MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
  .setLabelCol("indexedLabel")
  .setPredictionCol("prediction");

evaluator.setMetricName("accuracy");
double accuracy = evaluator.evaluate(predictions);
System.out.printf("Accuracy = %f\n", accuracy); 

使用 k-Means 和 Bisecting k-Means 的实验的均方误差在以下表中给出:

算法k特征SSE
k-Means2754214,702
k-Means(PCA)2716241,155
Bisecting k-Means(PCA)2716305,644

表 3:k-Means 的结果

GMM 模型被用来展示 API 的使用;它为每个簇输出高斯混合的参数以及簇权重。所有簇的输出可以在本书的网站上查看。

对于随机森林的情况,这些是不同树的数量运行的结果。这里使用了所有 54 个特征:

树的数量准确率F1 度量加权精度加权召回率
150.68060.64890.62130.6806
200.67760.64700.61910.6776
250.59680.53250.57170.5968
300.65470.62070.59720.6547
400.65940.62720.60060.6594

表 4:随机森林的结果

结果分析

表 3 所示,在 PCA 后使用较少维度时,成本略有增加,而簇的数量保持不变。随着 PCA 中 k 的变化,可能表明 PCA 情况下的更好 k。注意,在这个实验中,对于相同的 k,使用 PCA 导出的特征的 Bisecting K-Means 具有最高的成本。用于 Bisecting k-Means 的停止簇数简单地被选为基本 k-Means 确定的那个,但不必如此。对于 Bisecting k-Means,可以独立进行寻找最佳成本 k 的类似搜索。

在随机森林的情况下,当使用 15 棵树时,我们看到最佳性能。所有树都有三个深度。这个超参数可以变化以调整模型。尽管随机森林由于在训练阶段考虑了树之间的方差,因此不易过拟合,但将树的数量增加到最佳数量以上可能会降低性能。

实时大数据机器学习

在本节中,我们将讨论大数据机器学习的实时版本,其中数据以大量形式到达,并且同时以快速的速度发生变化。在这些条件下,机器学习分析不能按照传统的“批量学习与部署”实践进行 per (参考文献 [14])。

实时大数据机器学习

图 21:实时大数据机器学习的用例

让我们考虑一个案例,其中在短时间内有标记数据可用,我们对数据进行适当的建模技术,然后对生成的模型应用最合适的评估方法。接下来,我们选择最佳模型,并在运行时使用它对未见数据进行预测。然后,我们观察到,模型性能随着时间的推移显著下降。用新数据进行重复的练习显示出类似性能的退化!我们现在该怎么办?这种困境,加上大量数据,促使我们需要不同的方法:实时大数据机器学习。

与批量学习框架类似,大数据中的实时框架在数据准备阶段之前可能具有类似的组件。当数据准备中涉及的计算必须在流或流与批量数据组合上进行时,我们需要专门的计算引擎,例如 Spark Streaming。像流计算一样,机器学习必须在集群上工作,并在流上执行不同的机器学习任务。这给单机多线程流算法的实现增加了额外的复杂性。

实时大数据机器学习

图 22:实时大数据组件和提供商

SAMOA 作为实时大数据机器学习框架

在第五章“实时流机器学习”中,我们详细讨论了 MOA 框架。SAMOA 是用于在流上执行机器学习的分布式框架。

在撰写本文时,SAMOA 是一个孵化级开源项目,拥有 Apache 2.0 许可证,并与不同的流处理引擎(如Apache StormSamzaS4)有良好的集成。

SAMOA 架构

SAMOA 框架为可扩展的流处理引擎集提供几个关键流服务,现有实现适用于今天最受欢迎的引擎。

SAMOA 架构

图 23:SAMOA 高级架构

TopologyBuilder是一个充当工厂的接口,用于在 SAMOA 中创建不同的组件并将它们连接在一起。SAMOA 的核心在于构建数据流的处理元素。处理的基本单元由ProcessingItemProcessor接口组成,如图 24 所示。ProcessingItem是一个封装的隐藏元素,而Processor是核心实现,其中编码了处理流的逻辑。

SAMOA 架构

图 24:SAMOA 处理数据流

是另一个接口,它将各种处理器连接起来,作为由TopologyBuilder创建的源和目的地。一个流可以有一个源和多个目的地。流支持源和目的地之间的三种通信形式:

  • 所有: 在本通信中,所有来自源的消息都被发送到所有目的地

  • : 在本通信中,具有相同键的消息被发送到相同的处理器

  • 洗牌: 在本通信中,消息被随机发送到处理器

SAMOA 中的所有消息或事件都是ContentEvent接口的实现,主要封装流中的数据作为值,并具有某种形式的键以实现唯一性。

每个流处理引擎都有一个作为插件的实现,用于所有关键接口,并与 SAMOA 集成。API 中展示了 Apache Storm 的实现,如 StormTopology、StormStream 和 StormProcessingItem 等,如图 25 所示。

Task 是 SAMOA 中的另一个工作单元,负责执行。所有分类或聚类评估和验证技术,如预 quential、holdout 等,都作为任务实现。

Learner 是用于在 SAMOA 中实现所有监督学习和无监督学习能力的接口。学习者可以是本地的或分布式的,并具有不同的扩展,如ClassificationLearnerRegressionLearner

机器学习算法

机器学习算法机器学习算法

图 25:SAMOA 机器学习算法

图 25展示了 SAMOA 拓扑的核心组件及其对不同引擎的实现。

工具和用法

我们继续使用之前相同的商业问题。启动covtype数据集训练作业的命令行是:

bin/samoa local target/SAMOA-Local-0.3.0-SNAPSHOT.jar "PrequentialEvaluation -l classifiers.ensemble.Bagging 
 -s (ArffFileStream -f covtype-train.csv.arff) -f 10000"

工具和用法

图 25:袋装模型性能

当与 Storm 一起运行时,这是命令行:

bin/samoa storm target/SAMOA-Storm-0.3.0-SNAPSHOT.jar "PrequentialEvaluation -l classifiers.ensemble.Bagging 
 -s (ArffFileStream -f covtype-train.csv.arff) -f 10000"

实验、结果和分析

使用 SAMOA 作为大数据基于流的平台进行实验的结果在表 5中给出。

算法最佳准确率最终准确率最终 Kappa 统计量最终 Kappa 时间统计量
Bagging79.1664.0937.52-69.51
Boosting78.0547.820-1215.1
VerticalHoeffdingTree83.2367.5144.35-719.51
AdaptiveBagging81.0364.6438.99-67.37

表 5:使用 SAMOA 进行大数据实时学习实验结果

结果分析

从结果分析中,可以得出以下观察:

  • 表 5显示,在几乎所有的指标中,基于流行的非线性决策树 VHDT 的 SAMOA 是最具表现力的算法。

  • 自适应袋装算法比袋装算法表现更好,因为它在实现中采用了 Hoeffding 自适应树,这些树比基本的在线流袋装更稳健。

  • 如预期的那样,在线提升算法由于其依赖弱学习者和缺乏适应性而排名最低。

  • 图 25中的袋装图显示了随着示例数量的增加所实现的稳定趋势,这验证了普遍共识,即如果模式是平稳的,更多的示例会导致稳健的模型。

机器学习的未来

机器学习对商业、社会互动,以及我们日常生活的冲击是无可否认的,尽管这种影响并不总是立即显而易见。在不久的将来,它将无处不在,无法避免。根据麦肯锡全球研究院 2016 年 12 月发布的一份报告(参考文献 [15]),在主要行业部门,尤其是在医疗保健和公共部门,数据和分析存在着巨大的未开发潜力。机器学习是帮助利用这种潜力的关键技术之一。我们现在可用的计算能力比以往任何时候都要多。可用的数据也比以往任何时候都要多,而且我们拥有比以往任何时候都要便宜和更大的存储容量。

已经,对数据科学家的未满足需求已经促使全球大学课程发生了变化,并在 2012-2014 年期间导致美国数据科学家的工资每年增长 16%。机器学习可以解决广泛的问题,包括资源分配、预测、预测分析、预测维护以及价格和产品优化。

同一份麦肯锡报告强调了机器学习在包括农业、制药、制造、能源、媒体和金融等行业各种用例中的日益增长的作用,包括深度学习。这些场景涵盖了从预测个性化健康结果、识别欺诈交易、优化定价和调度、根据个体条件个性化作物、识别和导航道路、诊断疾病到个性化广告的各个方面。深度学习在自动化越来越多的职业方面具有巨大潜力。仅仅改善自然语言理解就可能导致全球工资产生 3 万亿美元的潜在影响,影响全球的客户服务和支持类工作。

图像和语音识别以及语言处理方面的巨大进步,得益于深度学习技术的显著进步,使得个人数字助理等应用变得司空见惯。本书开篇章节提到的 AlphaGO 战胜李世石的成功象征意义巨大,它是人工智能进步超越我们预测里程碑的一个生动例证。然而,这只是冰山一角。最近在迁移学习等领域的研究为更广泛智能系统的承诺提供了希望,这些系统能够解决更广泛的问题,而不仅仅是专门解决一个问题。通用人工智能,即 AI 能够发展客观推理、提出解决问题的方法并从其错误中学习,目前还相距甚远,但几年后,这个距离可能会缩小到我们目前的预期之外!日益增长的、相互促进的技术变革正在预示着一个令人眼花缭乱的未来,我们已经在周围看到了这种可能性。看起来,机器学习的角色将继续以前所未有的方式塑造那个未来。对此,我们几乎毫无疑问。

摘要

本书最后一章讨论了适应信息管理和分析领域在过去几十年中出现的最显著范式转变之一——大数据的机器学习。正如计算机科学和工程的其他许多领域所看到的那样,人工智能——特别是机器学习——从创新解决方案和适应大数据带来的众多挑战的专门社区中受益。

一种描述大数据的方式是通过其体积、速度、多样性和真实性。这要求有一套新的工具和框架来执行大规模有效分析的任务。

选择大数据框架涉及选择分布式存储系统、数据准备技术、批量或实时机器学习,以及可视化和报告工具。

可用的开源部署框架包括 Hortonworks 数据平台、Cloudera CDH、Amazon Elastic MapReduce 和 Microsoft Azure HDInsight。每个都提供了一个平台,其中包含支持数据采集、数据准备、机器学习、评估和结果可视化的组件。

在数据采集组件中,发布-订阅是 Apache Kafka (参考文献[8]) 和 Amazon Kinesis 提供的一种模型,它涉及一个在订阅者和发布者之间进行调解的代理。其他选择包括源-汇,SQL,消息队列以及其他自定义框架。

关于数据存储,有几个因素有助于为满足您的需求做出适当的选择。HDFS 提供了一个具有强大容错性和高吞吐量的分布式文件系统。NoSQL 数据库也提供高吞吐量,但通常在一致性方面提供较弱保证。它们包括键值、文档、列和图数据库。

数据处理和准备是流程中的下一步,包括数据清洗、抓取和转换。Hive 和 HQL 在 HDFS 系统中提供这些功能。SparkSQL 和 Amazon Redshift 提供类似的功能。实时流处理可通过 Storm 和 Samza 等产品获得。

在大数据分析的学习阶段,可以包括批量或实时数据。

存在着多种丰富的可视化和分析框架,可以从多个编程环境中访问。

在大数据领域,有两个主要的机器学习框架是 H2O 和 Apache Spark MLlib。两者都可以从各种来源访问数据,如 HDFS、SQL、NoSQL、S3 等。H2O 支持多种机器学习算法,可以在集群中运行。对于实时数据的机器学习,SAMOA 是一个具有全面流处理能力的的大数据框架。

机器学习在未来将扮演主导角色,对医疗保健、金融、能源以及实际上大多数行业都将产生广泛的影响。自动化范围的扩展将不可避免地对社会产生影响。计算能力、数据和存储成本的增加为机器学习应用开辟了新的广阔视野,这些应用有可能提高生产力、激发创新并极大地改善全球的生活水平。

参考文献

  1. Matei Zaharia, Mosharaf Chowdhury, Michael J. Franklin, Scott Shenker, Ion Stoica:Spark:使用工作集的集群计算. HotCloud 2010

  2. Matei Zaharia, Reynold S. Xin, Patrick Wendell, Tathagata Das, Michael Armbrust, Ankur Dave, Xiangrui Meng, Josh Rosen, Shivaram Venkataraman, Michael J. Franklin, Ali Ghodsi, Joseph Gonzalez, Scott Shenker, Ion Stoica:Apache Spark:一个用于大数据处理的统一引擎. Commun. ACM 59(11): 56-65 (2016)

  3. Apache Hadoop: hadoop.apache.org/.

  4. Cloudera: www.cloudera.com/.

  5. Hortonworks: hortonworks.com/.

  6. Amazon EC2: aws.amazon.com/ec2/.

  7. Microsoft Azure: azure.microsoft.com/.

  8. Apache Flume: flume.apache.org/.

  9. Apache Kafka: kafka.apache.org/.

  10. Apache Sqoop: sqoop.apache.org/.

  11. Apache Hive: hive.apache.org/.

  12. Apache Storm: storm.apache.org/.

  13. H2O: h2o.ai/.

  14. Shahrivari S, Jalili S. 超越批量处理:迈向实时和流式大数据. 计算机. 2014;3(4):117–29.

  15. MGI, 分析时代——执行摘要 www.mckinsey.com/~/media/McKinsey/Business%20Functions/McKinsey%20Analytics/Our%20Insights/The%20age%20of%20analytics%20Competing%20in%20a%20data%20driven%20world/MGI-The-Age-of-Analytics-Full-report.ashx.