丁曉梅,汪 靜,趙麗紅
(安徽文達信息工程學院計算工程學院,安徽 合肥 231201)
移動設備已經(jīng)成為廉價且可靠的平臺,無處不在地收集數(shù)據(jù)并做數(shù)據(jù)處理.根據(jù)思科系統(tǒng)公司最新的流量預測報告,2015年全球每月平均售出10億臺移動設備,其中移動設備的流量較上一年增長了74%.移動大數(shù)據(jù)(Mobile Big Data,MBD)是一個描述大量移動數(shù)據(jù)且無法使用單臺機器處理的專有名詞.MBD包含許多實際問題,例如欺詐檢測、營銷檢測、上下文感知計算[1]以及醫(yī)療保健等.因此,MBD分析是當前互聯(lián)網(wǎng)領域高度關注的問題,旨在從原始移動數(shù)據(jù)中提取有意義的信息和模式.
深度學習即深度神經(jīng)網(wǎng)絡是MBD問題分析中的常用方法.具體來說,深度學習在MBD問題中可以利用先驗知識建立高精度的模型,避免了昂貴的手工特征設計,并且可以適用于某些無監(jiān)督的問題.但是,由于MBD中數(shù)據(jù)的維度過高,深度學習模型在此類問題中學習速率很慢,并且常規(guī)的深度學習計算量過大,往往需要花費幾小時甚至幾天的時間完成一次模擬.然而,大部分的問題和系統(tǒng)不能容忍精度處理不夠或者延遲問題,因此在移動數(shù)據(jù)分析問題中,如何將深度學習模型在保證精度的同時提高訓練速度,一直是研究人員的關注熱點.
為了滿足可伸縮和自適應系統(tǒng)對數(shù)據(jù)分析的需求,本文提供了一種基于Spark框架的深度學習方法,使用具有先驗知識訓練的深度模型來實現(xiàn)省時的MBD分析.本文框架基于Apache Spark構(gòu)建[2],它提供了一個開源集群計算平臺,這樣就可以使用集群中的許多計算核心進行分布式學習。在該集群中,將連續(xù)訪問的數(shù)據(jù)緩存到運行的內(nèi)存中,從而將深度模型的學習速度提高了幾倍.為了證明所提出框架的可行性,本文在最后實驗了一個上下文感知活動識別系統(tǒng),在計算集群上運行,并使用移動人群感知數(shù)據(jù)樣本訓練深度學習模型.在此測試案例中,客戶請求包括加速度計信號,并且對服務器進行了編程,以使用深度活動識別模型來提取潛在的人類活動.與傳統(tǒng)的機器學習方法相比,深度學習的準確性得到保障,與隨機森林相比,深度學習的精度提高了9%,與多層感知相比,深度學習的精度提高了17.8%.此外,與單機計算相比,基于并行Spark的實現(xiàn)減少了深度模型的學習時間.因此,本文的算法可以有效解決當前深度學習在MBD問題上因數(shù)據(jù)維度過高、計算量過大而導致的學習速率過慢的問題.
MBD的幾種結(jié)構(gòu)如圖1.
圖1(a)部分顯示了用于連接各種類型的便攜式設備(如智能手機、可穿戴計算機和IoT小工具)的大型移動系統(tǒng)的典型體系結(jié)構(gòu).在現(xiàn)代移動設備中廣泛安裝了各種類型的傳感器,例如加速度計、陀螺儀、指南針和GPS傳感器,從而允許了許多新應用.本質(zhì)上,每個移動設備都以無狀態(tài)數(shù)據(jù)交換結(jié)構(gòu)(例如Java中的對象符號〈JSON〉格式)封裝其服務請求和自己的感知數(shù)據(jù).由于移動設備在不同的移動操作系統(tǒng)上運行,因此無狀態(tài)格式非常重要.基于收集的MBD,服務器利用MBD來分析發(fā)現(xiàn)隱藏的模式和信息. MBD分析的重要性源于其可以在小型數(shù)據(jù)集上組裝、配置以及構(gòu)建復雜的移動系統(tǒng)來分析數(shù)據(jù).例如,一個可以靈活地識別各種數(shù)據(jù)類型的應用程序[3],以及使用移動設備的嵌入式加速度計來收集有關日常人類活動的適當加速度數(shù)據(jù)[4]等.在接收到請求之后,服務器將加速度計數(shù)據(jù)映射到最可能的人類活動,比如可以支持許多交互式服務,包括醫(yī)療保健、智能建筑和普通游戲等.MBD分析比傳統(tǒng)的大數(shù)據(jù)更具有通用性,因為數(shù)據(jù)源是便攜式的,并且數(shù)據(jù)流量是打包使用的,MBD會同時處理由數(shù)百萬個移動設備收集的大量數(shù)據(jù).
圖1(b)(c)(d)展示了MBD時代的最新主要技術:大規(guī)模和高速移動網(wǎng)絡、便攜性眾包以及復雜通信機制[5-6].每種技術都會以不同方式促進形成MBD特性,以及在當前情況下會產(chǎn)生不同難題.第一,大規(guī)模和高速移動網(wǎng)絡:移動設備和高速移動網(wǎng)絡(例如Wi-Fi和蜂窩網(wǎng)絡)的增長帶來了大規(guī)模且有爭議的移動數(shù)據(jù)流量.2015年,每月產(chǎn)生3.7億字節(jié)的移動數(shù)據(jù),預計未來幾年還會增加.同時,大規(guī)模數(shù)據(jù)的增加會帶來 MBD的流率變慢,由此影響為移動用戶提供服務時延遲的響應速度.請求的長時間排隊會導致用戶滿意度降低,并增加后期決策的成本.第二,便攜性:每個移動設備都可以在多個位置自由移動.因此,MBD是不穩(wěn)定的(波動性).第三,MBD分析經(jīng)常應對新收集的數(shù)據(jù)樣本,而由于可移植性,收集的樣本質(zhì)量對于決策是否有效起重要作用.
深度學習是機器學習的一個新分支,可以解決MBD分析中的一系列復雜問題,例如分類和回歸[6-8].深度學習模型由模擬的神經(jīng)元和突觸組成,可以從現(xiàn)有MBD樣本中對其進行訓練以學習數(shù)據(jù)特征.生成的深度模型可以泛化和處理看不見的流MBD樣本.如圖2所示.
生成式深度網(wǎng)絡可以縮放為包含許多隱藏層和數(shù)百萬個難以一次訓練的參數(shù).其中,文獻[5]、[6]給出了基于堆疊式的去噪自動編碼思路的貪婪逐層學習算法.具體如下:
(1)生成式模型預訓練:此階段僅需要未標記的數(shù)據(jù),這些數(shù)據(jù)通常使用眾包,因此很容易在移動數(shù)據(jù)流中收集.圖2中展示了深度模型的逐層調(diào)整的方法.首先,使用未標記的數(shù)據(jù)樣本訓練第一層神經(jīng)元,學習輸入數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),其中每個層都包括編碼和解碼功能:編碼功能使用輸入數(shù)據(jù)和各層參數(shù)來生成一組新功能.然后,解碼功能使用特征向量和隱藏層參數(shù)來生成輸入數(shù)據(jù)的重構(gòu).最后,在第一層的輸出處產(chǎn)生第一組特征.之后,在第一層的頂部添加第二層神經(jīng)元,在此將第一層的輸出作為第二層的輸入.通過添加更多層來重復此過程,直到形成合適的深度模型為止.因此,基于在其下層生成的特征,在每一層學習更復雜的特征.
(2)判別式模型微調(diào)方法:第一步中初始化的模型參數(shù)會使用一組可用的標記數(shù)據(jù)進行微調(diào),來進一步調(diào)整參數(shù),優(yōu)化模型.
在MBD分析中深度學習模型的學習速度很慢,而且對計算的精度要求也很高.通常這是深層模型參數(shù)和MBD樣本數(shù)量太大所導致.一方面,深度學習可以從未標記的移動數(shù)據(jù)中學習,從而減少數(shù)據(jù)標記工作量.因為在大多數(shù)移動系統(tǒng)[9-11]中,標記數(shù)據(jù)是有限的,而手動數(shù)據(jù)注釋需要人工干預,既昂貴又耗時;另一方面,未標記的數(shù)據(jù)樣本數(shù)量龐大但容易獲得.因此,深度學習模型在訓練前階段將未標記的數(shù)據(jù)樣本用于生成數(shù)據(jù)的探索,這樣可以盡可能地減少MBD分析期間對標記數(shù)據(jù)的需求.
Apache Spark是用于集群上可伸縮Map Reduce計算的開源平臺.該框架的主要目標是通過將深度模型的學習與高性能計算集群并行化來加快MBD決策.簡而言之,深度模型的并行化是通過將MBD切片為多個分區(qū)來執(zhí)行的.每個分區(qū)都包含在彈性分布式數(shù)據(jù)集(RDD)中,該數(shù)據(jù)集為Spark引擎提供了數(shù)據(jù)分發(fā)的抽象.除了數(shù)據(jù)緩存之外,Spark項目中RDD本身還支持容錯執(zhí)行并恢復工作節(jié)點上的程序操作.
因此,本文基于Spark的框架包含兩個主要組件:(1)一個Spark主控件;(2)多個Spark相關控件.主計算機初始化Spark驅(qū)動程序用于實例,該實例管理一組Spark Worker上其他部分模型的執(zhí)行.在深度學習算法的每次迭代中(圖2), 每個工作節(jié)點在MBD的小分區(qū)上優(yōu)化部分深度模型,并發(fā)送計算出的優(yōu)化參數(shù),最后返回主節(jié)點.之后,主節(jié)點通過均值化所有執(zhí)行者節(jié)點的模型來重建主深度模型.
學習深度模型主要通過兩個主要步驟執(zhí)行:大量的梯度計算和參數(shù)更新步驟(請參見文獻[8]、[9]等).而在本文框架中,使用以下幾個步驟來進行梯度計算和更新:第一步,學習算法獨立地遍歷所有數(shù)據(jù)批次,以計算模型參數(shù)的梯度更新(即變化率).第二步,通過對所有數(shù)據(jù)批次上計算的梯度更新取平均值來更新模型的參數(shù).這兩個步驟適合學習Map Reduce編程模型中的深層模型[12].特別地,并行梯度計算可以用來實現(xiàn)映射過程[13],這樣簡化了參數(shù)的更新迭代過程.在Apache Spark上進行深度學習的迭代Map Reduce計算是按照如下步驟執(zhí)行的:
(1)MBD分區(qū):首先使用Spark的parallelize的API將整個MBD分為多個分區(qū).生成的MBD分區(qū)存儲到RDD中并分發(fā)到工作程序節(jié)點.這些RDD對于加快深度模型的學習至關重要,影響著內(nèi)存數(shù)據(jù)訪問磁盤數(shù)據(jù)的操作.
(2)深度學習并行性[13-15]:深度學習問題的解決方案取決于具有較小數(shù)據(jù)集的同一學習問題的解決方案.尤其是,深度學習工作分為多個學習階段,每個學習階段都包含一組獨立的Map Reduce迭代,其中一個迭代的解決方案是下一個迭代的輸入.在每次Map Reduce迭代期間,將在可用MBD的單獨分區(qū)上訓練部分模型,步驟如下:
a)學習局部模型:每個工作節(jié)點計算其MBD分區(qū)的梯度更新(也稱為Map過程).在此步驟中,所有Spark工作者都在MBD的不同分區(qū)上并行執(zhí)行相同的Map任務.以此方式,深度模型學習的昂貴的梯度計算任務被分成許多并行的子任務.
b)參數(shù)平均:將部分模型的參數(shù)發(fā)送到主計算機,以通過平均所有Spark工作者的參數(shù)計算來構(gòu)建主深度模型(也稱為Reduce過程).
c)參數(shù)分發(fā):將Reduce過程后生成的主模型分發(fā)給所有工作節(jié)點,然后根據(jù)更新的參數(shù)開始新的Map Reduce迭代.繼續(xù)該過程,直到滿足學習收斂標準為止.
最后生成一個參數(shù)合適的深度學習模型,該模型可用于從用戶請求中推斷信息的問題.
在本實驗中,使用可以公開采集到的Actitracker數(shù)據(jù)集,來驗證以上算法的可行性.
數(shù)據(jù)集包括來自563個用戶的6項常規(guī)活動(步行、慢跑、爬樓梯、坐著、站立和躺下)的加速度計樣本.圖3繪制了6種不同活動的加速度計信號.由于不同的活動包含不同的頻率內(nèi)容,因此這些內(nèi)容大體上反映了人體的動態(tài).具體包括:第一,收集身體較為劇烈的活動(例如步行、慢跑和爬樓梯)的高頻信號.第二,在半靜態(tài)下進行慢性身體運動的采樣,例如在站立、坐下以及躺下的活動收集低頻信號.該數(shù)據(jù)是使用具有20Hz采樣率的移動電話收集的,并且將這些數(shù)據(jù)分為兩部分,一部分作為訓練數(shù)據(jù)使用,另一部分作為測試數(shù)據(jù)使用.
由于實驗使用了生活實例型數(shù)據(jù),與未標記數(shù)據(jù)相比,標記數(shù)據(jù)數(shù)量很有限,因此,數(shù)據(jù)標記需要人工干預.使用10s開窗功能對數(shù)據(jù)進行構(gòu)圖,該功能會生成200個時間序列樣本.在實驗中,首先只對未標記的數(shù)據(jù)樣本進行深度模型預訓練,然后使用標記的數(shù)據(jù)集對模型進行微調(diào).為了增強活動識別性能,本文還使用了加速度計信號的頻譜圖作為深度模型的輸入來優(yōu)化參數(shù).
數(shù)據(jù)進行合理的標記之后,運行負載分配工具(LSF)管理平臺和Red Hat Linux系統(tǒng).每個節(jié)點都具有8個核心(時鐘速度為2.93GHz的Intel Xeon 5570 CPU)以及24GB RAM.實驗中,將核心計算設備設置為8的倍數(shù),以分配整個節(jié)點的資源.每個計算核心初始化一個局部模型學習任務.每個任務使用包含100個樣本的數(shù)據(jù),分批進行100次迭代學習.顯然,增加核心數(shù)量可以更快地訓練深度模型.最后,需要注意的是,分布式深度學習是一種強類型的正則化學習方法.因此,不建議使用正則化術語(例如稀疏性和輟學約束)來避免擬合不足的問題.
基于本文深度學習模型,與其他模型識別率對比,如表1所示.
表1 深度學習模型與其他模型識別誤差的對比
根據(jù)實驗結(jié)果可以得出如下結(jié)論:
(1)本文深度模型在識別率方面優(yōu)于現(xiàn)有的上下文學習模型:通過表1可知,本文算法在實驗中表現(xiàn)出最好的識別錯誤率,為14%,比未使用Spark計算引擎多層感知機準確率提高了18%,同時也優(yōu)于隨機森林、基于實例等傳統(tǒng)方法.證明了基于Spark計算引擎的深度學習模型可以提高深度學習在MBD問題上的準確率.
(2)深度模型的學習層次特征消除了常規(guī)方法中對手工統(tǒng)計特征的需求.當層數(shù)一定時,本文的算法識別的準確率一直是四種方法中最高的,且本文算法的錯誤率曲線一直呈下降趨勢,并沒有出現(xiàn)波動.也就是說,本文算法在實驗過程中,并未出現(xiàn)傳統(tǒng)深度學習網(wǎng)絡的過擬合問題.由此可以得出結(jié)論:通過使用后期標記數(shù)據(jù)微調(diào)的方法來優(yōu)化模型,解決了優(yōu)化參數(shù)的問題并避免了過度擬合.
本文介紹了基于Spark的框架以及深度學習模型用于移動大數(shù)據(jù)分析問題的算法.該模型可以對具有許多隱藏層和數(shù)以百萬計參數(shù)的深度模型進行調(diào)整和優(yōu)化,同時具有較好的擴展性.通常,深度學習雖然為移動大數(shù)據(jù)問題提供了識別率較高的方法,但是難以克服運算復雜度、時間復雜度過高的問題.而通過使用Spark框架,以及其易于并行計算的特性,能幫助傳統(tǒng)的深度學習模型更高效地解決移動大數(shù)據(jù)分析問題.最后,通過一個互聯(lián)網(wǎng)上下文情感分析的實例,證明了該模型的可行性,并且通過與其他傳統(tǒng)方法的對比,更直觀地展示了本文算法的有效性.