【问题标题】:Implementing general back-propagation实现一般的反向传播
【发布时间】:2018-10-20 22:14:46
【问题描述】:

我正在尝试为具有任意激活函数的全连接层实现反向传播方法。我理解算法背后的一般思想和数学,但我在理解矢量化形式时遇到了困难......

我需要帮助了解元素的预期尺寸

已知尺寸:

  • 输入 - self.X 是大小 (N,128)
  • 重量 - self.W 是尺寸 (128,10)
  • 偏差 - self.b 是大小 (128,10)
  • 输出 - self.y 是大小 (N,10)
  • 线性输出(激活前) - self.z 的大小为 (N,10)

尺寸未知: N=1(示例数)

  • dy - 下一层的梯度 - 应该是什么大小?
  • dz - 激活函数的导数 - 它应该是什么大小?
  • self.d - 当前层的梯度 - 应该是什么大小?

这是我的代码:

def backward(self, dy):
    if self.activator == 'relu':
        dz = np.zeros((self.z.shape[0], self.z.shape[1]))
        dz[self.z>0] = 1
    elif self.activator == 'sigmoid':
        dz = self.z * (1 - self.z)
    elif self.activator == 'soft-max':
        s = self.z.reshape(-1, 1)
        dz = np.diagflat(s) - np.dot(s, s.T)
    elif self.activator == 'none':
        dz = 1

    self.d = np.dot((dz * dy), self.W.T) # the error of the layer
    self.W_grad = np.dot(self.X.T, dy) # The weight gradient of the layer
    self.b_grad = np.sum(dy, axis=0).reshape(1, -1) # The bias gradient of the layer

【问题讨论】:

    标签: python numpy neural-network backpropagation


    【解决方案1】:

    我相信,您的代码中有一点混乱:您写道self.z激活之前 的线性输出,但出于某种原因,使用它来计算您称为@987654322 的激活导数@。它应该使用激活值。然后,假设您计算了该值(我称它为 prime 不与我的其他 dz 混合),试试这个:

    dz = dy * prime
    dW = np.dot(dz, self.z.T)
    db = np.sum(dz, axis=1, keepdims=True)
    d = np.dot(self.W.T, dz)
    

    【讨论】:

    • 你对我的代码中的错误是对的,但你写的第二行不应该是:dW = np.dot(dz, self.X.T)?线性输出的导数就是输入
    • 为什么错了?他叫dz的是f'(z)(你叫prime
    • @Mark.F 关于dW 中的顺序:它完全取决于前向传递。我通常像这样将它向左乘:self.W * ...。向右相乘可以翻转。
    【解决方案2】:

    几个错误:

    • self.b 的大小应该是 self.b is size (10, ) 而不是 (128, 10) (因为偏差是每单位,而不是每单位对)。
    • self.W_grad 应该是 np.dot(self.X.T, (dz * dy)),而不是 np.dot(self.X.T, dy)self.b_grad 相同 - 应该是 np.sum(dz * dy, axis=0)

    至于其他

    dy := dL/dy 应该是(N, 10),因为它包含关于 y 中每个元素的损失梯度。

    dz := df(z)/d(z) 对于元素激活函数应该是 (N, 10),因为 dz[i] 包含 df(z[i])/dz[i]

    self.d := dL/dX 应该是(N, 128),因为它包含关于 X 中每个元素的损失梯度。

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 2017-05-12
      • 2020-08-04
      • 2017-03-13
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多