【发布时间】:2018-04-29 10:31:28
【问题描述】:
我正在尝试阅读一本关于深度学习的书,但我发现关于网络仿射层的部分内容令人困惑。假设我有一个接受一些手写数字(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,)来自numpy.array的X.shape等。为了简化我的问题,我选择了这些维数。
术语结束,现在问题来了:
通过一些数学运算(省略),我们可以得出反向传播中使用的相等性,(因此代码中使用了
self._dW = np.dot(self._x.T, y)):
d L T d L--- == X * ---d W d Y(2,3) (2,N) * (N,3).请注意,无论我如何调整
N(即批量大小),dL/dW的维度(L 权重矩阵的偏导数)都不会改变,并且始终是 @ 987654342@.这是否意味着这些
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
...
【问题讨论】:
标签: python numpy neural-network