簡體   English   中英

神經網絡:批次版本仿射層反向傳播權矩陣更新

[英]Neural network: Batch-version affine layer back-propagation weight matrix updation

我正在嘗試閱讀有關深度學習的書,但發現有關網絡仿射層的某些部分令人困惑。 說我有它接受一些筆跡數(網絡0 ~ 9 )的圖像(MNIST),其被壓扁到一個維陣列,例如np.array([123, 255, 0, ...])和它將輸出對每個可能的輸出進行評分,例如np.array([0., 0., 0.3, 0., 0., 0.6, 0., 0., 0., 0.1]) (因此圖像可能是數字5 ) 。

這是我的仿射層的實現:

class AffineLayer(object):
    ...
    def backward(self, dy):
        dx = np.dot(dy, self._W.T)
        self._dW = np.dot(self._x.T, dy) # Question related part
        self._db = np.sum(dy, axis=0)
        dx = dx.reshape(self._original_x_shape)
        return dx
    ...

這里有一些解釋:

  • self._W是權重矩陣。
  • 這里需要關注的部分是self._dW = np.dot(self._x.T, y) # Question related part
  • 這行是從等式得出的:

    X * W + B = Y
    (N,2) matrix product (2,3) (1,3) (N,3).

  • 的符號(2,)來自X.shapenumpy.array等。為了簡化我的問題,我選擇這些維數。

術語結束,現在出現問題:

通過一些數學運算(省略),我們可以得出反向傳播中使用的等式(因此在代碼中使用self._dW = np.dot(self._x.T, y) ):

d LT d L
--- == X * ---
d W d Y
   
(2,3) (2,N) * (N,3).

請注意,無論我如何調整N (即批的大小), dL/dW的大小,L的偏導數權重矩陣,都不會改變,並且始終為(2,3)

這是否意味着將這N批次的總效果合並/壓縮為dL/dW 這與我將如何實現輸出層(例如softmax-cross-entropy層)作為最終層有關。 我目前的結論是, N批處理意味着要進行N次反向傳播,並且需要用dL/dW梯度除以N才能平均/攤銷該批處理的總效果。 但是現在看來,我只需要這樣做一次,那么該部門應該是“第一步”。

編輯:

我還找到了似乎在最后一步mnielsen / neural-networks-and-deep-learning-GitHub上進行划分的版本,以供參考。

由於softmax-cross-entropy層類別是網絡的最后一層,因此在反向傳播中,它將成為如上所述的“第一步”:

class SoftmaxCrossEntropy(object):
    ...
    def backward(self, dout=1):
        batch_size = self._t.shape[0]
        # one-hot
        if self._t.size == self._y.size:
            dx = (self._y - self._t) / batch_size # <-- why divided by N here?
        else: # not one-hot
            dx = self._y * 1
            dx[np.arange(batch_size), self._t] -= 1
            dx = dx / batch_size       #    <-- why divided by N here?
        return dx
    ...

這是否意味着將這N批輸入的效果合並/壓縮到dW中?

由於X的第i行是與第i個展平圖像有關的1-d數組。 如果我將X換位

T
X ,然后是代表這些扁平圖像的列。 如果N增加,盡管

結果( dW )的維數不變,計算每個元素的中間步驟

T d L
dW = X * ---
d Y ,增加,這意味着

N
dW = Sum ( pixel_info * class_scores_deriv. )
i,jn=1 i,nn,j ,其中N是批次

尺寸。 顯然,每個class_scores_derivative_(n,j) “加入” dW_(i,j)的確定,但是這意味着需要用batch_size = N進行除法,因為上述總和不是該批次的平均效果,而是需要dW來表示該批次的平均影響。 如果我划分class_scores_deriv.每個元素class_scores_deriv. ,這是線
dx = (self._y - self._t) / batch_size ,然后

N 1
Sum ( pixel_info * --- class_scores_deriv. )
n=1 i,n N n,j
1 N
= --- Sum ( pixel_info * class_scores_deriv. )
N n=1 i,nn,j
1
= --- dW
N ,這是我想要的實際dW

所以答案(我希望)應該是

整個批次確定dW,但為了進行壓縮,需要在SoftmaxCrossEntropy::backward(self, dout=1)中進行划分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM