卷积神经网络中的损失功能



我正在实施卷积神经网络,我似乎无法掌握损失功能如何影响实现。

到目前为止,我的基本图层如卷积,合并等。完全连接的层,但也可以在卷积层之后放置。我已经在某些实现中看到了。

激活层简单地计算一个激活函数(例如sigmoid,relu,softmax等(在正向传播过程中和向后传播期间,进出的梯度仅乘以输出的导数并传递。

> > 。

Sigmoid激活层的示例:

Forward propagation = 1.0 / (1.0 + exp(-input)
Backward propagation = outputValue * (1 - outputValue) * inputGradient

我认为到目前为止是正确的。如果我错了,请纠正我。

由于我使用的是平方误差,因此在末尾,我只需计算每个输出和预期输出之间的差异(输出向量[i] - 预期向量[i](,然后将其传递给反向传播作为梯度。首先通过激活层修改并将其传递到完全连接的激活层。因此,它是正常的神经网络,没有直接应用激活功能的隐藏层。

现在,我想实现更多的损失功能 - 确切的跨熵。我已经查看了一些简单神经网络的代码,没有直接计算激活功能的隐藏层,它们将梯度通过

将其传递给
(outputValue - expectedValue)

在平均方向错误中,他们以

的方式将其传递
(outputValue - expectedValue) * derivativeOfActivationFuction(outputValue )

由于我将激活层分开(正如我在其他实现中看到的那样(,因此我无法弄清楚什么是从外部传递为梯度,因为它乘以激活函数的衍生物。我当然可以使用反向操作或将标志传递到最后一个激活层,该层说不应该发生乘法。但这似乎并不普遍或正确。

有人可以指向正确的方向吗?我将激活函数作为单独层实现是错误的吗?还是我缺少一些东西,我只需要更改计算传递给最后一层的梯度的方式?

让我直接做到这一点。您正在写卷积层和从头开始的梯度传播?勇敢!我赞扬您不必要的挣扎。

话虽如此,梯度实际上只是链条规则的长期版本。因此,对于您的均方错误示例,我们可以将输出的MSE功能写为MSE(f(w((,其中F是导致该点的网络,W是您的"权重"(让我们假设您只有一个使事情变得更容易(。

我们想要的是MSE相对于W的衍生物,因此D/DW(MSE(f(w((。通过链条规则,这是MSE'(f(w(( * f'(w(。mse的定义是((f(w( - y(^2(/2。相对于W是(f(w( - y(的派生词:( f(w( - y( * f'(w(。

您现在想要的是执行横熵,而不是均方误差。这完全可以做到,但是会采取不同的形式。您将拥有CE(f(w((,而不是MSE(f(w((,其中ce = cross_entropy。梯度将是类似的不同,其中它将为ce'(f(w(( * f'(w(,而不是mse'(f(w(( * f'(w(。f'(w(是相同的,但是现在您拥有跨熵的派生。

因此,无论您的激活功能是什么,您都需要将F'(w(乘以激活函数的导数,以便获得完整的梯度。希望能清除它。我在细节方面无法提供更多的帮助,因为我看不到您的代码,因此,不知道您实际上是如何实施的。

最新更新