深度學習是機器學習領域的一大熱點, 它可以對極度非線性的資料, 包括圖像等進行建模。 在過去的幾年, 深度學習在各應用領域展現了驚人的發展勢頭。 其中包括圖像和聲音識別、無人駕駛、自然語言處理等。 有趣的是, 深度學習有關的大部分的數學原理早在幾十年前就存在了。 然而, 它的潛能是通過近期的一些領域的應用才得以有效的解放。
過去由於梯度下降及過度擬合的問題, 人工神經網路是很難實現的。 如今, 通過不同的啟動函數、正則化、大量的訓練資料集可以解決上述的問題。 比如, 利用互聯網可以獲取大量的有標籤或無標籤的資料。 另外, GPUs和GPGPUs通用計算使得計算過程更快, 成本更低。
當前, 深度學習在幾乎所有的機器學習任務中表現出良好的性能, 特別適合於複雜的、多層次的資料。 最基本的就是通過人工神經網路模型處理極度非線性的資料,
深度學習的成功使得大量的程式設計語言有關深度學習的資源應運而生。 其中包括Caffee、Theano、Torch、Tensor Flow等。 本文將對幾個深度學習相關的R包進行介紹和比較。
R語言因其簡便靈活、視覺化功能強大等在統計學家和資料採擷分析師中深受歡迎。 隨著深度學習的發展, 一系列深度學習的R包也出來了。 我們將介紹MXNetR、darch、deepnet、H2O、deepr等五個主要的R包。 下表展示的是幾個R包的異同。
1)MXNetR
MXNetR是基於C語言的MXNet庫的一個幾口。 它可以進行前饋神經網路和卷積神經網路(MXNetR 2016a)。
前饋神經網路例子
①通過封裝的函數實現:
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())
②通過自訂模型實現:
data <- mx.symbol.Variable("data") fc1 <- mx.symbol.FullyConnected(data, num_hidden=128) act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu") fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=64) act2 <- mx.symbol.Activation(fc2, name="relu2", act_type="relu") fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=2) lro <- mx.symbol.SoftmaxOutput(fc3, name="sm")
model2 <- mx.model.FeedForward.create(lro, X=train.x, y=train.y, ctx=mx.cpu(), num.round=100, array.batch.size=15, learning.rate=0.07, momentum=0.9)
可見, MXNetR通過mx.mlp函數可以快速設計標準的模型, 也可以通過自訂參數實現同樣的功能。
2)darch
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)
總的來說, darch的基本使用非常簡單, 它只使用一個函數對網路進行訓練, 但是這也限制了它進行更加深入的深度信念網路學習, 因為往往需要更多的訓練。
3)deepnet
deepnet是一個相對較小而強大的包。 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)
總之, deepnet是一個羽量級的, 設定少數的參數, 卻能實現多數的模型。
4)H2O
H2O原來是一個可以利用分散式運算機系統的開源軟體平臺。 它是基於Java語言搭建的, 要求版的JVM和JDK(https://www.java.com/en/download/)。 該R包提供了很多語言的介面, 並且源於雲端服務的設計。
深度自動編碼器的例子
anomaly_model <- h2o.deeplearning( x = names(train), training_frame = train, activation = "Tanh", autoencoder = TRUE, hidden = c(50,20,50), sparse = TRUE, l1 = 1e-4, epochs = 100)
總之, H2O是一個高度用戶有好的R包, 可以實現前饋神經網路和深度自動編碼器, 還支援分散式運算, 甚至提供網路介面。
5)deepr
deepr自身其實並不能實現深度學習的演算法, 當初是由於H2O包在CRAN上不可用時作為彌補的。 所以它只是引用了H2O和deepnet的某些函數。
我們將從易用性、靈活性、易安裝性、並行運算支持性、超參數選擇性等幾方面進行比較。 借助常用的資料集Iris、MNIST、Forest Cover Type等為用戶提供合適的R包提供參考。
通過CRAN安裝R包是非常簡便的。但是以上某些R包需要協力廠商庫的支援。比如,H2O要求版的Java和JDK。由於darch允許使用GPU,所以darch要基於gputools包,而且它只支援Linux和MacOS系統;MXNetR默認是不開放GPU功能的,因為它基於的cuDNN存在版權的問題,所以GPU版本要求Rtools和C++軟體來支援封裝來自CUDA SDK和cuDNN的代碼。
在靈活性方便,MXNetR應該是排在第一位的。由於它分層定義模型的特點,無需設置大量的參數就可以實現不同的模型。在我們看來,H2O和darch應該是排在第二位的。H2O主要關注前回饋神經網路和深度自動編碼器,而darch則關注限制玻爾茲曼機和深度信念網路。兩個包都提供了很多可調整的參數。deepnet是一個相對羽量級的包,主要的優點在於可以擬合多種不同的模型。但是我們不推薦日常使用非GPU版本的deepnet對較大的資料進行分析,因為相對較少的參數使它不能微調至理想的模型。
H2O和MXNetR因其速度和易用性而出色的。MXNetR不要求對資料進行預處理;而H2O通過as.h2o()函數將資料轉換為H2O物件。兩個包都提供模型檢驗的工具。deepnet通常把標籤作為單特徵編碼矩陣,這就要求很多的資料初始化工作,因為很多資料集的類儲存為向量的格式。但是它不會報告這個初始化工作的過程。另外,deepnet也缺乏模型檢驗的工具。相反,darch有一個很清晰而且詳細的輸出。
深度學習之所以成為趨勢得力於它可以處理大資料集。所以,如果R包可以支持並行運算,對於深度學習將會是極大的幫助。下表展示的是幾個R包對並行運算的支援性。
另一個重要的方面是超參數的選擇性。H2O採用一種全自動的前神經元調整學習演算法使其能夠很快的收斂。它也可以通過交叉驗證和區域搜尋的方法來優化參數以及模型篩選。
MXNetR會給出每次反覆運算的訓練正確性,darch會給出每次建模的誤差。這都允許我們手動的選擇不同的參數,由於訓練過程可以根據反覆運算的結果提前終止,而無需等到演算法收斂。相反,deepnet沒有在訓練結束之前給出任何資訊,導致參數選擇非常具有挑戰性。
通過上面的介紹和分析,我們可知:當前版本的deepnet能夠實現較大的模型,但在速度和使用者友好方面欠佳,也未能支持參數的調整。
H2O和MXNetR,相對來說,提供了用戶友好的體驗。兩者都提供參數調整的參考,訓練時間快,而且通常能得到比較好的結果。H2O更適合集群運算的環境,資料分析師可以通過直接的管道進行資料採擷和探索。當我門更加關注靈活性和模型設計方面,MXNetR將會是最合適的選擇。它提供了直觀的符號工具使我們方便進行自訂。另外,它可以在個人電腦上使用多核CPU/GPU進行優化。
darch提供了少數但專注于深度信念網路的函數。
總之,R語言可以很好地進行深度學習。H20和MXnetR可以說是R用戶強大的深度學習工具,Caffe和TorchIn等更多的介面將會湧現。儘管與其他程式設計語言相比,R語言在深度學習方面還不是很有優勢。
想要獲得《R語言深度學習實踐指南》PDF版本和英文原版連結,請關注基數智慧公眾號jishu2017ai,回復r獲取,一起加入人工智慧AI技術大本營。
借助常用的資料集Iris、MNIST、Forest Cover Type等為用戶提供合適的R包提供參考。通過CRAN安裝R包是非常簡便的。但是以上某些R包需要協力廠商庫的支援。比如,H2O要求版的Java和JDK。由於darch允許使用GPU,所以darch要基於gputools包,而且它只支援Linux和MacOS系統;MXNetR默認是不開放GPU功能的,因為它基於的cuDNN存在版權的問題,所以GPU版本要求Rtools和C++軟體來支援封裝來自CUDA SDK和cuDNN的代碼。
在靈活性方便,MXNetR應該是排在第一位的。由於它分層定義模型的特點,無需設置大量的參數就可以實現不同的模型。在我們看來,H2O和darch應該是排在第二位的。H2O主要關注前回饋神經網路和深度自動編碼器,而darch則關注限制玻爾茲曼機和深度信念網路。兩個包都提供了很多可調整的參數。deepnet是一個相對羽量級的包,主要的優點在於可以擬合多種不同的模型。但是我們不推薦日常使用非GPU版本的deepnet對較大的資料進行分析,因為相對較少的參數使它不能微調至理想的模型。
H2O和MXNetR因其速度和易用性而出色的。MXNetR不要求對資料進行預處理;而H2O通過as.h2o()函數將資料轉換為H2O物件。兩個包都提供模型檢驗的工具。deepnet通常把標籤作為單特徵編碼矩陣,這就要求很多的資料初始化工作,因為很多資料集的類儲存為向量的格式。但是它不會報告這個初始化工作的過程。另外,deepnet也缺乏模型檢驗的工具。相反,darch有一個很清晰而且詳細的輸出。
深度學習之所以成為趨勢得力於它可以處理大資料集。所以,如果R包可以支持並行運算,對於深度學習將會是極大的幫助。下表展示的是幾個R包對並行運算的支援性。
另一個重要的方面是超參數的選擇性。H2O採用一種全自動的前神經元調整學習演算法使其能夠很快的收斂。它也可以通過交叉驗證和區域搜尋的方法來優化參數以及模型篩選。
MXNetR會給出每次反覆運算的訓練正確性,darch會給出每次建模的誤差。這都允許我們手動的選擇不同的參數,由於訓練過程可以根據反覆運算的結果提前終止,而無需等到演算法收斂。相反,deepnet沒有在訓練結束之前給出任何資訊,導致參數選擇非常具有挑戰性。
通過上面的介紹和分析,我們可知:當前版本的deepnet能夠實現較大的模型,但在速度和使用者友好方面欠佳,也未能支持參數的調整。
H2O和MXNetR,相對來說,提供了用戶友好的體驗。兩者都提供參數調整的參考,訓練時間快,而且通常能得到比較好的結果。H2O更適合集群運算的環境,資料分析師可以通過直接的管道進行資料採擷和探索。當我門更加關注靈活性和模型設計方面,MXNetR將會是最合適的選擇。它提供了直觀的符號工具使我們方便進行自訂。另外,它可以在個人電腦上使用多核CPU/GPU進行優化。
darch提供了少數但專注于深度信念網路的函數。
總之,R語言可以很好地進行深度學習。H20和MXnetR可以說是R用戶強大的深度學習工具,Caffe和TorchIn等更多的介面將會湧現。儘管與其他程式設計語言相比,R語言在深度學習方面還不是很有優勢。
想要獲得《R語言深度學習實踐指南》PDF版本和英文原版連結,請關注基數智慧公眾號jishu2017ai,回復r獲取,一起加入人工智慧AI技術大本營。