原文链接:http://tecdat.cn/?p=5147

介绍

深度学习是机器学习最近的一个趋势,模仿高度非线性的数据表示。在过来的几年中,深度学习在各种利用中取得了微小的发展势头(Wikipedia 2016a)。其中包含图像和语音辨认,无人驾驶汽车,自然语言解决等等。 

明天,深度学习对于简直所有须要机器学习的工作都是十分无效的。然而,它特地适宜简单的分层数据。其潜在的人工神经网络模型高度非线性示意; 这些通常由多层联合非线性转换和定制架构组成。图1形容了一个深度神经网络的典型示意。

图1.深度神经网络的模型

深度学习的胜利带来了各种编程语言的各种框架和库。例子包含Caffee,Theano,Torch和Tensor Flow等等。这篇博客文章的目标是为编程语言R提供不同深度学习软件包的概述和比拟。咱们比拟不同数据集的性能和易用性。

R学习  

R编程语言在统计人员和数据挖掘人员之间的易用性以及简单的可视化和剖析方面曾经取得了相当的遍及。随着深度学习时代的到来,对R的深度学习的反对一直增长,随着越来越多的软件包的推出,本节提供以下软件包提供的无关深度学习的概述:MXNetR,darch,deepnet,H2O和deepr。

首先,咱们留神到,从一个包到另一个包的底层学习算法有很大的不同。同样,表1显示了每个软件包中可用办法/体系结构的列表。

表1. R包中可用的深度学习办法列表。

包神经网络的可用体系结构

MXNetR前馈神经网络,卷积神经网络(CNN)

达奇限度玻尔兹曼机,深层信念网络

DEEPNET前馈神经网络,受限玻尔兹曼机器,深层信念网络,堆栈主动编码器

H2O前馈神经网络,深度主动编码器

deepr从H2O和深网包中简化一些性能

包“MXNetR”

MXNetR包是用C ++编写的MXNet库的接口。它蕴含前馈神经网络和卷积神经网络(CNN)(MXNetR 2016a)。它也容许人们构建定制的模型。该软件包分为两个版本:仅限CPU或GPU版本。以前的CPU版本能够间接从R外部间接装置,而后者的GPU版本依赖于第三方库(如cuDNN),并须要从其源代码(MXNetR 2016b)中构建库。

前馈神经网络(多层感知器)能够在MXNetR中构建,其函数调用如下:

mx.mlp(data, label, hidden_node=1, dropout=NULL, activation=”tanh”, out_activation=”softmax”, device=mx.ctx.default(),…)

参数如下:

data - 输出矩阵

label - 培训标签

hidden_node - 蕴含每个暗藏层中暗藏节点数量的向量

dropout - [0,1)中蕴含从最初一个暗藏层到输入层的失落率的数字

activation - 蕴含激活函数名称的单个字符串或向量。有效值是{ 'relu','sigmoid','softrelu','tanh'}

out_activation - 蕴含输入激活函数名称的单个字符串。有效值是{ 'rmse','sofrmax','logistic'}

device- 是否训练mx.cpu(默认)或mx.gpu

... - 传递给其余参数 mx.model.FeedForward.create

函数mx.model.FeedForward.create在外部应用,mx.mpl并采纳以下参数:

symbol - 神经网络的符号配置

ctx - 上下文,即设施(CPU / GPU)或设施列表(多个CPU或GPU)

num.round - 训练模型的迭代次数

optimizer- 字符串(默认是'sgd')

initializer - 参数的初始化计划

eval.data - 过程中应用的验证集

eval.metric - 评估后果的性能

epoch.end.callback - 迭代完结时回调

batch.end.callback - 当一个小批量迭代完结时回调

array.batch.size - 用于阵列训练的批量大小

array.layout-能够是{ 'auto','colmajor','rowmajor'}

kvstore - 多个设施的同步计划

示例调用:

model <- mx.mlp(train.x, train.y, hidden_node=c(128,64), out_node=2, activation="relu", out_activation="softmax",num.round=100, array.batch.size=15, learning.rate=0.07, momentum=0.9, device=mx.cpu())

之后要应用训练好的模型,咱们只须要调用predict()指定model第一个参数和testset第二个参数的函数:

preds = predict(model, testset)

这个函数mx.mlp()实质上代表了应用MXNet的'Symbol'零碎定义一个神经网络的更灵便但更长的过程。以前的网络符号定义的等价物将是:

data <- mx.symbol.Variable("data") fc1 <- mx.symbol.FullyConnected(data, num_hidden=128) act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu")

当网络架构最终被创立时,MXNetR提供了一种简略的办法来应用以下函数调用来图形化地查看它:

graph.viz(model$symbol$as.json())

graph.viz(model2$symbol$as.json())

这里,参数是由符号示意的训练模型。第一个网络由mx.mlp()第二个网络构建,第二个网络应用符号零碎。

该定义从输出到输入逐层进行,同时还为每个层别离容许不同数量的神经元和特定的激活函数。其余选项可通过mx.symbol以下形式取得:mx.symbol.Convolution,将卷积利用于输出,而后增加偏差。它能够创立卷积神经网络。相同mx.symbol.Deconvolution,通常在宰割网络中应用mx.symbol.UpSampling,以便重建图像的按像素分类。CNN中应用的另一种类型的层是mx.symbol.Pooling; 这本质上通过抉择具备最高响应的信号来缩小数据。该层mx.symbol.Flatten须要将卷积层和池层链接到齐全连贯的网络。另外,mx.symbol.Dropout能够用来应酬适度配合的问题。它将输出的参数previous_layer和浮点值fraction作为降落的参数。

正如咱们所看到的,MXNetR可用于疾速设计标准多层感知器的性能,mx.mlp()或用于更宽泛的对于符号示意的试验。

LeNet网络示例:

data <- mx.symbol.Variable('data')

总而言之,MXNetR软件包非常灵活,同时反对多个CPU和多个GPU。它具备构建规范前馈网络的捷径,同时也提供了灵便的性能来构建更简单的定制网络,如CNN LeNet。

 “darch”

darch软件包(darch 2015)施行深层架构的训练,如深层信念网络,它由分层预训练的限度玻尔兹曼机器组成。该套件还须要反向流传进行微调,并且在最新版本中,能够抉择预培训。

深层信奉网络的培训是通过darch()性能进行的。

示例调用:

darch <- darch(train.x, train.y, rbm.numEpochs = 0, rbm.batchSize = 100, rbm.trainOutputLayer = F, layers = c(784,100,10), darch.batchSize = 100, darch.learnRate = 2, darch.retainData = F, darch.numEpochs = 20 )

这个函数带有几个最重要的参数,如下所示:

x - 输出数据

y - 指标数据

layers - 蕴含一个整数的矢量,用于每个图层中的神经元数量(包含输出和输入图层)

rbm.batchSize - 预培训批量大小

rbm.trainOutputLayer - 在训练前应用的布尔值。如果属实,RBM的输入层也会被训练

rbm.numCD - 执行比照一致的残缺步数

rbm.numEpochs - 预培训的期间数量

darch.batchSize - 微调批量大小

darch.fineTuneFunction - 微调性能

darch.dropoutInput - 网络输出失落率

darch.dropoutHidden - 暗藏层上的失落率

darch.stopErr - 如果谬误小于或等于阈值,则进行训练

darch.numEpochs - 微调的时代数量

darch.retainData - 布尔型,批示在培训之后将训练数据存储在darch实例中的天气

依据以前的参数,咱们能够训练咱们的模型产生一个对象darch。稍后咱们能够将其利用于测试数据集test.x来进行预测。在这种状况下,一个附加参数type指定预测的输入类型。例如,能够‘raw’给出‘bin’二进制向量和‘class’类标签的概率。最初,在调用时predict()进行如下预测:

predictions <- predict(darch, test.x, type="bin")

总的来说,darch的根本用法很简略。它只须要一个性能来训练网络。但另一方面,这套教材只限于深层的信奉网络,这通常须要更宽泛的训练。

包“deepnet ”

deepnet (deepnet 2015)是一个绝对较小,但相当弱小的软件包,有多种架构可供选择。它能够应用函数来训练一个前馈网络,也能够用nn.train()深度信念网络来初始化权重dbn.dnn.train()。这个性能在外部rbm.train()用来训练一个受限制的波尔兹曼机器(也能够独自应用)。此外,深网也能够解决重叠的主动编码器sae.dnn.train()。

示例调用(for nn.train()):

nn.train(x, y, initW=NULL, initB=NULL, hidden=c(50,20), activationfun="sigm", learningrate=0.8, momentum=0.5, learningrate_scale=1, output="sigm", numepochs=3, batchsize=100, hidden_dropout=0, visible_dropout=0)

人们能够设置原来的权initW重initB,否则随机生成。另外,hidden管制的在暗藏层单元的数量,而activationfun指定的暗藏层的激活性能(能够是‘sigm’,‘linear’或‘tanh’),以及输入层的(能够是‘sigm’,‘linear’,‘softmax’)。

作为一种抉择,上面的例子训练一个神经网络,其中权重是由深层信念网络(via dbn.dnn.train())初始化的。差异次要在于训练受限玻尔兹曼机的比照散度算法。它是通过cd给定学习算法内的吉布斯采样的迭代次数来设置的。

dbn.dnn.train(x, y, hidden=c(1), activationfun="sigm", learningrate=0.8, momentum=0.5, learningrate_scale=1, output="sigm", numepochs=3, batchsize=100, hidden_dropout=0, visible_dropout=0, cd=1)

同样,也能够从堆栈主动编码器初始化权重。output这个例子不是应用参数,而是sae_output和以前一样应用。

sae.dnn.train(x, y, hidden=c(1), activationfun="sigm", learningrate=0.8, momentum=0.5, learningrate_scale=1, output="sigm", sae_output="linear", numepochs=3, batchsize=100, hidden_dropout=0, visible_dropout=0)

最初,咱们能够应用训练有素的网络来预测后果nn.predict()。随后,咱们能够借助nn.test()错误率将预测转化为错误率。第一次调用须要一个神经网络和相应的察看值作为输出。第二个电话在进行预测时还须要正确的标签和阈值(默认值为0.5)。

predictions = nn.predict(nn, test.x) error_rate = nn.test(nn, test.x, test.y, t=0.5)

总而言之,深网代表了一个轻量级的包,其中蕴含了一系列无限的参数。然而,它提供了多种体系结构。

包 “H2O”

H2O是一个开源软件平台,能够利用分布式计算机系统(H2O 2015)。其外围以Java编码,须要最新版本的JVM和JDK,能够在https://www.java.com/en/downl...。该软件包为许多语言提供接口,最后设计用作基于云的平台(Candel et al。2015)。因而,通过调用h2o.init()以下命令启动H2O :

h2o.init(nthreads = -1)

该参数nthreads指定将应用多少个外围进行计算。值-1示意H2O将尝试应用零碎上所有可用的内核,但默认为2.此例程也能够应用参数,ip并且portH2O装置在不同的机器上。默认状况下,它将IP地址127.0.0.1与端口54321一起应用。因而,能够在浏览器中定位地址“localhost:54321”以拜访基于Web的界面。一旦您应用以后的H2O实例实现工作,您须要通过以下形式断开连接:

h2o.shutdown()

示例调用:

所有培训操作h2o.deeplearning()如下:

model <- h2o.deeplearning( x=x, y=y, training_frame=train, validation_frame=test, distribution="multinomial", activation="RectifierWithDropout", hidden=c(32,32,32), input_dropout_ratio=0.2, sparse=TRUE, l1=1e-5, epochs=100)

用于在H2O中传递数据的接口与其余包略有不同:x是蕴含具备训练数据的列的名称的向量,并且y是具备所有名称的变量的名称。接下来的两个参数,training_frame并且validation_frame,是H2O帧的对象。 

最初,咱们能够应用h2o.predict()以下签名进行预测:

predictions <- h2o.predict(model, newdata=test_data)

H2O提供的另一个弱小工具是优化超参数的网格搜寻。能够为每个参数指定一组值,而后找到最佳组合值h2o.grid()。

超参数优化

H2 =包将训练四种不同的模型,两种架构和不同的L1正则化权重。因而,能够很容易地尝试一些超参数的组合,看看哪一个更好:

深度主动编码器

H2O也能够利用深度主动编码器。为了训练这样的模型,应用雷同的性能h2o.deeplearning(),然而这组参数略有不同

在这里,咱们只应用训练数据,没有测试集和标签。咱们须要深度主动编码器而不是前馈网络的事实由autoencoder参数指定。和以前一样,咱们能够抉择多少暗藏单元应该在不同的档次。如果咱们应用一个整数值,咱们将失去一个天真的主动编码器。

训练完结后,咱们能够钻研重建误差。咱们通过特定的h2o.anomaly()函数来计算它。

总的来说,H2O是一个十分用户敌对的软件包,能够用来训练前馈网络或深度主动编码器。它反对分布式计算并提供一个Web界面。

包deepr

deepr (deepr 2015)包自身并没有实现任何深度学习算法,而是将其工作转交给H20。该包最后是在CRAN尚未提供H2O包的时候设计的。因为状况不再是这样,咱们会将其排除在比拟之外。咱们也留神到它的性能train_rbm()应用深层的实现rbm来训练带有一些附加输入的模型。

软件包的比拟

本节将比拟不同指标的上述软件包。其中包含易用性,灵活性,易于装置,反对并行计算和帮助抉择超参数。另外,咱们测量了三个常见数据集“Iris”,“MNIST”和“森林笼罩类型”的体现。咱们心愿咱们的比拟帮忙实践者和钻研人员抉择他们喜爱的深度学习包。

装置

通过CRAN装置软件包通常非常简单和晦涩。然而,一些软件包依赖于第三方库。例如,H2O须要最新版本的Java以及Java Development Kit。darch和MXNetR软件包容许应用GPU。为此,darch依赖于R软件包gpuools,它仅在Linux和MacOS零碎上受反对。默认状况下,MXNetR不反对GPU,因为它依赖于cuDNN,因为许可限度,cuDNN不能蕴含在软件包中。因而,MXNetR的GPU版本须要Rtools和一个反对C ++ 11的古代编译器,以应用CUDA SDK和cuDNN从源代码编译MXNet。

灵活性

就灵活性而言,MXNetR很可能位列榜首。它容许人们尝试不同的体系结构,因为它定义了网络的分层办法,更不用说丰盛多样的参数了。在咱们看来,咱们认为H2O和darch都是第二名。H20次要针对前馈网络和深度主动编码器,而darch则侧重于受限制的玻尔兹曼机器和深度信念网络。这两个软件包提供了宽泛的调整参数。最初但并非最不重要的一点,deepnet是一个相当轻量级的软件包,然而当想要应用不同的体系结构时,它可能是无益的。然而,咱们并不举荐将其用于宏大数据集的日常应用,因为其以后版本不足GPU反对,而绝对较小的一组参数不容许最大限度地进行微调。

使用方便

H2O和MXNetR的速度和易用性突出。MXNetR简直不须要筹备数据来开始训练,而H2O通过应用as.h2o()将数据转换为H2OFrame对象的函数提供了十分直观的包装。这两个包提供了额定的工具来查看模型。深网以单热编码矩阵的模式获取标签。这通常须要一些预处理,因为大多数数据集都具备矢量格局的类。然而,它没有报告对于培训期间停顿的十分具体的信息。该软件包还短少用于查看模型的附加工具。darch,另一方面,有一个十分好的和具体的输入。

总的来说,咱们将H2O或者MXNetR看作是这个类别的赢家,因为两者都很快并且在训练期间提供反馈。这使得人们能够疾速调整参数并进步预测性能。

并行

深度学习在解决大量数据集时很常见。因而,当软件包容许肯定水平的并行化时,它能够是微小的帮忙。表2比拟了并行化的反对。它只显示文件中明确阐明的信息。

参数的抉择

另一个要害的方面是超参数的抉择。H2O软件包应用全自动的每神经元自适应学习速率来疾速收敛。它还能够抉择应用n-fold穿插验证,并提供h2o.grid()网格搜寻性能,以优化超参数和模型抉择。

MXNetR在每次迭代后显示训练的准确性。darch在每个纪元后显示谬误。两者都容许在不期待收敛的状况下手动尝试不同的超参数,因为如果精度没有进步,训练阶段能够提前终止。相比之下,深网不会显示任何信息,直到训练实现,这使得调整超参数十分具备挑战性。

性能和运行工夫

咱们筹备了一个非常简单的性能比拟,以便为读者提供无关效率的信息。所有后续测量都是在CPU Intel Core i7和GPU NVidia GeForce 750M(Windows操作系统)的零碎上进行的。比拟是在三个数据集上进行的:“MNIST” (LeCun等人2012),“Iris” (Fisher 1936)和“森林笼罩类型” (Blackard和Dean 1998)。详情见附录。

作为基准,咱们应用H2O包中实现的随机森林算法。随机森林是通过构建多个决策树(维基百科2016b)来工作的汇合学习办法。乏味的是,它曾经证实了它可能在不进行参数调整的状况下在很大水平上实现高性能。

后果

测量后果在表3中给出,并且在图2,图3和图4中别离针对“MNIST”,“虹膜”和“森林笼罩类型”数据集可视化。

'MNIST'数据集。依据表3和图2,MXNetR和H2O在“MNIST”数据集上实现了运行工夫和预测性能之间的优越折衷。darch和deepnet须要绝对较长的工夫来训练网络,同时达到较低的精度。

'虹膜'数据集。在这里,咱们再次看到MXNetR和H2O体现最好。从图3能够看出,深网具备最低的准确性,可能是因为它是如此小的数据集,在训练前误导。正因为如此,darch 100和darch 500/300通过反向流传训练,省略了训练前的阶段。这由表中的*符号标记。

“森林笼罩类型”数据集。H2O和MXNetR显示的准确率大概为67%,然而这还是比其余软件包好。咱们留神到darch 100和darch 500/300的培训没有收敛,因而这些模型被排除在这个比拟之外。

咱们心愿,即便是这种简略的性能比拟,也能够为从业人员在抉择本人喜爱的R包时提供有价值的见解

留神:从图3和图4能够看出,随机森林比深度学习包可能体现得更好。这有几个无效的起因。首先,数据集太小,因为深度学习通常须要大数据或应用数据加强能力失常工作。其次,这些数据集中的数据由手工特色组成,这就否定了深层架构从原始数据中学习这些特色的劣势,因而传统办法可能就足够了。最初,咱们抉择十分类似的(也可能不是最高效的)体系结构来比拟不同的实现。

表3. R中不同深度学习包的准确性和运行工夫的比拟

*仅应用反向流传训练的模型(不进行预训练)。

 数据集MNIST鸢尾花森林笼罩类型

准确性 (%)运行工夫(秒)准确性 (%)运行工夫(秒)准确性 (%)运行工夫(秒)

图2.比拟“MNIST”数据集的运行工夫和准确度。

图3.“虹膜”数据集的运行工夫和精度比拟

图4.“森林笼罩类型”数据集的运行工夫和准确度的比拟。

论断

作为本文的一部分,咱们在R中比拟了五种不同的软件包,以便进行深刻的学习:(1)以后版本的deepnet可能代表可用体系结构中差别最大的软件包。然而,因为它的施行,它可能不是最快也不是用户最敌对的抉择。此外,它可能不提供与其余一些软件包一样多的调整参数。(2)H2O和MXNetR相同,提供了十分人性化的体验。两者还提供额定信息的输入,疾速进行训练并获得体面的后果。H2O可能更适宜集群环境,数据科学家能够在简略的流水线中应用它来进行数据挖掘和勘探。当灵活性和原型更受关注时,MXNetR可能是最合适的抉择。它提供了一个直观的符号工具,用于从头构建自定义网络体系结构。此外,通过利用多CPU / GPU性能,它能够在个人电脑上运行。(3)darch提供了一个无限然而有针对性的性能,重点是深度信念网络。

总而言之,咱们看到R对深度学习的反对正在顺利进行。最后,R提供的性能落后于其余编程语言。然而,这不再是这种状况。有了H20和MXnetR,R用户就能够在指尖上应用两个弱小的工具。在将来,看到更多的接口 - 例如Caffe或Torch将是可取的。