在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_b
和delta_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_b
和nabla_w
是因为我们想要对梯度进行平均,并且它们是梯度总和的矩阵吗?
回答:
我们创建nabla_b和nabla_w是因为我们想要对梯度进行平均,并且它们是梯度总和的矩阵吗?
是的,你的想法是对的。基本上,这段代码直接对应于教程中步骤3梯度下降中的公式。
公式本身有点误导,凭直觉更容易认为在一个mini-batch中的每个实例的权重和偏置是独立更新的。但是如果你回想起来,总和的梯度是梯度的总和,那么就会明白其实是相同的。在两种情况下,所有的梯度以相同的方式贡献于参数的更新。