![](/img/trans.png)
[英]Back-propagation and forward-propagation for 2 hidden layers in neural network
[英]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.shape
的numpy.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.