小型批次梯度下降

时间:2018-12-07 18:42:01

标签: neural-network gradient-descent mini-batch

我从头开始研究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的派生。我计算梯度输出并将其发送到先前的完全连接层。

问题是,我想将此过程转换为小批量梯度下降。我可以计算实际批次中每个项目(图像)的损耗推导。每次批处理后,我将所有错误相加并除以批处理大小。比我需要从最后一层调用向后函数。作为输入梯度,我使用“损耗的平均导数”。我不明白在反向功能中应该使用什么Input。我应该平均所有实际批次的投入吗?

谢谢

0 个答案:

没有答案