楊 鶴,王 良,修世軍
(遼東學(xué)院 現(xiàn)代教育技術(shù)中心,遼寧 丹東 118001)
當(dāng)前是一個(gè)智能電網(wǎng)飛速發(fā)展的時(shí)代,智能電網(wǎng)將傳統(tǒng)的電力系統(tǒng)與最新的信息技術(shù)有機(jī)的結(jié)合在了一起。在電網(wǎng)運(yùn)行過(guò)程中,產(chǎn)生的大量數(shù)據(jù)成為了故障檢測(cè)與診斷、調(diào)度策略選擇、智能控制決策等方面的重要依據(jù)。
電力系統(tǒng)是一個(gè)典型的動(dòng)態(tài)非線性系統(tǒng),由于人工神經(jīng)網(wǎng)絡(luò)優(yōu)異的非線性處理能力,已經(jīng)在電力系統(tǒng)得到了廣泛的研究與醫(yī)用。葛少云等在給定實(shí)時(shí)電價(jià)的條件下,使用灰色神經(jīng)網(wǎng)絡(luò)建模,并用遺傳算法進(jìn)行優(yōu)化,對(duì)短期電力負(fù)荷進(jìn)行了預(yù)測(cè)[1]。雷紹蘭等在不考慮電價(jià)的情況下,利用RBF神經(jīng)網(wǎng)絡(luò)進(jìn)行了短期電力負(fù)荷預(yù)測(cè),并使用ANFIS算法進(jìn)行了修正[2]。楊光亮和石東源等分別應(yīng)用小波神經(jīng)網(wǎng)絡(luò)和RBF神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)了電力系統(tǒng)的故障檢測(cè)[3-4]。2006年Hinton等人引發(fā)了深度學(xué)習(xí)的熱潮[5],隨著對(duì)深度學(xué)習(xí)研究的展開,研究人員開始將深度學(xué)習(xí)應(yīng)用到智能電網(wǎng)中。Tarsa等使用深度信念網(wǎng)絡(luò)進(jìn)行了短期的電力預(yù)測(cè)[6]。Zhu等采用分層稀疏編碼對(duì)電路的電能消耗進(jìn)行了預(yù)測(cè)[7]。也有一些研究者對(duì)單隱層的神經(jīng)網(wǎng)絡(luò)并行化進(jìn)行了研究[8-9]。
然而,在大數(shù)據(jù)環(huán)境下,傳統(tǒng)的研究與應(yīng)用還面臨以下問(wèn)題:
(1)數(shù)據(jù)量大,數(shù)據(jù)維度高;(2)模型結(jié)構(gòu)日趨復(fù)雜;(3)實(shí)際應(yīng)用中,對(duì)預(yù)測(cè)數(shù)據(jù)的需求存在動(dòng)態(tài)變化。傳統(tǒng)模型的訓(xùn)練過(guò)程往往需要10幾個(gè)小時(shí)乃至幾天的時(shí)間,每次建立新的模型都需要漫長(zhǎng)的等待過(guò)程,這在電網(wǎng)策略更加細(xì)化、動(dòng)態(tài)化的條件的是不能容忍的。
因此,本文提出基于MapReduce的智能電網(wǎng)多層感知器并行訓(xùn)練算法研究。將電網(wǎng)的預(yù)測(cè)模型訓(xùn)練過(guò)程并行化,充分利用云計(jì)算提供的強(qiáng)大計(jì)算能力,縮短計(jì)算時(shí)間。另外,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練是一個(gè)多次迭代的過(guò)程,傳統(tǒng)的MapReduce技術(shù)并不善于處理迭代計(jì)算,針對(duì)這一問(wèn)題,本文還采用了IMapReduce技術(shù)對(duì)迭代計(jì)算進(jìn)行了優(yōu)化,每次作業(yè)結(jié)束后會(huì)先對(duì)結(jié)果進(jìn)行緩存,直到整個(gè)迭代過(guò)程全部結(jié)束才上傳結(jié)果到集群的分布式文件系統(tǒng)。同時(shí),每次迭代獲得的中間結(jié)果被緩存到運(yùn)算節(jié)點(diǎn)本地,只有更改的狀態(tài)才會(huì)上傳到分布式文件系統(tǒng),因此可以取消傳統(tǒng)算法中部分作業(yè),解決訓(xùn)練過(guò)程中頻繁迭代的問(wèn)題,節(jié)省大量運(yùn)行時(shí)間。最后,在由多臺(tái)PC組成的集群中進(jìn)行了實(shí)驗(yàn)。
玻爾茲曼機(jī)是一種由隨機(jī)神經(jīng)元組成的二值隨機(jī)機(jī)器,它的神經(jīng)元取值有0和1兩種狀態(tài),分別存在不同的概率,其中0代表神經(jīng)元處于關(guān)閉或者不連通的狀態(tài),1代表神經(jīng)元處于打開或者聯(lián)通狀態(tài)。玻爾茲曼機(jī)的神經(jīng)元被分為2類,分別是可見(jiàn)單元V={vi}和隱藏單元H={hi}。其中可見(jiàn)單元包括輸入節(jié)點(diǎn)和輸出節(jié)點(diǎn),是外部環(huán)境與模型之間的接口。隱藏單元可以從數(shù)據(jù)中提取特征。神經(jīng)元之間的連接都是對(duì)稱的,當(dāng)連接只存在于可見(jiàn)單元與隱藏單元之間時(shí),就被成為受限玻爾茲曼機(jī)。通過(guò)各個(gè)神經(jīng)元的狀態(tài)可以計(jì)算出整個(gè)模型的能量E,如(1)所示:
(1)
其中wij表示兩個(gè)神經(jīng)元之間連接的權(quán)重,θ={W,a,b}表示模型的參數(shù)。
神經(jīng)元狀態(tài)的聯(lián)合概率可以通過(guò)神經(jīng)元狀態(tài)、能量E和玻爾茲曼分布來(lái)求得,如(2)所示
(2)
其中Z(θ)如(3)所示
(3)
由此可以得出最大對(duì)數(shù)似然函數(shù)如(4)所示
(4)
使其對(duì)W求導(dǎo),就可以得到參數(shù)的更新規(guī)律如(5)所示
△W=ε(Epdata[vihj]-Epθ[vihj])
(5)
其中ε表示學(xué)習(xí)率,Epdata表示數(shù)據(jù)的期望值,Epθ表示模型的期望值。
如果將多個(gè)受限玻爾茲曼機(jī)進(jìn)行縱向疊加,就可以得到深度玻爾茲曼機(jī),如圖1所示。深度玻爾茲曼機(jī)只有在相鄰的兩層之間存在連接。圖1所示的例子可以看做3個(gè)受限玻爾茲曼機(jī)的組合,由1個(gè)可見(jiàn)層v1和3個(gè)隱藏層h1、h2、h3組成。對(duì)深度玻爾茲曼機(jī)進(jìn)行訓(xùn)練可以逐層進(jìn)行,同時(shí)訓(xùn)練多個(gè)受限玻爾茲曼機(jī)然后再將它們組合在一起。
模型訓(xùn)練的過(guò)程被分為了2個(gè)部分,預(yù)訓(xùn)練與微調(diào)。以圖1舉例,預(yù)訓(xùn)練的步驟如下所示:
步驟1:受限將v1作為可見(jiàn)層,h1作為隱藏層構(gòu)建一個(gè)受限玻爾茲曼機(jī)進(jìn)行訓(xùn)練,訓(xùn)練過(guò)程中將v1到h1連接的權(quán)重設(shè)置為2×W1,h1到v1的權(quán)重不變。
步驟2:將h1作為可見(jiàn)層,h2作為隱藏層構(gòu)建受限玻爾茲曼機(jī),將權(quán)重設(shè)置為2×W2,進(jìn)行訓(xùn)練。
步驟3:將h2作為可見(jiàn)層,h3作為隱藏層構(gòu)建受限玻爾茲曼機(jī)進(jìn)行訓(xùn)練,將h2到h3連接的權(quán)重設(shè)置為W3,h3到h2的權(quán)重設(shè)置為2×W3。
步驟4:最后,使用訓(xùn)練出來(lái)的{W1,W2,W3}構(gòu)建一個(gè)深度玻爾茲曼機(jī)。
如果模型中有更多的隱藏層,可以多次重復(fù)第2步來(lái)進(jìn)行計(jì)算。預(yù)訓(xùn)練結(jié)束后,再使用BP算法對(duì)模型進(jìn)行微調(diào)。
MapReduce是一種對(duì)數(shù)據(jù)進(jìn)行批處理的并行計(jì)算框架。該框架適合于處理數(shù)據(jù)之間彼此獨(dú)立,用戶對(duì)于實(shí)時(shí)性要求不高的應(yīng)用。因此,需要處理大量獨(dú)立樣本的神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)過(guò)程正適用于MapReduce框架。該框架對(duì)數(shù)據(jù)的處理過(guò)程如圖2所示,用戶需要先將算法的邏輯劃分成Map和Reduce 2個(gè)部分,2個(gè)部分都可以并行計(jì)算,分別用Map函數(shù)和Reduce函數(shù)進(jìn)行封裝;然后上傳數(shù)據(jù)到集群,框架會(huì)將數(shù)據(jù)劃分成等大的數(shù)據(jù)塊分布式的存儲(chǔ)在集群中,并且為每個(gè)數(shù)據(jù)塊分配1個(gè)Map任務(wù),在該任務(wù)中運(yùn)行Map函數(shù),這個(gè)過(guò)程是并行完成的;Map任務(wù)都結(jié)束后,通過(guò)shuffle過(guò)程進(jìn)行同步,Map函數(shù)的輸入會(huì)被分配給不同的Reduce任務(wù);最后由Reduce任務(wù)輸出結(jié)果。
矩陣運(yùn)算是本文算法的核心內(nèi)容,下面介紹在MapReduce框架中進(jìn)行矩陣運(yùn)算的算法。設(shè)有矩陣A=(aij)mn與矩陣B=(bij)nl,使用MapReduce計(jì)算C=AB。C是一個(gè)m×l階矩陣,所以最后輸出結(jié)果應(yīng)該有m×l條數(shù)據(jù)。1個(gè)MapReduce作業(yè)可以完成1次矩陣乘法,也就是說(shuō)只需要編寫1個(gè)Map函數(shù)和1個(gè)Reduce函數(shù)。
首先,Map函數(shù)的輸入為aij與bij,如果輸入為aij,那么將輸出l條數(shù)據(jù)<(i,k),(j, ‘a(chǎn)’,aij)>其中(i,k)為Key值,k=1,2,3,…,l,(j, ‘a(chǎn)’,aij)位value值,字‘a(chǎn)’代表數(shù)據(jù)來(lái)自矩陣A。如果輸入為bij,那么將輸出m條數(shù)據(jù)<(i,k), (i,’b’,bij)>其中(i,k)為Key值,k=1,2,3,…,m,(i,‘b’,bij)為value值,字符‘b’代表數(shù)據(jù)來(lái)自矩陣B。
然后,經(jīng)過(guò)shuffle過(guò)程,所有具有相同Key值的數(shù)據(jù)都被傳輸?shù)酵?個(gè)Reduce任務(wù)。Reduce函數(shù)的輸入為<(i,j),list>,這樣,計(jì)算aij所需的A矩陣第i行和B矩陣第j列數(shù)據(jù)都被存放如同1個(gè)list中,再根據(jù)矩陣的運(yùn)算法則就可以計(jì)算出cij的值了。
矩陣加(減)法運(yùn)算比較簡(jiǎn)單,設(shè)有矩陣A=(aij)mn與矩陣B=(bij)nl,使用MapReduce計(jì)算C=A+(-)B。Map函數(shù)讀入aij與bij,輸出時(shí)以(i,j)為Key,元素為值,在Reduce函數(shù)直接做加(減)操作。
深度玻爾茲曼機(jī)的訓(xùn)練由多個(gè)受限玻爾茲曼機(jī)的訓(xùn)練過(guò)程組成,下文將首先介紹基于MapReduce的受限玻爾茲曼機(jī)訓(xùn)練算法,再介紹深度玻爾茲曼機(jī)訓(xùn)練算法。在MapReduce框架下進(jìn)行訓(xùn)練與普通串行算法不同,需要將算法分為控制主函數(shù)、Map函數(shù)和Reduce函數(shù)3個(gè)部分,其中Map函數(shù)和Reduce函數(shù)主要用來(lái)進(jìn)行矩陣運(yùn)算,其算法在上1小節(jié)已經(jīng)介紹,受限玻爾茲曼機(jī)訓(xùn)練算法主函數(shù)(簡(jiǎn)稱為RMain)偽代碼如下所示:
RMain算法:
輸入:樣本集合S,可見(jiàn)層數(shù)量nv,隱藏層數(shù)量nh,可見(jiàn)層到隱層倍數(shù)m,隱層到可見(jiàn)層倍數(shù)n。
(1)對(duì)學(xué)習(xí)率ε和連接權(quán)重矩陣W進(jìn)行初始化;
(2)啟動(dòng)一個(gè)作業(yè)1,選擇樣本S中的樣本si做矩陣乘運(yùn)算h=siW;
(3)啟動(dòng)一個(gè)作業(yè)2,求更新參數(shù)p1ij=hj×si;
(4)啟動(dòng)一個(gè)作業(yè)3,計(jì)算顯示層v等于hWT;
(5)啟動(dòng)一個(gè)作業(yè)4,計(jì)算h’=vW;
(6)啟動(dòng)作業(yè)5,計(jì)算更新參數(shù)p2ij=h’j×vi;
(7)啟動(dòng)作業(yè)6,更新W’=ε(p1ij-p2ij);
(8)判讀是否結(jié)束迭代,如果不結(jié)束則返回(2);
在RMain算法的基礎(chǔ)上,訓(xùn)練深度玻爾茲曼機(jī),算法(簡(jiǎn)稱DMain)偽代碼如下所示:
DMain算法:
輸入:樣本集合S,可見(jiàn)層數(shù)量nv,隱藏層數(shù)量nh1、nh2、…、nhx
(1)調(diào)用RMain計(jì)算第一層RBM,
RMain(S,nv,nh1, 2, 1);
(2)計(jì)算下一層RBM,RMain(S,nh1,nh2, 2, 2);
(3)判斷中間層是否結(jié)束,是進(jìn)行第(4)步,否回到(2);
混凝土澆筑完成后,及時(shí)進(jìn)行養(yǎng)護(hù),采用土工布或黑芯棉覆蓋+灑水的方法,以土工布長(zhǎng)期保持濕潤(rùn)為標(biāo)準(zhǔn),由于頂板面預(yù)埋件較多,養(yǎng)護(hù)時(shí)采取土工布穿豎向精軋螺紋鋼的方式,保證土工布緊貼混凝土面,保證養(yǎng)護(hù)質(zhì)量,梁體內(nèi)腔采用噴霧器,安排專人進(jìn)行養(yǎng)護(hù),按規(guī)范要求,養(yǎng)護(hù)時(shí)間不少于14d。當(dāng)環(huán)境溫度低于5℃時(shí),梁表面噴涂養(yǎng)護(hù)劑,采取保溫措施,禁止對(duì)混凝土灑水,混凝土噴涂養(yǎng)護(hù)劑養(yǎng)護(hù)時(shí),應(yīng)確保不漏噴;當(dāng)外界氣溫較高時(shí),適當(dāng)增加灑水次數(shù)或延長(zhǎng)灑水時(shí)間。
(4)計(jì)算最上層RBM,RMain(S,nh(x-1),nhx, 1, 2);
在對(duì)深度玻爾茲曼機(jī)進(jìn)行訓(xùn)練的過(guò)程中,需要進(jìn)行多次迭代。用傳統(tǒng)的MapReduce進(jìn)行迭代計(jì)算的流程如圖3左所示,每一次迭代都被封裝成一個(gè)或者幾個(gè)作業(yè)(Job)。作業(yè)在啟動(dòng)后需要從分布式的文件系統(tǒng)中讀取數(shù)據(jù),作業(yè)結(jié)束后又將數(shù)據(jù)重新存入分布式文件系統(tǒng)。每一次存取都需要耗費(fèi)大量的時(shí)間,當(dāng)?shù)螖?shù)較多時(shí)就會(huì)十分影響效率。針對(duì)這個(gè)問(wèn)題,我們選擇使用IMapReduce框架[10]進(jìn)行了優(yōu)化,其運(yùn)行流程如圖3右所示,每次作業(yè)結(jié)束后會(huì)先對(duì)結(jié)果進(jìn)行緩存,直到整個(gè)迭代過(guò)程全部結(jié)束才上傳結(jié)果到集群的分布式文件系統(tǒng)。這樣可以節(jié)省大量運(yùn)行時(shí)間。
在上1節(jié)的算法中存在大量的迭代過(guò)程,每一次迭代都包含若干個(gè)作業(yè),雖然DMain算法利用并行計(jì)算能夠處理大規(guī)模數(shù)據(jù),但是運(yùn)行效率依然不夠理想。本節(jié)受限對(duì)作業(yè)進(jìn)行優(yōu)化整合,然后利用IMapReduce對(duì)迭代計(jì)算進(jìn)行優(yōu)化,優(yōu)化過(guò)程如下:
步驟1:對(duì)RMain中的作業(yè)1和作業(yè)2進(jìn)行了合并,在同一個(gè)Reduce任務(wù)中,計(jì)算出隱層h后同時(shí)計(jì)算參數(shù)p1;
步驟2:對(duì)RMain中的作業(yè)4和作業(yè)5進(jìn)行了合并,在同一個(gè)Reduce任務(wù)中,計(jì)算出更新顯示層v后同時(shí)計(jì)算參數(shù)p2;
步驟3:IMapReduce對(duì)原有的Map- Reduce接口沒(méi)有改變,但是每次迭代獲得的中間結(jié)果被緩存到運(yùn)算節(jié)點(diǎn)本地,只有更改的狀態(tài)才會(huì)上傳到分布式文件系統(tǒng)。因此可以取消RMain中的作業(yè)6,同時(shí)需要在分布式文件系統(tǒng)中設(shè)置臨時(shí)路徑來(lái)保存狀態(tài)的更改值。將上一節(jié)中的算法進(jìn)行更新得到迭代優(yōu)化的深度玻爾茲曼機(jī)訓(xùn)練算法IDMain,如下所示:
IDMain算法:
(1)設(shè)置狀態(tài)路徑
(2)調(diào)用RMain計(jì)算第一層RBM,
IRMain(S,nv,nh1, 2, 1);
(3)計(jì)算下一層RBM,IRMain(S,nh1,nh2, 2, 2);
(4)判斷中間層是否結(jié)束,是進(jìn)行第(5)步,否回到(2);
(5)計(jì)算最上層RBM,IRMain(S,nh(x-1),nhx, 1, 2);
IRMain算法:
輸入:樣本集合S,可見(jiàn)層數(shù)量nv,隱藏層數(shù)量nh,可見(jiàn)層到隱藏層倍數(shù)m,隱層到可見(jiàn)層倍數(shù)n。
(1)對(duì)學(xué)習(xí)率ε和連接權(quán)重矩陣W進(jìn)行初始化;
(2)啟動(dòng)一個(gè)作業(yè)1,選擇樣本S中的樣本si做矩陣乘運(yùn)算h=siW,同時(shí)計(jì)算更新參數(shù)p1ij;
(3)啟動(dòng)一個(gè)作業(yè)2,計(jì)算顯示層v等于hWT;
(4)啟動(dòng)一個(gè)作業(yè)3,計(jì)算h’=vW,同時(shí)計(jì)算更新參數(shù)p2ij;
(5)判讀是否結(jié)束迭代,如果不結(jié)束則返回(2)。
實(shí)驗(yàn)使用多臺(tái)PC搭建了集群,其中一臺(tái)作為master節(jié)點(diǎn),其他作為slave節(jié)點(diǎn)。PC的配置為Intel(R) Core(TM)2 Duo E8200 dual-core 2.66GHz CPU、3 GB 內(nèi)存、160 GB 硬盤,交換機(jī)為銳捷的千兆交換機(jī)。使用的操作系統(tǒng)為ubuntu11,使用了Apache開發(fā)的Hadoop1.0.3作為MapReduce環(huán)境以及開源工具IMapReduce。深度玻爾茲曼機(jī)網(wǎng)絡(luò)共5層,包括1個(gè)可見(jiàn)層和4個(gè)隱藏層。
為了進(jìn)行測(cè)試,采集了北方某城市3個(gè)月的環(huán)境數(shù)據(jù)對(duì)電力負(fù)荷進(jìn)行測(cè)試。由于實(shí)驗(yàn)數(shù)據(jù)量有限,本文對(duì)元數(shù)據(jù)集進(jìn)行了擴(kuò)大,數(shù)據(jù)集的描述如表1所示:
表1 數(shù)據(jù)集參數(shù)表
本實(shí)驗(yàn)的計(jì)算量比較大,使用傳統(tǒng)方式在單機(jī)運(yùn)行的效率已經(jīng)非常緩慢,因此直接使用了本文設(shè)計(jì)的IDMain算法。圖4顯示了在不同數(shù)量的節(jié)點(diǎn)上的運(yùn)行時(shí)間,可以發(fā)現(xiàn)隨著節(jié)點(diǎn)的增加,訓(xùn)練時(shí)間顯著的縮短了。這次實(shí)驗(yàn)中使用了數(shù)據(jù)集DataSet1。
圖5顯示了使用傳統(tǒng)MapReduce下的DMain算法和迭代優(yōu)化的IDMain算法在處理不同數(shù)據(jù)集時(shí)的運(yùn)行時(shí)間對(duì)比。本次實(shí)驗(yàn)使用了8臺(tái)PC作為slave結(jié)點(diǎn)。在使用DataSet1時(shí),IDMain運(yùn)行時(shí)間是DMain的74%;在使用DataSet2時(shí),IDMain運(yùn)行時(shí)間是DMain的72%;在使用DataSet3時(shí),IDMain運(yùn)行時(shí)間是DMain的67%。可以發(fā)現(xiàn)隨著數(shù)據(jù)集的增大,迭代優(yōu)化的算法表現(xiàn)出更良好的性能。
圖6顯示了進(jìn)行歸一化后,某日12個(gè)時(shí)段電力負(fù)荷預(yù)測(cè)值與實(shí)際值之間的差別。通過(guò)預(yù)測(cè)值與實(shí)際值之間的對(duì)比圖可以看出,通過(guò)本算法計(jì)算出的結(jié)果與實(shí)際結(jié)果之間的差別較小,預(yù)測(cè)值已經(jīng)可以逼近實(shí)際值。這是因?yàn)槭褂蒙窠?jīng)網(wǎng)絡(luò)進(jìn)行電力系統(tǒng)預(yù)測(cè)已經(jīng)被證明是有效的,而通過(guò)本算法訓(xùn)練出的模型與傳統(tǒng)方法訓(xùn)練出的模型在有效性方面是一致的。
在智能電網(wǎng)中進(jìn)行預(yù)測(cè)、故障檢測(cè)是當(dāng)前電力系統(tǒng)的一個(gè)重要研究方向。隨著大數(shù)據(jù)技術(shù)的發(fā)展,對(duì)電力預(yù)測(cè)有了進(jìn)一步推動(dòng)。在該環(huán)境下,本文針對(duì)電網(wǎng)中大數(shù)據(jù)處理效率低、速度慢的問(wèn)題進(jìn)行了研究。提出了基于深度玻爾茲曼機(jī)的迭代優(yōu)化的電力預(yù)測(cè)訓(xùn)練算法IDMain,并且搭建Hadoop集群進(jìn)行了測(cè)試,實(shí)驗(yàn)表明,本文提出的算法在具有良好的性能和準(zhǔn)確性。