Hadoop 深度学习(二)
原文:
annas-archive.org/md5/fb21c7d21fa111e9900de84c112a1378译者:飞龙
第六章 自编码器
| “人们担心计算机会变得太聪明,接管世界,但真正的问题是它们太愚蠢,已经接管了世界。” | ||
|---|---|---|
| --Pedro Domingos |
在上一章中,我们讨论了一个生成模型——限制玻尔兹曼机。在本章中,我们将介绍另一个生成模型——自编码器。自编码器是一种人工神经网络,通常用于降维、特征学习或特征提取。
在本章接下来的部分,我们将详细讨论自编码器的概念及其各种形式。我们还将解释 正则化自编码器 和 稀疏自编码器 这两个术语。将会介绍稀疏编码的概念,并探讨在稀疏自编码器中选择稀疏因子的标准。随后,我们将讨论深度学习模型——深度自编码器,并展示如何使用 Deeplearning4j 实现它。去噪自编码器是传统自编码器的另一种形式,将在本章的后部分讨论。
总体来说,本章分为几个小节,具体内容如下:
-
自编码器
-
稀疏自编码器
-
深度自编码器
-
去噪自编码器
-
自编码器的应用
自编码器
自编码器是一个具有一个隐藏层的神经网络,经过训练来学习一种身份函数,尝试将其输入重建为输出。换句话说,自编码器试图通过将输入数据投影到由隐藏节点定义的低维子空间来复制输入数据。隐藏层 h 描述了一种代码,用于表示输入数据及其结构。因此,这个隐藏层被迫从输入训练数据集中学习结构,以便在输出层能够复制输入。
自编码器的网络可以分为两个部分:编码器和解码器。编码器通过函数 h=f (k) 描述,解码器则通过 r = g (h) 尝试重建或复制。自编码器的基本思想应该是只复制输入中优先的那些方面,而不是创建输入的精确副本。它们的设计方式是限制隐藏层只做大致的复制,而不是从输入数据中复制所有内容。因此,如果自编码器学习到完全设置 g(f(k) = k 对所有 k 的值都成立,则它不能被称为有用的。图 6.1 表示自编码器的通用结构,通过内部隐藏层代码 h 将输入 k 映射到输出 r:
图 6.1:自编码器的通用框图。这里,输入 k 通过隐藏状态或内部表示 h 映射到输出 r。编码器 f 将输入 k 映射到隐藏状态 h,解码器 g 执行 h 到输出 r 的映射。
再举一个例子,考虑 图 6.2。该图展示了自编码器对输入图像块 k 的实际表示,它学习隐藏层 h 以输出 r。输入层 k 是图像块强度值的组合。隐藏层节点有助于将高维输入层投影到隐藏节点的低维激活值。这些隐藏节点的激活值合并在一起生成输出层 r,它是输入像素的近似。在理想情况下,隐藏层的节点数通常比输入层节点数少。因此,它们被迫以某种方式减少信息,以便仍能生成输出层。
图 6.2:该图展示了一个实际示例,说明了自编码器如何从输入像素的近似中学习输出结构。
将输入的结构复制到输出可能听起来无效,但实际上,自编码器的最终结果并不完全依赖于解码器的输出。相反,训练自编码器的主要思想是复制输入任务的有用特性,这些特性将在隐藏层中体现。
从自编码器中提取所需特征或信息的常见方法之一是将隐藏层 h 的维度限制为比输入 k 的维度 d 小的维度 d^/,即 d^/ < d。这种结果较小的维度层可以称为输入 k 的损失压缩表示。隐藏层维度小于输入维度的自编码器被称为欠完备。
如上所述的学习过程可以通过最小化损失函数 L 来数学表示,公式如下:
简单来说,L 可以定义为一个损失函数,它惩罚 g (f (k)) 与输入 k 的差异。
使用线性解码器函数,自编码器学习形成与主成分分析(PCA)程序相似的空间基础。收敛后,隐藏层将形成由训练数据集的主子空间所生成的空间基础。然而,与 PCA 不同,这些过程不一定会生成正交向量。因此,具有非线性编码器函数 f 和非线性解码器函数 g 的自编码器可以学习 PCA 更强大的非线性泛化。这最终会大大增加编码器和解码器的容量。然而,随着容量的增加,自编码器开始表现出不希望出现的行为。
它接着学习将整个输入复制,而不注意提取所需的信息。从理论上讲,一个自编码器可能是一个一维编码,但实际上,一个非常强大的非线性编码器可以学习表示每个训练示例k(i),并用代码i来表示。然后,解码器将这些整数*(i)*映射到特定训练示例的值。因此,使用具有更高容量的自编码器完全无法从输入数据集中复制仅有的有用特征。
注意
主成分分析(PCA)是一种统计方法,通过正交变换将一组可能相关的观测变量转化为一组线性相关的变量,称为主成分。在 PCA 方法中,主成分的数量小于或等于原始输入变量的数量。
类似于为欠完备自编码器提到的边缘情况问题,在该问题中,隐藏层的维度小于输入的维度,允许隐藏层或编码器的维度与输入相等的自编码器通常面临相同的问题。
一个隐藏代码维度大于输入维度的自编码器称为完备自编码器。这种类型的自编码器更加容易受到上述问题的影响。即使是线性编码器和解码器也能在不学习任何输入数据集的期望属性的情况下,完成将输入复制到输出的学习。
正则化自编码器
通过为隐藏层选择合适的维度,并根据模型分布的复杂性调整编码器和解码器的容量,任何类型架构的自编码器都可以成功构建。能够提供这种能力的自编码器被称为正则化自编码器。
除了能够将输入复制到输出的功能外,正则化自编码器还有一个损失函数,帮助模型具备其他特性。这些特性包括对缺失输入的鲁棒性、数据表示的稀疏性、表示的导数小等。即使是非线性和过完备的正则化自编码器,也能学习到关于数据分布的某些信息,而不考虑模型的容量。正则化自编码器[131]能够通过重构误差与正则化项之间的有效对立,捕捉训练分布的结构。
稀疏自编码器
分布式稀疏表示是深度学习算法中学习有用特征的关键之一。它不仅是数据表示的一种连贯模式,还帮助捕捉到大多数现实世界数据集的生成过程。在这一部分,我们将解释自编码器如何鼓励数据的稀疏性。我们将从介绍稀疏编码开始。当输入引发神经网络中相对少量的节点激活时,结合这些节点可以以稀疏的方式表示输入,那么这种编码就被称为稀疏编码。在深度学习技术中,类似的约束被用来生成稀疏编码模型,以实现常规自编码器,这些自编码器是通过名为稀疏自编码器的稀疏常数训练出来的。
稀疏编码
稀疏编码是一种无监督学习方法,用于学习过完备的基集合,以便以连贯高效的方式表示数据。稀疏编码的主要目标是确定一组向量*(n) v[i],使得输入向量k*可以表示为这些向量的线性组合。
从数学角度来看,这可以表示为如下形式:
这里*a[i]是与每个向量v[i]*相关联的系数[.]
在 PCA 的帮助下,我们可以以一种连贯的方式学习一组完整的基向量;然而,我们希望学习一组过完备的基向量来表示输入向量k ,其中n>m。拥有过完备基的原因在于,基向量通常能够捕捉到输入数据固有的模式和结构。然而,过完备性有时会引发退化问题,即通过其基,系数a[i]无法唯一标识输入向量k。因此,引入了一种额外的标准,称为稀疏性,这在稀疏编码中起到了作用。
简单来说,稀疏性可以定义为具有少量非零组件,或者具有少量不接近零的组件。如果对于给定的输入向量,非零系数的数量或远离零的系数数量较少,则称系数集合*a[i]*为稀疏。
有了对稀疏编码的基本理解后,我们可以进入下一部分,探讨稀疏编码概念如何用于自编码器,从而生成稀疏自编码器。
稀疏自编码器
当输入数据集保持一定结构,并且输入特征之间存在相关性时,即便是一个简单的自编码器算法也能够发现这些相关性。此外,在这种情况下,一个简单的自编码器最终会学习到一个低维表示,类似于主成分分析(PCA)。
这种看法基于隐藏层数量相对较少的事实。然而,通过对网络施加其他约束条件,即便是大量隐藏层的网络,依然能够从输入向量中发现所需的特征。
稀疏自编码器通常用于学习特征,以执行其他任务,如分类。对于添加了稀疏性约束的自编码器,它必须响应其训练数据集的独特统计特征,而不仅仅是充当一个恒等函数。
图 6.3:图示展示了一个典型的稀疏自编码器示例
稀疏自编码器是一种具有稀疏性约束的自编码器,它有助于引导单层网络学习隐藏层代码。该方法通过限制重构所需的代码词数来最小化重构误差。这种稀疏化算法可以视为一个分类问题,它将输入限制为单一类别值,从而帮助减少预测误差。
在本部分中,我们将通过一个简单的架构来解释稀疏自编码器。图 6.3展示了稀疏自编码器的最简单形式,包含一个隐藏层h。隐藏层h通过权重矩阵W与输入向量K相连,形成编码步骤。在解码步骤中,隐藏层h通过绑定权重矩阵W^T输出到重构向量K`。在网络中,激活函数用f表示,偏置项用b*表示。激活函数可以是任何类型:线性、Sigmoid 或 ReLU。
用于计算隐藏代码l的稀疏表示的方程式如下所示:
重构的输出是隐藏表示,通过以下方式线性映射到输出:
学习通过反向传播重构误差进行。所有参数都被优化以最小化均方误差,公式如下:
现在我们已经设置了网络,可以加入稀疏化组件,它将驱动向量L朝着稀疏表示方向发展。在这里,我们将使用 k-Sparse 自编码器来实现这一层的稀疏表示。(不要混淆 k-Sparse 表示中的k和K输入向量。为了区分它们,我们将这两者分别用小k和大K表示。)
k-Sparse 自编码器
k-Sparse 自编码器[132]是基于具有绑定权重和线性激活函数的自编码器。k-Sparse 自编码器的基本思想非常简单。在自编码器的前馈阶段,一旦我们计算出隐藏代码l = WK + b,方法就不会从所有隐藏单元重构输入,而是寻找k个最大的隐藏单元,并将其余隐藏单元的值设置为零。
还有其他方法可以确定 k 个最大的隐藏单元。通过排序隐藏单元的活动或使用 ReLU,隐藏单元的阈值会被调整,直到我们确定 k 个最大的活动。这个选择步骤用于找到 k 个最大的活动是非线性的。这个选择步骤像一个正则化器,帮助防止在通过重构输入生成输出时使用过多的隐藏单元。
如何选择稀疏性水平 k
如果我们强制使用较低的稀疏性水平,例如 k=10,在训练 k-Sparse 自编码器时可能会出现一个问题。一个常见的问题是,在前几个 epoch 中,算法会积极地开始将各个隐藏单元分配到训练样本的组中。这种现象可以与 k-means 聚类方法进行比较。在接下来的 epochs 中,这些隐藏单元会被选中并重新强化,但其他隐藏单元则不会被调整。
这个问题可以通过适当地安排稀疏性水平来解决。假设我们的目标是稀疏性水平为 10。在这种情况下,我们可以从较大的稀疏性水平开始,比如 k=100 或 k=200。因此,k-Sparse 自编码器可以训练所有的隐藏单元。逐渐地,在一个 epoch 的前半部分,我们可以将稀疏性水平从 k=100 线性地减少到 k=10。这样大大增加了选中所有隐藏单元的机会。然后,在该 epoch 的后半部分,我们将保持 k=10。通过这种方式,这种调度方法可以保证即使在低稀疏性水平下,所有的过滤器都能得到训练。
稀疏性水平的影响
在设计或实现 k-Sparse 自编码器时,k 值的选择至关重要。k 的值决定了期望的稀疏性水平,这有助于使算法适用于各种数据集。例如,一个应用可以用于预训练一个深度判别神经网络或一个浅层网络。
如果我们选择一个较大的 k 值(例如在 MNIST 数据集上 k=200),算法将倾向于识别和学习数据集的非常局部的特征。这些特征有时表现得过于初期,无法用于浅层架构的分类。浅层架构通常有一个简单的线性分类器,它实际上没有足够的架构能力来合并所有这些特征并实现显著的分类率。然而,类似的局部特征在预训练深度神经网络时非常有用。
对于较小的稀疏性水平(例如在 MNIST 数据集上 k=10),输出是通过使用较少的隐藏单元从输入重构的。这最终会导致检测到数据集中的全局特征,而不是像前面那样检测到局部特征。这些较少的局部特征适用于浅层架构的分类任务。相反,这种情况对于深度神经网络来说并不理想。
深度自编码器
到目前为止,我们讨论的只是简单自编码器的单层编码器和单层解码器。然而,具有多个编码器和解码器的深度自编码器带来了更多的优势。
前馈网络在深度增加时表现更好。自编码器本质上是前馈网络,因此,基础前馈网络的优势同样适用于自编码器。编码器和解码器是自编码器,它们也像前馈网络一样工作。因此,我们可以在这些组件中也应用前馈网络深度的优势。
在这个过程中,我们还可以讨论普适逼近定理,该定理保证了一个至少包含一层隐藏层,并且隐藏单元足够多的前馈神经网络,可以逼近任何任意函数,并且可以达到任意精度。根据这一概念,深度自编码器只要有至少一层隐藏层,并且包含足够的隐藏单元,就能逼近输入到编码的任意映射。
注意
使用一个两层网络可以逼近任何连续函数,且可以达到任意精度。在人工神经网络的数学理论中,普适逼近定理指出,如果前馈网络至少有一层隐藏层,并且隐藏单元数量是有限的,那么它可以逼近R^n的任何连续函数。
深度自编码器相比浅层架构提供了许多优势。自编码器的非平凡深度抑制了表示一些函数的计算。同时,自编码器的深度大大减少了学习这些函数所需的训练数据量。甚至通过实验发现,深度自编码器在压缩性能上优于浅层自编码器。
训练深度自编码器的常见做法是训练一系列浅层自编码器。因此,在训练深度自编码器时,常常会遇到一系列浅层自编码器。在接下来的小节中,我们将深入讨论深度自编码器的概念。
深度自编码器的训练
此处所解释的深度自编码器设计基于 MNIST 手写数字数据库。在论文[133]中,详细解释了构建和训练深度自编码器的结构化流程。训练深度自编码器的基本过程分为三个阶段:预训练、展开和微调。
-
预训练:训练深度自编码器的第一阶段是“预训练”。这一阶段的主要目的是处理二进制数据,将其推广到实值数据,并最终得出结论,表明它在各种数据集上都能良好工作。
我们已经有足够的见解,认为单层隐藏单元并不是建模大量图像结构的合适方式。深度自编码器由多个限制玻尔兹曼机层组成。在第五章,限制玻尔兹曼机中,我们提供了足够的信息来说明限制玻尔兹曼机是如何工作的。使用相同的概念,我们可以继续构建深度自编码器的结构:
图 6.4:预训练深度自编码器涉及学习一堆限制玻尔兹曼机(RBM),每个 RBM 具有一层特征检测器。一个限制玻尔兹曼机学习到的特征作为“输入数据”用于训练堆叠中的下一个 RBM。经过预训练阶段,所有 RBM 都会被展开或展开以构建深度自编码器。然后,使用误差导数的反向传播方法对深度自编码器进行微调。
当 RBM 的第一层通过数据流驱动时,该层开始学习特征检测器。这种学习可以作为下一层学习的输入数据。通过这种方式,第一层的特征检测器成为下一层限制玻尔兹曼机学习的可见单元。这个逐层学习的过程可以根据需要反复进行。这个过程在预训练深度自编码器的权重时确实非常有效。每一层捕捉到的特征具有与下方隐藏单元活动之间的高阶相关性。图 6.4的第一部分给出了这一过程的流程图。在处理基准数据集 MNIST 时,深度自编码器在每个 RBM 之后会使用二值变换。为了处理实值数据,深度自编码器在每个限制玻尔兹曼机层之后使用高斯修正变换。
图 6.5:图示表示编码器和解码器的向量数量如何在各个阶段变化。
-
展开:一旦深度自编码器的多层特征检测器经过预训练,整个模型将被展开以生成编码器和解码器网络,最初它们使用相同的权重。我们将在图像第二部分中分别解释每个部分的设计,以便更好地理解这一阶段。
-
编码器:对于一个 28x28 像素的 MNIST 数据集,网络输入的图像将是 784 个像素。根据经验法则,深度自编码器第一层的参数数量应该略大。如 图 6.4 所示,网络第一层使用了 2000 个参数。这可能听起来不太合理,因为增加输入的参数数量会增加过拟合的风险。然而,在这种情况下,增加参数数量最终会增加输入的特征,从而使得自编码器数据的解码成为可能。
-
如 图 6.4 所示,层的宽度分别为 2000、1000、500 和 30 个节点。这个现象的快照在 图 6.5 中得以展示。最终,编码器将生成一个 30 长度的向量。这个 30 个数字的向量是深度自编码器编码器的最后一层。这个编码器的大致框架如下:
-
解码器:在编码阶段结束时,得到的 30 个向量是 28x28 像素图像的编码版本。深度自编码器的第二部分是解码器阶段,它基本上学习如何解码压缩向量。因此,编码器阶段的输出(30 个向量)成为解码器阶段的输入。深度自编码器的这一部分是一个前馈网络,经过每一层后,编码的压缩向量逐渐传递到重建的输入。图 6.4 中显示的各层是 30、500、1000 和 2000。这些层最初的权重与预训练网络中的对应层相同,唯一不同的是,权重被转置,如图所示。这个编码器的大致框架如下:
因此,解码深度自编码器的一半的主要目的是学习如何重建图像。这个操作是在第二个前馈网络中进行的,且该网络也执行反向传播,这通过重建熵来实现。
-
-
微调:在微调阶段,随机活动被替换为确定性、实值概率。整个深度自编码器每一层的权重通过反向传播方法被微调,以实现最优重建。
使用 Deeplearning4j 实现深度自编码器
现在,你已经对如何使用多个限制玻尔兹曼机构建深度自编码器有了足够的了解。在本节中,我们将解释如何利用 Deeplearning4j 设计深度自编码器。
我们将使用与上一节相同的 MNIST 数据集,并保持深度自编码器的设计与之前解释的相似。
如前面例子所述,使用从原始 MNIST 数据集中的小批次 1024 个样本,可以将其拆分成 N 个 Hadoop 块。这些 N 个块将由每个工作节点并行地在 Hadoop 分布式文件系统上运行。实现深度自编码器的代码流程简单直接。
步骤如下所示:
-
在 HDFS 中按批次加载 MNIST 数据集。每个批次将包含
1024个样本。 -
开始构建模型。
-
执行编码操作。
-
执行解码操作。
-
通过调用
fit()方法训练模型。
final int numRows = 28;
设置 Hadoop 环境所需的初始配置。batchsize 被设置为 1024。
final int numColumns = 28;
int seed = 123;
int numSamples = MnistDataFetcher.NUM_EXAMPLES;
int batchSize = 1024;
int iterations = 1;
int listenerFreq = iterations/5;
将数据加载到 HDFS 中:
log.info("Load data....");
DataSetIterator iter = new MnistDataSetIterator(batchSize,numSamples,true);
我们现在已经准备好构建模型,加入受限玻尔兹曼机的层数以构建深度自编码器:
log.info("Build model....");
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(iterations)
.optimizationAlgo(OptimizationAlgorithm.LINE_GRADIENT_DESCENT)
为了创建一个具有指定层数(这里是八层)的 ListBuilder,我们调用 .list() 方法:
.list(8)
下一步是构建模型的编码阶段。可以通过将受限玻尔兹曼机(Restricted Boltzmann machine)逐步加入到模型中来完成。编码阶段包含四层受限玻尔兹曼机,每层分别有 2000、1000、500 和 30 个节点:
.layer(0, new RBM.Builder().nIn(numRows *
numColumns).nOut(2000).lossFunction(LossFunctions.LossFunction
.RMSE_XENT).build())
.layer(1, new RBM.Builder().nIn(2000).nOut(1000)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
.layer(2, new RBM.Builder().nIn(1000).nOut(500)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
.layer(3, new RBM.Builder().nIn(500).nOut(30)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
编码器后的下一阶段是解码器阶段,我们将在此阶段使用四个受限玻尔兹曼机,方法与之前相似:
.layer(4, new RBM.Builder().nIn(30).nOut(500)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
.layer(5, new RBM.Builder().nIn(500).nOut(1000)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
.layer(6, new RBM.Builder().nIn(1000).nOut(2000)
.lossFunction(LossFunctions.LossFunction.RMSE_XENT).build())
.layer(7, new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
.activation("sigmoid").nIn(2000).nOut(numRows*numColumns).build())
由于所有中间层已构建完毕,现在可以通过调用 build() 方法来构建模型:
.pretrain(true).backprop(true)
.build();
实现的最后阶段是训练深度自编码器。可以通过调用 fit() 方法来完成:
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(listenerFreq));
log.info("Train model....");
while(iter.hasNext())
{
DataSet next = iter.next();
model.fit(new DataSet(next.getFeatureMatrix(),next
.getFeatureMatrix()));
}
去噪自编码器
从输入重构输出并不总是能保证得到期望的输出,有时可能只是简单地复制输入。为避免这种情况,[134] 提出了一个不同的策略。在该提议的架构中,重构标准是基于清理部分损坏的输入来构建的,而不是在输入数据的表示上施加一些约束。
"一个好的表示是能够从损坏的输入中稳健地获得的,并且对恢复相应的干净输入是有用的。"
去噪自编码器是一种自编码器,它以损坏的数据作为输入,模型被训练以预测原始的、干净的和未损坏的数据作为输出。在本节中,我们将解释设计去噪自编码器的基本思想。
去噪自编码器的架构
去噪自编码器的主要思想是引入一个损坏过程,Q (k^/ | k),并从损坏的输入k^/重构输出r。图 6.6展示了去噪自编码器的整体表示。在去噪自编码器中,对于每个小批量的训练数据k,应该使用Q (k^/ | k)生成相应的损坏k^/。从这里来看,如果我们将初始输入视为损坏输入k^/,那么整个模型可以看作是一种基本编码器的形式。损坏的输入k^/被映射生成隐藏表示h。
因此,我们得到以下内容:
从这个隐藏表示中,可以使用r = g (h)推导出重构的输出r。去噪自编码器重新组织数据,然后尝试学习这些数据,以便重构输出。这种数据的重新组织或数据的洗牌生成了噪声,模型通过噪声学习特征,从而实现对输入的分类。在网络训练过程中,它生成一个模型,该模型通过损失函数计算该模型与基准之间的距离。其思想是最小化训练集上的平均重构误差,使输出 r 尽可能接近原始未损坏的输入k。
图 6.6:设计去噪自编码器的步骤。原始输入为 k;从 k 衍生的损坏输入表示为 k^/。最终输出表示为 r。
堆叠去噪自编码器
构建堆叠去噪自编码器以初始化深度神经网络的基本概念类似于堆叠多个限制玻尔兹曼机来构建深度置信网络或传统深度自编码器。生成损坏输入仅在每个单独层的初始去噪训练中需要,以帮助学习有用的特征提取。
一旦我们知道编码函数f来达到隐藏状态,它就可以应用于原始的、未损坏的数据,以到达下一层。通常情况下,不会施加任何损坏或噪声来生成表示,作为训练下一层的未损坏输入。堆叠去噪自编码器的一个关键功能是其逐层的无监督预训练,当输入被馈送通过时。一旦某一层经过预训练,能够对来自前一层的输入进行特征选择和提取,就可以进入下一个阶段的监督微调,类似于传统深度自编码器的情况。
图 6.7展示了设计堆叠去噪自编码器的详细表示。学习和堆叠多个去噪自编码器层的整体过程如下图所示:
图 6.7:堆叠去噪自编码器的表示
使用 Deeplearning4j 实现堆叠去噪自编码器
可以通过使用 Deeplearning4j 创建一个包含自编码器作为隐藏层的MultiLayerNetwork来构建堆叠去噪自编码器。自编码器具有一定的corruptionLevel,即噪声。
在这里,我们设置了建立模型所需的初始配置。为了演示的目的,选择了batchSize为1024个示例。输入数和输出数分别设置为1000和2。
int outputNum = 2;
int inputNum = 1000;
int iterations = 10;
int seed = 123;
int batchSize = 1024;
输入数据集的加载与在深度自编码器部分中解释的一样。因此,我们将直接跳到如何构建堆叠去噪自编码器。为了说明方法,我们采用了一个五层隐藏层的深度模型:
log.info ("Build model....");
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder ()
.seed(seed)
.gradientNormalization(GradientNormalization
.ClipElementWiseAbsoluteValue)
.gradientNormalizationThreshold (1.0)
.iterations(iterations)
.updater(Updater.NESTEROVS)
.momentum(0.5)
.momentumAfter(Collections.singletonMap(3, 0.9))
.optimizationAlgo(OptimizationAlgorithm.CONJUGATE_GRADIENT)
.list()
.layer(0, new AutoEncoder.Builder()
.nIn(inputNum)
.nOut(500)
.weightInit(WeightInit.XAVIER)
.lossFunction(LossFunction.RMSE_XENT)
以下代码表示输入数据需要被破坏的程度:
.corruptionLevel (0.3)
.build())
.layer(1, new AutoEncoder.Builder()
.nIn(500)
.nOut(250)
.weightInit(WeightInit.XAVIER).lossFunction
(LossFunction.RMSE_XENT)
.corruptionLevel(0.3)
.build())
.layer(2, new AutoEncoder.Builder()
.nIn(250)
.nOut(125)
.weightInit(WeightInit.XAVIER).lossFunction
(LossFunction.RMSE_XENT)
.corruptionLevel(0.3)
.build())
.layer(3, new AutoEncoder.Builder()
.nIn(125)
.nOut(50)
.weightInit(WeightInit.XAVIER).lossFunction
(LossFunction.RMSE_XENT)
.corruptionLevel(0.3)
.build())
.layer(4, new OutputLayer.Builder
(LossFunction.NEGATIVELOGLIKELIHOOD)
.activation("softmax")
.nIn(75)
.nOut(outputNum)
.build())
.pretrain(true)
.backprop(false)
.build();
一旦模型建立完成,就通过调用fit()方法进行训练:
try {
model.fit(iter);
}
catch(Exception ex)
{
ex.printStackTrace();
}
自编码器的应用
自编码器可以成功应用于许多场景,因此,在深度学习领域获得了广泛的关注。在本节中,我们将讨论自编码器的重要应用和用途:
-
维度降维:如果你记得,在第一章《深度学习简介》中,我们介绍了“维度灾难”这一概念。维度降维是深度学习的最初应用之一。自编码器最初的研究就是为了克服维度灾难的问题。从本章内容,我们已经对深度自编码器如何在高维数据上工作并在最终输出中减少维度有了大致的了解。
-
信息检索:自编码器的另一个重要应用是在信息检索中。信息检索基本上是指在数据库中搜索与输入查询匹配的条目。在高维数据中进行搜索通常是一项繁琐的任务;然而,通过降低数据集的维度,某些低维数据的搜索可以变得非常高效。自编码器所获得的维度降维可以生成低维且具有二进制性质的编码。这些编码可以存储在键值存储数据结构中,其中键是二进制代码向量,值是相应的条目。这样的键值存储帮助我们通过返回与查询匹配的二进制代码的所有数据库条目来执行信息检索。通过降维和二进制编码来检索信息的这种方法被称为语义哈希[135]。
-
图像搜索:正如在深度自编码器部分所解释的,深度自编码器能够将高维图像数据集压缩成非常小的向量,例如 30 个。因此,这使得对高维图像的图像搜索变得更加容易。一旦上传图像,搜索引擎会将其压缩成小向量,然后将该向量与索引中的其他所有向量进行比较。对于搜索查询,将返回包含相似数字的向量,并转换为映射的图像。
总结
自编码器是最受欢迎且广泛应用的生成模型之一,本章对此进行了讨论。自编码器基本上帮助完成两个阶段:一个是编码阶段,另一个是解码阶段。在本章中,我们对这两个阶段进行了详细的数学解释。接下来,我们介绍了一种特殊类型的自编码器,称为稀疏自编码器。我们还讨论了自编码器如何在深度神经网络的世界中使用,通过解释深度自编码器来说明。深度自编码器由限制玻尔兹曼机的层组成,它们参与了网络的编码和解码阶段。我们解释了如何使用 Deeplearning4j 部署深度自编码器,通过将输入数据集的块加载到 Hadoop 分布式文件系统中。本章后面,我们介绍了最流行的自编码器形式——去噪自编码器及其深度网络版本,称为堆叠去噪自编码器。还展示了如何使用 Deeplearning4j 实现堆叠去噪自编码器。我们通过概述自编码器的常见应用来总结本章内容。
在下一章中,我们将借助 Hadoop 讨论一些常见的深度学习实用应用。
第七章. 使用 Hadoop 的杂项深度学习操作
| “在开拓者时代,他们使用牛来进行重型牵引,当一头牛无法移动一根原木时,他们不会试图养一头更大的牛。我们不应该追求更大的计算机,而是应该追求更多的计算机系统。” | ||
|---|---|---|
| --格蕾丝·霍普 |
到目前为止,本书讨论了各种深度神经网络模型及其概念、应用和在分布式环境中的实现。我们还解释了为什么集中式计算机难以存储和处理大量数据,并使用这些模型提取信息。Hadoop 被用于克服大规模数据带来的限制。
随着我们已进入本书的最后一章,本章将主要讨论三种最常用的机器学习应用的设计。我们将解释使用 Hadoop 框架进行大规模视频处理、大规模图像处理和自然语言处理的一般概念。
本章的组织结构如下:
-
使用 Hadoop 进行大规模分布式视频处理
-
使用 Hadoop 进行大规模图像处理
-
使用 Hadoop 进行自然语言处理
数字世界中大量的视频正在为近年来产生的大数据贡献着巨大的份额。在第二章《分布式深度学习与大规模数据》中,我们讨论了如何将数百万个视频上传到各种社交媒体网站,如 YouTube 和 Facebook。除此之外,安装在各大商场、机场或政府机构中的监控摄像头也会每天生成大量的视频。由于这些视频占用巨大的存储空间,大多数视频通常以压缩格式存储。在许多企业中,监控摄像头全天运行,随后存储重要的视频,以备将来调查。
这些视频包含了隐藏的“热数据”或信息,需要迅速处理和提取。因此,处理和分析这些大规模视频已经成为数据爱好者的优先事项之一。此外,在许多不同的研究领域,如生物医学工程、地质学和教育研究等,都需要处理这些大规模视频,并将它们提供给不同地点进行详细分析。
在本节中,我们将探讨使用 Hadoop 框架处理大规模视频数据集的问题。大规模视频处理的主要挑战是将视频从压缩格式转码为非压缩格式。因此,我们需要一个分布式视频转码器,它将视频写入 Hadoop 分布式文件系统(HDFS),并行解码比特流块,生成序列文件。
当 HDFS 中的输入数据块被处理时,每个 mapper 进程分别访问每个分片中的行。然而,在大规模视频数据集的情况下,当它被分割成多个预定义大小的块时,每个 mapper 进程应该单独解释这些位流块。然后,mapper 进程将提供对解码后的视频帧的访问,以供后续分析。在以下小节中,我们将讨论如何将包含视频位流的 HDFS 中的每个块转码成图像集,以便进行进一步的分析。
Hadoop 中的分布式视频解码
大多数流行的视频压缩格式,如 MPEG-2 和 MPEG-4,遵循位流中的分层结构。在这一小节中,我们假设使用的压缩格式具有分层结构。为简单起见,我们将解码任务分为两个不同的 Map-reduce 作业:
-
提取视频序列级别信息:一开始就可以很容易预测,所有视频数据集的头信息可以在数据集的第一个块中找到。在这个阶段,map-reduce 作业的目的是从视频数据集的第一个块中收集序列级别信息,并将结果输出为 HDFS 中的文本文件。序列头信息对于设置解码器对象的格式是必需的。
对于视频文件,应实现一个新的
FileInputFormat,并具有自己的记录读取器。每个记录读取器将以这种格式向每个 map 过程提供<key, value>对:<LongWritable, BytesWritable>。输入键表示文件中的字节偏移量;与BytesWritable对应的值是一个字节数组,包含整个数据块的视频位流。对于每个 map 过程,键值与
0进行比较,以确定它是否是视频文件的第一个块。一旦确定了第一个块,位流将被解析以确定序列级别信息。然后,这些信息将被转储到.txt文件中,并写入 HDFS。我们将该.txt文件的名称表示为input_filename_sequence_level_header_information.txt。由于只有 map 过程可以为我们提供所需的输出,因此此方法的 reducer 数量设置为0。注意
假设有一个包含以下数据的文本文件:深度学习 与 Hadoop 现在,第一行的偏移量为
0,Hadoop 作业的输入将是<0,深度学习>,第二行的偏移量将是<14,与 Hadoop>。每当我们将文本文件传递给 Hadoop 作业时,它会内部计算字节偏移量。 -
解码并转换视频块为序列文件:这个 Map-reduce 任务的目的是解码每个视频数据集的块,并生成相应的序列文件。序列文件将包含每个视频块的解码视频帧,格式为 JPEG。
InputFileFormat文件和记录读取器应与第一个 Map-reduce 任务保持一致。因此,mapper 输入的<key, value>对是<LongWritable, BytesWritable>。Hadoop 分布式视频解码图 7.1:Hadoop 视频解码的整体表示
-
在第二阶段,第一次任务的输出作为第二次 Map-reduce 任务的输入。因此,这个任务的每个 mapper 将读取 HDFS 中的序列信息文件,并将此信息与以
BytesWritable输入形式传入的位流缓冲区一起传递。 -
map 过程基本上将解码的视频帧转换为 JPEG 图像,并生成
<key, value>对,作为 map 过程的输出。该输出的 key 编码了输入视频文件名和块编号,格式为video_filename_block_number。对应于此 key 的输出值是BytesWritable,它存储了解码视频块的 JPEG 位流。 -
然后,reducers 会将数据块作为输入,并将解码的帧简单地写入包含 JPEG 图像的序列文件中,作为输出格式进行进一步处理。一个简单的格式和整个过程的概览如 图 7.1 所示。我们使用一个输入视频
sample.m2v进行说明。此外,在本章中,我们将讨论如何使用 HDFS 处理大规模的图像文件(来自序列文件)。
注意
Mapper 的输入
<key,value>:<LongWritable, BytesWritable>例如:
<17308965, BytesWritable>Mapper 输出的<key,value>:<Text, BytesWritable>例如:<sample.m2v_3, BytesWritable> -
使用 Hadoop 进行大规模图像处理
我们在前面的章节中已经提到,图像的大小和数量正日益增加;存储和处理这些庞大的图像对于集中式计算机来说是一项挑战。我们来考虑一个实际的例子,以便更好地理解这种情况。假设我们有一张尺寸为 81025 像素 x 86273 像素的大规模图像。每个像素由三个值组成:红色、绿色和蓝色。假设每个值需要使用 32 位精度的浮动点数来存储。那么,该图像的总内存消耗可以通过以下公式计算:
86273 * 81025 * 3 * 32 位 = 78.12 GB
抛开对图像进行任何后处理,因为可以清楚地得出结论,传统计算机甚至无法将如此大量的数据存储在其主内存中。即使一些高级计算机具有更高的配置,但考虑到投资回报率,大多数公司并不选择这些计算机,因为它们的购买和维护成本过于昂贵。因此,适当的解决方案应该是使用通用硬件来运行这些图像,以便图像能够存储在其内存中。在本节中,我们将解释如何使用 Hadoop 以分布式方式处理这些大量图像。
Map-Reduce 作业的应用
在本节中,我们将讨论如何使用 Map-reduce 作业和 Hadoop 来处理大型图像文件。在作业开始之前,所有待处理的输入图像将被加载到 HDFS 中。在操作过程中,客户端发送一个作业请求,该请求经过 NameNode。NameNode 从客户端接收该请求,搜索其元数据映射,然后将文件系统的数据块信息以及数据块的位置发送回客户端。一旦客户端获得了数据块的元数据,它会自动访问存储该数据块的 DataNodes,然后通过适用的命令处理该数据。
用于大规模图像处理的 Map-reduce 作业主要负责控制整个任务。基本上,在这里我们解释了可执行 shell 脚本文件的概念,该文件负责从 HDFS 中收集可执行文件的输入数据。
使用 Map-reduce 编程模型的最佳方式是设计我们自己的 Hadoop 数据类型,用于直接处理大量图像文件。系统将使用 Hadoop Streaming 技术,帮助用户创建和运行特殊类型的 Map-reduce 作业。这些特殊类型的作业可以通过前面提到的可执行文件来执行,该文件将充当映射器或化简器。程序的映射器实现将使用一个 shell 脚本来执行必要的操作。这个 shell 脚本负责调用图像处理的可执行文件。这些图像文件列表作为输入传递给这些可执行文件,进行进一步处理。该处理的结果或输出稍后会写回到 HDFS 中。
因此,输入的图像文件应首先写入 HDFS,然后在 Hadoop Streaming 的输入目录中生成一个文件列表。该目录将存储文件列表的集合。文件列表的每一行将包含要处理的图像文件的 HDFS 地址。Mapper 的输入是Inputsplit类,这是一个文本文件。Shell 脚本管理器逐行读取文件并从元数据中检索图像。接着,它调用图像处理可执行文件进一步处理图像,然后将结果写回 HDFS。因此,Mapper 的输出就是最终所需的结果。Mapper 完成了所有工作,包括从 HDFS 检索图像文件、图像处理,然后将其写回 HDFS。该过程中的 Reducer 数量可以设置为零。
这是一个使用 Hadoop 按二进制图像处理方法处理大量图像的简单设计。其他复杂的图像处理方法也可以部署来处理大规模的图像数据集。
使用 Hadoop 进行自然语言处理
网络信息的指数增长增加了大规模非结构化自然语言文本资源的传播强度。因此,在过去几年中,提取、处理和共享这些信息的兴趣显著增加。在规定的时间内处理这些知识源已成为各个研究和商业行业面临的主要挑战。在这一部分,我们将描述使用 Hadoop 以分布式方式爬取网页文档、发现信息并运行自然语言处理的过程。
为了设计自然语言处理(NLP)的架构,首先要进行的任务是从大规模非结构化数据中提取标注的关键词和关键短语。为了在分布式架构上执行 NLP,可以选择 Apache Hadoop 框架,因为它提供了高效且可扩展的解决方案,并且能改善故障处理和数据完整性。大规模网页爬虫可以被设置为从 Web 中提取所有非结构化数据并将其写入 Hadoop 分布式文件系统以供进一步处理。为了执行特定的 NLP 任务,我们可以使用开源的 GATE 应用程序,如论文[136]所示。分布式自然语言处理架构的初步设计概览如图 7.2所示。
为了分配网络爬虫的工作,可以使用 Map-reduce 并在多个节点上运行。NLP 任务的执行以及最终输出的写入都是通过 Map-reduce 来完成的。整个架构将依赖于两个输入文件:i)存储在 seed_urls.txt 中的用于抓取特定网页的 seedurls,ii)NLP 应用程序的路径位置(例如 GATE 的安装位置)。网络爬虫将从 .txt 文件中获取 seedurls,并为这些 URL 并行运行爬虫。异步地,一个提取插件将在抓取的网页上搜索关键词和关键短语,并与网页一起独立执行。在最后一步,一个专用程序会根据需求将提取的关键词和关键短语存储在外部 SQL 数据库或 NoSQL 数据库中,如 Elasticsearch。架构中提到的所有这些模块将在以下子章节中进行描述。
网络爬虫
为了解释这一阶段,我们不打算深入讨论,因为这几乎超出了本书的范围。网络爬虫有几个不同的阶段。第一阶段是 URL 发现阶段,该过程将每个种子 URL 作为 seed_urls.txt 文件的输入,并通过分页 URL 来发现相关的 URL。这个阶段定义了下一阶段要抓取的 URL 集合。
下一阶段是抓取 URL 页面内容并保存在磁盘中。操作是按段进行的,每个段包含一定数量的预定义 URL。操作将在不同的 DataNode 上并行执行。各个阶段的最终结果将保存在 Hadoop 分布式文件系统中。关键词提取器将在这些保存的页面内容上工作,为下一阶段做准备。
图 7.2:展示了自然语言处理在 Hadoop 中的执行过程,下一阶段将会获取这些数据。下一阶段是抓取 URL 页面内容并保存在磁盘中。该操作是按段进行的,每个段包含一定数量的预定义 URL。操作将在不同的 DataNode 上并行执行。各个阶段的最终结果将保存在 Hadoop 分布式文件系统中。关键词提取器将在这些保存的页面内容上工作,为下一阶段做准备。
关键词提取和自然语言处理模块
对于每个 URL 的页面内容,创建并存储一个 文档对象模型 (DOM) 回到 HDFS 中。在 DOM 中,文档具有类似树的逻辑结构。通过使用 DOM,可以编写 xpath 来收集自然语言处理阶段所需的关键词和短语。在本模块中,我们将定义 Map-reduce 作业来执行下一阶段的自然语言处理应用程序。定义的 map 函数是一个 <key, value> 对,key 是 URL,value 是该 URL 对应的 DOM。reduce 函数将执行自然语言处理部分的配置和执行。接下来的关键词和短语在网页域级别的估算将在 reduce 方法中执行。为此,我们可以编写一个自定义插件来生成规则文件,通过执行各种字符串操作,过滤掉从提取文本中获得的噪声和不需要的词汇。规则文件可以是 JSON 文件或任何其他易于加载和解析的文件,具体取决于用例。通常,我们将常见的名词和形容词识别为文本中的常见关键词。
从页面估算相关关键词
论文 [136] 提出了一个非常重要的公式,用于从网页文档中找到相关的关键词和关键短语。他们提供了 词频 - 逆文档频率 (TF-IDF) 度量,用于从整个语料库中估算相关信息,语料库由属于同一网页域的所有文档和页面组成。计算 TF-IDF 的值并为丢弃其他关键词设定阈值,使我们能够从语料库中生成最相关的词语。换句话说,它丢弃了可能在文本中出现频率较高的常见冠词和连词,这些词通常不包含任何有意义的信息。TF-IDF 度量本质上是两个函数 TF 和 IDF 的乘积。
TF 提供了每个词在语料库中的频率,即一个词在语料库中出现的次数。而 IDF 起到了平衡作用,对于在整个语料库中出现频率较低的词,给出较高的值。
从数学上讲,关键词或关键短语 i 在文档 d 中的 TF-IDF 度量公式如下:
(TF-IDF)[i] = TF[i] . IDF[i]
这里 TF[i] = f[i]/n[d] 和 IDF[i] = log N[d]/N[i]
这里的 f[i] 是候选关键词或关键短语 i 在文档 d 中的频率,n[d] 是文档 d 中的总词数。在 IDF 中,N[D] 表示语料库 D 中的文档总数,而 N[i] 表示包含关键词或关键短语 i 的文档数量。
根据使用案例,应该为TF-IDF定义一个通用的阈值频率。对于一个关键字或关键短语i,如果TF-IDF的值超过阈值,该关键字或关键短语将被接受并直接写入 HDFS。另一方面,如果相应的值低于阈值,则该关键字将从最终集合中删除。通过这种方式,最终所有所需的关键字将被写入 HDFS。
总结
本章讨论了机器学习中最广泛使用的应用程序以及如何在 Hadoop 框架中设计它们。首先,我们从一个大型视频集开始,展示了如何在 HDFS 中解码视频,并将其转换为包含图像的序列文件,以便后续处理。接下来,本章讨论了大规模图像处理。用于此目的的 mapper 有一个 shell 脚本,执行所有必要的任务。因此,不需要 reducer 来执行此操作。最后,我们讨论了如何将自然语言处理模型部署到 Hadoop 中。
附录 1. 参考文献
[1] Hsu, F.-H. (2002). 《深蓝背后:打造击败世界象棋冠军的计算机》. 普林斯顿大学出版社,普林斯顿,新泽西州,美国。 [2] Geoffrey E. Hinton, Simon Osindero, 和 Yee-Whye Teh. 2006 年. 《深度信念网络的快速学习算法》。神经计算,18(7)(2006 年 7 月),1527-1554。 [3] Bengio, Yoshua,等人. "深度网络的贪心层训练"。《神经信息处理系统进展》 19 (2007): 153。 [4] Krizhevsky, Alex, Ilya Sutskever 和 Geoffrey E. Hinton. "使用深度卷积神经网络进行 ImageNet 分类。"《神经信息处理系统进展》,2012 年。 [5] 《机器学习》,Tom Mitchell,McGraw Hill,1997 年。 [6] 《机器学习:一种概率视角》(自适应计算与机器学习系列),Kevin P. Murphy [7] O. Chapelle,B. Scholkopf 和 A. Zien 主编,"半监督学习(Chapelle,O. 等人,主编;2006 年)[书评]",《IEEE 神经网络学报》,第 20 卷,第 3 期,542-542 页,2009 年 3 月。 [8] Y. Bengio. 《为人工智能学习深度架构》。载于《机器学习基础与趋势》,2(1):1–127,2009 年。 [9] G. Dahl,D. Yu,L. Deng 和 A. Acero. "基于上下文的 DBNHMMs 在大词汇量连续语音识别中的应用"。国际声学、语音与信号处理会议(ICASSP)论文集,2011 年。 [10] A. Mohamed,G. Dahl 和 G. Hinton. "使用深度信念网络进行声学建模"。《IEEE 音频、语音与语言处理学报》,20(1),2012 年 1 月。 [11] A. Mohamed,D. Yu 和 L. Deng. "深度信念网络全序列训练在语音识别中的应用研究"。国际语音学会会议论文集,2010 年。 [12] Indyk, Piotr 和 Rajeev Motwani. "近似最近邻:消除维度灾难的尝试"。第 30 届 ACM 计算理论年会论文集,ACM,1998 年。 [13] Friedman, Jerome H. "关于偏差、方差、0/1 损失和维度灾难"。《数据挖掘与知识发现》 1.1 (1997): 55-77。 [14] Keogh, Eamonn 和 Abdullah Mueen. "维度灾难"。《机器学习百科全书》,Springer US,2011 年,257-258 页。 [15] Hughes, G.F. (1968 年 1 月). "关于统计模式识别器的平均准确率"。《IEEE 信息理论学报》,14(1): 55–63。 [16] Bengio, Yoshua, Patrice Simard 和 Paolo Frasconi. "使用梯度下降学习长期依赖关系是困难的"。《IEEE 神经网络学报》5.2 (1994): 157-166。
[17] Ivakhnenko, Alexey (1965). Cybernetic Predicting Devices. Kiev: Naukova Dumka. [18] Ivakhnenko, Alexey (1971). "Polynomial theory of complex systems". IEEE Transactions on Systems, Man and Cybernetics (4): 364–378. [19] X. Glorot 和 Y. Bengio。理解深度前馈神经网络训练的困难。在人工智能和统计学会议论文集(AISTATS)中的论文。2010 年。[20] G. Hinton 和 R. Salakhutdinov。利用神经网络减少数据的维度。科学,313(5786):504–507,2006 年 7 月[21] M. Ranzato, C. Poultney, S. Chopra 和 Y. LeCun。利用基于能量的模型高效学习稀疏表示。在神经信息处理系统(NIPS)会议论文集中。2006 年。[22] I. Goodfellow, M. Mirza, A. Courville 和 Y. Bengio。多预测深度玻尔兹曼机。在神经信息处理系统(NIPS)会议论文集中。2013 年。[23] R. Salakhutdinov 和 G. Hinton。深度玻尔兹曼机。在人工智能和统计学会议(AISTATS)论文集中。2009 年。[24] R. Salakhutdinov 和 G. Hinton。预训练深度玻尔兹曼机的更好方法。在神经信息处理系统(NIPS)会议论文集中。2012 年。[25] N. Srivastava 和 R. Salakhutdinov。多模态学习与深度玻尔兹曼机。在神经信息处理系统(NIPS)会议论文集中。2012 年。[26] H. Poon 和 P. Domingos。总-产品网络:一种新的深度架构。在不确定性人工智能会议论文集中。2011 年。[27] R. Gens 和 P. Domingo。总-产品网络的判别学习。神经信息处理系统(NIPS),2012 年。[28] R. Gens 和 P. Domingo。总-产品网络的判别学习。神经信息处理系统(NIPS),2012 年。[29] S. Hochreiter。动态神经网络研究。技术大学慕尼黑,计算机学院,1991 年。毕业论文。[30] J.Martens。使用无 Hessian 优化的深度学习。在国际机器学习大会(ICML)论文集中。2010 年。[31] Y. Bengio。代表性的深度学习:展望。在统计语言和语音处理中,页 1–37。斯普林格出版社,2013 年。[32] I. Sutskever。训练递归神经网络。多伦多大学,博士论文,2013 年。[33] J. Ngiam, Z. Chen, P. Koh 和 A. Ng。学习深度能量模型。在国际机器学习大会(ICML)论文集中。2011 年。[34] Y. LeCun, S. Chopra, M. Ranzato 和 F. Huang。文件识别和计算机视觉中的基于能量的模型。在国际文档分析和识别大会(ICDAR)论文集中。2007 年。[35] R. Chengalvarayan 和 L. Deng。利用最小分类错误学习进行语音轨迹判别。IEEE 语音和音频处理交易,6(6):505–515,1998 年。
[36] M. Gibson 和 T. Hain. 错误逼近与最小电话错误声学模型估计。IEEE 音频、语音与语言处理学报,18(6):1269–1279,2010 年 8 月。[37] X. He, L. Deng 和 W. Chou. 序列模式识别中的判别学习—面向优化的语音识别统一综述。IEEE 信号处理杂志,25:14–36,2008 年。[38] H. Jiang 和 X. Li. 使用凸优化的统计模型参数估计:一种面向语音和语言处理的先进判别训练方法。IEEE 信号处理杂志,27(3):115–127,2010 年。[39] B.-H. Juang, W. Chou 和 C.-H. Lee. 语音识别的最小分类错误率方法。IEEE 语音与音频处理学报,5:257–265,1997 年。[40] D. Povey 和 P. Woodland. 最小电话错误与 I 平滑用于改进判别训练。在国际声学、语音与信号处理会议(ICASSP)上发表,2002 年。[41] D. Yu, L. Deng, X. He 和 X. Acero. 面向大规模语音识别任务的“大间隔最小分类错误训练”。在国际声学、语音与信号处理会议(ICASSP)上发表,2007 年。[42] A. Robinson. 循环神经网络在电话概率估计中的应用。IEEE 神经网络学报,5:298–305,1994 年。[43] A. Graves. 使用循环神经网络的序列转导。国际机器学习会议(ICML)表征学习研讨会,2012 年。[44] A. Graves, S. Fernandez, F. Gomez 和 J. Schmidhuber. 连接主义时序分类:使用循环神经网络标注未分段序列数据。在国际机器学习会议(ICML)上发表,2006 年。[45] A. Graves, N. Jaitly 和 A. Mohamed. 使用深度双向 LSTM 的混合语音识别。在自动语音识别与理解研讨会(ASRU)上发表,2013 年。[46] A. Graves, A. Mohamed 和 G. Hinton. 使用深度循环神经网络的语音识别。在国际声学、语音与信号处理会议(ICASSP)上发表,2013 年。[47] K. Lang, A. Waibel 和 G. Hinton. 用于孤立词识别的时延神经网络架构。神经网络,3(1):23–43,1990 年。[48] A. Waibel, T. Hanazawa, G. Hinton, K. Shikano 和 K. Lang. 使用时延神经网络的音素识别。IEEE 声学、语音与信号处理学报,37:328–339,1989 年。[50] Moore, Gordon E. (1965-04-19). "将更多组件集成到集成电路中"。电子学。2016-07-01 检索。[51] www.emc.com/collateral/analyst-reports/idc-the-digital-universe-in-2020.pdf [52] D. Beaver, S. Kumar, H. C. Li, J. Sobel 和 P. Vajgel, “在干草堆中找针:Facebook 的照片存储”,在 OSDI,2010 年,第 47-60 页。[53] Michele Banko 和 Eric Brill. 2001 年。大规模语料库在自然语言歧义消解中的扩展。在第 39 届计算语言学年会(ACL '01)上发表。计算语言学协会,美国宾夕法尼亚州斯特劳兹堡,26-33 页。[54] www.huffingtonpost.in/entry/big-data-and-deep-learnin_b_3325352 [55] X. W. Chen 和 X. Lin, "大数据深度学习:挑战与展望," 在 IEEE Access,第 2 卷,第 X 期,514-525 页,2014 年。[56] Bengio Y, LeCun Y (2007) 将学习算法扩展至人工智能。In: Bottou L, Chapelle O, DeCoste D, Weston J (编). 大规模核机器。麻省理工学院出版社,美国剑桥,第 34 卷。第 321–360 页。www.iro.umontreal.ca/~lisa/pointeurs/bengio+lecun_chapter2007.pdf [57] A. Coats, B. Huval, T. Wng, D. Wu 和 A. Wu, “使用 COTS HPS 系统的深度学习,”J. Mach. Learn. Res., 第 28 卷,第 3 期,第 1337-1345 页,2013 年。[58] J.Wang 和 X. Shen, "大间隔半监督学习," J. Mach. Learn. Res., 第 8 卷,第 8 期,第 1867-1891 页,2007 年。[59] R. Fergus, Y. Weiss 和 A. Torralba, “在庞大的图像集合中进行半监督学习”,在 NIPS 会议论文集(2009 年)中,第 522-530 页。[60] J. Ngiam, A. Khosla, M. Kim, J. Nam, H. Lee 和 A. Ng, “多模态深度学习”,在第 28 届国际机器学习大会(2011 年)上发表,美国华盛顿州贝尔维尤。[61] N. Srivastava 和 R. Salakhutdinov, “使用深度玻尔兹曼机的多模态学习”,在 NIPS 会议论文集(2012 年)中发表。[62] L. Bottou, “在线算法与随机逼近”,在《神经网络中的在线学习》,D. Saad(编)。剑桥大学出版社,英国剑桥,1998 年。[63] A. Blum 和 C. Burch, “在线学习与度量任务系统问题”,在第 10 届计算学习理论年会(1997 年)上发表,第 45-53 页。[64] N. Cesa-Bianchi, Y. Freund, D. Helmbold 和 M. Warmuth, “在线预测与对话策略”,在欧罗科尔特计算学习理论会议论文集,第 53 卷。英国牛津,1994 年,第 205-216 页。[65] Y. Freund 和 R. Schapire, “博弈论、在线预测与提升”,在第 9 届计算学习理论年会(1996 年)上发表,第 325-332 页。[66] Q. Le 等,“使用大规模无监督学习构建高级特征”,在国际机器学习会议论文集,2012 年。[67] C. P. Lim 和 R. F. Harrison, “使用多个神经网络系统的在线模式分类:一项实验研究”,IEEE 系统、人工智能与控制学报,C 卷,33(2):235-247,2003 年 5 月。[68] P. Riegler 和 M. Biehl, “两层神经网络中的在线反向传播”,J. Phys. A,第 28 卷,第 20 期,第 L507-L513 页,1995 年。[69] M. Rattray 和 D. Saad, “多层神经网络的全局最优在线学习规则”,J. Phys. A,数学一般,第 30 卷,第 22 期,第 L771-776 页,1997 年。
[70] P. Campolucci, A. Uncini, F. Piazza 和 B. Rao,针对局部递归神经网络的在线学习算法,''IEEE Trans. Neural Netw.,第 10 卷,第 2 期,页 253-271,1999 年 3 月。[71] N. Liang, G. Huang, P. Saratchandran 和 N. Sundararajan,一种快速且准确的前馈网络在线顺序学习算法,''IEEE Trans. Neural Netw.,第 17 卷,第 6 期,页 1411-1423,2006 年 11 月。[72] L. Bottou 和 O. Bousequet,神经网络中的随机梯度学习,''在 Neuro-Nimes 会议论文集,1991 年。[73] S. Shalev-Shwartz, Y. Singer 和 N. Srebro,Pegasos:SVM 的原始估计子梯度求解器,''在国际机器学习会议论文集,2007 年。[74] D. Scherer, A. Müller 和 S. Behnke,卷积架构中池化操作的评估用于物体识别,''在国际人工神经网络会议论文集,2010 年,页 92-101。[75] J. Chien 和 H. Hsieh,使用顺序和变分贝叶斯学习进行非平稳源分离,''IEEE Trans. Neural Netw. Learn. Syst.,第 24 卷,第 5 期,页 681-694,2013 年 5 月。[76] W. de Oliveira,``Rosenblatt 贝叶斯算法在非平稳环境中的学习,''IEEE Trans. Neural Netw.,第 18 卷,第 2 期,页 584-588,2007 年 3 月。[77] Hadoop 分布式文件系统,hadoop.apache.org/2012。[78] T. White. 2009 年. 《Hadoop:权威指南》。O'Reilly Media, Inc. 2009 年 6 月。[79] Shvachko, K.; Hairong Kuang; Radia, S.; Chansler, R.,2010 年 5 月. 《Hadoop 分布式文件系统》,2010 年 IEEE 第 26 届大容量存储系统与技术研讨会(MSST)。卷,无,页 1,10。[80] Hadoop 分布式文件系统,hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/。[81] Dev, Dipayan 和 Ripon Patgiri. "Dr. Hadoop: 一种无限可扩展的 Hadoop 元数据管理——小象如何变得永生。" 《信息技术与电子工程前沿》17(2016 年):15-31。[82] deeplearning4j.org/ [83] Dean, Jeffrey 和 Sanjay Ghemawat. "MapReduce: 简化大规模集群数据处理。" 《ACM 通讯》51.1(2008 年):107-113。[84] deeplearning.net/software/theano/ [85] torch.ch/ [86] Borthakur, Dhruba. "Hadoop 分布式文件系统:架构与设计。" Hadoop 项目网站 11.2007(2007 年):21。[87] Borthakur, Dhruba. "HDFS 架构指南。" HADOOP APACHE PROJECT hadoop.apache.org/docs/r1.2.1/hdfs_design.pdf(2008 年):39。[88] deeplearning4j.org/quickstart
[89] LeCun, Yann 和 Yoshua Bengio。"用于图像、语音和时间序列的卷积网络。"大脑理论和神经网络手册 3361.10(1995 年):1995。 [90] LeCun, Y.、Bottou, L.、Bengio, Y.和 Haffner, P.(1998)。基于梯度的文档识别应用学习。IEEE 86, 2278-2324。doi:10.1109/5.726791 [91] Gao, H.、Mao, J.、Zhou, J.、Huang, Z.、Wang, L.和 Xu, W.(2015)。您在与机器交谈吗?多语言图像问答的数据集和方法。arXiv 预印本 arXiv:1505.05612。 [92] Srinivas, Suraj 等人。"计算机视觉深度卷积神经网络的分类学。"arXiv 预印本 arXiv:1601.06615(2016)。 [93] Zhou, Y-T.等人。"使用神经网络进行图像恢复。"IEEE 声学、语音和信号处理期刊 36.7(1988):1141-1151。 [94] Maas, Andrew L.、Awni Y. Hannun 和 Andrew Y. Ng。"整流器非线性改进神经网络声学模型。"Proc. ICML。Vol. 30。No. 1。2013。 [95] He, Kaiming 等人。"深入研究整流器:超越图像分类上的人类水平性能。"IEEE 国际计算机视觉会议论文集。2015。 [96] web.engr.illinois.edu/~slazebni/spring14/lec24_cnn.pdf [97] Zeiler, Matthew D.和 Rob Fergus。"可视化和理解卷积网络。"欧洲计算机视觉会议。斯普林格国际出版社,2014 年。 [98] Simonyan, Karen 和 Andrew Zisserman。"用于大规模图像识别的非常深的卷积网络。"arXiv 预印本 arXiv:1409.1556(2014)。 [99] Szegedy, Christian 等人。"通过卷积更深入地挖掘。"IEEE 计算机视觉与模式识别会议论文集。2015。 [100] He, Kaiming 等人。"用于图像识别的深度残余学习。"arXiv 预印本 arXiv:1512.03385(2015)。 [101] Krizhevsky, Alex。"并行化卷积神经网络的一个奇怪的技巧。"arXiv 预印本 arXiv:1404.5997(2014)。 [102] S. Hochreiter 和 J. Schmidhuber。长短期记忆。神经计算,9(8):1735-1780,1997。 [103] Mikolov, Tomas 等人。"基于递归神经网络的语言模型。"Interspeech。Vol. 2。2010。 [104] Rumelhart, D. E.、Hinton, G. E.和 Williams, R. J.(1986)。通过反向传播学习表示。自然,323,533-536。 [105] Mikolov, T.、Sutskever, I.、Chen, K.、Corrado, G.和 Dean, J.(2013a)。单词和短语的分布式表示及其组合性。在神经信息处理系统 26 的进展中,页面 3111-3119。 [106] Graves, A.(2013)。使用递归神经网络生成序列。arXiv:1308.0850 [cs.NE]。 [107] Pascanu, R.、Mikolov, T.和 Bengio, Y.(2013a)。训练递归神经网络的困难。在 ICML’2013。
[108] Mikolov, T., Sutskever, I., Deoras, A., Le, H., Kombrink, S., 和 Cernocky, J. (2012a)。使用神经网络的子词语言建模。未发表的[109] Graves, A., Mohamed, A., 和 Hinton, G. (2013)。深度递归神经网络的语音识别。ICASSP[110] Graves, A., Liwicki, M., Fernandez, S., Bertolami, R., Bunke, H., 和 Schmidhuber, J. (2009)。一种新型的连接主义系统,用于改善无约束手写识别。IEEE 模式分析与机器智能汇刊。[111] karpathy.github.io/2015/05/21/rnn-effectiveness/ [112] web.stanford.edu/group/pdplab/pdphandbook/handbookch8.html [113] Schuster, Mike, 和 Kuldip K. Paliwal。"双向递归神经网络"。IEEE 信号处理汇刊 45.11 (1997): 2673-2681。[114] Graves, Alan, Navdeep Jaitly, 和 Abdel-rahman Mohamed。"基于深度双向 LSTM 的混合语音识别"。自动语音识别与理解(ASRU),2013 IEEE 研讨会。IEEE,2013[115] Baldi, Pierre, 等。"在蛋白质二级结构预测中利用过去和未来"。生物信息学 15.11 (1999): 937-946[116] Hochreiter, Sepp, 和 Jürgen Schmidhuber。"长短时记忆"。神经计算 9.8 (1997): 1735-1780。[117] A. Graves, M. Liwicki, S. Fernandez, R. Bertolami, H. Bunke, J. Schmidhuber。改进的无约束手写识别的新型连接主义系统。IEEE 模式分析与机器智能汇刊,31 卷,第 5 期,2009 年。[118] 使用 QuickType,苹果公司希望做的不仅仅是猜测你的下一条文本。它还想给你一个 AI。"WIRED"。2016 年 6 月 16 日检索。[119] Sak, Hasim, Andrew W. Senior, 和 Françoise Beaufays。"用于大规模声学建模的长短时记忆递归神经网络架构"。INTERSPEECH。2014 年。[120] Poultney, Christopher, Sumit Chopra, 和 Yann L. Cun。"利用基于能量的模型进行稀疏表示的高效学习"。神经信息处理系统进展。2006 年。[121] LeCun, Yann, 等。"关于基于能量的学习的教程"。结构化数据预测 1 (2006): 0。[122] Ackley, David H., Geoffrey E. Hinton, 和 Terrence J. Sejnowski。"Boltzmann 机的学习算法"。认知科学 9.1 (1985): 147-169。[123] Desjardins, G. 和 Bengio, Y. (2008)。卷积 RBM 在视觉中的经验评估。技术报告 1327,蒙特利尔大学计算机科学与运筹学系。[124] Hinton, G. E., Osindero, S., 和 Teh, Y. (2006)。一种快速学习算法,用于深度置信网络。神经计算,18,1527–1554。[125] Hinton, G. E. (2007b)。学习多层表示。认知科学趋势,11(10),428–434。
[126] Bengio, Yoshua 等人. "深度网络的贪婪分层训练." 《神经信息处理系统进展》19 (2007): 153. [127] A.-R. Mohamed, T. N. Sainath, G. Dahl, B. Ramabhadran, G. E. Hinton 和 M. A. Picheny, 使用判别特征进行电话识别的深度信念网络,'' 见《IEEE ICASSP 会议论文集》,2011 年 5 月,pp. 5060-5063. [128] R. Salakhutdinov 和 G. Hinton, 语义哈希,'' 《近似推理国际期刊》,第 50 卷,第 7 期,pp. 969-978,2009 年. [129] G. W. Taylor, G. E. Hinton 和 S. T. Roweis, ``使用二进制潜变量建模人类运动,'' 见《神经信息处理系统进展》. 美国马萨诸塞州剑桥: MIT 出版社, 2006 年,pp. 1345-1352. [130] Zhang, Kunlei 和 Xue-Wen Chen. "大规模深度信念网络与 MapReduce." 《IEEE Access》2 (2014): 395-403.
[131] Yoshua Bengio, Aaron Courville 和 Pascal Vincent. 表示学习:回顾与新视角. 技术报告,arXiv:1206.5538,2012b. [132] Makhzani, Alireza 和 Brendan Frey. "k-稀疏自编码器." arXiv 预印本 arXiv:1312.5663 (2013). [133] Hinton, Geoffrey E. 和 Ruslan R. Salakhutdinov. "使用神经网络减少数据的维度." 《科学》313.5786 (2006): 504-507. [134] Vincent, Pascal 等人. "堆叠去噪自编码器:在具有局部去噪准则的深度网络中学习有用的表示." 《机器学习研究期刊》11.12 (2010): 3371-3408. [135] Salakhutdinov, Ruslan 和 Geoffrey Hinton. "语义哈希." RBM 500.3 (2007): 500. [136] Nesi, Paolo, Gianni Pantaleo 和 Gianmarco Sanesi. "基于 Hadoop 的平台用于网页和文档的自然语言处理." 《视觉语言与计算期刊》31 (2015): 130-138.