近年來,機器學習和深度學習不斷被炒熱,tensorflow 做爲谷歌發佈的數值計算和神經網絡的新框架也得到了諸多關注,spark和tensorflow深度學習框架的結合,使得tensorflow在現有的spark集羣上就能夠進行深度學習,而不須要爲深度學習設置單獨的集羣,爲了深刻了解spark趕上tensorflow分佈式深度學習框架的原理和實踐,飛馬網於4月10日晚,邀請到前後就任於百度、騰訊,負責過多個大數據研發工做的李曙鵬老師進行線上直播,主要向咱們介紹spark和深度學習的基本原理、spark與深度學習領域相結合的最新的發展方向,以及如何結合tensorflowonspark開源框架,構建一個分佈式圖像分類模型訓練。算法
如下是本次分享實錄:sql
上面這張圖片顯示的是本次直播所針對的受衆和可能的收益,你們能夠了解一下。服務器
一.大數據的價值微信
什麼是大數據的價值呢?李老師根據自身以往的項目經驗和互聯網主流的大數據應用場景,大體總結了如下三種價值。網絡
二.計算的核心問題框架
結合上面所說的大數據的價值和應用場景,咱們把它概括爲一條計算流:首先從數據存儲當中通過數據加工、抽取,獲得提煉後的數據、特徵,而後進行進一步的模型訓練,獲得模型。機器學習
這條計算流的核心問題能夠概括爲y=f(x)這個函數。對於第一階段的數據ETL和查詢來說,主要解決的是數據源對接、實時數據整合、數據歸一化、特徵生成等應用場景,它的計算框架表明是spark,輸入是f()\x,輸出是y,很是適合作分佈式數據計算。第二階段的模型訓練,主要有模型建模、反向計算、梯度更新、超參數調優、效果評估等流程,它的計算框架表明是tensorflow,輸入是x\y,輸出是f(),更多關注的是模型建模和分佈式參數更新。異步
接下來,咱們就針對以上兩個框架作一些基本原理的介紹和概述。分佈式
三.spark概述函數
1.spark的核心抽象:RDD
爲何要作RDD這樣的抽象呢?主要是由於它的一致性、高效並行、容錯機制,RDD屏蔽了分佈式的複雜性,使開發程序時簡單如寫單機程序。
RDD也提供了一些操做,如transform和action,經過對RDD操做業務的封裝以及計算邏輯,咱們就會造成一個大的DAG計算圖(參考下圖右)。
2.spark的大數據生態:
這部分是講spark的數據生態,包括它支持的組件庫、部署環境和數據來源。
3.Spark SQL和Spark Streaming:
咱們簡要介紹一下這兩個比較重要的組件,首先是spark sql,它的典型應用場景是OLAP多維分析,它提供了一個DataFrame抽象接口,等價於RDD,以下圖所示。
Spark Streaming是spark的一個實時處理組件,它的典型應用場景是實時特徵處理,它提供了一個Dstreams抽象接口,直觀上理解Dstreams就是一個持續的RDD,以下圖。
四.Deep Learning概述
下面,咱們一塊兒來了解關於Deep Learning的相關內容。
1.Deep Learning模型:
第一個模型是很是經典的多層感知器模型(MLP)。首次這個模型有一個輸入層,在輸入層後面有兩個隱藏層,最後是輸出層。這個模型的特色是全鏈接,在最後輸出以前有一個Softmax函數,它的做用是把最終的權值轉換爲最直觀的機率。理論上來說,MLP這種帶有隱藏層的神經網絡能夠擬合一切的函數,但它的計算量很大,因此傳統的MLP模型並不適合去更深層次地加深網絡結構。
真正把神經網絡推向更深層次網絡結構模型的是CNN卷積神經網絡,它一般應用在圖像分類等領域,這裏有一個概念—感覺野,所謂感覺野就是空間局部性的考慮,它認爲圖像上比較接近的圖像領域具備更強的相關性,圖像上更遠的像素之間相關性更弱,基於感覺野的考慮,它把全鏈接層替換爲卷積操做。
卷積操做的特色是能夠將局部特徵抽象化,另外大幅減小計算量,以便加深神經網絡,豐富語義表達。
2.Tensorflow模型建模與訓練:
介紹完深度學習模型後,回到咱們的tensorflow部分,首先咱們瞭解一下tensorflow是怎樣來作模型建模的。以下圖所示,X是Tensor,W和b是Variable,Matmul、Add、ReLU都是Operator,最後組成一個神經網絡圖Graph。
其次,咱們來了解一下tensorflow訓練的核心問題—擬合f(),主要經過反向梯度計算來擬合f(),反向梯度計算的目的是計算梯度和更新參數,這裏涉及到Loss函數和最小化Loss。那麼怎麼去計算梯度呢?主要經過鏈式求導(看下圖右)。一次鏈式求導只是一次的前向和後向的計算結果,在訓練流程當中,咱們一般批量計算,因此會涉及batch_size和epoch。
最後咱們結合一個代碼事例,回顧一下前面所講的知識點:
咱們以多層感知器模型MLP爲例,首先須要建立一個模型,模型定義就是兩個隱藏層加最後的輸出層,定義好模型以後,咱們須要定義損失函數,在這裏它是對你的標籤和預測輸出進行的交叉熵的損失定義,而後選擇一個optimizer的優化器來作優化訓練,
在訓練開始以前,你須要去調一個sess.run(init)對權值作一個隨機初始化的過程,初始化以後,進入到咱們的訓練階段。
3.Tensorflow分佈式訓練機制:
剛纔介紹的是tensorflow怎麼去定義模型以及怎麼去作反向計算,那麼,在大規模數據場景下,它又是怎樣工做的?
Tensorflow自己提供了一些並行機制,第一個是模型並行機制,就是基於圖去拆分(如上圖左下),它會把一張大的圖拆分紅不少部分,每一個部分都會在不少設備上去運行、計算。一般是針對一個節點沒法存下整個模型的狀況下,去對圖進行拆分。
更多場景下咱們的數據量會比較大,這時候就採用數據並行機制,在這種機制下tensorflow有兩個角色,一個是參數服務器,負責參數的存儲和交換更新,一個是工做節點,負責具體的模型計算。每一個工做節點會負責它領域內的數據分片所對應模型參數的更新計算,同時它們又會向參數服務器去傳遞它所計算的梯度,由參數服務器來彙總全部的梯度,再進一步反饋到全部節點,根據參數服務器合併參數的方式又分爲同步更新和異步更新,這兩種更新方式各有優缺點,異步更新可能會更快速地完成整個梯度計算,而對於同步更新來說,它能夠更快地進行一個收斂,選擇哪一種方式取決於實際的應用場景。
五.Deep Learning On Spark
通過剛纔的介紹,咱們知道spark是一個分佈式的通用計算框架,而以tensorflow爲表明的deep learning是一個分佈式模型訓練框架,它更多專一在梯度計算,那爲何要將二者整合呢?整合的意義在哪裏?意義就是能實現更好的分佈式訓練和數據傳輸。
針對分佈式訓練的場景,雅虎開源了TensorflowOnSpark的開源框架,它主要實現tensorflow可以與spark相結合作分佈式訓練。同時也有其它的一些機制,例如,CaffeOnSpark、MMLSpark(CNTK)、PaddleOnSpark。
TensorflowOnSpark解決的核心問題是將spark做爲分佈式tensorflow的底層調動機制,經過spark executor去把tensorflow的進程調動起來,這樣在進行tensorflow訓練時就不須要手動地去組建網絡。它也提供了一個API,經過調TFCluster.run這樣一個API,能夠快速得到tensorflow的一個分佈式訓練環境。
除此以外TensorflowOnSpark還提供了基於RDD的數據並行機制,以下圖所示。這套機制很是方便地集成了spark已有的RDD處理機制,能夠更好地跟spark sql或spark streaming去作相應的集成。
而後進入到另一個方向,叫作spark-deep-learning,是由spark的創始公司—Data Bricks發起的,它主要的目標是提供一些high-level的API,把底層的模型進行組件化,同時它指望能夠兼容底層深度式學習框架。
這裏有個「Transfer Learning as a Pipeline」的例子供你們瞭解,以下圖所示:
TensorflowOnSpark Pipeline開發了兩個API,一個是TFEstimator,另外一個是TFModel,提供了這兩個以後,你能夠直接把它們集成到spark-deep-learning pipeline裏面,進行進一步的訓練。
六.TensorflowOnSpark案例實踐
最後一部分,咱們來進行案例實踐介紹,咱們要解決的是一個圖像分類問題,這裏採用了一個kaggle dataset,叫作花朵識別,有5個類別,4000多張圖片,包括鬱金香、太陽花、蒲公英、玫瑰和雛菊這五種花。把這些數據預先存儲於MongoDB中。咱們的案例實踐是一個分佈式解決方案,包括分佈式數據獲取、分佈式訓練、分佈式評估。
如下幾張圖片是代碼示例,簡單瞭解一下:
下面是效果演示,左邊是圖片,右邊是模型預測結果,預測結果都是一個機率值,根據機率值的大小來斷定這是哪一類花朵:
以上六部分就是本次分享的主要內容,接下來是問答時間,咱們來看看都有哪些問題。
1.整個訓練過程須要人工參與嗎?準確率的提升是須要人工來參與嗎?
李老師:整個訓練過程不須要人工參與,準確率的提升涉及超參優化,deep leaning pipeline中提供了grid search機制,能夠作些自動超參選擇。
2.如今這訓練的過程是否是隻針對靜態的圖片?動態的場景能夠嗎?
李老師:你的動態場景若是是視頻,自己也可抽幀爲圖片,視頻分類是另一種應用問題,但底層也須要藉助已有的圖像分類模型,圖像分類自己的應用場景很是廣,好比和無人機相結合。
3.這套框架適用於文本的自動分類嗎?
李老師:框架一樣適合文本分類等其餘領域,差異在於數據schema和模型,訓練過程涉及到一些圖像歸一化的過程,但沒有模版匹配,你能夠理解爲全部的特徵抽取都是由deep learning自動抽取出來的。
以上就是本次線上直播的所有內容,相信經過本次學習,必定對深度學習和機器算法有了更細緻深刻的掌握。想了解更多更詳細內容的小夥伴們,能夠關注服務號:FMI飛馬網,點擊菜單欄飛馬直播,便可進行學習。