在迈克尔·尼尔森(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
是因为我们想对梯度求平均值,它们是梯度总和的矩阵?
答案 0 :(得分:0)
是否要创建nabla_b和nabla_w是因为我们要对梯度进行平均,它们是梯度总和的矩阵?
是的,您的想法是正确的。基本上,此代码直接对应于本教程第3步 Gradient descent 中的公式。
公式本身有点误导,并且直观上更容易认为小批量中的每个实例的权重和偏差都独立地 更新。但是,如果您还记得总和的渐变是渐变的总和,那么很明显它实际上是相同的。在这两种情况下,所有梯度都以相同的方式影响参数更新。