Как реализовать пакетное обратное распространение

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

Насколько я понимаю, вы суммируете изменения, которые необходимо внести для каждого веса и смещения, и применяете это изменение в конце серии примеров тренировок. Я практически ничего не изменил из своего исходного стохастического кода 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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector