近年來橄镜,機器學(xué)習(xí)和深度學(xué)習(xí)不斷被炒熱,tensorflow 作為谷歌發(fā)布的數(shù)值計算和神經(jīng)網(wǎng)絡(luò)的新框架也獲得了諸多關(guān)注,spark和tensorflow深度學(xué)習(xí)框架的結(jié)合,使得tensorflow在現(xiàn)有的spark集群上就可以進行深度學(xué)習(xí)矮烹,而不需要為深度學(xué)習(xí)設(shè)置單獨的集群,為了深入了解spark遇上tensorflow分布式深度學(xué)習(xí)框架的原理和實踐罩锐,飛馬網(wǎng)于4月10日晚奉狈,邀請到先后就職于百度抢肛、騰訊恕酸,負責(zé)過多個大數(shù)據(jù)研發(fā)工作的李曙鵬老師進行線上直播,主要向我們介紹spark和深度學(xué)習(xí)的基本原理萍恕、spark與深度學(xué)習(xí)領(lǐng)域相結(jié)合的最新的發(fā)展方向境氢,以及如何結(jié)合tensorflowonspark開源框架蟀拷,構(gòu)建一個分布式圖像分類模型訓(xùn)練。
以下是本次分享實錄:
上面這張圖片顯示的是本次直播所針對的受眾和可能的收益萍聊,大家可以了解一下问芬。
一.大數(shù)據(jù)的價值
什么是大數(shù)據(jù)的價值呢?李老師根據(jù)自身以往的項目經(jīng)驗和互聯(lián)網(wǎng)主流的大數(shù)據(jù)應(yīng)用場景寿桨,大致總結(jié)了以下三種價值此衅。
二.計算的核心問題
結(jié)合上面所說的大數(shù)據(jù)的價值和應(yīng)用場景,我們把它歸納為一條計算流:首先從數(shù)據(jù)存儲當(dāng)中經(jīng)過數(shù)據(jù)加工亭螟、抽取挡鞍,得到提煉后的數(shù)據(jù)、特征预烙,然后進行進一步的模型訓(xùn)練墨微,得到模型。
這條計算流的核心問題可以歸納為y=f(x)這個函數(shù)扁掸。對于第一階段的數(shù)據(jù)ETL和查詢來講翘县,主要解決的是數(shù)據(jù)源對接、實時數(shù)據(jù)整合谴分、數(shù)據(jù)歸一化锈麸、特征生成等應(yīng)用場景,它的計算框架代表是spark牺蹄,輸入是f()\x忘伞,輸出是y,非常適合做分布式數(shù)據(jù)計算。第二階段的模型訓(xùn)練氓奈,主要有模型建模匿刮、反向計算、梯度更新探颈、超參數(shù)調(diào)優(yōu)熟丸、效果評估等流程,它的計算框架代表是tensorflow伪节,輸入是x\y光羞,輸出是f(),更多關(guān)注的是模型建模和分布式參數(shù)更新怀大。
接下來纱兑,我們就針對以上兩個框架做一些基本原理的介紹和概述。
三.spark概述
1.spark的核心抽象:RDD
為什么要做RDD這樣的抽象呢化借?主要是因為它的一致性潜慎、高效并行、容錯機制蓖康,RDD屏蔽了分布式的復(fù)雜性铐炫,使開發(fā)程序時簡單如寫單機程序。
RDD也提供了一些操作蒜焊,如transform和action倒信,通過對RDD操作業(yè)務(wù)的封裝以及計算邏輯,我們就會形成一個大的DAG計算圖(參考下圖右)泳梆。
2.spark的大數(shù)據(jù)生態(tài):
這部分是講spark的數(shù)據(jù)生態(tài)鳖悠,包括它支持的組件庫、部署環(huán)境和數(shù)據(jù)來源优妙。
3.Spark SQL和Spark Streaming:
我們簡要介紹一下這兩個比較重要的組件乘综,首先是spark sql,它的典型應(yīng)用場景是OLAP多維分析套硼,它提供了一個DataFrame抽象接口卡辰,等價于RDD,如下圖所示熟菲。
Spark Streaming是spark的一個實時處理組件看政,它的典型應(yīng)用場景是實時特征處理,它提供了一個Dstreams抽象接口抄罕,直觀上理解Dstreams就是一個持續(xù)的RDD,如下圖于颖。
四.Deep Learning概述
下面呆贿,我們一起來了解關(guān)于Deep Learning的相關(guān)內(nèi)容。
1.Deep Learning模型:
第一個模型是非常經(jīng)典的多層感知器模型(MLP)。首次這個模型有一個輸入層做入,在輸入層后面有兩個隱藏層冒晰,最后是輸出層。這個模型的特點是全連接竟块,在最后輸出之前有一個Softmax函數(shù)壶运,它的作用是把最終的權(quán)值轉(zhuǎn)換為最直觀的概率。理論上來講浪秘,MLP這種帶有隱藏層的神經(jīng)網(wǎng)絡(luò)可以擬合一切的函數(shù)蒋情,但它的計算量很大,所以傳統(tǒng)的MLP模型并不適合去更深層次地加深網(wǎng)絡(luò)結(jié)構(gòu)耸携。
真正把神經(jīng)網(wǎng)絡(luò)推向更深層次網(wǎng)絡(luò)結(jié)構(gòu)模型的是CNN卷積神經(jīng)網(wǎng)絡(luò)棵癣,它通常應(yīng)用在圖像分類等領(lǐng)域,這里有一個概念—感受野夺衍,所謂感受野就是空間局部性的考慮狈谊,它認為圖像上比較接近的圖像領(lǐng)域具有更強的相關(guān)性,圖像上更遠的像素之間相關(guān)性更弱沟沙,基于感受野的考慮河劝,它把全連接層替換為卷積操作。
卷積操作的特點是可以將局部特征抽象化矛紫,另外大幅減少計算量丧裁,以便加深神經(jīng)網(wǎng)絡(luò),豐富語義表達含衔。
2.Tensorflow模型建模與訓(xùn)練:
介紹完深度學(xué)習(xí)模型后煎娇,回到我們的tensorflow部分,首先我們了解一下tensorflow是怎樣來做模型建模的贪染。如下圖所示缓呛,X是Tensor,W和b是Variable杭隙,Matmul哟绊、Add、ReLU都是Operator痰憎,最后組成一個神經(jīng)網(wǎng)絡(luò)圖Graph票髓。
其次,我們來了解一下tensorflow訓(xùn)練的核心問題—擬合f()铣耘,主要通過反向梯度計算來擬合f()洽沟,反向梯度計算的目的是計算梯度和更新參數(shù),這里涉及到Loss函數(shù)和最小化Loss蜗细。那么怎么去計算梯度呢裆操?主要通過鏈式求導(dǎo)(看下圖右)怒详。一次鏈式求導(dǎo)只是一次的前向和后向的計算結(jié)果,在訓(xùn)練流程當(dāng)中踪区,我們通常批量計算昆烁,所以會涉及batch_size和epoch。
最后我們結(jié)合一個代碼事例缎岗,回顧一下前面所講的知識點:
我們以多層感知器模型MLP為例静尼,首先需要創(chuàng)建一個模型,模型定義就是兩個隱藏層加最后的輸出層传泊,定義好模型之后鼠渺,我們需要定義損失函數(shù),在這里它是對你的標(biāo)簽和預(yù)測輸出進行的交叉熵的損失定義或渤,然后選擇一個optimizer的優(yōu)化器來做優(yōu)化訓(xùn)練系冗,
在訓(xùn)練開始之前,你需要去調(diào)一個sess.run(init)對權(quán)值做一個隨機初始化的過程薪鹦,初始化之后掌敬,進入到我們的訓(xùn)練階段。
3.Tensorflow分布式訓(xùn)練機制:
剛才介紹的是tensorflow怎么去定義模型以及怎么去做反向計算池磁,那么奔害,在大規(guī)模數(shù)據(jù)場景下,它又是怎樣工作的地熄?
Tensorflow本身提供了一些并行機制华临,第一個是模型并行機制,就是基于圖去拆分(如上圖左下)端考,它會把一張大的圖拆分成很多部分雅潭,每個部分都會在很多設(shè)備上去運行、計算却特。通常是針對一個節(jié)點無法存下整個模型的情況下扶供,去對圖進行拆分。
更多場景下我們的數(shù)據(jù)量會比較大裂明,這時候就采用數(shù)據(jù)并行機制椿浓,在這種機制下tensorflow有兩個角色,一個是參數(shù)服務(wù)器闽晦,負責(zé)參數(shù)的存儲和交換更新扳碍,一個是工作節(jié)點,負責(zé)具體的模型計算仙蛉。每個工作節(jié)點會負責(zé)它領(lǐng)域內(nèi)的數(shù)據(jù)分片所對應(yīng)模型參數(shù)的更新計算笋敞,同時它們又會向參數(shù)服務(wù)器去傳遞它所計算的梯度,由參數(shù)服務(wù)器來匯總所有的梯度捅儒,再進一步反饋到所有節(jié)點液样,根據(jù)參數(shù)服務(wù)器合并參數(shù)的方式又分為同步更新和異步更新振亮,這兩種更新方式各有優(yōu)缺點巧还,異步更新可能會更快速地完成整個梯度計算鞭莽,而對于同步更新來講,它可以更快地進行一個收斂麸祷,選擇哪種方式取決于實際的應(yīng)用場景澎怒。
五.Deep Learning On Spark
經(jīng)過剛才的介紹,我們知道spark是一個分布式的通用計算框架阶牍,而以tensorflow為代表的deep learning是一個分布式模型訓(xùn)練框架喷面,它更多專注在梯度計算,那為什么要將兩者整合呢走孽?整合的意義在哪里惧辈?意義就是能實現(xiàn)更好的分布式訓(xùn)練和數(shù)據(jù)傳輸。
針對分布式訓(xùn)練的場景磕瓷,雅虎開源了TensorflowOnSpark的開源框架盒齿,它主要實現(xiàn)tensorflow能夠與spark相結(jié)合做分布式訓(xùn)練。同時也有其它的一些機制困食,例如边翁,CaffeOnSpark、MMLSpark(CNTK)硕盹、PaddleOnSpark符匾。
TensorflowOnSpark解決的核心問題是將spark作為分布式tensorflow的底層調(diào)動機制,通過spark executor去把tensorflow的進程調(diào)動起來瘩例,這樣在進行tensorflow訓(xùn)練時就不需要手動地去組建網(wǎng)絡(luò)啊胶。它也提供了一個API,通過調(diào)TFCluster.run這樣一個API垛贤,可以快速獲得tensorflow的一個分布式訓(xùn)練環(huán)境焰坪。
除此之外TensorflowOnSpark還提供了基于RDD的數(shù)據(jù)并行機制,如下圖所示南吮。這套機制非常方便地集成了spark已有的RDD處理機制琳彩,可以更好地跟spark sql或spark streaming去做相應(yīng)的集成。
然后進入到另外一個方向部凑,叫做spark-deep-learning露乏,是由spark的創(chuàng)始公司—Data Bricks發(fā)起的,它主要的目標(biāo)是提供一些high-level的API涂邀,把底層的模型進行組件化瘟仿,同時它期望可以兼容底層深度式學(xué)習(xí)框架。
這里有個“Transfer Learning as a Pipeline”的例子供大家了解比勉,如下圖所示:
TensorflowOnSpark Pipeline開發(fā)了兩個API劳较,一個是TFEstimator驹止,另一個是TFModel,提供了這兩個之后观蜗,你可以直接把它們集成到spark-deep-learning pipeline里面臊恋,進行進一步的訓(xùn)練。?
六.TensorflowOnSpark案例實踐
最后一部分墓捻,我們來進行案例實踐介紹抖仅,我們要解決的是一個圖像分類問題,這里采用了一個kaggle dataset砖第,叫做花朵識別撤卢,有5個類別,4000多張圖片梧兼,包括郁金香放吩、太陽花、蒲公英羽杰、玫瑰和雛菊這五種花渡紫。把這些數(shù)據(jù)預(yù)先存儲于MongoDB中。我們的案例實踐是一個分布式解決方案忽洛,包括分布式數(shù)據(jù)獲取腻惠、分布式訓(xùn)練、分布式評估欲虚。
以下幾張圖片是代碼示例集灌,簡單了解一下:
下面是效果演示,左邊是圖片复哆,右邊是模型預(yù)測結(jié)果欣喧,預(yù)測結(jié)果都是一個概率值,根據(jù)概率值的大小來判定這是哪一類花朵:
以上六部分就是本次分享的主要內(nèi)容梯找,接下來是問答時間唆阿,我們來看看都有哪些問題。
1.整個訓(xùn)練過程需要人工參與嗎锈锤?準確率的提高是需要人工來參與嗎驯鳖?
李老師:整個訓(xùn)練過程不需要人工參與,準確率的提高涉及超參優(yōu)化久免,deep leaning pipeline中提供了grid search機制浅辙,可以做些自動超參選擇。
2.現(xiàn)在這訓(xùn)練的過程是不是只針對靜態(tài)的圖片阎姥?動態(tài)的場景可以嗎记舆?
李老師:你的動態(tài)場景如果是視頻,本身也可抽幀為圖片呼巴,視頻分類是另外一種應(yīng)用問題泽腮,但底層也需要借助已有的圖像分類模型御蒲,圖像分類本身的應(yīng)用場景非常廣,比如和無人機相結(jié)合诊赊。
3.這套框架適用于文本的自動分類嗎厚满?
李老師:框架同樣適合文本分類等其他領(lǐng)域,差別在于數(shù)據(jù)schema和模型豪筝,訓(xùn)練過程涉及到一些圖像歸一化的過程痰滋,但沒有模版匹配摘能,你可以理解為所有的特征抽取都是由deep learning自動抽取出來的续崖。
以上就是本次線上直播的全部內(nèi)容,相信通過本次學(xué)習(xí)团搞,一定對深度學(xué)習(xí)和機器算法有了更細致深入的掌握严望。想了解更多更詳細內(nèi)容的小伙伴們,可以關(guān)注服務(wù)號:FMI飛馬網(wǎng)逻恐,點擊菜單欄飛馬直播像吻,即可進行學(xué)習(xí)。