當(dāng)前位置:首頁 > 工程資源 > 正文

架構(gòu)圖還是構(gòu)架圖?架構(gòu)圖

  中生代技術(shù)第52期分享

  分享嘉賓:劉光聰

  中生小編預(yù)告:中生代技術(shù)年度大會上海站將在2017年3月11號舉行,請掃描下面二維碼關(guān)注中生代技術(shù)公眾號了解詳細(xì)信息。

中生代技術(shù)公眾號

  

  祝大家在2017年有新的收獲。非常感謝大家在春節(jié)前夕依然還堅(jiān)持參加中生代技術(shù)的分享活動,也感謝中生代提供的強(qiáng)大的分享平臺。 我是劉光聰,來自于中興通訊技術(shù)規(guī)劃部,關(guān)注敏捷軟件開發(fā),從事機(jī)器學(xué)習(xí)算法研究,目前負(fù)責(zé)AI平臺架構(gòu)與設(shè)計(jì)。 今天我給大家分享的題目是:剖析TensorFlow架構(gòu)與設(shè)計(jì)之編程模型。其目標(biāo)是對深度學(xué)習(xí)有一個初步的了解,了解TensorFlow的基本編程模型,及其掌握TensorFlow的幾個重要概念。

  

  今天我的分享主要包括3個部分,簡單介紹TensorFlow的架構(gòu);理解計(jì)算圖的工作原理;通過Mnist實(shí)戰(zhàn),了解TensorFlow編程模型。

  

  

  TensorFlow在跨平臺,通用性,分布式, 可擴(kuò)展性,可視化等方面優(yōu)勢非常明顯。

  

  TensorFlow是一種典型的基于符號編程的數(shù)值計(jì)算框架,從總架構(gòu)上分為兩層:

1. 前端:負(fù)責(zé)計(jì)算圖的構(gòu)造,支持多語言,其中Python提供的 API最為成熟;

2. 后端:負(fù)責(zé)計(jì)算圖的執(zhí)行,使用C++實(shí)現(xiàn),直接操作分布式的CPU/GPU環(huán)境。

  

  

  計(jì)算圖是TensorFlow最重要的領(lǐng)域概念,OP代表節(jié)點(diǎn),Tensor代表邊; 數(shù)據(jù)從節(jié)點(diǎn)流入,通過OP運(yùn)算,從節(jié)點(diǎn)流出,并做為下一節(jié)點(diǎn)的輸入,TensorFlow的命名由此而來。

  

  OP用于表示計(jì)算圖的一個節(jié)點(diǎn),完成某種抽象的計(jì)算。

  

  TensorFlow支持豐富的OP集合,并且支持OP的擴(kuò)展。

  

  OP通過OP構(gòu)造器(OP Constructor)生成OP實(shí)例,該工廠具有副作用,它將該OP實(shí)例注冊到計(jì)算圖中。 此時用戶對圖實(shí)例無感知,因?yàn)槠渖舷挛拇嬖谝粋€默認(rèn)的圖實(shí)例。

  

  OP的輸入和輸出以Tensor的形式傳遞,支持三種基本類型。

  

  描述OP可以通過三個維度描述:

1. 類型

2. Tensor的Shape:維度,及其每一維度的大小

3. 約束:例如默認(rèn)值,允許的值列表

  

  以placeholder的OP為例,該OP是一個特殊的OP,它沒有輸入,只有輸出。而且,他的類型為確定,待用戶在構(gòu)造OP是確定,可以看成一個「泛型編程」的過程。

  

  這是placeholder OP的構(gòu)造器(constructor),或稱為工廠。調(diào)用OP時,指定OP的屬性,從而確定OP的基本規(guī)格。該過程類似于C++模板實(shí)例化,但還未生成對象實(shí)例(直至執(zhí)行計(jì)算圖階段)。

  

  Operation描述了OP的接口(類型,約束,屬性,設(shè)備等),Kernel是針對具體設(shè)備類型,或者數(shù)據(jù)類型,Tensor的維度及大小的某種具體實(shí)現(xiàn)。典型地,OP會有GPU實(shí)現(xiàn)的Kernel,及其CPU實(shí)現(xiàn)的Kernel 。 這是一種典型的多態(tài)設(shè)計(jì)(區(qū)別于編程語言的多態(tài))。

  

  Tensor表示計(jì)算圖的邊實(shí)例,表示OP之間的數(shù)據(jù)流方向。

  

  Tensor可以通過三元組描述:(Type, Rank, Shape)。

  

  查看源代碼(簡化之后),其Protobuf是如此描述Tensor的,其很好地形式化描述了Tensor的本質(zhì)。

  

  在計(jì)算圖中,存在兩種類型的邊:

1. 正常的邊:用于傳遞Tensor;

2. 特殊的邊:用于控制依賴。

  

  控制依賴是一種構(gòu)建復(fù)雜網(wǎng)絡(luò)模型的重要工具,它表示OP之間執(zhí)行的依賴關(guān)系。

  

  當(dāng)前上下文,維護(hù)了一個指向default graph的指針;也就是說,在任何一個時刻,在上下文中都存在一個默認(rèn)的圖實(shí)例。 圖實(shí)例包括兩類:

1. 隱式的圖實(shí)例

2. 顯式的圖實(shí)例

  

  前者的OP注冊到隱式的圖實(shí)例,后者的OP注冊到顯式的圖實(shí)例中。

  

  OP命名的層次化是一種搭建復(fù)雜網(wǎng)絡(luò)的重要工具。例如,將OP看成西安市,那么如何從地球中找到它呢? 首先,通過世界地圖,先找到亞洲,然后找到中國,然后再找到陜西,最后才找到西安。 當(dāng)搭建復(fù)雜的網(wǎng)絡(luò)模型時,OP命名的層次化,對于OP定位是非常有用的。

  

  可以指定OP的設(shè)備類型,當(dāng)執(zhí)行計(jì)算圖時,該OP會被分配到指定的設(shè)備上執(zhí)行運(yùn)算。

  

  默認(rèn)圖實(shí)例(Default Graph),OP命名的層次化(Name Scope),指派設(shè)備(device)等機(jī)制,實(shí)際是由Context Manager管理,保證在某一個時刻,存在唯一的默認(rèn)圖實(shí)例,及其當(dāng)前的Scope,及其當(dāng)前的Device等等。

  

  總結(jié)一下,TensorFlow是一種基于符號的編程模式,前端完成計(jì)算圖的構(gòu)造,后端完成計(jì)算圖的執(zhí)行。

  

  這里舉一個簡單的例子,x表示模型的輸入,y_表示模型的輸出(Labels);定義了W, b兩個訓(xùn)練參數(shù),然后使用matmul的OP,及其add的OP完成權(quán)重的線性求和,最后使用ReLU的激活函數(shù),搭建了第一層網(wǎng)絡(luò)模型。 其中C代表后續(xù)的網(wǎng)絡(luò)層次。

  

  上述代碼實(shí)現(xiàn),構(gòu)造了如上圖所示的計(jì)算圖實(shí)例。

  

  通過建立一個Session,使用Mini-Batch算法實(shí)現(xiàn)該模型的訓(xùn)練。很顯然,計(jì)算圖被構(gòu)造依次,但被執(zhí)行了多次(一次一個Batch)。

  

  這是使用Protobuf描述計(jì)算圖的領(lǐng)域模型。

  

  這是前端(Python)的領(lǐng)域模型。

  

  這是后端的領(lǐng)域模型。

  

  Session是Client與計(jì)算服務(wù)的橋梁,是一種資源,使用完成后保證被關(guān)閉;session.run建立了一個瞬時的閉包,該閉包針對于該次Batch,依次傳遞Tensor,完成整個計(jì)算的過程,然后再將梯度反傳,最后完成參數(shù)的更新。 每個子圖只會構(gòu)造依次,但可能被執(zhí)行多次。Tensor在OP之間傳遞,其生命周期僅對當(dāng)前批次有效,對下一個Mini-Batch無效。

  

  其中,F(xiàn)eed代表模型的輸入,F(xiàn)etch代表模型的輸出。

  

  變量是一種特殊的OP,它維持一個Tensor的句柄,變相地延長了該Tensor的生命周期。

  

  變量在使用之前,都需要使用初始化的OP進(jìn)行初始化。例如,W使用tf.zeros的初始化OP進(jìn)行初始化為0值。

  

  存在一些語法糖,可以方便地對變量進(jìn)行初始化(組合模式)。

  

  猶如C++全局變量初始化的依賴關(guān)系,TensorFlow變量之間的初始化依賴關(guān)系需要特殊的處理。

  

  可以使用Stateful的OP操作變量,完成變量狀態(tài)的變更。

  

  通過變量分組,可以方便對變量進(jìn)行分組管理。例如,可以快速獲取出所有訓(xùn)練參數(shù)的集合。

  

  接下來,通過Mnist的實(shí)戰(zhàn),加深 理解TensorFlow的編程模型。實(shí)戰(zhàn)包括兩種網(wǎng)絡(luò)模型的實(shí)踐:

1. 單層網(wǎng)絡(luò)(Softmax)

2. 多層網(wǎng)絡(luò)(2層網(wǎng)絡(luò))

  

  特征提取,因?yàn)橹皇荄emo示例,這里簡單地按照像素進(jìn)行特征的提取。

  

  訓(xùn)練樣本集的示意圖,它是一個二維的Tensor。

  

  這是訓(xùn)練樣本的標(biāo)簽集合(Labels),采用One-hot形式的特征描述 。

  

  首先描述模型的輸入和輸出,其中None表示batch_size,待seesion.run的Feed提供。

  

  然后定義模型的訓(xùn)練參數(shù)集合,并定義變量初始化OP,用于在執(zhí)行階段完成變量的初始化。

  

  這里定義了Mnist的Softmax單層網(wǎng)絡(luò)模型。

  

  然后定義交叉熵的損失函數(shù),并使用隨機(jī)梯度下降算法優(yōu)化該損失函數(shù),使得損失函數(shù)最小化。

  

  然后建立一個會話,使用Mini-Batch算法,完成模型的訓(xùn)練。 」

  

  當(dāng)完成模型的馴良后,可以使用測試數(shù)據(jù)集對模型進(jìn)行測試,輸出模型的精度。

  

  接下來,通過搭建兩層網(wǎng)絡(luò)模型實(shí)現(xiàn)Mnist。其中,通過計(jì)算圖的4個基本子圖,顯式地增強(qiáng)模型設(shè)計(jì)的可理解性。

- Inference:僅完成推理,僅僅包括前向計(jì)算過程;

- Loss:構(gòu)建損失函數(shù),計(jì)算損失;

- Training:根據(jù)損失,反向傳遞梯度,然后更新權(quán)重,直到模型收斂;

- Evaluation:評估模型的精度

  

架構(gòu)圖還是構(gòu)架圖?架構(gòu)圖  第1張

  這里搭建了兩層的網(wǎng)絡(luò)模型: 第一層:ReLU 第二層:Softmax

  

  這是推理的主要邏輯,定義了兩層網(wǎng)絡(luò)。

  

  使用交叉熵定義損失函數(shù)。

  

  使用隨機(jī)梯度下降算法最小化損失函數(shù) 。

  

  使用evaluation評估網(wǎng)絡(luò)模型的精度。

  感謝大家的耐心閱讀,如果您對TensorFlow的架構(gòu)與設(shè)計(jì)感興趣,請持續(xù)關(guān)注我后續(xù)關(guān)于TensorFlow源代碼的剖析,謝謝。

  

  參考資料,網(wǎng)絡(luò)上已經(jīng)很豐富了,在此不在重述了。當(dāng)然,閱讀源代碼,是獲取最權(quán)威的知識的最佳途徑。

  

  最后,歡迎大家關(guān)注我的「簡書」,直接搜索「劉光聰」,我主要關(guān)注敏捷軟件開發(fā),機(jī)器學(xué)習(xí)算法,也歡迎大家給我更多的指點(diǎn),謝謝。

問答環(huán)節(jié)

  Q1. 對TensorFlow的集群化搭建有何建議?

  A1. TensorFlow的分布式架構(gòu)已經(jīng)超過本次分享的內(nèi)容,希望爭取下次機(jī)會再組織一次關(guān)于分布式架構(gòu)與工作機(jī)制,實(shí)踐應(yīng)用的分享。

  其中,在講義的最后一節(jié),有一個關(guān)于TensorFlow分布式的簡單介紹,請查閱:

  http://www.jianshu.com/p/a857743c7095

  TensorFlow分布式的簡單介紹

  識別二維碼直達(dá)光聰?shù)暮啎刂?/p>

  Q2. 我可以理解為TensorFlow是一個張量為具體參數(shù)的數(shù)值計(jì)算框架嗎?有沒有張量為閉包的數(shù)值計(jì)算框架?我對TensorFlow感興趣主要是因?yàn)樗讓邮荂++實(shí)現(xiàn),我認(rèn)為可能會比較高效。

  A2. TensorFlow是一個通用的,分布式的數(shù)值計(jì)算框架,是業(yè)界關(guān)注最為廣泛的深度學(xué)習(xí)框架;其中,Tensor是TensorFlow的一個重要數(shù)據(jù)結(jié)構(gòu),它是一個特定類型,任意維度,且每個維度任意大小的高維數(shù)組。

  TensorFlow的前端支持多語言編程,而后端使用C++實(shí)現(xiàn),直接操作CPU/GPU硬件,性能是其考慮的重要因素。

  Q3. 請問機(jī)器學(xué)習(xí)是不是必須是數(shù)學(xué)專業(yè)?

  A3. 機(jī)器學(xué)習(xí)是一個多學(xué)科交叉的領(lǐng)域,它是人工智能的一個重要分支。當(dāng)然,機(jī)器學(xué)習(xí)的確需要一定的數(shù)學(xué)基礎(chǔ),例如線性代數(shù),微積分,概率論與數(shù)理統(tǒng)計(jì)。

  推薦https://github.com/exacity/deeplearningbook-chinese第一部分關(guān)于數(shù)學(xué)基礎(chǔ)的概括性介紹。

  Github上鏈接,第一部分關(guān)于數(shù)學(xué)基礎(chǔ)的概括性介紹。

  識別二維碼直達(dá)

  Q4. 請問中興通訊在機(jī)器學(xué)習(xí)在哪些領(lǐng)域上應(yīng)用?

  A4. 智能運(yùn)維,終端,IoT,智能家居等方面都要相關(guān)應(yīng)用。

  Q5. 訓(xùn)練過程能否將狀態(tài)持久化到硬盤…

  A5. TensorFlow支持Checkpoint的特性,請參閱https://www.tensorflow.org/versions/master/how_tos/variables/#checkpoint_files

  Checkpoint官網(wǎng)介紹

  識別二維碼直達(dá)

致謝為知識贊賞的朋友

  —

  —

  

  

  鳴謝

  致謝為知識打賞的以上群友,祝雞年大吉,更上層樓

  —

  —

  為慶祝中生代成立一周年,也為了答謝長期支持的朋友們,中生代技術(shù)聯(lián)合iTechPlus在上海舉行年度大會

  

  

  戳原文,查看光聰簡書!

發(fā)表評論