0x01 數(shù)據(jù)流圖
數(shù)據(jù)流圖:用節(jié)點(diǎn)和有向邊描述數(shù)學(xué)運(yùn)算的有向無環(huán)圖
節(jié)點(diǎn):代表各類操作(operation),具體包括數(shù)學(xué)運(yùn)算竟贯、數(shù)據(jù)填充益眉、結(jié)果輸出和變量讀寫等
有向邊:描述節(jié)點(diǎn)間的輸入、輸出關(guān)系娱颊,而張量(Tensor)則在邊上流動(dòng)
基于梯度下降的機(jī)器學(xué)習(xí)問題傲诵,在TensorFlow的數(shù)據(jù)流圖中通常可分為兩個(gè)階段:
- 前向圖求值:用戶編寫箱硕,主要包括定義模型的目標(biāo)和損失函數(shù)拴竹,輸入輸出的形狀和類型
- 后向圖計(jì)算梯度:TensorFlow的優(yōu)化器生成,主要用來計(jì)算模型的梯度以及梯度的更新
0x02 節(jié)點(diǎn)
前向圖中剧罩,節(jié)點(diǎn)稱為操作(operation)主要包括三類:
- 數(shù)學(xué)函數(shù)或表達(dá)式:如加減乘除等
- 儲(chǔ)存模型參數(shù)的變量(Variable):比如卷積中的卷積核和偏置
- 占位符(Placeholder):用來描述輸入輸出的形狀栓拜,便于用戶利用其抽象結(jié)構(gòu)來定義模型,執(zhí)行時(shí)需要填充對(duì)應(yīng)的數(shù)據(jù)
后向圖中惠昔,節(jié)點(diǎn)也會(huì)分為三類:
- 梯度值:經(jīng)過前向圖計(jì)算出的模型參數(shù)的梯度
- 更新模型參數(shù)的操作:定義如何將梯度值更新到對(duì)應(yīng)的模型參數(shù)
- 更新后的模型參數(shù):優(yōu)化器中的參數(shù)與前向圖中的參數(shù)一一對(duì)應(yīng)幕与,但是參數(shù)進(jìn)行了更新,用戶下一輪訓(xùn)練
0x03 有向邊
有向邊定義操作之間的關(guān)系镇防,主要包括兩類:
- 傳輸數(shù)據(jù)啦鸣,絕大的有向邊都是此類,用來流動(dòng)張量
- 定義控制依賴来氧,泰國(guó)設(shè)定節(jié)點(diǎn)的前置依賴決定相關(guān)節(jié)點(diǎn)的執(zhí)行順序诫给,又被稱為控制邊
所有的節(jié)點(diǎn)都通過數(shù)據(jù)邊和控制邊相連,入度為0的節(jié)點(diǎn)啦扬,即沒有前置依賴的節(jié)點(diǎn)可直接執(zhí)行中狂,其他節(jié)點(diǎn)必須等所有依賴節(jié)點(diǎn)執(zhí)行完才可執(zhí)行
0x04 執(zhí)行原理
從宏觀的角度可分為四個(gè)步驟:
- 以節(jié)點(diǎn)的名稱做關(guān)鍵字、入度作為值扑毡,構(gòu)建散列表胃榕,并將此數(shù)據(jù)流圖上的所有節(jié)點(diǎn)都放入散列表中
- 為此數(shù)據(jù)流圖創(chuàng)建一個(gè)可執(zhí)行節(jié)點(diǎn)隊(duì)列,將散列表中入度為0的節(jié)點(diǎn)加入到隊(duì)列中僚楞,并從散列表中刪除這些節(jié)點(diǎn)
- 依次執(zhí)行隊(duì)列中的每一個(gè)節(jié)點(diǎn)勤晚,執(zhí)行成功后將此節(jié)點(diǎn)輸出指向的節(jié)點(diǎn)的入度減1枉层,更新散列表中對(duì)應(yīng)節(jié)點(diǎn)的入度值泉褐。
- 重復(fù)上面兩個(gè)步驟直到執(zhí)行隊(duì)列為空。
注意:TensorFlow的編程模式(聲明式編程)決定了其執(zhí)行的順序并不完全依賴于與代碼中定義的順序鸟蜡,而與節(jié)點(diǎn)之間的邏輯關(guān)系以及運(yùn)行時(shí)庫的實(shí)現(xiàn)機(jī)制相關(guān)膜赃。