【问题标题】:Breakdown of Stochastic Gradient Descent Code in PythonPython中随机梯度下降代码的分解
【发布时间】:2019-04-15 19:07:09
【问题描述】:

在 Michael Nielson 的人工神经网络在线书籍http://neuralnetworksanddeeplearning.com 中,他提供了以下代码:

    def update_mini_batch(self, mini_batch, eta):
    """Update the network's weights and biases by applying
    gradient descent using backpropagation to a single mini batch.
    The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``
    is the learning rate."""
    nabla_b = [np.zeros(b.shape) for b in self.biases]
    nabla_w = [np.zeros(w.shape) for w in self.weights]
    for x, y in mini_batch:
        delta_nabla_b, delta_nabla_w = self.backprop(x, y)
        nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
        nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
    self.weights = [w-(eta/len(mini_batch))*nw
                    for w, nw in zip(self.weights, nabla_w)]
    self.biases = [b-(eta/len(mini_batch))*nb
                   for b, nb in zip(self.biases, nabla_b)]

我无法理解带有 nabla_b 和 nabla_w 的部分。

如果delta_nabla_bdelta_nabla_w 是成本函数的梯度,那么我们为什么要在这里将它们添加到nabla_b 和nabla_w 的现有值中?

nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]

我们不应该直接定义吗

nabla_b, nabla_w = self.backprop(x, y)

并更新权重和偏差矩阵?

我们制作nabla_bnabla_w 是不是因为我们想要对梯度进行平均并且它们是梯度总和的矩阵?

【问题讨论】:

    标签: machine-learning neural-network deep-learning backpropagation gradient-descent


    【解决方案1】:

    我们制作 nabla_b 和 nabla_w 是因为我们想要对梯度进行平均,并且它们是梯度和的矩阵吗?

    是的,你的想法是对的。基本上这段代码直接对应教程中第三步梯度下降中的公式。

    公式本身有点误导,直观上更容易认为权重和偏差是独立为小批量中的每个实例更新的。但是,如果您还记得总和的梯度是梯度的总和,那么很明显它实际上是相同的。在这两种情况下,所有梯度都以相同的方式参与参数更新。

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2013-10-13
      • 2021-12-18
      • 2018-12-10
      • 2021-02-20
      • 2019-06-19
      相关资源
      最近更新 更多