2016-12-14 151 views
0

我想了解如何使用miinibatch SGD計算梯度。我已經在CS231在線課程中實現了它,但只有意識到在中間層中,梯度基本上是爲每個樣本計算的所有梯度的總和(Caffe或Tensorflow中的實現相同)。它僅在最後一層(損失)中被樣本數平均。 這是正確的嗎?如果是這樣,這是否意味着,因爲在最後一層他們是平均的,當做backprop時,所有的梯度也是自動平均的? 謝謝!Minibatch SGD梯度計算 - 平均或總和

+1

這與TensorFlow有什麼關係? – martianwars

+0

我標記了它,因爲在tensorflow實現是這樣完成的,該社區中的人也通常知道低層次的實現(可能不是你),並可能有助於回答 –

回答

3

最好理解爲什麼SGD首先工作。

通常,神經網絡實際上是一個非常複雜的輸入向量x,標籤y(或目標變量,根據問題是分類還是迴歸而變化)和一些參數向量w的複合函數。假設我們正在進行分類。我們實際上試圖對變量向量w做一個最大似然估計(實際上是MAP估計,因爲我們當然會使用L2或L1正則化,但現在這太過於技術性了)。假設樣本是獨立的;那麼我們有以下的成本函數:

p(y1|w,x1)p(y2|w,x2) ... p(yN|w,xN) 

優化這個WRT到w是一個爛攤子由於所有這些可能性都multiplicated(這將產生一個瘋狂的複雜的衍生WRT W)。我們使用對數概率而不是(以日誌不改變極值點,我們用N劃分,所以我們可以把我們的訓練設置爲經驗概率分佈,P(X))

J(X,Y,w)=-(1/N)(log p(y1|w,x1) + log p(y2|w,x2) + ... + log p(yN|w,xN)) 

這是實際成本功能我們有。神經網絡實際上做的是模擬概率函數p(yi | w,xi)。這可能是一個非常複雜的1000+分層ResNet或者只是一個簡單的感知器。

現在對於瓦特的衍生物是簡單的狀態下,由於我們現在加法:

dJ(X,Y,w)/dw = -(1/N)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(yN|w,xN)/dw) 

理想的是,上述是實際梯度。但是這種批量計算並不容易計算。如果我們正在處理1M個培訓樣本的數據集,該怎麼辦?更糟糕的是,訓練集可能是樣本x的流,它具有無限大小。

新元的隨機部分在這裏發揮作用。從訓練集中挑m個樣本,其中m < <Ñ隨機和均勻地和通過使用它們計算衍生物:

dJ(X,Y,w)/dw =(approx) dJ'/dw = -(1/m)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(ym|w,xm)/dw) 

記住,我們有一個經驗(或實際無限訓練集的情況下)的數據分佈p (X)。上述從p(x)中抽取m個樣本並對它們進行平均的操作實際上爲實際導數dJ(X,Y,w)/ dw產生了無偏估計量dJ'/ dw。那是什麼意思?採取許多這樣的m個樣本並計算不同的dJ'/ dw估計值,並對它們進行平均,並且在無窮大采樣的極限內,您甚至可以非常接近地得到dJ(X,Y,w)/ dw。可以看出,這些有噪聲但無偏差的梯度估計在長期運行中會表現得像原始梯度。平均而言,SGD將遵循實際梯度的路徑(但它可能卡在不同的局部最小值,這取決於學習速率的選擇)。小批量大小m與噪聲估計值dJ'/ dw中的固有誤差直接相關。如果m很大,可以獲得低方差的梯度估計值,則可以使用較大的學習率。如果m很小或者m = 1(在線學習),那麼估計量dJ'/ dw的方差非常高,您應該使用較小的學習率,否則算法可能很容易偏離失控。現在

足夠的理論,實際問題是

只有在它們被採樣的數量平均爲最後一層(損失)。它是否正確?如果是這樣,這是否意味着,因爲在最後一層他們是平均的,當做backprop時,所有的梯度也是自動平均的?謝謝!

是的,在最後一層除以m就足夠了,因爲一旦最下層與其相乘,鏈規則就會將因子(1/m)傳播到所有參數。您無需爲每個參數分別進行操作,這將是無效的。

+1

這個答案是非常有用的,解決了另一個問題,我有關於爲什麼我們應該最大化對數似然而不是僅僅是可能性。非常感謝! –

2

在最後一層他們被平均,並在前面的總結。先前層中的累加梯度在下一層的不同節點上求和,而不是通過示例。這種平均只是爲了讓學習過程在更改批處理大小時表現得相似 - 如果對所有圖層進行求和,但所有圖層的總和應該相同,但要適當降低學習速率。

+0

,例如,假設我有一個完全連接的層,例如: y = XW,其中X是一個N×D矩陣(N個維度爲d的樣本),W是dxM(M個輸出節點)。那麼y就是NxM。現在,如果我們有dL/dy(NxM),那麼dL/dW = dy/dW * dL/dy,那麼dL/dW = X_transpose * dL/dy;在這種情況下,我認爲dL/dW正在爲每個單獨的樣本添加漸變。這是正確的嗎? –

+0

不,它爲y(M)中的每個__node__添加漸變。假設L是樣本上的平均值,dL/dy也是平均值,但它根據輸出層中的節點數量具有一些尺寸。 – sygi

+0

感謝您的幫助,我有點困惑,我很抱歉, 但如果dL/dy是平均值,爲什麼它的大小是NxM(如每個樣本的一個梯度)? –