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