Мини-градиентный спуск - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю в сверточной сети на C ++ с нуля.Я использовал стохастический градиентный спуск, когда вычисляю потери и производные потерь после каждого обработанного изображения.

Я вычисляю потери следующим образом (с перекрестной энтропией):

for (int i = 0; i < this->nCategories; i++)
    sum += refOutput[i] * log(output[0][0][i]) + ((1- refOutput[i])*log(1 - output[0][0][i]));

Это сумма ошибок на каждом выходном нейроне.

Я вычисляю градиент с производной потери

for (int i = 0; i < this->nCategories; i++)
{
    this->CrossEntropyDerivative[0][0][i] += -1 * (refOutput[i] * (1 / output[0][0][i]) + (1 - refOutput[i])*(1 / (1 - output[0][0][i])));
}

Когда я хочу попрактиковаться в обратном распространении, я отправляю градиент обратной функции последнего слоя - softmax

void SoftmaxLayer::Backward()
{
double sum = 0;
for (int i = 0; i < this->InputDepth; i++)
{
    sum += exp(this->Input[0][0][i]);
}

for (int i = 0; i < this->InputDepth; i++) {
    this->GradientOutput[0][0][i] = ((exp(this->Input[0][0][i])*(sum - exp(this->Input[0][0][i]))) / (sum*sum)) * this->GradientInput[0][0][i];
}
}

Эта обратная функция является производной softmax.Я вычисляю выход градиента и отправляю его на предыдущий полностью связанный слой.

Проблема в том, что я хочу преобразовать этот процесс в мини-градиентный спуск.Я могу вычислить производную потери для каждого элемента (изображения) в фактической партии.После каждой партии я суммирую все ошибки и делю их на размер партии.Чем мне нужно вызвать обратную функцию из последнего слоя.В качестве входного градиента я использую «среднее значение потерь».Я не могу понять, какой ввод я должен использовать в обратной функции.Должен ли я усреднить все входы из фактической партии?

Спасибо

...