您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何解析spark MLlib訓練原理和使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
說明
spark MLlib是Spark提供的可擴展的機器學習庫。MLlib中已經包含了一些通用的學習算法和工具,如:分類、回歸、聚類、協同過濾、降維以及底層的優化原語等算法和工具,MLlib提供的API主要分為以下兩類。
spark.mllib包中提供的主要API,操作RDD,后續可能廢棄。
spark.ml包中提供的構建機器學習工作流的高層次的API,主要操作DataFrame,可使用pipeline把很多操作(算法/特征提取/特征轉換)以管道的形式串起來,讓數據在這個管道中流動。ml所有模型提供統一的算法操作接口,比如模型訓練都是fit。mllib中不同模型會有各種各樣的trainXXX。
訓練原理
隨機森林訓練原理:
優化:
逐層訓練:因為數據存放在不同的機器上,頻繁的訪問數據效率非常低,因此采用廣度遍歷的方法,每次構造所有樹的一層,例如如果要訓練10棵樹,第一次構造所有樹的第一層根節點,第二次構造所有深度為2的節點,以此類推,這樣訪問數據的次數降為樹的最大深度,大大減少了機器之間的通信,提高訓練效率。
樣本抽樣:當樣本存在連續特征時,其可能的取值可能是無限的,存儲其可能出現的值占用較大空間,因此spark對樣本進行了抽樣,抽樣數量,最少抽樣1萬條
特征裝箱:每個離散特征值(對于連續特征,先離散化)稱為一個Split,上下限[lowSplit, highSplit]組成一個bin,也就是特征裝箱,默認的maxBins是32。對于連續特征,離散化時的bin的個數就是maxBins,采用等頻離散化;對于有序的離散特征,bin的個數是特征值個數+1;對于無序離散特征,bin的個數是2^(M-1)-1,M是特征值個數
過程:
1、初始化模型:構建numTrees個Node,賦默認值emptyNode,這些node將作為每棵樹的root node,參與后面的訓練。將這些node與treeIndex封裝加入到隊列nodeQueue中,后面會將所有待split的node都加入到這個隊列中,依次split,直到所有node觸發截止條件,也就是后面的while循環中隊列為空了。
2、選擇待分裂Node:循環從nodeQueue取出待處理node放入nodesForGroup和treeToNodeToIndexInfo中nodesForGroup是Map[Int, Array[Node]],其key是treeIndex,value是Node數組,其中放著該tree本次要分裂的node
treeToNodeToIndexInfo的類型是Map[Int, Map[Int, NodeIndexInfo]],key為treeIndex,value中Map的key是node.id,這個id來自Node初始化時的第一個參數,第一輪時node的id都是1。其value為NodeIndexInfo結構,
計算最佳node分裂:先在個partition上分別統計,再累積各partition成全局統計,針對每個node遍歷所有特征,計算獲得最佳分裂。
3、分裂node:根據最佳split進行node的分裂,包括當前節點的一些屬性完善,左右孩子節點的構造等,將當前節點的左右孩子節點繼續加入nodeQueue中,這里面放的是需要繼續分裂的節點,至此當前層分裂完成。
4、循環訓練循環執行取出node、分裂node步驟, 直到的所有節點觸發結束為止。
5、隨機森林繼承自樹模型集合模型,最終結果,分類投票,回歸平均。
梯度下降步驟:
1、把當前的模型參數廣播到各個數據partition(可當作虛擬的計算節點)
2、各計算節點進行數據抽樣得到mini batch的數據,分別計算梯度,再通過treeAggregate操作匯總梯度,得到最終梯度gradientSum
3、利用gradientSum更新模型權重
缺點:
1、采用全局廣播的方式,在每輪迭代前廣播全部模型參數。眾所周知Spark的廣播過程非常消耗帶寬資源,特別是當模型的參數規模過大時,廣播過程和在每個節點都維護一個權重參數副本的過程都是極消耗資源的過程,這導致了Spark在面對復雜模型時的表現不佳;
2、采用阻斷式的梯度下降方式,每輪梯度下降由最慢的節點決定。從上面的分析可知,Spark MLlib的mini batch的過程是在所有節點計算完各自的梯度之后,逐層Aggregate最終匯總生成全局的梯度。也就是說,如果由于數據傾斜等問題導致某個節點計算梯度的時間過長,那么這一過程將block其他所有節點無法執行新的任務。這種同步阻斷的分布式梯度計算方式,是Spark MLlib并行訓練效率較低的主要原因;
3、Spark MLlib并不支持復雜網絡結構和大量可調超參。事實上,Spark MLlib在其標準庫里只支持標準的多層感知機神經網絡的訓練,并不支持RNN,LSTM等復雜網絡結構,而且也無法選擇不同的activation function等大量超參。這就導致Spark MLlib在支持深度學習方面的能力欠佳
看完上述內容,你們對如何解析spark MLlib訓練原理和使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。