楊艷艷, 李雷孝*, 林浩, 王永生 , 王慧, 高靜
(1.內蒙古工業大學數據科學與應用學院, 呼和浩特 010080; 2.內蒙古自治區基于大數據的軟件服務工程 技術研究中心, 呼和浩特 010080; 3.內蒙古農業大學計算機與信息工程學院, 呼和浩特 010010)
隨著大數據時代的到來,越來越多的機器學習算法被應用于數據處理和分析中[1]。為了訓練出準確率較高的模型,模型訓練者不可避免地要對機器學習算法中可調整的參數尋優。如果參數取值不當,將會嚴重影響模型的性能[2]。而在進行機器學習的參數尋優時,需將多組參數輸入機器學習算法中,利用訓練得到的模型的準確率和泛化能力作為參數尋優的標準評價指標。這就意味著機器學習的參數尋優是一個極其耗時的過程,每評價一次參數就需要訓練一次模型。基于數據并行的并行訓練方法是目前提高機器學習訓練效率的主流方法,該方法將訓練數據劃分后分配到各個工作節點上,各節點使用分到的數據對模型按照某種優化方法進行更新[3]。但在考慮參數尋優時,它的訓練效率常常不盡如人意。目前為止,如何提高機器學習的參數尋優效率仍是一個棘手問題。
近幾年來,針對機器學習參數尋優的問題,大量學者進行了研究。首先用于實踐的是人為的手動調參。但由于手動調參不確定性大且耗時耗力,因此新的方法被應用到機器學習參數尋優。比如Cui 等[4]、李瀚等[5]提出利用改進的網格搜索算法來提高機器學習最優參數的搜索效率。李坤等[6]提出了基于Spark并行計算框架進行網格搜索的并行計算,以找到支持向量機(support vector machines, SVM)的最優參數。但網格搜索算法實際上是對固定范圍內的所有參數取值進行遍歷搜索,且傳統的網格搜索僅僅是通過改變步長來提高搜索效率。網格搜索的并行計算雖然在一定程度上提高了參數尋優的效率,但參數尋優的范圍和步長會直接影響參數的優化程度。另一方面,網格搜索算法只適用于參數較少以及參數范圍較小的情況下。在參數多,取值范圍較廣的情況下使用網格搜索算法,將會存在計算復雜、耗時長等問題[7]。
針對使用網格搜索算法對機器學習算法的參數尋優時精度較低的問題,群啟發式算法被廣泛應用于機器學習的參數尋優中。王麗婷等[8]提出了利用烏鴉搜索算法求SVM的最優參數組合,實驗證明此模型具有較高的分類準確度。Wang 等[9]采用遺傳算法(genetic algorithm, GA)求解SVM最優參數,實驗結果表明此模型預測效果較好。潘成勝等[10]針對K-means算法在文本聚類過程中易陷入局部最優解的問題,提出了一種基于灰狼優化算法的K-means文本聚類方法。實驗結果表明,該方法的準確率、召回率和F值都有明顯提高,文本聚類結果更可靠。依據經驗調整參數會導致隨機森林模型性能不佳,鄒宗民等[11]提出基于粒子群優化支持向量回歸的方法。基于具有較強搜索能力的粒子群算法來獲取支持向量回歸模型的最優參數組合。除此之外,還有生物地理學優化算法(biogeography-based optimization,BBO)[12]、布谷鳥搜索算法(cuckoo search,CS)[13]、磷蝦群(improved krill herd,IKH)[14]算法等群啟發式算法被用于機器學習的參數尋優中。目前基于各種改進或者未改進的群啟發式算法用于機器學習算法的參數尋優的研究,雖然解決了機器學習參數尋優精度的問題,在一定程度上耗時也有所降低。但是機器學習參數尋優的效率依然沒有達到質的提升。基于數據并行機制的訓練方式可以用來解決群啟發式算法進行機器學習參數尋優效率低的問題,但是基于數據并行的機制只有在大數據量下,優勢才會逐漸體現出來。因此目前仍然沒有一個很好的方案來解決基于群啟發式算法的機器學習參數尋優效率低的問題,參數尋優效率仍有上升空間[15]。
現通過對比實驗驗證在機器學習參數尋優方面,群啟發式算法相較于網格搜索算法的優越性。另外對群啟發式算法應用于機器學習參數尋優時的各部分耗時進行分析。針對使用數據并行機制來解決求解種群個體適應度耗時問題時的不足,提出一種基于參數并行機制的機器學習參數尋優方法。該方法利用Spark并行計算框架將群啟發算法中的種群轉化為Spark所支持的彈性分布式數據集(resilient distributed dataset,RDD),然后將RDD切分并分發到各個節點,各個節點并行計算種群個體適應度。使用GA和RF算法驗證了基于參數并行機制的機器學習參數尋優方法的先進性、效率以及可擴展性。
機器學習是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。機器學習研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構,使之不斷改善自身的性能。
機器學習算法的參數可以分為模型參數和模型超參數。模型參數是可以通過數據學習過程進行初始化和更新的一種參數,不需要手動設置。模型超參數是無法直接從數據學習中估計出來的參數,必須在訓練機器學習模型之前進行設置。比如訓練神經網絡的學習速率、SVM的懲罰參數c和RBF核參數g等。學習速率太大會導致神經網絡的權重更新的幅度大,梯度下降法可能會越過最低點,導致權重在極值點兩端不斷發散或者劇烈震蕩。學習速率設置太小,則會使神經網絡的權重更新速度太慢,導致無法快速找到好的下降的方向。對于SVM來說,c的取值直接影響SVM模型的泛化能力。c太大,容易出現過擬合,c太小,容易出現欠擬合。g越大支持向量越少,g越小支持向量越多。而支持向量的個數會影響SVM模型訓練與預測的速度。因此機器學習模型超參數的選擇將會直接影響訓練好的機器學習模型的性能。
利用群啟發式算法進行機器學習算法的參數尋優,將其尋得的參數用作機器學習算法訓練模型的超參數。設er為機器學習訓練模型的誤差,P為超參數集合,則機器學習參數尋優問題定義為
miner=F(P)
(1)

(2)
式中:k為需要尋優的機器學習算法超參數的個數;pimin、pimax為超參數pi的變化范圍。種群中的一個個體對應一組P。P的更新依賴于種群的更新。例如,GA通過種群個體的交叉、變異等操作來更新種群,經過解碼更新過后的個體得到新的P;PSO根據找到的當前個體極值和整個粒子群共享的當前全局最優解來更新自己的速度和位置,經過解碼更新過后的粒子得到更新過后的P。當滿足終止條件時,終止算法。終止條件為

(3)
式(3)中:fitnessbest為擁有最優解的個體適應度;fitnessmin為算法設置的最小適應度;T為迭代次數;Tmax為算法設置的最大迭代次數。當種群最優個體的適應度大于算法設置的最小適應度或者迭代次數大于算法設置的最大迭代次數時,終止迭代,返回最優參數作為機器學習算法的模型超參數。
Spark是專門基于大數據而設計的通用計算引擎[15],可以完成包括SQL查詢、文本處理、機器學習等各種運算[16],能夠解決由于單機計算資源不足而導致運行速度慢、檢測效率低等問題[17]。Spark基于內存的運算速度比Hadoop MapReduce快100倍以上,而且擁有Hadoop MapReduce具有的所有的優點。Spark將數據抽象為其特有的RDD。在Spark中,對數據的操作主要有創建RDD,轉化已有RDD以及調用RDD操作進行求值,Spark會自動將RDD中的數據分發到集群上,進行并行化計算[18]。
Spark還提供了很多程序庫,包括Spark SQL、Spark Streaming、MLib、GraphX。其中MLib庫是Spark提供的可擴展的機器學習庫。Mlib庫是專為在集群上并行運行的情況而設計的,提供了很多種機器學習算法,包括分類、回歸、聚類、協同過濾等。Mlib的設計理念就是把數據以RDD的形式表示,然后在分布式數據集上調用Mlib庫所提供的機器學習算法。
在群啟發式算法中,其操作都可分為初始化種群、計算種群個體適應度、種群更新3個部分。初始化種群部分包括種群參數的設置、種群個體初始化以及種群個體適應度的初始化。種群更新部分為根據種群的更新規則進行種群的更新。計算種群個體適應度的部分為遍歷種群中的所有個體,并調用機器學習算法來計算種群中每一條個體的適應度。以GA為例,運行GA 5次,其中最大迭代次數為50,種群規模為20,數據量為2萬條,計算并記錄各部分耗時的平均值。各部分耗時情況如圖1所示。

圖1 GA各部分耗時Fig.1 Time consuming parts of GA
由圖1可知,計算個體適應度的部分耗時最長,占總體算法運行時間的96.6%,種群初始化和種群更新部分分別占2.4%和1%。計算適應度部分耗時較長的原因是因為種群中的每一個個體都需要訓練一次機器學習模型。若種群規模為20,最大迭代次數為50,則要進行1 000次機器學習算法模型的訓練,加上種群個體適應度初始化部分,算法總共要進行1 020次機器學習算法模型的訓練。
針對群啟發式算法在機器學習參數尋優問題中計算個體適應度耗時較長的問題,采用Spark平臺對種群進行并行化處理來提高計算種群個體適應度的效率。
根據上述GA各部分操作耗時分析,可以通過并行化計算個體適應度來提高機器學習參數尋優的效率。在Spark平臺上通過parallelize()方法將種群轉換為RDD,將整個種群切分為子種群,然后分發給不同的Worker節點。由Worker節點中的Executor并行進行計算子種群個體適應度,最終Executor將計算結果返回給Driver。參數并行如圖2所示。
圖2中,Driver負責資源的申請、RDD的轉換、任務的生成等;Master負責資源調度,與Worker進行RPC通信,讓Worker啟動Executor;Executor負責真正的邏輯計算。
在參數并行的并行化實現中,Driver首先向Master申請需要的資源,Master收到Driver的請求后與Worker進行RPC通信,讓Worker啟動Executor。Executor啟動之后,Driver端將切分之后的RDD和一些計算邏輯等生成具體的任務通過網絡發送給不同Worker中的Executor來實現并行化計算。當Executor將任務計算完后,向Driver端返回計算結果。Driver端匯總所有種群個體適應度,然后根據種群個體適應度來進行種群的更新,更新之后保留最優個體,得到種群一次迭代的最優參數組合。
通過將種群切分為子種群,并行化計算種群個體的適應度來提高機器學習參數尋優的效率。
并行化算法的設計主要依賴Spark所特有的RDD來對種群或者數據進行讀取、切分和并行化處理。針對計算適應度耗時較長的問題,現有的方法是基于數據并行的機器學習參數尋優方法,其將數據切分為多個子數據,并行計算種群內個體的適應度。基于參數并行機制的機器學習參數尋優方法,將種群切分為多個子種群,并行計算子種群內個體的適應度。基于數據并行和參數并行的并行化設計流程圖如圖3所示。
圖3中,左側是數據并行的流程圖,右側是參數并行流程圖。在Spark平臺進行并行化計算首先應進行Spark參數初始化,包括節點個數的設置,并行度的設置以及節點內存的設置等,用于Spark集群應用的提交。然后將所需要并行處理的部分轉化為Spark所支持的RDD。RDD支持兩種操作:轉化操作和行動操作。RDD的轉化操作返回一個新的RDD操作,它只是封裝了邏輯,但并未真正開始計算。而行動操作是向驅動器程序返回結果或者把結果寫入外部系統的操作,觸發真正的計算。

圖2 參數并行Fig.2 Parallel parameters

圖3 基于數據并行和參數并行的并行化設計流程圖Fig.3 Parallel design flow chart based on data parallelism and parameter parallelism
種群初始化完成后,將包含著參數、適應度、編碼等信息的種群個體存放在一個列表中,形成一個包含所有個體信息的種群列表。將種群個體攜帶的參數信息作為訓練機器學習算法模型的超參數,把模型的準確率作為種群個體的適應度。
由圖3可知,數據并行操作是先隨機初始化種群,然后再讀取數據,只將數據轉化為RDD,然后基于數據并行來計算種群內個體的適應度。參數并行是初始化種群的同時就讀取數據,將數據和種群一起存放在列表中,然后將列表轉化為RDD。當數據和種群轉換為RDD時,并未觸發真正的計算,只是定義了一個RDD。用行動操作collect()合并計算的所有個體適應度時,才真正開始計算。所有種群個體的適應度計算完成后,根據每個個體的適應度來進行種群的更新。不同的種群更新的規則也是不同的。進行完種群更新操作后,保留更新過后的個體最優值。如果滿足式(3)所示的終止條件,則返回最優參數作為機器學習算法模型的超參數,否則,將繼續執行并行化計算個體適應度、合并所有個體適應度、更新種群、保留最優個體的操作。
采用隨機森林作為機器學習算法的代表,選用GA作為群啟發式算法的代表。二者均是各自應用場景中的主流算法。隨機森林依靠Scikit-learn實現。Scikit-learn是針對Python編程語言的免費軟件機器學習庫,它有各種分類、回歸和聚類算法,是GitHub上最受歡迎的機器學習庫之一。實驗數據為廣州市公交車的IC卡交易數據。經過歸一化后,將其處理為時間序列數據,利用隨機森林進行回歸預測。Scikit-learn中的隨機森林需要調節的參數為:n_estimators、max_depth、max_features。分別為決策樹的個數、決策樹的深度、單個決策樹使用特征的最大數量。由于使用的數據中,數據段總共只有6個,因此選取了所有特征。所以只對n_estimators、max_depth兩個參數進行尋優。其中n_estimators參數的取值范圍為[100,200], max_depth參數的取值范圍為[2,30]。
通過構建Spark集群來驗證并行化計算算法的效率。Spark集群詳細配置為:CentOS-6.10-x64,spark-2.1.1-bin-hadoop2.7,hadoop-2.7.2,py4j- 0.10.4,jdk1.8.0_261,scikit-learn-0.24.0,pyspark-2.3.2。根據經驗設置Spark集群節點個數為8,節點運行參數配置如表1所示。
GA的參數設置如表2所示。

表1 節點運行參數配置Table 1 Node’s operating parameter configuration

表2 GA參數設置Table 2 GA parameter settings
3.2.1 網格搜索算法與群啟發式算法對比實驗
實驗的目的是通過和文獻[6]提出的并行化網格搜索算法進行對比,來驗證群啟發式算法作為機器學習算法參數尋優的方法,不僅可以提高機器學習參數尋優的效率,而且還能保證機器學習算法模型的準確率。
(1)第一個實驗。在上述實驗環境以及參數范圍內,通過給網格搜索算法設置不同的步長,來實現不同步長下的參數尋優。將每一次得到的最優參數組合作為機器學習算法訓練模型的最終的參數。記錄網格搜索算法不同步長下的機器學習模型的準確率。實驗結果如表3所示。
(2)第二個實驗。在第一個實驗的基礎上,選取機器學習算法模型準確率最高時所對應網格搜索算法的步長作為此次實驗的步長。在相同的數據量和并行度下,將基于網格搜索算法的參數尋優實驗和基于群啟發式算法的參數尋優實驗分別進行了5次,統計每一次參數尋優實驗的耗時以及最優參數模型的準確率,計算5次實驗的平均值。實驗結果如表4和表5所示。

表3 不同步長下的網格搜索算法的參數尋優的模型準確率Table 3 Model accuracy rate of parameter optimization of grid search algorithm under asynchronous length

表4 不同算法參數尋優的模型準確率Table 4 Model accuracy of different algorithm parameter optimization

表5 不同算法參數尋優耗時Table 5 Time consuming to optimize the parameters of different algorithms
由表3可以看出,基于網格搜索算法的參數尋優的模型精度受網格搜索算法的步長影響。隨著網格搜索算法步長的增加,模型的準確率出現了一定程度的下降。另外,從表3還可以看出,當參數n_estimators和參數max_depth的步長都為1時,得到的最優參數組合的模型的準確率是最高的。這是由于網格搜索算法遍歷了參數取值范圍內的所有參數組合,沒有遺漏任何一組參數,但搜索效率很低。隨著步長的增加,網格搜索算法會根據步長來進行參數的選擇,這就極其容易跳過最優參數組合導致尋優精度不高。
由表4可以看出,基于群啟發式算法的機器學習參數尋優,得到的最優參數組合的模型準確率的平均值為0.819 99;基于網格搜索算法且搜索步長為1的機器學習參數尋優得到的模型平均準確率為0.811 557。兩者的模型準確率相差不多,在誤差范圍內。從表5可以看出,基于網格搜索算法的機器學習參數尋優的耗時約是群啟發式算法的1.49倍。由此可以看出,在確保模型準確率不相上下的基礎上,群啟發式算法作為機器學習算法的參數尋優方法效率要高于網格搜索算法。
和網格搜索算法相比,群啟發算法作為機器學習參數尋優的方法,不僅在效率上得到了提升,而且并不會使機器學習算法模型的準確率下降。因此,群啟發式算法作為機器學習參數尋優的方法在尋優能力和效率上都要優于網格搜索算法。
3.2.2 參數并行與數據并行對比實驗
實驗的目的是驗證參數并行機制相較于數據并行機制的效率優勢。在上述實驗環境下,采用Python語言實現了基于數據并行機制和參數并行機制的并行化RF,并記錄算法在不同數據量下所用的運行時間。在實驗中,最大迭代次數設為50,種群規模設為20和100。為驗證數據量對并行效率的影響,在2萬、4萬、8萬、16萬、32萬數據量下進行實驗。種群規模為20和100的實驗結果分別如圖4和圖5所示。

圖4 種群規模為20時的兩種并行機制的運行時間Fig.4 Running time of the two parallel mechanisms with a population size of 20

圖5 種群規模為100時的兩種并行機制的運行時間Fig.5 Running time of the two parallel mechanisms with a population size of 100
由圖4、圖5可以看出,當數據量為20萬左右的時候,兩種并行機制的運行時間出現了交點。當數據量小于20萬時,參數并行優勢較為明顯,參數并行相較于數據并行來說,參數尋優效率提高了42.8%。當數據量大于20萬時,參數并行的運行時間出現顯著增長。此時,數據并行的優勢顯現出來,所用時間較短。這是因為在小數據量下,每個任務的計算量越大,效率越高,每個任務切分越細,效率越低。參數并行是將種群切分成若干份,訓練數據不進行切分。在相同數據量下,對于參數并行而言,每一個個體都需要一份數據量計算個體適應度,種群規模為20時,這個種群就對應20份數據。本實驗中參數并行根據分區度將種群切分為6份,則每一個任務就對應3.333份數據。對于數據并行來說,是根據分區度把訓練數據切分為6份,種群不進行切分。則每一個任務所對應的訓練數據為0.167份。所以在小數據量下,數據并行每一個任務的數據量要小于參數并行。由于每個任務的計算量越大,效率越高。即在數據量小于20萬時的小數據量下,參數并行的效率要高于數據并行。隨著數據量的增大,每一個任務對應的計算量越來越大,則運行時間相應的會越來越長。由于參數并行每一個任務對應的數據量是數據并行每一個任務對應的數據的20倍左右,在大于20萬時的大數據量下,數據并行要比參數并行有優勢。
由圖5可知,在數據量為2萬的時候,參數并行和數據并行運行時間相差不大。其原因在于Spark集群模式下,各個節點之間需要進行資源分配、任務劃分、任務調度以及節點之間的通信,這些操作也要消耗時間。當數據量較小時,Spark之間的資源調度等操作會占一大部分時間,所以此時參數并行和數據并行之間的差距并不明顯。
另外,根據圖4、圖5還可以看出,數據量為8萬時,是數據并行的一個拐點。在數據量大于8萬時,運行時間出現了下降趨勢。此時對于數據并行來說,其優勢開始顯現出來。數據量較小時,每一個任務對應的計算量小,每個任務切分的細,因此效率較低。
通過上述結果分析可得,在小數據量下,基于參數并行的機器學習并行化訓練方法效率更高。但這并不意味著小數據量下并行訓練是無意義的。由圖5可知,在數據量為8萬時,使用參數并行可節省將近2 h的可觀的訓練時間。
3.2.3 可擴展性實驗
可擴展性實驗是指是否能夠通過增加結點的數量來提高算法運行速度。實驗基于單節點、2個節點、4個節點以及8個節點,在數據量為1萬,迭代次數為20的基礎上將參數并行算法運行5次,計算算法運行時間并記錄平均值。參數并行運行結果如圖6所示。
由圖6可以看出,算法運行時間隨著種群規模的增加而增長。當種群規模為50時,4個節點和8個節點的算法運行時間差別較小。這是因為多個節點運行程序時,節點之間需要進行資源分配、任務

圖6 參數并行算法可擴展性實驗Fig.6 Parametric parallel algorithm scalability experiment
劃分、任務調度以及節點之間的通信等操作。這些操作也要消耗時間。隨著種群規模的增大,8個節點時算法運行效率逐漸高于其他節點。這是因為節點數越多,算法并行度就越高,即每個節點計算量就越小。
通過上述實驗結果分析,參數并行算法具有良好的可擴展性。
3.2.4 節點個數與分區度實驗
節點個數與分區度實驗是指在確定的分區度下,不同的節點個數對參數并行算法運行效率的影響。在節點個數為2、4、6、8個,分區度為6,迭代次數為20的基礎上分別將參數并行算法運行5次,計算并記錄算法運行時間的平均值。參數并行算法運行結果如圖7所示。
由圖7可以看出,在節點個數為6和8時的算法運行時間低于節點個數為2和4時參數并行算法運行時間。這是因為本實驗節點的個數決定算法每一輪并行執行的任務數的多少。實驗分區度為6,即有6個任務需要計算。節點個數為2或4時,

圖7 分區度為6時不同節點個數運行時間Fig.7 Running time of different nodes when the partition degree is 6
算法每一輪并行執行的任務數為2個或4個,則需要兩輪才能將所有任務計算完畢。當節點個數為6時,剛好一輪就能計算完所有的任務。當節點個數為8時,算法運行時間要稍稍高于節點個數為6時。這是由于只有6個任務,并行度為8,會有兩個節點不計算任務,但這2個節點之間還是會被分配資源,進行節點間的通信。在一定程度上,算法運行時間會加長。
由以上分析可知,盡管可以通過增加結點的數量來提高算法運行效率,但是節點個數并不是越多越好,應當根據分區度的大小來設置節點個數。
在對機器學習的參數尋優問題進行深度分析研究的基礎上,針對群啟發式算法提出了一種基于參數并行機制的機器學習參數尋優方法。設計了數據并行與參數并行對比實驗、可擴展性實驗、節點個數與分區度實驗來驗證參數并行機制的優勢,得到以下結論。
(1)提出的方法在機器學習參數尋優精度和效率上都要優于主流的并行化網格搜索算法。
(2)參數并行機制在小數據量下能顯著提高參數尋優的效率,進而可以提高機器學習的訓練效率,并具有良好的可擴展性。
只是把GA算法作為群啟發式算法的代表來進行機器學習算法超參數尋優。但基于群啟發式算法進行機器學習算法超參數的尋優問題仍有很多可以研究的方面。在接下來工作中,將會著力研究更適合機器學習算法超參數尋優的群啟發式算法。例如,可以將參數并行機制應用于基于混合式群啟發式算法的機器學習算法超參數的尋優;對群啟發式算法進行優化,使之能在不影響機器學習算法模型性能的前提下減少計算個體適應度的次數等。