神經網路訓練時間主要耗時在於前向還是梯度反傳?

時間 2021-05-31 18:12:50

1樓:czvsdf

前向計算是按部就班的事情,順著模型自然推就出來了,可以理解為多項式時間出來(中學水平)。

引數更新就是個自加運算,類似資料庫update更新覆蓋,可以理解為常數時間出來(小學水平)。

梯度計算是個玄學,因為就前向計算的一步而言,就存在很多種梯度計算方式,其中包括靠譜的和不靠譜的(不靠譜的沒人用,我只是舉個例子),靠譜的包括torch的一堆優化器,簡單的梯度下降或者隨機梯度下降,那個就有點苟了,正常人學習大概要花一點時間;當然還有更苟的adam或者RMSProp,以及現在新出的一些梯度計算公式——反正核心都是花裡胡哨的組合加權各階導數。(本科水平,玩優化花裡胡哨的是研究生以上水平)

不靠譜的方法理論上不存在,因為效果肯定辣雞沒人用,比如複雜的隨機數或者沒事來個奇怪的複雜運算什麼的——所以理論上,如果有乙個很複雜的靠譜的計算梯度的優化方法,不考慮計算準確率提公升作用,只考慮時間複雜度的話,就可以視作乙個瞎搞的複雜函式。

因此,正常梯度計算的複雜顯然都是高於前向計算的,高階複雜的梯度計算就更不用說了(你可以理解為不靠譜的玄學計算),更是遠遠大於前向計算。PS當然也可以遠遠小於,如果不考慮效果提公升,你可以定義你的梯度計算公式始終為常值,比如233,顯然這樣查表的梯度計算複雜度會比引數更新的還低——當然這種梯度計算不存在2333333。

綜上,計算複雜度排名從高到低如下:

玄學≈複雜(高階導數)的梯度》簡單(低階導數)的梯度》前向計算》引數更新》不存在的常數梯度≈查表

PS 誰又能說,神經網路本身就不是玄學呢?

2樓:

反向慢。以前的pytorch的多卡平行計算只有前向做了多卡並行,反向還是1號卡單卡在做,很迷惑。不知道後來版本這點改了沒有。

3樓:TY Sun

考慮某層的計算為 y=f(x, w),其中x為輸入,y為輸出,w為權重。

前向需計算y,反向需計算dx和dw(有些層無w,例如池化,首層通常不需計算dx),引數更新需計算w=w+dw。

所以一般來說是t2>t1>t3。

有些情況下,t3會比較複雜,但是一般也不會很久。

有沒有訓練神經網路的數字貨幣?

孫大波 Ekiden算是可以進行訓練神經網路的的區塊鏈專案。原理簡單的來說,就是一些節點執行可信硬體的方式來訓練資料,可信硬體是一模擬較專業的裝置,例如 Intel SGX。這類專案的想法都是訓練放在鏈下,再用密碼學來保證資料 結果的真實性。Ekiden 專案是由 Down Song 宋曉東主導的,...

RNN神經網路訓練過程中weight幾乎不更新,只有bias更新?

大多萌萌噠 把梯度截斷的c的值增大吧,或者修改啟用函式。一般用ReLU函式的話不會出現這個問題啊。而且你權重初始化是怎麼初始化的?單位矩陣還是隨機值? 其實不太懂RNN,路過問一下 啟用函式用的是啥,relu?這個網路用來做什麼的,輸入輸出是什麼樣子的,數值範圍?感覺像是normalization或...

訓練神經網路所需要的gpu是什麼意思?

智星雲服務 圖形處理器是一種專門在個人電腦 工作站 遊戲機和一些移動裝置上執行繪圖運算工作的微處理器。神經網路設計到大量的矩陣運算,GPU在這個方面很有優勢,筆記本上的GPU如果低於2G視訊記憶體,或者過於老舊的GPU型號都是沒有辦法訓練神經網路的,即使6G視訊記憶體對於大型網路和中大型資料集來說也...