您好,登錄后才能下訂單哦!
這篇文章給大家介紹Tensorflow中的控制流和優化器指的是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
控制流
只要對tensorflow有一點了解,都應該知道graph是tensorflow最基本的一個結構。Tensorflow的所有計算都是以圖作為依據的。圖的nodes表示一些基本的數學運算,比如加法,卷積,pool等。Node使用protoBuf來進行描述,包括node的名字,op,input等,詳細可以參看tensorflow中的node_def.proto文件。Node對應的op使用C++來進行實現。圖中的邊表示了數據流動的方向以及節點之間的依賴關系。比如A->B就表示B必須在A執行完之后才能夠執行。以下是inception網絡的圖結構。
當了解了tensorflow的一些基本op之后,我們會存在這樣的疑問。對于需要分支跳轉,循環的部分,tensorflow是如何實現的。比如tf.cond,tf.while_loop這些語句在底層是如何表示的呢?tensorflow定義一些基本的控制原語,通過一定的組合可以完成高層次控制語言的實現,比如a=op?C:D這樣的語句。
tensorflow控制流的設計原則是通過引入最少的控制模塊,利用這些控制模塊可以表示很多復雜應用廣泛的控制過程。這些控制模塊還能夠適應并發,分布式運算,同時能夠實現自動微分。在tensorflow,一個計算節點在執行幀(execution frame,類比進程的棧幀)里執行。控制流原語負責創建和管理執行。直觀地理解,TF運行時建立一個個執行幀,在執行幀里執行所有屬于這個執行幀的計算節點。執行幀可以嵌套(父子關系)。來自不同執行幀且沒有依賴關系的計算節點可以并行計算。這里介紹5種最基本的控制原語。
1 switch
依據控制條件p,選擇性將輸入數據d傳播到兩個輸出端。
2 merge
Merge算子將一個可用輸入傳給輸出,只要有任意一個輸入可用,switch就可以執行。
3 enter
Enter算子依據執行幀唯一標識名稱將輸入傳遞到相應執行幀。Enter算子用于將一個tensor從一個執行幀傳遞到子執行幀。
4 exit
Exit算子用于將子執行幀的數據傳遞父執行幀。
5 nextIteration
netIteration算子可以將其輸入傳遞到當前執行幀的下一個iteration。Tensorflow的runtime可以隨時跟蹤執行幀中的iteration。任何一個op都有一個唯一的iteration ID進行標識。
現在我們來看這幾種原子指令是如何實現條件判斷和循環的。
Tensorflow中條件判斷cond(pre, fn1, fn2)實現的偽代碼如下:
首先創建一個條件控制context,這個context會調用兩個不同的計算圖。使用哪個計算圖由條件pre來決定。最后將調用兩個計算圖的結果通過merge節點輸出到下一個計算圖。使用merge節點是為了保證只要有一個圖有了結果就可以馬上輸送到下一個節點進行后續計算。用圖描述如下:
對于循環語句,tensorflow中使用一下偽代碼來完成:
首先創建一個循環控制context。然后創建一個enter和merge節點來導入循環體變量。使用enter節點是通過幀名識別這個循環體從而去執行。Merge是將循環變量傳遞給判斷條件圖,進行循環判定。加入的switch節點用于對循環條件判斷的結果進行計算圖選擇。循環體內部計算結果需要進行多次循環,所以進入了nextIteration節點。Switch的false輸出用于終止循環,所以進入exit節點將最終結果輸出。
有了這些控制節點,tensorflow就可以將一個圖分割成多個子圖,并部署到多個硬件執行設備上。在兩個子圖分割處,添加send和receive節點用于不同設備之間數據通信。Tensorflow對節點如何分配沒有限制,只要這個節點可以在這個設備上執行,就可以分配。如果沒有這些控制節點,那么一幅圖中的一個節點就只能執行一次,有了這些控制節點,計算圖就能夠有更多計算方式。一個節點可以循環執行多次,還可以被分配到不同設備執行。
Tensorflow可以支持自動微分。當用戶建立了計算圖和定義了loss函數后,tensorflow會根據計算圖的結構建立反向傳播圖。給定一個計算節點,可以通過映射到計算公式方式進而求取微分。從而能夠找出其反向傳播的節點的表示。對于控制節點來說,enter的反向傳播節點是exit,switch的反向傳播節點是merge(對于cond來說),或者nextIteration+merge(對于while_loop來說)。Merge的反向傳播節點是switch。nextIteration的反向傳播節點是identity。Enter的反向傳播節點是exit。有了這些對應關系,就可以自動來推斷反向傳播圖。從而求取梯度了。而且可以在多個設備上進行計算分配。
比如對于cond條件判斷,如果其不是loop中的條件判斷,那么其正向傳播圖和反向傳播圖的映射關系為:
優化器
優化器是在原始計算圖基礎上進行優化,提高計算在硬件上的效率。優化主要有幾個目標:簡化圖結構,降低最大的硬件存儲使用率,進行硬件友好的圖轉化。圖優化方法有很多,有些和硬件無關,有些和硬件的具體實現細節相關。高層次優化是對圖進行一定簡化,它對硬件是透明的。通過簡化可以去除一些冗余計算。比如常數折疊,多余控制節點去除等。還有一些利用結合律,分配律等對公式進行簡化,比如:
1) 圖的簡化可以刪除一些冗余計算,將圖用最終等效結果替換。比如一個建立tensor的過程:
將tensor的shape創建和數據創建合并,直接用常數替換。這樣就去除了shape創建過程。
2) 常數折疊可以將兩個以上常數用一個常數替代,需要優化器進行一些計算。比如:
3) 代數優化利用算術的性質進行一定轉化。比如:
addN相當于硬件上可支持的一個并行計算單元,可以一次計算多個輸入。所以可以將連續的三個加法用一個并行加法替換。
第二個利用了算術的分配律和結合律將三個具有相同乘數提取出來。最后一個對邏輯進行了等效轉化,從而減少了計算節點。
這個matrix+scalar的時候需要對scalar先進行廣播,然后再加。轉化后減少了廣播次數。
這兩個消除了冗余計算。
4) op融合將多個計算節點融合為一個節點來計算。這個是和硬件有關的,比如一個硬件計算單元可以完成conv+batch_norm,那么就可以實現這樣的計算融合,就不需要單獨多出來一個計算單元。常用的op融合有:
5) 存儲優化的目的是為了降低對片外的訪問頻率,這樣能夠提高數據運算效率,減少等待數據加載時間。
關于Tensorflow中的控制流和優化器指的是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。