架構圖還是構架圖?架構圖
中生代技術第52期分享
分享嘉賓:劉光聰
中生小編預告:中生代技術年度大會上海站將在2017年3月11號舉行,請掃描下面二維碼關注中生代技術公眾號了解詳細信息。
中生代技術公眾號
祝大家在2017年有新的收獲。非常感謝大家在春節前夕依然還堅持參加中生代技術的分享活動,也感謝中生代提供的強大的分享平臺。 我是劉光聰,來自于中興通訊技術規劃部,關注敏捷軟件開發,從事機器學習算法研究,目前負責AI平臺架構與設計。 今天我給大家分享的題目是:剖析TensorFlow架構與設計之編程模型。其目標是對深度學習有一個初步的了解,了解TensorFlow的基本編程模型,及其掌握TensorFlow的幾個重要概念。
今天我的分享主要包括3個部分,簡單介紹TensorFlow的架構;理解計算圖的工作原理;通過Mnist實戰,了解TensorFlow編程模型。
TensorFlow在跨平臺,通用性,分布式, 可擴展性,可視化等方面優勢非常明顯。
TensorFlow是一種典型的基于符號編程的數值計算框架,從總架構上分為兩層:
1. 前端:負責計算圖的構造,支持多語言,其中Python提供的 API最為成熟;
2. 后端:負責計算圖的執行,使用C++實現,直接操作分布式的CPU/GPU環境。
計算圖是TensorFlow最重要的領域概念,OP代表節點,Tensor代表邊; 數據從節點流入,通過OP運算,從節點流出,并做為下一節點的輸入,TensorFlow的命名由此而來。
OP用于表示計算圖的一個節點,完成某種抽象的計算。
TensorFlow支持豐富的OP集合,并且支持OP的擴展。
OP通過OP構造器(OP Constructor)生成OP實例,該工廠具有副作用,它將該OP實例注冊到計算圖中。 此時用戶對圖實例無感知,因為其上下文存在一個默認的圖實例。
OP的輸入和輸出以Tensor的形式傳遞,支持三種基本類型。
描述OP可以通過三個維度描述:
1. 類型
2. Tensor的Shape:維度,及其每一維度的大小
3. 約束:例如默認值,允許的值列表
以placeholder的OP為例,該OP是一個特殊的OP,它沒有輸入,只有輸出。而且,他的類型為確定,待用戶在構造OP是確定,可以看成一個「泛型編程」的過程。
這是placeholder OP的構造器(constructor),或稱為工廠。調用OP時,指定OP的屬性,從而確定OP的基本規格。該過程類似于C++模板實例化,但還未生成對象實例(直至執行計算圖階段)。
Operation描述了OP的接口(類型,約束,屬性,設備等),Kernel是針對具體設備類型,或者數據類型,Tensor的維度及大小的某種具體實現。典型地,OP會有GPU實現的Kernel,及其CPU實現的Kernel 。 這是一種典型的多態設計(區別于編程語言的多態)。
Tensor表示計算圖的邊實例,表示OP之間的數據流方向。
Tensor可以通過三元組描述:(Type, Rank, Shape)。
查看源代碼(簡化之后),其Protobuf是如此描述Tensor的,其很好地形式化描述了Tensor的本質。
在計算圖中,存在兩種類型的邊:
1. 正常的邊:用于傳遞Tensor;
2. 特殊的邊:用于控制依賴。
控制依賴是一種構建復雜網絡模型的重要工具,它表示OP之間執行的依賴關系。
當前上下文,維護了一個指向default graph的指針;也就是說,在任何一個時刻,在上下文中都存在一個默認的圖實例。 圖實例包括兩類:
1. 隱式的圖實例
2. 顯式的圖實例
前者的OP注冊到隱式的圖實例,后者的OP注冊到顯式的圖實例中。
OP命名的層次化是一種搭建復雜網絡的重要工具。例如,將OP看成西安市,那么如何從地球中找到它呢? 首先,通過世界地圖,先找到亞洲,然后找到中國,然后再找到陜西,最后才找到西安。 當搭建復雜的網絡模型時,OP命名的層次化,對于OP定位是非常有用的。
可以指定OP的設備類型,當執行計算圖時,該OP會被分配到指定的設備上執行運算。
默認圖實例(Default Graph),OP命名的層次化(Name Scope),指派設備(device)等機制,實際是由Context Manager管理,保證在某一個時刻,存在唯一的默認圖實例,及其當前的Scope,及其當前的Device等等。
總結一下,TensorFlow是一種基于符號的編程模式,前端完成計算圖的構造,后端完成計算圖的執行。
這里舉一個簡單的例子,x表示模型的輸入,y_表示模型的輸出(Labels);定義了W, b兩個訓練參數,然后使用matmul的OP,及其add的OP完成權重的線性求和,最后使用ReLU的激活函數,搭建了第一層網絡模型。 其中C代表后續的網絡層次。
上述代碼實現,構造了如上圖所示的計算圖實例。
通過建立一個Session,使用Mini-Batch算法實現該模型的訓練。很顯然,計算圖被構造依次,但被執行了多次(一次一個Batch)。
這是使用Protobuf描述計算圖的領域模型。
這是前端(Python)的領域模型。
這是后端的領域模型。
Session是Client與計算服務的橋梁,是一種資源,使用完成后保證被關閉;session.run建立了一個瞬時的閉包,該閉包針對于該次Batch,依次傳遞Tensor,完成整個計算的過程,然后再將梯度反傳,最后完成參數的更新。 每個子圖只會構造依次,但可能被執行多次。Tensor在OP之間傳遞,其生命周期僅對當前批次有效,對下一個Mini-Batch無效。
其中,Feed代表模型的輸入,Fetch代表模型的輸出。
變量是一種特殊的OP,它維持一個Tensor的句柄,變相地延長了該Tensor的生命周期。
變量在使用之前,都需要使用初始化的OP進行初始化。例如,W使用tf.zeros的初始化OP進行初始化為0值。
存在一些語法糖,可以方便地對變量進行初始化(組合模式)。
猶如C++全局變量初始化的依賴關系,TensorFlow變量之間的初始化依賴關系需要特殊的處理。
可以使用Stateful的OP操作變量,完成變量狀態的變更。
通過變量分組,可以方便對變量進行分組管理。例如,可以快速獲取出所有訓練參數的集合。
接下來,通過Mnist的實戰,加深 理解TensorFlow的編程模型。實戰包括兩種網絡模型的實踐:
1. 單層網絡(Softmax)
2. 多層網絡(2層網絡)
特征提取,因為只是Demo示例,這里簡單地按照像素進行特征的提取。
訓練樣本集的示意圖,它是一個二維的Tensor。
這是訓練樣本的標簽集合(Labels),采用One-hot形式的特征描述 。
首先描述模型的輸入和輸出,其中None表示batch_size,待seesion.run的Feed提供。
然后定義模型的訓練參數集合,并定義變量初始化OP,用于在執行階段完成變量的初始化。
這里定義了Mnist的Softmax單層網絡模型。
然后定義交叉熵的損失函數,并使用隨機梯度下降算法優化該損失函數,使得損失函數最小化。
然后建立一個會話,使用Mini-Batch算法,完成模型的訓練。 」
當完成模型的馴良后,可以使用測試數據集對模型進行測試,輸出模型的精度。
接下來,通過搭建兩層網絡模型實現Mnist。其中,通過計算圖的4個基本子圖,顯式地增強模型設計的可理解性。
- Inference:僅完成推理,僅僅包括前向計算過程;
- Loss:構建損失函數,計算損失;
- Training:根據損失,反向傳遞梯度,然后更新權重,直到模型收斂;
- Evaluation:評估模型的精度
這里搭建了兩層的網絡模型: 第一層:ReLU 第二層:Softmax
這是推理的主要邏輯,定義了兩層網絡。
使用交叉熵定義損失函數。
使用隨機梯度下降算法最小化損失函數 。
使用evaluation評估網絡模型的精度。
感謝大家的耐心閱讀,如果您對TensorFlow的架構與設計感興趣,請持續關注我后續關于TensorFlow源代碼的剖析,謝謝。
參考資料,網絡上已經很豐富了,在此不在重述了。當然,閱讀源代碼,是獲取最權威的知識的最佳途徑。
最后,歡迎大家關注我的「簡書」,直接搜索「劉光聰」,我主要關注敏捷軟件開發,機器學習算法,也歡迎大家給我更多的指點,謝謝。
問答環節
Q1. 對TensorFlow的集群化搭建有何建議?
A1. TensorFlow的分布式架構已經超過本次分享的內容,希望爭取下次機會再組織一次關于分布式架構與工作機制,實踐應用的分享。
其中,在講義的最后一節,有一個關于TensorFlow分布式的簡單介紹,請查閱:
http://www.jianshu.com/p/a857743c7095
TensorFlow分布式的簡單介紹
識別二維碼直達光聰的簡書地址
Q2. 我可以理解為TensorFlow是一個張量為具體參數的數值計算框架嗎?有沒有張量為閉包的數值計算框架?我對TensorFlow感興趣主要是因為它底層是C++實現,我認為可能會比較高效。
A2. TensorFlow是一個通用的,分布式的數值計算框架,是業界關注最為廣泛的深度學習框架;其中,Tensor是TensorFlow的一個重要數據結構,它是一個特定類型,任意維度,且每個維度任意大小的高維數組。
TensorFlow的前端支持多語言編程,而后端使用C++實現,直接操作CPU/GPU硬件,性能是其考慮的重要因素。
Q3. 請問機器學習是不是必須是數學專業?
A3. 機器學習是一個多學科交叉的領域,它是人工智能的一個重要分支。當然,機器學習的確需要一定的數學基礎,例如線性代數,微積分,概率論與數理統計。
推薦https://github.com/exacity/deeplearningbook-chinese第一部分關于數學基礎的概括性介紹。
Github上鏈接,第一部分關于數學基礎的概括性介紹。
識別二維碼直達
Q4. 請問中興通訊在機器學習在哪些領域上應用?
A4. 智能運維,終端,IoT,智能家居等方面都要相關應用。
Q5. 訓練過程能否將狀態持久化到硬盤…
A5. TensorFlow支持Checkpoint的特性,請參閱https://www.tensorflow.org/versions/master/how_tos/variables/#checkpoint_files
Checkpoint官網介紹
識別二維碼直達
致謝為知識贊賞的朋友
—
—
鳴謝
致謝為知識打賞的以上群友,祝雞年大吉,更上層樓
—
—
為慶祝中生代成立一周年,也為了答謝長期支持的朋友們,中生代技術聯合iTechPlus在上海舉行年度大會
戳原文,查看光聰簡書!
免責聲明: 本站提供的任何內容版權均屬于相關版權人和權利人,如有侵犯你的版權。 請來信指出,我們將于第一時間刪除! 所有資源均由免費公共網絡整理而來,僅供學習和研究使用。請勿公開發表或 用于商業用途和盈利用途。
本文鏈接:http://m.w-link.com.cn/ziyuan/16189.html
發表評論