Как реализовать пакетное обратное распространение - PullRequest
0 голосов
/ 31 декабря 2018

Я успешно реализовал стохастическое обратное распространение и пытаюсь повысить его точность.Я заметил, что пакетное обратное распространение, кажется, более популярно, я хотел попробовать и посмотреть, улучшит ли это точность сети, однако я не могу понять, как это реализовать.Под «пакетным обратным распространением» я подразумеваю обратное распространение, где веса и смещения обновляются только после завершения мини-пакета или эпохи, а не обновляются после каждого ввода.

Насколько я понимаю, вы суммируете изменения, которые необходимо внести для каждого веса и смещения, и применяете это изменение в конце серии примеров тренировок.Я практически ничего не изменил из своего исходного стохастического кода backprop, кроме того, что вместо того, чтобы применить изменение непосредственно к весам и смещениям, я применяю изменение к буферу, который затем используется для обновления весов и смещений позже.Или я должен суммировать стоимость каждого учебного примера, а затем по окончании пакетного прогона обратного распространения?Если это так, то что мне использовать для промежуточных результатов (выходных векторов каждого слоя), если стоимость представляет собой комбинацию стоимости для пакета входных данных?

//Called after each calculation on a training example
void ML::NeuralNetwork::learnBatch(const Matrix & calc, const Matrix & real) const {
  ML::Matrix cost = 2 * (calc - real);
  for (int i = weights.size() - 1; i >= 0; --i) {
      //Each element in results is the column vector output for each layer
      //ElementMultiply() returns Hadamard Product
      ML::Matrix dCdB = cost.elementMultiply(ML::sigDerivative(weights[i] * results[i] + biases[i]));
      ML::Matrix dCdW = dCdB * results[i].transpose();
      cost = weights[i].transpose() * dCdB;

      sumWeights[i] += learningRate * dCdW; //Scalar multiplication
      sumBiases[i] += learningRate * dCdB;
      /* Original Code:
       * weights[i] -= learningRate * dCdW;
       * biases[i] -= learningRate * dCdB;
      */ 
  }

}
//Called at the end of a batch
void ML::NeuralNetwork::update() {

  for (int i = 0; i < weights.size(); ++i) {
      weights[i] -= sumWeights[i];
      biases[i] -= sumBiases[i];

      //Sets all elements in the matrix to 0
      sumWeights[i].zero();
      sumBiases[i].zero();

  }
}

Помимо добавленияupdate() функция, которую я действительно не сильно изменил по сравнению со своим рабочим стохастическим кодом backprop.С моим текущим пакетным кодом backprop нейронная сеть никогда не учится и постоянно получает 0 правильных выходных данных даже после итерации более 200 пакетов.Есть что-то, чего я не понимаю?

Любая помощь будет принята с благодарностью.

1 Ответ

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

В периодическом обратном распространении вы суммируете вклад обратного распространения каждого образца.

Другими словами, результирующий градиент, таким образом, является суммой градиента каждого образца.

...