十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
今天就跟大家聊聊有關(guān)如何解析spark MLlib訓(xùn)練原理和使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),黃山區(qū)企業(yè)網(wǎng)站建設(shè),黃山區(qū)品牌網(wǎng)站建設(shè),網(wǎng)站定制,黃山區(qū)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,黃山區(qū)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
說明
spark MLlib是Spark提供的可擴(kuò)展的機(jī)器學(xué)習(xí)庫(kù)。MLlib中已經(jīng)包含了一些通用的學(xué)習(xí)算法和工具,如:分類、回歸、聚類、協(xié)同過濾、降維以及底層的優(yōu)化原語等算法和工具,MLlib提供的API主要分為以下兩類。
spark.mllib包中提供的主要API,操作RDD,后續(xù)可能廢棄。
spark.ml包中提供的構(gòu)建機(jī)器學(xué)習(xí)工作流的高層次的API,主要操作DataFrame,可使用pipeline把很多操作(算法/特征提取/特征轉(zhuǎn)換)以管道的形式串起來,讓數(shù)據(jù)在這個(gè)管道中流動(dòng)。ml所有模型提供統(tǒng)一的算法操作接口,比如模型訓(xùn)練都是fit。mllib中不同模型會(huì)有各種各樣的trainXXX。
訓(xùn)練原理
隨機(jī)森林訓(xùn)練原理:
優(yōu)化:
逐層訓(xùn)練:因?yàn)閿?shù)據(jù)存放在不同的機(jī)器上,頻繁的訪問數(shù)據(jù)效率非常低,因此采用廣度遍歷的方法,每次構(gòu)造所有樹的一層,例如如果要訓(xùn)練10棵樹,第一次構(gòu)造所有樹的第一層根節(jié)點(diǎn),第二次構(gòu)造所有深度為2的節(jié)點(diǎn),以此類推,這樣訪問數(shù)據(jù)的次數(shù)降為樹的最大深度,大大減少了機(jī)器之間的通信,提高訓(xùn)練效率。
樣本抽樣:當(dāng)樣本存在連續(xù)特征時(shí),其可能的取值可能是無限的,存儲(chǔ)其可能出現(xiàn)的值占用較大空間,因此spark對(duì)樣本進(jìn)行了抽樣,抽樣數(shù)量,最少抽樣1萬條
特征裝箱:每個(gè)離散特征值(對(duì)于連續(xù)特征,先離散化)稱為一個(gè)Split,上下限[lowSplit, highSplit]組成一個(gè)bin,也就是特征裝箱,默認(rèn)的maxBins是32。對(duì)于連續(xù)特征,離散化時(shí)的bin的個(gè)數(shù)就是maxBins,采用等頻離散化;對(duì)于有序的離散特征,bin的個(gè)數(shù)是特征值個(gè)數(shù)+1;對(duì)于無序離散特征,bin的個(gè)數(shù)是2^(M-1)-1,M是特征值個(gè)數(shù)
過程:
1、初始化模型:構(gòu)建numTrees個(gè)Node,賦默認(rèn)值emptyNode,這些node將作為每棵樹的root node,參與后面的訓(xùn)練。將這些node與treeIndex封裝加入到隊(duì)列nodeQueue中,后面會(huì)將所有待split的node都加入到這個(gè)隊(duì)列中,依次split,直到所有node觸發(fā)截止條件,也就是后面的while循環(huán)中隊(duì)列為空了。
2、選擇待分裂Node:循環(huán)從nodeQueue取出待處理node放入nodesForGroup和treeToNodeToIndexInfo中nodesForGroup是Map[Int, Array[Node]],其key是treeIndex,value是Node數(shù)組,其中放著該tree本次要分裂的node
treeToNodeToIndexInfo的類型是Map[Int, Map[Int, NodeIndexInfo]],key為treeIndex,value中Map的key是node.id,這個(gè)id來自Node初始化時(shí)的第一個(gè)參數(shù),第一輪時(shí)node的id都是1。其value為NodeIndexInfo結(jié)構(gòu),
計(jì)算最佳node分裂:先在個(gè)partition上分別統(tǒng)計(jì),再累積各partition成全局統(tǒng)計(jì),針對(duì)每個(gè)node遍歷所有特征,計(jì)算獲得最佳分裂。
3、分裂node:根據(jù)最佳split進(jìn)行node的分裂,包括當(dāng)前節(jié)點(diǎn)的一些屬性完善,左右孩子節(jié)點(diǎn)的構(gòu)造等,將當(dāng)前節(jié)點(diǎn)的左右孩子節(jié)點(diǎn)繼續(xù)加入nodeQueue中,這里面放的是需要繼續(xù)分裂的節(jié)點(diǎn),至此當(dāng)前層分裂完成。
4、循環(huán)訓(xùn)練循環(huán)執(zhí)行取出node、分裂node步驟, 直到的所有節(jié)點(diǎn)觸發(fā)結(jié)束為止。
5、隨機(jī)森林繼承自樹模型集合模型,最終結(jié)果,分類投票,回歸平均。
梯度下降步驟:
1、把當(dāng)前的模型參數(shù)廣播到各個(gè)數(shù)據(jù)partition(可當(dāng)作虛擬的計(jì)算節(jié)點(diǎn))
2、各計(jì)算節(jié)點(diǎn)進(jìn)行數(shù)據(jù)抽樣得到mini batch的數(shù)據(jù),分別計(jì)算梯度,再通過treeAggregate操作匯總梯度,得到最終梯度gradientSum
3、利用gradientSum更新模型權(quán)重
缺點(diǎn):
1、采用全局廣播的方式,在每輪迭代前廣播全部模型參數(shù)。眾所周知Spark的廣播過程非常消耗帶寬資源,特別是當(dāng)模型的參數(shù)規(guī)模過大時(shí),廣播過程和在每個(gè)節(jié)點(diǎn)都維護(hù)一個(gè)權(quán)重參數(shù)副本的過程都是極消耗資源的過程,這導(dǎo)致了Spark在面對(duì)復(fù)雜模型時(shí)的表現(xiàn)不佳;
2、采用阻斷式的梯度下降方式,每輪梯度下降由最慢的節(jié)點(diǎn)決定。從上面的分析可知,Spark MLlib的mini batch的過程是在所有節(jié)點(diǎn)計(jì)算完各自的梯度之后,逐層Aggregate最終匯總生成全局的梯度。也就是說,如果由于數(shù)據(jù)傾斜等問題導(dǎo)致某個(gè)節(jié)點(diǎn)計(jì)算梯度的時(shí)間過長(zhǎng),那么這一過程將block其他所有節(jié)點(diǎn)無法執(zhí)行新的任務(wù)。這種同步阻斷的分布式梯度計(jì)算方式,是Spark MLlib并行訓(xùn)練效率較低的主要原因;
3、Spark MLlib并不支持復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)和大量可調(diào)超參。事實(shí)上,Spark MLlib在其標(biāo)準(zhǔn)庫(kù)里只支持標(biāo)準(zhǔn)的多層感知機(jī)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,并不支持RNN,LSTM等復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu),而且也無法選擇不同的activation function等大量超參。這就導(dǎo)致Spark MLlib在支持深度學(xué)習(xí)方面的能力欠佳
看完上述內(nèi)容,你們對(duì)如何解析spark MLlib訓(xùn)練原理和使用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。