原文链接:http://tecdat.cn/?p=5147
原文出处:拓端数据部落公众号
介绍
深度学习是机器学习最近的一个趋势,模仿 高度非线性 的数据。在过来的几年中,深度学习在各种利用中取得了微小的发展势头(Wikipedia 2016a)。其中包含图像和语音辨认,无人驾驶汽车,自然语言解决等等。
明天,深度学习对于简直所有须要机器学习的工作都是十分无效的。然而,它特地适宜简单的分层数据。其潜在的人工神经网络模型高度非线性示意; 这些通常由多层联合非线性转换和定制架构组成。图 1 形容了一个深度神经网络的典型示意。
图 1. 深度神经网络的模型
深度学习的胜利带来了各种编程语言的各种框架和库。例子包含 Caffee,Theano,Torch 和 Tensor Flow 等等。这篇博客文章的目标是为编程语言 R 提供不同深度学习软件包的概述和比拟。咱们比拟不同数据集的性能和易用性。
R 学习
R 编程语言在统计人员和数据挖掘人员之间的易用性以及简单的 可视化 方面曾经取得了相当的遍及。随着深度学习时代的到来,对 R 的深度学习的反对一直增长,随着越来越多的软件包的推出,本节提供以下软件包提供的无关深度学习的概述:MXNetR,darch,deepnet,H2O 和 deepr。
首先,咱们留神到,从一个包到另一个包的底层学习算法有很大的不同。同样,表 1 显示了每个软件包中可用办法 / 体系结构的列表。
R 包中可用的深度学习办法列表:
MXNetR 前馈神经网络,卷积神经网络(CNN)
DEEPNET 前馈神经网络,受限玻尔兹曼机器,深层信念网络,堆栈主动编码器
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.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’}
示例调用:
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.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,否则随机生成。另外,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)
总而言之,deepnet 代表了一个轻量级的包,其中蕴含了一系列无限的参数。然而,它提供了多种体系结构。
包“H2O”
H2O 是一个开源软件平台,能够利用分布式计算机系统(H2O 2015)。其外围以 Java 编码,须要最新版本的 JVM 和 JDK,能够在 https://www.java.com/en/download/ 上找到。该软件包为许多语言提供接口,最后设计用作基于云的平台(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 对象的函数提供了十分直观的包装。这两个包提供了额定的工具来查看模型。deepnet 以单热编码矩阵的模式获取标签。这通常须要一些预处理,因为大多数数据集都具备矢量格局的类。然而,它没有报告对于训练期间停顿的十分具体的信息。该软件包还短少用于查看模型的附加工具。darch,另一方面,有一个十分好的和具体的输入。
总的来说,咱们将 H2O 或者 MXNetR 看作是这个类别的赢家,因为两者都很快并且在训练期间提供反馈。这使得人们能够疾速调整参数并进步预测性能。
并行
深度学习在解决大量数据集时很常见。因而,当软件包容许肯定水平的并行化时,它能够提供微小的帮忙。
参数的抉择
另一个要害的方面是超参数的抉择。H2O 软件包应用全自动的每神经元自适应学习速率来疾速收敛。它还能够抉择应用 n -fold 穿插验证,并提供 h2o.grid()网格搜寻性能,以优化超参数和模型抉择。
MXNetR 在每次迭代后显示训练的准确性。两者都容许在不期待收敛的状况下手动尝试不同的超参数,因为如果精度没有进步,训练阶段能够提前终止。相比之下,deepnet 不会显示任何信息,直到训练实现,这使得调整超参数十分具备挑战性。
性能和运行工夫
咱们筹备了一个非常简单的性能比拟,以便为读者提供无关效率的信息。所有后续测量都是在 CPU Intel Core i7 和 GPU NVidia GeForce 750M(Windows 操作系统)的零碎上进行的。比拟是在三个数据集上进行的:“MNIST”(LeCun 等人 2012),“Iris”(Fisher 1936)和“森林笼罩类型”(Blackard 和 Dean 1998)。详情见附录。
作为基准,咱们应用 H2O 包中实现的随机森林算法。随机森林是通过构建多个决策树来工作的汇合学习办法。乏味的是,它曾经证实了它可能在不进行参数调整的状况下在很大水平上实现高性能。
后果
测量后果在表 3 中给出,并且在图 2,图 3 和图 4 中别离针对“MNIST”,“iris”和“森林笼罩类型”数据集可视化。
‘MNIST’ 数据集。依据表 3 和图 2,MXNetR 和 H2O 在“MNIST”数据集上实现了运行工夫和预测性能之间的优越折衷。darch 和 deepnet 须要绝对较长的工夫来训练网络,同时达到较低的精度。
‘iris’ 数据集。在这里,咱们再次看到 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.“iris”数据集的运行工夫和精度比拟
图 4.“森林笼罩类型”数据集的运行工夫和准确度的比拟。
论断
作为本文的一部分,咱们在 R 中比拟了五种不同的软件包,以便进行深刻的学习:(1)以后版本的 deepnet 可能代表可用体系结构中差别最大的软件包。然而,因为它的施行,它可能不是最快也不是用户最敌对的抉择。此外,它可能不提供与其余一些软件包一样多的调整参数。(2)H2O 和 MXNetR 相同,提供了十分人性化的体验。两者还提供额定信息的输入,疾速进行训练并获得后果。H2O 可能更适宜集群环境,数据科学家能够在简略的流水线中应用它来进行数据挖掘和勘探。当灵活性和原型更受关注时,MXNetR 可能是最合适的抉择。它用于从头构建自定义网络体系结构。此外,通过利用多 CPU / GPU 性能,它能够在个人电脑上运行。(3)darch 提供了一个无限然而有针对性的性能,重点是深度信念网络。
总而言之,咱们看到 R 对深度学习的反对正在顺利进行。最后,R 提供的性能落后于其余编程语言。然而,有了 H20 和 MXnetR,R 用户就能够应用两个弱小的工具。