Hadoop-深度学习-二-

57 阅读55分钟

Hadoop 深度学习(二)

原文:Deep learning with Hadoop

协议:CC BY-NC-SA 4.0

六、自编码器

|   | “人们担心计算机会变得太聪明,接管世界,但真正的问题是它们太愚蠢,它们已经接管了世界。” |   | |   | -- 佩德罗·多明戈斯 |

在最后一章中,我们讨论了一个称为受限玻尔兹曼机的生成模型。在本章中,我们将介绍另一种称为自编码器的生成模型。自编码器是一种人工神经网络,通常用于降维、特征学习或提取。

随着本章的继续,我们将详细讨论自编码器的概念及其各种形式。我们还将解释术语正则化自编码器稀疏自编码器。将讨论稀疏编码的概念以及稀疏自编码器中稀疏因子的选择标准。稍后,我们将讨论深度学习模型 deep autoencoder,以及它使用 Deeplearning4j 的实现。去噪自编码器是传统自编码器的另一种形式,这将在本章的结尾部分讨论。

总的来说,本章分为以下几个小节:

  • 自编码器
  • 稀疏自编码器
  • 深度自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编自编
  • 去噪自编码器
  • 自编码器的应用

自锚

自编码器是具有一个隐藏层的神经网络,它被训练来学习试图将其输入重构为其输出的恒等式函数。换句话说,自编码器试图通过投影到由隐藏节点定义的低维子空间来复制输入数据。隐藏层 h 描述了一个代码,用于表示输入数据及其结构。因此,该隐藏层被迫从其输入训练数据集学习结构,以便它可以在输出层复制输入。

自编码器的网络可以分为两部分:编码器和解码器。编码器由函数 h=f (k) 描述,试图重构或复制的解码器由 r = g (h) 定义。autoencoder 的基本思想应该是只复制优先输入的那些方面,而不是创建输入的精确副本。它们被设计成这样一种方式,即限制隐藏层仅大致复制,而不是来自输入数据的所有内容。因此,如果自编码器学会为所有的 k 值完全设置 g(f(k) = k ,它就不会被称为有用的。图 6.1 表示自编码器的总体结构,通过代码的内部隐藏层 h 将输入 k 映射到输出 r :

Autoencoder

图 6.1:自编码器的一般框图。这里,输入 k 通过隐藏状态或内部表示 h 映射到输出 r。编码器 f 将输入 k 映射到隐藏状态 h,解码器 g 执行 h 到输出 r 的映射

再举一个例子,让我们考虑一下图 6.2 。该图显示了一个用于输入图像块的自编码器的实际表示 k ,它学习隐藏层 h 以输出 r 。输入层 k 是来自图像块的强度值的组合。隐藏层节点帮助将高维输入层投影到隐藏节点的低维激活值中。隐藏节点的这些激活值被合并在一起以生成输出层 r ,其是输入像素的近似。在理想情况下,与输入层节点相比,隐藏层的节点数量通常较少。出于这个原因,他们被迫以仍然可以生成输出层的方式减少信息。

Autoencoder

图 6.2:图 6 显示了自编码器如何从输入像素的近似值中学习输出结构的一个实际例子。

将输入的结构复制到输出可能听起来效率不高,但实际上,自编码器的最终结果并不完全取决于解码器的输出。相反,训练自编码器背后的主要思想是复制输入任务的有用属性,这将反映在隐藏层中。

从自编码器中提取所需特征或信息的常见方法之一是将隐藏层 h 限制为具有比输入 k 更小的尺寸 (d / ) ,尺寸 d、d / < d 。由此产生的较小维度层可以称为输入 k 的损失压缩表示。隐藏层尺寸小于输入尺寸的自编码器称为欠采样

所描述的学习过程可以数学地表示为最小化损失函数 L ,其给出如下:

Autoencoder

简单来说, L 可以定义为一个损失函数,它惩罚 g (f (k)) 与输入 k 不同。

利用线性解码器功能,自编码器学习形成空间基础,类似于主成分分析 ( 主成分分析)程序。收敛后,隐藏层将形成训练数据集的主子空间作为输入所跨越的空间的基础。然而,与主成分分析不同,这些过程不一定需要生成正交向量。因此,具有非线性编码器功能 f 和非线性解码器功能 g 的自编码器可以学习更强大的主成分分析非线性泛化能力。这将最终在很大程度上增加编码器和解码器的容量。然而,随着容量的增加,自编码器开始显示不需要的行为。

然后,它可以学习在不注意提取所需信息的情况下复制整个输入。从理论上讲,自编码器可能是一维代码,但实际上,一个非常强大的非线性编码器可以学习用代码 i 表示每个训练示例 k(i) 。解码器然后将这些整数 (i) 映射到特定训练示例的值。因此,使用容量更大的自编码器时,仅复制输入数据集中的有用要素会完全失败。

主成分分析是一种统计方法,它应用正交变换将一组可能相关的观测变量转换成一组称为主成分的线性相关变量。主成分分析法的主成分数小于或等于原始输入变量数。

类似于提到的欠采样自编码器的边缘情况问题,其中隐藏层的尺寸小于输入的尺寸,自编码器,其中隐藏层或代码被允许具有相等的输入尺寸,经常面临相同的问题。

隐藏代码的维数大于输入维数的自编码器称为过完备自编码器。这种类型的自编码器更容易出现上述问题。即使是线性编码器和解码器也可以执行从输入到输出的学习,而无需学习输入数据集的任何期望属性。

正则化自编码器

通过为隐藏层选择合适的尺寸,以及根据模型分布的复杂性选择编码器和解码器的容量,可以成功地构建任何类型架构的自编码器。能够提供相同功能的自编码器称为正则化自编码器。

除了将输入复制到输出的能力之外,正则化自编码器还具有损失函数,这有助于模型拥有其他属性。这些包括对缺失输入的鲁棒性、数据表示的稀疏性、表示导数的小性等。即使是非线性且过完备的正则化自编码器也能够至少了解一些关于数据分布的信息,而不管模型的容量如何。正则化自编码器[131]能够借助重构误差和正则化器之间的有效对立来捕获训练分布的结构。

稀疏自编码器

分布式稀疏表示是深度学习算法中学习有用特征的关键之一。它不仅是一种连贯的数据表示模式,而且有助于捕捉大多数真实世界数据集的生成过程。在本节中,我们将解释自编码器如何促进数据的稀疏性。我们将从介绍稀疏编码开始。当一个输入触发神经网络中相对少量节点的激活时,代码被称为稀疏的,这些节点组合起来以稀疏的方式表示它。在深度学习技术中,使用类似的约束来生成稀疏代码模型,以实现常规的自编码器,这些自编码器用稀疏常数训练,称为稀疏自编码器。

稀疏编码

稀疏编码是一种无监督方法,用于学习多组过完备的基,以便以连贯有效的方式表示数据。稀疏编码的主要目标是确定一组向量 (n) v i ,使得输入向量 k 可以表示为这些向量的线性组合。

从数学上讲,这可以表示如下:

Sparse coding

这里aIT3】是与每个向量相关的系数 v i

借助 PCA,我们可以连贯地学习一整套基向量;然而,我们想要学习一组过完备的基向量来表示输入向量 k Sparse coding,其中 n > m 。使过完备基的原因是基向量通常能够捕捉输入数据固有的模式和结构。然而,过完备有时会引起退化,以此为基础,系数 a i 不能唯一地识别输入向量 k 。为此,在稀疏编码中引入了一个称为稀疏性的附加标准。

简单地说,稀疏性可以被定义为具有很少的非零分量或者具有很少的不接近零的分量。如果对于给定的输入向量,非零系数的数量或者离零很远的系数的数量应该很少,则系数集合 a i 被称为稀疏的。

有了对稀疏编码的基本理解,我们现在可以进入下一部分,了解稀疏编码概念如何用于自编码器来生成稀疏自编码器。

稀疏自编码器

当输入数据集保持某种结构时,如果输入特征是相关的,那么即使是简单的自编码器算法也可以发现这些相关性。此外,在这种情况下,一个简单的自编码器最终将学习一个低维表示,这类似于主成分分析。

这种看法是基于这样一个事实,即隐藏层的数量相对较少。然而,通过对网络施加其他约束,即使有大量的隐藏层,网络仍然可以从输入向量中发现期望的特征。

稀疏自编码器通常用于学习特征以执行其他任务,如分类。添加了稀疏性约束的自编码器必须响应其所训练的输入数据集的独特统计特征,而不是简单地充当身份函数。

Sparse autoencoders

图 6.3:图中显示了一个稀疏自编码器的典型例子

稀疏自编码器是一种带有稀疏执行器的自编码器,它有助于指导单层网络学习隐藏层代码。这种方法最大限度地减少了重构错误,同时限制了重构输出所需的码字数量。这种稀疏化算法可以看作是一个分类问题,它将输入限制在一个单一的类值,这有助于减少预测误差。

在这一部分,我们将用一个简单的架构来解释稀疏自编码器。图 6.3 显示了稀疏自编码器的最简单形式,由单个隐藏层 h 组成。隐藏层 h 通过权重矩阵 W 连接到输入向量 K ,形成编码步骤。在解码步骤中,隐藏层 h 借助于捆绑权重矩阵 W T 输出到重构向量 K` 。在网络中,激活函数表示为 f ,偏置项表示为 b 。激活函数可以是任何函数:线性函数、乙状线函数或 ReLU 函数。

计算隐藏代码 l 的稀疏表示的公式如下:

Sparse autoencoders

重构输出是隐藏表示,使用以下公式线性映射到输出:

Sparse autoencoders

通过重构误差的反向传播进行学习。所有参数均经过优化,以最小化均方误差,如下所示:

Sparse autoencoders

现在我们已经有了网络设置,我们可以添加稀疏化组件,它驱动向量 L 朝向稀疏表示。这里,我们将使用 k 稀疏自编码器来实现层的稀疏表示。(不要混淆 K-稀疏表示的 k 和输入向量的 K 。为了区分这两者,我们分别用小 k 和大写 K 来表示这两个。)

k-稀疏自编码器

k-Sparse 自编码器[132]是基于一个具有绑定权重和线性激活函数的自编码器。k 稀疏自编码器的基本思想非常简单。在自编码器的前馈阶段,一旦我们计算出隐藏代码 l = WK + b ,而不是从所有隐藏单元重建输入,该方法搜索 k 最大的隐藏单元,并将剩余隐藏单元的值设置为零。

确定 k 最大隐藏单位有替代方法。通过对隐藏单元的活动进行排序或使用 ReLU,调整具有阈值的隐藏单元,直到我们确定 k 最大的活动。这个寻找 k 最大活动的选择步骤是非线性的。选择步骤的行为类似于正则化,这有助于防止在通过重构输入来构建输出时使用大量隐藏单元。

如何选择稀疏度 k

如果我们实施低稀疏度,比如说 k=10 ,那么在 k 稀疏自编码器的训练过程中可能会出现问题。一个常见的问题是,在最初的几个时期,算法将积极地开始将单个隐藏单元分配给训练案例组。这些现象可以与 k-means 聚类方法进行比较。在连续的时代,这些隐藏的单位将被选择和重新实施,但其他隐藏的单位不会被调整。

这个问题可以通过以适当的方式调度稀疏级别来解决。让我们假设我们的目标是稀疏度为 10。在这种情况下,我们可以从较大的稀疏度开始,比如说 k=100k=200 。因此,k 稀疏自编码器可以训练所有存在的隐藏单元。渐渐地,在半个历元内,我们可以将 k=100 的稀疏度线性降低到 k=10 。这大大增加了所有隐藏单位被选中的几率。然后,我们将在下半个纪元保持 k=10 。这样,这种调度将保证即使在低稀疏度的情况下,所有的过滤器都将被训练。

稀疏度的影响

在设计或实现 k 稀疏自编码器时, k 值的选择非常关键。 k 的值决定了理想的稀疏级别,这有助于使该算法非常适合各种数据集。例如,一个应用可以用于预训练深度辨别神经网络或浅层网络。

如果我们对 k 取一个较大的值(比如说在 MNIST 数据集上 k=200 ,算法将倾向于识别和学习数据集的非常局部的特征。这些特性有时表现得过于过早,不能用于浅层体系结构的分类。浅层架构通常有一个简单的线性分类器,它没有足够的架构强度来合并所有这些特性并获得相当高的分类率。然而,相似的局部特征对于预先训练深度神经网络是非常理想的。

对于稀疏级别的较小值(比如说 MNIST 数据集上的 k=10 ,使用较小的隐藏单元集从输入中重建输出。这最终导致从数据集中检测全局特征,而不是像前面的情况那样检测局部特征。这些局部性较小的特征适用于分类任务的浅层体系结构。相反,这些类型的情况对于深度神经网络来说并不理想。

深度自编码器

到目前为止,我们只讨论了简单自编码器的单层编码器和单层解码器。然而,具有多个编码器和解码器的深度自编码器带来更多优势。

前馈网络在深度时表现更好。自编码器基本上是前馈网络;因此,基本前馈网络的优点也可以应用于自编码器。编码器和解码器是自编码器,也像前馈网络一样工作。因此,我们也可以在这些组件中利用前馈网络的深度优势。

在这种情况下,我们还可以谈论通用逼近器定理,该定理确保具有至少一个隐藏层和足够隐藏单元的前馈神经网络可以以任何精度产生任何任意函数的逼近。遵循这个概念,具有至少一个隐藏层并包含足够的隐藏单元的深度自编码器可以很好地逼近从输入到代码的任何映射。

人们可以用两层网络以任何精度逼近任何连续函数。在人工神经网络的数学理论中,通用逼近函数指出,前馈网络可以逼近 R n 的紧致子集的任何连续函数,如果它至少有一个具有有限数量神经元的隐层。

与浅层架构相比,深层自编码器具有许多优势。自编码器不平凡的深度抑制了表示一些函数的计算。此外,自编码器的深度大大减少了学习功能所需的训练数据量。甚至在实验中,已经发现与浅自编码器相比,深自编码器提供更好的压缩。

为了训练深度自编码器,通常的做法是训练一堆浅自编码器。因此,为了训练深度自编码器,经常会遇到一系列浅自编码器。在接下来的小节中,我们将深入讨论深度自编码器的概念。

深度自编码器的训练

这里介绍的深度自编码器的设计是基于 MNIST 手写数字数据库的。在论文[133]中,解释了一个结构良好的深度自编码器的构建和训练过程。训练深度自编码器的基础是通过三个阶段,即:预训练、展开和微调。

  1. Pre-training: The first phase of training a deep autoencoder is 'pre-training'. The main purpose of this phase is to work on binary data, generalize in to a real-valued data, and then to conclude that it works well for various datasets.

    我们已经有足够的见解,单层隐藏单元不是在一大组图像中建模结构的合适方式。深度自编码器由多层受限玻尔兹曼机组成。在第 5 章受限玻尔兹曼机中,我们给出了关于受限玻尔兹曼机如何工作的足够信息。使用相同的概念,我们可以继续构建深度自编码器的结构:

    Training of deep autoencoders

    图 6.4:深度自编码器的预训练包括学习一堆受限玻尔兹曼机(RBMs),其中每个 RBM 拥有一层特征检测器。一台受限玻尔兹曼机的学习特性被用作“输入数据”来训练堆栈的下一个 RBM。在预训练阶段之后,所有的 RBM 被展开或展开以构建深度自编码器。然后,使用误差导数的反向传播方法对这种深度自编码器进行微调。

    当 RBM 的第一层由数据流驱动时,该层开始学习特征检测器。这种学习可以被视为下一层学习的输入数据。这样,第一层的特征检测器成为学习受限玻尔兹曼机的下一层的可见单元。这个逐层学习的过程可以根据需要重复多次。这个过程在预先训练深度自编码器的权重方面确实非常有效。在每一层之后捕获的特征在下面隐藏单元的活动之间具有一串高阶相关性。第一部分图 6.4 给出了该程序的流程图。在处理基准数据集 MNIST 时,深度自编码器将在每个 RBM 之后使用二进制转换。为了处理实值数据,深度自编码器在每个受限玻尔兹曼机层之后使用高斯校正变换。

    Training of deep autoencoders

    图 6.5:编码器和解码器的数量或向量在各阶段如何变化的图示。

  2. Unrolling: Once the multiple layers of feature detectors of the deep autoencoders are pre-trained, the whole model is unrolled to generate the encoder and decoder networks, which at first use the same weights. We will explain each of the designs of each part given in the second part of the image separately to have a better understanding of this phase.

    • 编码器:对于 28x28 像素图像的 MNIST 数据集,网络将获得 784 像素的输入。根据经验法则,深度自编码器第一层的参数数量应该稍大一些。如图 6.42000 参数取网络第一层。这听起来可能不合理,因为采用更多参数作为输入会增加网络过度拟合的机会。然而,在这种情况下,增加参数的数量将最终增加输入的特征,这又使得自编码器数据的解码成为可能。

    • As shown in Figure 6.4, the layers would be 2000, 1000, 500, and 30-nodes wide respectively. A snapshot of this phenomenon is depicted in Figure 6.5. In the end, the encoder will produce a vector 30 numbers long. This 30 number vector is the last layer of the encoder of the deep autoencoder. A rough outline for this encoder will be as follows:

      Training of deep autoencoders

    • Decoder: The 30 number vectors found at the end of the encoding phase are the encoded version of the 28x28 pixel images. The second part of the deep autoencoder is the decoder phase, where it basically learns how to decode the condensed vector. Hence, the output of the encoder phase (30-number vectors) becomes the input of the decoder phase. This half of the deep autoencoder is a feed-forward network, where the encoded condensed vector proceeds towards the reconstructed input after each layer. The layers shown in Figure 6.4 are 30, 500, 1000, and 2000. The layers initially possess the same weights as their counterparts in the pre-training network; it is just that the weights are transposed as shown in the figure. A rough outline for this encoder will be as follows:

      Training of deep autoencoders

      所以,解码半个深度自编码器的主要目的是学习如何重建图像。该操作在第二前馈网络中执行,第二前馈网络也执行反向传播,反向传播通过重构熵发生。

  3. 微调:在微调阶段,随机活动被确定性的实值概率所取代。通过使用反向传播方法,与整个深度自编码器的每一层相关联的权重被微调用于最佳重建。

使用深度学习实现深度自编码器 4j

所以,你现在有足够的想法如何建立一个深度自编码器使用一些有限的玻尔兹曼机。在本节中,我们将解释如何借助 Deeplearning4j 设计深度自编码器。

我们将使用与上一节相同的 MNIST 数据集,并保持深度自编码器的设计与我们之前解释的相似。

正如在前面的示例中已经解释的那样,从原始 MNIST 数据集使用了 1024 个示例的小批量大小,该数据集可以划分为多个 Hadoop 块。每个工作人员将在 Hadoop 分布式文件系统上并行运行这些 N 多个数据块。实现深度自编码器的代码流程简单明了。

步骤如下所示:

  1. 在 HDFS 批量加载 MNIST 数据集。每批将包含1024个实例。
  2. 开始建立模型。
  3. 执行编码操作。
  4. 执行解码操作。
  5. 通过调用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) 

为了用指定的层(这里是八层)创建一个列表生成器,我们调用。list()方法:

 .list(8) 

现在下一步是构建模型的编码阶段。这可以通过随后将受限玻尔兹曼机添加到模型中来实现。编码阶段有四层受限玻尔兹曼机,其中每一层分别有2000100050030节点:

  .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//T17】。从那里,如果我们把初始输入看作是被破坏的输入 k / ,那么整个模型可以看作是一个基本编码器的一种形式。被破坏的输入 k / 被映射生成隐藏表示 h

因此,我们得到以下结果:

Architecture of a Denoising autoencoder

从这个隐藏的表示中,重构的输出 r 可以使用 r = g (h) 来导出。去噪自编码器重新组织数据,然后尝试了解数据以重建输出。这种数据重组或数据混洗产生噪声,模型从噪声中学习特征,这允许对输入进行分类。在网络训练期间,它产生一个模型,该模型通过损失函数计算该模型和基准之间的距离。其思想是最小化训练集的平均重建误差,以使输出 r 尽可能接近原始未被破坏的输入 k

Architecture of a Denoising autoencoder

图 6.6:设计去噪自编码器的步骤。原始输入为 k;从 k 导出的损坏输入表示为 k / 。最终输出表示为 r。

堆叠去噪自编码器

构建堆叠去噪自编码器来初始化深度神经网络的基本概念类似于堆叠多个限制性玻尔兹曼机来构建 Deep credit 网络或传统的深度自编码器。仅在每个单独层的初始去噪训练中需要产生损坏的输入,以帮助学习有用的特征提取。

一旦我们知道编码函数 f 达到隐藏状态,它就被用在原始的、未被破坏的数据上,以达到下一个级别。一般来说,不会出现损坏或噪声来生成表示,这将作为训练下一层的未损坏输入。堆叠式去噪自编码器的一个关键功能是在输入通过时进行逐层无监督预训练。一旦一个层被预先训练以对来自前一层的输入执行特征选择和提取,就可以进行下一阶段的监督微调,就像传统的深度自编码器一样。

图 6.7 展示了设计堆叠式去噪自编码器的详细表示。学习和堆叠去噪自编码器的多个层的整个过程如下图所示:

Stacked denoising autoencoders

图 6.7:堆叠去噪自编码器的表示

使用深度学习实现堆叠去噪自编码器 4j

通过创建一个拥有自编码器作为其隐藏层的MultiLayerNetwork,可以使用深度学习 4j 构建堆叠去噪自编码器。自编码器有一些corruptionLevel,称为噪声。

在这里,我们设置了建立模型所需的初始配置。出于说明的目的,采用了一组1024数量的例子。输入数和输出数分别取为10002

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、脸书等各种社交媒体网站的。除此之外,出于安全目的安装在各种商场、机场或政府机构的监控摄像头每天都会生成大量视频。由于这些视频的巨大存储消耗,它们大多数通常存储为压缩视频文件。在这些企业中,大部分都是安全摄像头全天运行,后期存储重要视频,以备日后调查。

这些视频包含隐藏的“热点数据”或信息,需要快速处理和提取。因此,处理和分析这些大规模视频的需求已经成为数据爱好者的首要任务之一。此外,在许多不同的研究领域,如生物医学工程、地质学和教育研究,需要处理这些大规模的视频,并使它们在不同的位置可供详细分析。

在本节中,我们将研究使用 Hadoop 框架处理大规模视频数据集。大规模视频处理的主要挑战是将视频从压缩格式转码为非压缩格式。为此,我们需要一个分布式视频转码器,将视频写入 Hadoop 分布式文件系统 ( HDFS )中,并行解码比特流组块,生成序列文件。

当在 HDFS 处理一个输入数据块时,每个映射器进程分别访问每个拆分中的行。然而,在大规模视频数据集的情况下,当它被分割成多个预定义大小的块时,每个映射器进程应该分别解释比特流的块。然后,映射器过程将提供对解码视频帧的访问,用于后续分析。在下面的小节中,我们将讨论如何将包含视频比特流的 HDFS 的每个块转码为图像集,以进行进一步分析。

Hadoop 中的分布式视频解码

大多数流行的视频压缩格式,如 MPEG-2 和 MPEG-4,在比特流中遵循分层结构。在本小节中,我们将假设所使用的压缩格式的比特流具有分层结构。为简单起见,我们将解码任务分为两个不同的地图缩减作业:

  1. Extraction of video sequence level information: From the outset, it can be easily predicted that the header information of all the video dataset can be found in the first block of the dataset. In this phase, the aim of the map-reduce job is to collect the sequence level information from the first block of the video dataset and output the result as a text file in the HDFS. The sequence header information is needed to set the format for the decoder object.

    对于视频文件,新的FileInputFormat应该用它自己的记录阅读器来实现。然后,每个记录阅读器将以这种格式向每个地图进程提供一对:<LongWritable, BytesWritable>。输入键表示文件中的字节偏移量;对应于BytesWritable的值是包含整个数据块的视频比特流的字节数组。

    对于每个映射过程,键值与0进行比较,以识别它是否是视频文件的第一个块。一旦第一块被识别,比特流被解析以确定序列级别信息。然后,这些信息被转储到一个.txt文件中,写入 HDFS。让我们将.txt文件的名称表示为input_filename_sequence_level_header_information.txt。由于只有 map 过程可以为我们提供所需的输出,因此该方法的 reducer count 被设置为0

    假设一个包含以下数据的文本文件:深度学习 配合 Hadoop 现在第一行的偏移量为0,Hadoop 作业的输入为<0,Deep Learning>,第二行的偏移量为<14,with Hadoop>。每当我们将文本文件传递给 Hadoop 作业时,它都会在内部计算字节偏移量。

  2. Decode and convert the blocks of videos into sequence files: The aim of this Map-reduce job is to decode  each block  of the video datasets and generate a corresponding sequence file. The sequence file will contain the decoded video frames of each block of data in JPEG format. The InputFileFormat file and record reader should be kept same as the first Map-reduce job. Therefore, the <key, value> pairs of the mapper input is <LongWritable, BytesWritable>.

    Distributed video decoding in Hadoop

    图 7.1:使用 Hadoop 进行视频解码的整体表示

    • 在第二阶段,第一个作业的输出被视为第二个地图缩减作业的输入。因此,该作业的每个映射器将读取 HDFS 中的序列信息文件,并将该信息与作为BytesWritable输入的比特流缓冲区一起传递。
    • 映射过程基本上将解码后的视频帧转换为 JPEG 图像,并生成一个<key, value>对作为映射过程的输出。地图处理输出的键将输入的视频文件名和块号编码为video_filename_block_number。与该键对应的输出值是BytesWritable,它存储解码视频块的 JPEG 比特流。
    • 然后,缩减器会将数据块作为输入,并将解码后的帧简单地写入包含 JPEG 图像的序列文件,作为进一步处理的输出格式。整个过程的简单格式和概述见图 7.1 。出于说明目的,我们拍摄了一段输入视频sample.m2v。此外,在本章中,我们将讨论如何用 HDFS 处理大规模图像文件(来自序列文件)。

    映射器输入<key,value>:<LongWritable, BytesWritable>

    例如:<17308965, BytesWritable> 从映射器输出<key,value>:<Text, BytesWritable> 例如:<sample.m2v_3, BytesWritable>

利用 Hadoop 进行大规模图像处理

我们在前面的章节中已经提到了图像的大小和体积是如何日益增大的;对于集中式计算机来说,存储和处理这些海量图像的需求是很困难的。让我们考虑一个例子来获得这种情况的实际想法。让我们拍一张 81025 像素乘 86273 像素的大规模图像。每个像素由三个值组成:红色、绿色和蓝色。考虑一下,要存储这些值,需要一个 32 位精度浮点数。因此,该图像的总内存消耗可以计算如下:

86273 * 8125 * 3 * 32 位元= 78.12 GB

抛开对这张图像的任何后期处理不谈,因为可以清楚地得出结论,传统计算机甚至不可能将这么多数据存储在其主存储器中。尽管一些先进的计算机配置更高,但考虑到投资回报,大多数公司不会选择这些计算机,因为它们太贵,无法购买和维护。因此,正确的解决方案应该是在商品硬件中运行图像,以便图像可以存储在它们的内存中。在本节中,我们将解释如何使用 Hadoop 以分布式方式处理这些海量图像。

地图缩减作业的应用

在本节中,我们将讨论如何使用 Hadoop 的地图缩减作业来处理大型图像文件。在作业开始之前,所有要处理的输入图像都被加载到 HDFS。在操作过程中,客户端发送一个作业请求,该请求通过名称节点。名称节点从客户端收集该请求,搜索其元数据映射,然后将文件系统的数据块信息以及数据块的位置发送回客户端。一旦客户端获得数据块的元数据,它就会自动访问所请求的数据块所在的数据节点,然后通过适用的命令处理这些数据。

用于大规模图像处理的地图缩减作业主要负责控制整个任务。基本上,这里我们解释了可执行 shell 脚本文件的概念,它负责从 HDFS 收集可执行文件的输入数据。

使用 Map-reduce 编程模型的最佳方式是设计我们自己的 Hadoop 数据类型,用于直接处理大量图像文件。该系统将使用 Hadoop Streaming 技术,帮助用户创建和运行特殊类型的地图缩减作业。这些特殊类型的作业可以通过前面提到的可执行文件来执行,该文件将充当映射器或缩减器。程序的映射器实现将使用 shell 脚本来执行必要的操作。shell 脚本负责调用图像处理的可执行文件。图像文件列表被作为这些可执行文件的输入,用于进一步处理。这种处理或输出的结果随后被写回到 HDFS。

因此,输入图像文件应该首先写入 HDFS,然后在 Hadoop Streaming 输入的特定目录中生成一个文件列表。该目录将存储文件列表的集合。文件列表的每一行都将包含要处理的图像文件的 HDFS 地址。映射器的输入将是Inputsplit类,这是一个文本文件。shell 脚本管理器逐行读取文件,并从元数据中检索图像。然后,它调用图像处理可执行文件来进一步处理图像,然后将结果写回 HDFS。因此,映射器的输出是最终期望的结果。因此,映射器完成所有工作,从 HDFS 检索图像文件,进行图像处理,然后将其写回 HDFS。该过程中的减压器数量可以设置为零。

这是一个如何利用 Hadoop 通过二值图像处理方法处理大量图像的简单设计。也可以部署其他复杂的图像处理方法来处理大规模图像数据集。

使用 Hadoop 的自然语言处理

网络中信息的指数级增长增加了大规模非结构化自然语言文本资源的扩散强度。因此,在过去的几年里,人们对提取、处理和共享这些信息的兴趣大大增加了。在规定的时间框架内处理这些知识来源已被证明是各种研究和商业行业的一项重大挑战。在本节中,我们将描述使用 Hadoop 以分布式方式抓取网络文档、发现信息和运行自然语言处理的过程。

要设计自然语言处理 ( NLP )的架构,首先要执行的任务是从大规模非结构化数据中提取带注释的关键词和关键短语。为了在分布式体系结构上执行自然语言处理,可以选择 Apache Hadoop 框架,因为它具有高效和可扩展的解决方案,并且还可以提高故障处理和数据完整性。大规模的网络爬虫可以设置为从网络中提取所有非结构化数据,并将其写入 Hadoop 分布式文件系统中进行进一步处理。为了执行特定的自然语言处理任务,我们可以使用开源的 GATE 应用,如论文[136]所示。图 7.2 中显示了分布式自然语言处理架构的初步设计概述。

为了分配网络爬虫的工作,可以使用 map-reduce 并在多个节点上运行。NLP 任务的执行以及最终输出的写入都是通过 Map-reduce 来执行的。整个体系结构将依赖于两个输入文件:I)为抓取存储在seed_urls.txt中的特定网页而给出的seedurls和 ii)NLP 应用的路径位置(例如安装 GATE 的位置)。网络爬虫将从.txt文件中获取seedurls,并为那些并行的文件运行爬虫。异步地,一个提取插件在被抓取的网页上搜索关键词和关键短语,并与被抓取的网页一起独立执行。最后一步,一个专门的程序根据需要将提取的关键词和关键短语存储在外部的 SQL 数据库或 NoSQL 数据库中,如Elasticsearch。架构中提到的所有这些模块将在以下小节中描述。

网络爬虫

为了解释这个阶段,我们不会深入解释,因为它几乎超出了本书的范围。网络爬行有几个不同的阶段。第一个阶段是 URL 发现阶段,该过程将每个种子 URL 作为seed_urls.txt文件的输入,并在分页 URL 中导航以发现相关 URL。这个阶段定义了将在下一阶段获取的一组 URL。

下一个阶段是获取网址的页面内容并保存在磁盘中。该操作是逐段完成的,其中每个段将包含一些预定义数量的网址。该操作将在不同的DataNodes上并行运行。这些阶段的最终结果存储在 Hadoop 分布式文件系统中。关键字提取器将在下一阶段处理这些保存的页面内容。

Web crawler

图 7.2:自然语言处理如何在 Hadoop 中执行的表示,将在下一阶段获取。下一个阶段是获取网址的页面内容并保存在磁盘中。操作是分段进行的,每个分段将包含一些预定义数量的网址。该操作将在不同的数据节点上并行运行。这些阶段的最终结果存储在 Hadoop 分布式文件系统中。关键字提取器将在下一阶段处理这些保存的页面内容。

用于自然语言处理的关键词和模块的提取

对于每个网址的页面内容,创建一个文档对象模型 ( DOM )并存储回 HDFS。在 DOM 中,文档有一个像树一样的逻辑结构。使用 DOM,可以编写xpath在自然语言处理阶段收集所需的关键词和短语。在本模块中,我们将为下一阶段执行自然语言处理应用定义 Map-reduce 作业。定义为<key, value>对键的映射函数是网址,值是该网址对应的 DOM。 reduce 功能将执行自然语言处理部分的配置和执行。在网络域级别对提取的关键词和短语的后续估计将在reduce方法中执行。为此,我们可以编写一个自定义插件来生成规则文件,以执行各种字符串操作,从提取的文本中过滤掉有噪声的、不需要的单词。规则文件可以是 JSON 文件,也可以是基于用例的任何其他易于加载和解释的文件。优选地,共同的名词和形容词被识别为来自文本的共同关键词。

对页面相关关键词的估计

论文[136]提出了一个非常重要的公式来从网络文档中找到相关的关键词和关键短语。他们提供了术语频率-反向文档频率 ( TF-IDF )度量来估计整个语料库的相关信息,该语料库由属于单个网络域的所有文档和页面组成。计算 TD-IDF 的值,并为其分配一个丢弃其他关键词的阈值,可以让我们从语料库中生成最相关的单词。换句话说,它丢弃了在文本中可能出现频率较高,但通常不具备任何有意义信息的常见冠词和连词。 TF-IDF 指标基本上是两个函数的乘积, TFIDF

TF 提供语料库中每个词的出现频率,即一个词在语料库中出现的次数。而 IDF 表现为一个平衡项,表示在整个语料库中具有较低频率的项的较高值。

数学上,包含在文档 D 中的文档 d 中的关键词或关键短语 i 的度量 TF-IDF 由以下等式给出:

(TF-IDF)【I】= TF【I】。IDF 【我】

此处TF【I】= f【I】/n【d】和*【IDF】【I】= log n【d】*

这里fIT3】是文档 d 中候选关键词或关键短语 i 的出现频率,ndT11】是文档 d 中术语的总数。在 IDF 中, N D 表示语料库中存在的文档总数 D ,而 N i 表示关键词或关键短语 i 存在的文档数。

基于用例,应该为 TF-IDF 定义一个通用的阈值频率。对于关键字或关键短语 i 如果 TF-IDF 的值变得高于阈值,则该关键字或关键短语作为最终结果被接受,并直接写入 HDFS。另一方面,如果相应的值小于阈值,则从最终集合中删除该关键字。这样,最后,所有想要的关键词都会被写到 HDFS。

总结

本章讨论了机器学习最广泛使用的应用,以及如何在 Hadoop 框架中设计它们。首先,我们从一个大型视频集开始,展示了如何在 HDFS 解码视频,然后将其转换为包含图像的序列文件,以供后续处理。本章接下来讨论大规模图像处理。用于此目的的映射器有一个执行所有必要任务的 shell 脚本。因此,不需要减速器来执行该操作。最后,我们讨论了如何在 Hadoop 中部署自然语言处理模型。

八、附录 1:参考文献

[1] Hsu, F.-H. (2002). Behind Deep Blue: Building the Computer That Defeated the World Chess Champion . Princeton University Press, Princeton, NJ, USA. 

[2] Geoffrey E. Hinton, Simon Osindero, and Yee-Whye Teh. 2006\. A fast learning algorithm for deep belief nets. Neural Comput. 18, 7 (July 2006), 1527-1554. 

[3] Bengio, Yoshua, et al. "Greedy layer-wise training of deep networks." Advances in neural information processing systems 19 (2007): 153. 

[4] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Advances in neural information processing systems. 2012. 

[5] Machine Learning, Tom Mitchell, McGraw Hill, 1997. 

[6] Machine Learning: A Probabilistic Perspective (Adaptive Computation and Machine Learning series), Kevin P. Murphy 

[7] O. Chapelle, B. Scholkopf and A. Zien Eds., "Semi-Supervised Learning (Chapelle, O. et al., Eds.; 2006) [Book reviews]," in IEEE Transactions on Neural Networks, vol. 20, no. 3, pp. 542-542, March 2009. 

[8] Y. Bengio. Learning deep architectures for AI. in Foundations and Trends in Machine Learning, 2(1):1127, 2009. 

[9] G. Dahl, D. Yu, L. Deng, and A. Acero. Context-dependent DBNHMMs in large vocabulary continuous speech recognition. In Proceedings of International Conference on Acoustics Speech and Signal Processing (ICASSP). 2011. 

[10] A. Mohamed, G. Dahl, and G. Hinton. Acoustic modeling using deep belief networks. IEEE Transactions on Audio, Speech, & Language Processing, 20(1), January 2012. 

[11] A. Mohamed, D. Yu, and L. Deng. Investigation of full-sequence training of deep belief networks for speech recognition. In Proceedings of Inter speech. 2010. 

[12] Indyk, Piotr, and Rajeev Motwani. "Approximate nearest neighbors: towards removing the curse of dimensionality." Proceedings of the thirtieth annual ACM symposium on Theory of computing. ACM, 1998. 

[13] Friedman, Jerome H. "On bias, variance, 0/1loss, and the curse-of-dimensionality." Data mining and knowledge discovery 1.1 (1997): 55-77. 

[14] Keogh, Eamonn, and Abdullah Mueen. "Curse of dimensionality." Encyclopedia of Machine Learning. Springer US, 2011\. 257-258. 

[15] Hughes, G.F. (January 1968). "On the mean accuracy of statistical pattern recognizers". IEEE Transactions on Information Theory. 14 (1): 5563. 

[16] Bengio, Yoshua, Patrice Simard, and Paolo Frasconi. "Learning long-term dependencies with gradient descent is difficult." IEEE transactions on neural networks 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): 364378. 

[19] X. Glorot and Y. Bengio. Understanding the difficulty of training deep feed-forward neural networks. In Proceedings of Artificial Intelligence and Statistics (AISTATS). 2010. 

[20] G. Hinton and R. Salakhutdinov. Reducing the dimensionality of data with neural networks. Science, 313(5786):504507, July 2006 

[21] M. Ranzato, C. Poultney, S. Chopra, and Y. LeCun. Efficient learning of sparse representations with an energy-based model. In Proceedings of Neural Information Processing Systems (NIPS). 2006. 

[22] I. Goodfellow, M. Mirza, A. Courville, and Y. Bengio. Multi-prediction deep boltzmann machines. In Proceedings of Neural Information Processing Systems (NIPS). 2013. 

[23] R. Salakhutdinov and G. Hinton. Deep boltzmann machines. In Proceedings of Artificial Intelligence and Statistics (AISTATS). 2009. 

[24] R. Salakhutdinov and G. Hinton. A better way to pretrain deep boltzmann machines. In Proceedings of Neural Information Processing Systems (NIPS). 2012. 

[25] N. Srivastava and R. Salakhutdinov. Multimodal learning with deep boltzmann machines. In Proceedings of Neural Information Processing Systems (NIPS). 2012. 

[26] H. Poon and P. Domingos. Sum-product networks: A new deep architecture. In Proceedings of Uncertainty in Artificial Intelligence. 2011. 

[27] R. Gens and P. Domingo. Discriminative learning of sum-product networks. Neural Information Processing Systems (NIPS), 2012. 

[28] R. Gens and P. Domingo. Discriminative learning of sum-product networks. Neural Information Processing Systems (NIPS), 2012. 

[29] S. Hochreiter. Untersuchungen zu dynamischen neuronalen netzen. Diploma thesis, Institut fur Informatik, Technische Universitat Munchen, 1991. 

[30] J.Martens. Deep learning with hessian-free optimization. In Proceedings of international Conference on Machine Learning (ICML). 2010. 

[31] Y. Bengio. Deep learning of representations: Looking forward. In Statistical Language and Speech Processing, pages 137\. Springer, 2013. 

[32] I. Sutskever. Training recurrent neural networks. Ph.D. Thesis, University of Toronto, 2013. 

[33] J. Ngiam, Z. Chen, P. Koh, and A. Ng. Learning deep energy models. In Proceedings of International Conference on Machine Learning (ICML). 2011. 

[34] Y. LeCun, S. Chopra, M. Ranzato, and F. Huang. Energy-based models in document recognition and computer vision. In Proceedings of International Conference on Document Analysis and Recognition (ICDAR). 2007. 

[35] R. Chengalvarayan and L. Deng. Speech trajectory discrimination using the minimum classification error learning. IEEE Transactions on Speech and Audio Processing, 6(6):505515, 1998.



[36] M. Gibson and T. Hain. Error approximation and minimum phone error acoustic model estimation. IEEE Transactions on Audio, Speech, and Language Processing, 18(6):12691279, August 2010 

[37] X. He, L. Deng, andW. Chou. Discriminative learning in sequential pattern recognitiona unifying review for optimization-oriented speech recognition. IEEE Signal Processing Magazine, 25:1436, 2008. 

[38] H. Jiang and X. Li. Parameter estimation of statistical models using convex optimization: An advanced method of discriminative training for speech and language processing. IEEE Signal Processing Magazine, 27(3):115127, 2010. 

[39] B.-H. Juang, W. Chou, and C.-H. Lee. Minimum classification error rate methods for speech recognition. IEEE Transactions On Speech and Audio Processing, 5:257265, 1997. 

[40] D. Povey and P. Woodland. Minimum phone error and I-smoothing for improved discriminative training. In Proceedings of International Conference on Acoustics Speech and Signal Processing (ICASSP). 2002 

[41] D. Yu, L. Deng, X. He, and X. Acero. Large-margin minimum classification error training for large-scale speech recognition tasks. In Proceedings of International Conference on Acoustics Speech and Signal Processing (ICASSP). 2007. 

[42] A. Robinson. An application of recurrent nets to phone probability estimation. IEEE Transactions on Neural Networks, 5:298305, 1994 

[43] A. Graves. Sequence transduction with recurrent neural networks. Representation Learning Workshop, International Conference on Machine Learning (ICML), 2012. 

[44] A. Graves, S. Fernandez, F. Gomez, and J. Schmidhuber. Connectionist temporal classification: Labeling unsegmented sequence data with recurrent neural networks. In Proceedings of International Conference on Machine Learning (ICML). 2006. 

[45] A. Graves, N. Jaitly, and A. Mohamed. Hybrid speech recognition with deep bidirectional LSTM. In Proceedings of the Automatic Speech Recognition and Understanding Workshop (ASRU). 2013. 

[46] A. Graves, A. Mohamed, and G. Hinton. Speech recognition with deep recurrent neural networks. In Proceedings of International Conference on Acoustics Speech and Signal Processing (ICASSP). 2013 

[47] K. Lang, A. Waibel, and G. Hinton. A time-delay neural network architecture for isolated word recognition. Neural Networks, 3(1):2343, 1990. 

[48] A.Waibel, T. Hanazawa, G. Hinton, K. Shikano, and K. Lang. Phoneme recognition using time-delay neural networks. IEEE Transactions on Acoustical Speech, and Signal Processing, 37:328339, 1989. 

[50] Moore, Gordon E. (1965-04-19). "Cramming more components onto integrated circuits". Electronics. Retrieved 2016-07-01. 

[51] [http://www.emc.com/collateral/analyst-reports/idc-the-digital-universe-in-2020.pdf](http://www.emc.com/collateral/analyst-reports/idc-the-digital-universe-in-2020.pdf) 

[52] D. Beaver, S. Kumar, H. C. Li, J. Sobel, and P. Vajgel, \Finding a needle in haystack: Facebooks photo storage," in OSDI, 2010, pp. 4760. 

[53] Michele Banko and Eric Brill. 2001\. Scaling to very very large corpora for natural language disambiguation. In Proceedings of the 39th Annual Meeting on Association for Computational Linguistics (ACL '01). Association for Computational Linguistics, Stroudsburg, PA, USA, 26-33. 

[54] [http://www.huffingtonpost.in/entry/big-data-and-deep-learnin_b_3325352](http://www.huffingtonpost.in/entry/big-data-and-deep-learnin_b_3325352) 

[55] X. W. Chen and X. Lin, "Big Data Deep Learning: Challenges and Perspectives," in IEEE Access, vol. 2, no. , pp. 514-525, 2014. 

[56] Bengio Y, LeCun Y (2007) Scaling learning algorithms towards, AI. In: Bottou L, Chapelle O, DeCoste D, Weston J (eds). Large Scale Kernel Machines. MIT Press, Cambridge, MA Vol. 34\. pp 321360\. [http://www.iro.umontreal.ca/~lisa/pointeurs/bengio+lecun_chapter2007.pdf](http://www.iro.umontreal.ca/~lisa/pointeurs/bengio+lecun_chapter2007.pdf) 

[57] A. Coats, B. Huval, T. Wng, D. Wu, and A. Wu, ``Deep Learning with COTS HPS systems,'' J. Mach. Learn. Res., vol. 28, no. 3, pp. 1337-1345, 2013. 

[58] J.Wang and X. Shen, ``Large margin semi-supervised learning,'' J. Mach. Learn. Res., vol. 8, no. 8, pp. 1867-1891, 2007 

[59] R. Fergus, Y. Weiss, and A. Torralba, ``Semi-supervised learning in gigantic image collections,'' in Proc. Adv. NIPS, 2009, pp. 522-530. 

[60] J. Ngiam, A. Khosla, M. Kim, J. Nam, H. Lee, and A. Ng, ``Multimodal deep learning,'' in Proc. 28th Int. Conf. Mach. Learn., Bellevue, WA, USA, 2011 

[61] N. Srivastava and R. Salakhutdinov, ``Multimodal learning with deep Boltzmann machines,'' in Proc. Adv. NIPS, 2012 

[62] L. Bottou, ``Online algorithms and stochastic approximations,'' in On-Line Learning in Neural Networks, D. Saad, Ed. Cambridge, U.K.: Cambridge Univ. Press, 1998. 

[63] A. Blum and C. Burch, ``On-line learning and the metrical task system problem,'' in Proc. 10th Annu. Conf. Comput. Learn. Theory, 1997, pp. 45-53. 

[64] N. Cesa-Bianchi, Y. Freund, D. Helmbold, and M. Warmuth, ``On-line prediction and conversation strategies,'' in Proc. Conf. Comput. Learn. Theory Eurocolt, vol. 53\. Oxford, U.K., 1994, pp. 205-216. 

[65] Y. Freund and R. Schapire, ``Game theory, on-line prediction and boosting,'' in Proc. 9th Annu. Conf. Comput. Learn. Theory, 1996, pp. 325-332. 

[66] Q. Le et al., ‘‘Building high-level features using large scale unsupervised learning,’’ in Proc. Int. Conf. Mach. Learn., 2012. 

[67] C. P. Lim and R. F. Harrison, ``Online pattern classifcation with multiple neural network systems: An experimental study,'' IEEE Trans. Syst., Man, Cybern. C, Appl. Rev., vol. 33, no. 2, pp. 235-247, May 2003. 

[68] P. Riegler and M. Biehl, ``On-line backpropagation in two-layered neural networks,'' J. Phys. A, vol. 28, no. 20, pp. L507-L513, 1995 

[69] M. Rattray and D. Saad, ``Globally optimal on-line learning rules for multi-layer neural networks,'' J. Phys. A, Math. General, vol. 30, no. 22, pp. L771-776, 1997.



[70] P. Campolucci, A. Uncini, F. Piazza, and B. Rao, ``On-line learning algorithms for locally recurrent neural networks,'' IEEE Trans. Neural Netw., vol. 10, no. 2, pp. 253-271, Mar. 1999 

[71] N. Liang, G. Huang, P. Saratchandran, and N. Sundararajan, ``A fast and accurate online sequential learning algorithm for feedforward networks,'' IEEE Trans. Neural Netw., vol. 17, no. 6, pp. 1411-1423, Nov. 2006. 

[72] L. Bottou and O. Bousequet, ``Stochastic gradient learning in neural networks,'' in Proc. Neuro-Nimes, 1991. 

[73] S. Shalev-Shwartz, Y. Singer, and N. Srebro, ``Pegasos: Primal estimated sub-gradient solver for SVM,'' in Proc. Int. Conf. Mach. Learn., 2007. 

[74] D. Scherer, A. Müller, and S. Behnke, ``Evaluation of pooling operations in convolutional architectures for object recognition,'' in Proc. Int. Conf. Artif. Neural Netw., 2010, pp. 92-101. 

[75] J. Chien and H. Hsieh, ``Nonstationary source separation using sequential and variational Bayesian learning,'' IEEE Trans. Neural Netw. Learn. Syst., vol. 24, no. 5, pp. 681-694, May 2013. 

[76] W. de Oliveira, ``The Rosenblatt Bayesian algorithm learning in a nonstationary environment,'' IEEE Trans. Neural Netw., vol. 18, no. 2, pp. 584-588, Mar. 2007. 

[77] Hadoop Distributed File System,[http://hadoop.apache.org/2012](http://hadoop.apache.org). 

[78] T. White. 2009\. Hadoop: The Definitive Guide. OReilly Media, Inc. June 2009 

[79] Shvachko, K.; Hairong Kuang; Radia, S.; Chansler, R., May 2010\. The Hadoop Distributed File System,"2010 IEEE 26th Symposium on Mass Storage Systems and Technologies (MSST). vol., no., pp.1,10 

[80] Hadoop Distributed File System,[https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/). 

[81] Dev, Dipayan, and Ripon Patgiri. "Dr. Hadoop: an infinite scalable metadata management for Hadoop—How the baby elephant becomes immortal." Frontiers of Information Technology & Electronic Engineering 17 (2016): 15-31. 

[82] [http://deeplearning4j.org/](http://deeplearning4j.org/) 

[83] Dean, Jeffrey, and Sanjay Ghemawat. "MapReduce: simplified data processing on large clusters." Communications of the ACM 51.1 (2008): 107-113. 

[84] [http://deeplearning.net/software/theano/](http://deeplearning.net/software/theano/) 

[85] [http://torch.ch/](http://torch.ch/) 

[86] Borthakur, Dhruba. "The hadoop distributed file system: Architecture and design." Hadoop Project Website 11.2007 (2007): 21. 

[87] Borthakur, Dhruba. "HDFS architecture guide." HADOOP APACHE PROJECT [https://hadoop.apache.org/docs/r1.2.1/hdfs_design.pdf](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.pdf) (2008): 39. 

[88] [http://deeplearning4j.org/quickstart](http://deeplearning4j.org/quickstart) 



[89] LeCun, Yann, and Yoshua Bengio. "Convolutional networks for images, speech, and time series." The handbook of brain theory and neural networks 3361.10 (1995): 1995. 

[90] LeCun, Y., Bottou, L., Bengio, Y., and Haffner, P. (1998). Gradient-based learning applied to document recognition. Proc. IEEE 86, 22782324\. doi:10.1109/5.726791 

[91] Gao, H., Mao, J., Zhou, J., Huang, Z., Wang, L., and Xu, W. (2015). Are you talking to a machine? Dataset and methods for multilingual image question answering. arXiv preprint arXiv:1505.05612. 

[92] Srinivas, Suraj, et al. "A Taxonomy of Deep Convolutional Neural Nets for Computer Vision." arXiv preprint arXiv:1601.06615 (2016). 

[93] Zhou, Y-T., et al. "Image restoration using a neural network." IEEE Transactions on Acoustics, Speech, and Signal Processing 36.7 (1988): 1141-1151. 

[94] Maas, Andrew L., Awni Y. Hannun, and Andrew Y. Ng. "Rectifier nonlinearities improve neural network acoustic models." Proc. ICML. Vol. 30\. No. 1\. 2013. 

[95] He, Kaiming, et al. "Delving deep into rectifiers: Surpassing human-level performance on imagenet classification." Proceedings of the IEEE International Conference on Computer Vision. 2015. 

[96] [http://web.engr.illinois.edu/~slazebni/spring14/lec24_cnn.pdf](http://web.engr.illinois.edu/~slazebni/spring14/lec24_cnn.pdf) 

[97] Zeiler, Matthew D., and Rob Fergus. "Visualizing and understanding convolutional networks." European Conference on Computer Vision. Springer International Publishing, 2014. 

[98] Simonyan, Karen, and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014). 

[99] Szegedy, Christian, et al. "Going deeper with convolutions." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015. 

[100] He, Kaiming, et al. "Deep residual learning for image recognition." arXiv preprint arXiv:1512.03385 (2015). 

[101] Krizhevsky, Alex. "One weird trick for parallelizing convolutional neural networks." arXiv preprint arXiv:1404.5997 (2014). 

[102] S. Hochreiter and J. Schmidhuber. Long short-term memory. Neural computation, 9(8):17351780, 1997. 

[103] Mikolov, Tomas, et al. "Recurrent neural network based language model." Interspeech. Vol. 2\. 2010. 

[104] Rumelhart, D. E., Hinton, G. E., and Williams, R. J. (1986). Learning representations by backpropagating errors. Nature, 323, 533536. 

[105] Mikolov, T., Sutskever, I., Chen, K., Corrado, G., and Dean, J. (2013a). Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems 26, pages 31113119. 

[106]Graves, A. (2013). Generating sequences with recurrent neural networks. arXiv:1308.0850 [cs.NE]. 

[107] Pascanu, R., Mikolov, T., and Bengio, Y. (2013a). On the difficulty of training recurrent neural networks. In ICML’2013.



[108] Mikolov, T., Sutskever, I., Deoras, A., Le, H., Kombrink, S., and Cernocky, J. (2012a). Subword language modeling with neural networks. unpublished 

[109] Graves, A., Mohamed, A., and Hinton, G. (2013). Speech recognition with deep recurrent neural networks. ICASSP 

[110] Graves, A., Liwicki, M., Fernandez, S., Bertolami, R., Bunke, H., and Schmidhuber, J. (2009). A novel connectionist system for improved unconstrained handwriting recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence. 

[111] [http://karpathy.github.io/2015/05/21/rnn-effectiveness/](http://karpathy.github.io/2015/05/21/rnn-effectiveness/) 

[112] [https://web.stanford.edu/group/pdplab/pdphandbook/handbookch8.html](https://web.stanford.edu/group/pdplab/pdphandbook/handbookch8.html) 

[113] Schuster, Mike, and Kuldip K. Paliwal. "Bidirectional recurrent neural networks." IEEE Transactions on Signal Processing 45.11 (1997): 2673-2681. 

[114] Graves, Alan, Navdeep Jaitly, and Abdel-rahman Mohamed. "Hybrid speech recognition with deep bidirectional LSTM." Automatic Speech Recognition and Understanding (ASRU), 2013 IEEE Workshop on. IEEE, 2013 

[115] Baldi, Pierre, et al. "Exploiting the past and the future in protein secondary structure prediction." Bioinformatics 15.11 (1999): 937-946 

[116] Hochreiter, Sepp, and Jürgen Schmidhuber. "Long short-term memory." Neural computation 9.8 (1997): 1735-1780. 

[117] A. Graves, M. Liwicki, S. Fernandez, R. Bertolami, H. Bunke, J. Schmidhuber. A Novel Connectionist System for Improved Unconstrained Handwriting Recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 31, no. 5, 2009. 

[118] With QuickType, Apple wants to do more than guess your next text. It wants to give you an AI.". WIRED. Retrieved 2016-06-16 

[119] Sak, Hasim, Andrew W. Senior, and Françoise Beaufays. "Long short-term memory recurrent neural network architectures for large scale acoustic modeling." INTERSPEECH. 2014. 

[120] Poultney, Christopher, Sumit Chopra, and Yann L. Cun. "Efficient learning of sparse representations with an energy-based model." Advances in neural information processing systems. 2006. 

[121] LeCun, Yann, et al. "A tutorial on energy-based learning." Predicting structured data 1 (2006): 0. 

[122] Ackley, David H., Geoffrey E. Hinton, and Terrence J. Sejnowski. "A learning algorithm for Boltzmann machines." Cognitive science 9.1 (1985): 147-169. 

[123] Desjardins, G. and Bengio, Y. (2008). Empirical evaluation of convolutional RBMs for vision. Technical Report 1327, Département d’Informatique et de Recherche Opérationnelle, Université de Montréal. 

[124] Hinton, G. E., Osindero, S., and Teh, Y. (2006). A fast learning algorithm for deep belief nets. Neural Computation, 18, 15271554. 

[125] Hinton, G. E. (2007b). Learning multiple layers of representation. Trends in cognitive sciences , 11(10), 428434.



[126] Bengio, Yoshua, et al. "Greedy layer-wise training of deep networks." Advances in neural information processing systems 19 (2007): 153. 

[127] A.-R. Mohamed, T. N. Sainath, G. Dahl, B. Ramabhadran, G. E. Hinton, and M. A. Picheny, ``Deep belief networks using discriminative features for phone recognition,'' in Proc. IEEE ICASSP, May 2011, pp. 5060-5063. 

[128] R. Salakhutdinov and G. Hinton, ``Semantic hashing,'' Int. J. Approx. Reasoning, vol. 50, no. 7, pp. 969-978, 2009. 

[129] G. W. Taylor, G. E. Hinton, and S. T. Roweis, ``Modeling human motion using binary latent variables,'' in Advances in Neural Information Processing Systems. Cambridge, MA, USA: MIT Press, 2006,pp. 1345-1352. 

[130] Zhang, Kunlei, and Xue-Wen Chen. "Large-scale deep belief nets with mapreduce." IEEE Access 2 (2014): 395-403.



[131] Yoshua Bengio, Aaron Courville, and Pascal Vincent. Representation learning: A review and new perspectives. Technical report, arXiv:1206.5538, 2012b. 

[132] Makhzani, Alireza, and Brendan Frey. "k-Sparse Autoencoders." arXiv preprint arXiv:1312.5663 (2013). 

[133] Hinton, Geoffrey E., and Ruslan R. Salakhutdinov. "Reducing the dimensionality of data with neural networks." Science 313.5786 (2006): 504-507. 

[134] Vincent, Pascal, et al. "Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion." Journal of Machine Learning Research 11.Dec (2010): 3371-3408. 

[135] Salakhutdinov, Ruslan, and Geoffrey Hinton. "Semantic hashing." RBM 500.3 (2007): 500. 

[136] Nesi, Paolo, Gianni Pantaleo, and Gianmarco Sanesi. "A hadoop based platform for natural language processing of web pages and documents." Journal of Visual Languages & Computing 31 (2015): 130-138.