Разбивка стохастического кода градиентного спуска в Python - PullRequest
0 голосов
/ 13 ноября 2018

В онлайновой книге Майкла Нильсона об искусственных нейронных сетях 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, потому что мы хотим сделать среднее по градиентам, а они являются матрицами сумм градиентов?

1 Ответ

0 голосов
/ 14 декабря 2018

Делаем ли мы nabla_b и nabla_w, потому что хотим получить среднее значение по градиентам, а они являются матрицами сумм градиентов?

Да, ваше мышление верно.По сути, этот код напрямую соответствует формуле в шаге 3 Градиентный спуск в учебном пособии.

Сама формула немного вводит в заблуждение, и интуитивно легче думать, что веса и отклоненияобновляются независимо для каждого экземпляра в мини-партии.Но если вы вспомните, что градиент суммы является суммой градиентов, становится ясно, что на самом деле это то же самое.В обоих случаях все градиенты вносят одинаковый вклад в обновление параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...