卷积神经网络中的损失函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络中的损失函数相关的知识,希望对你有一定的参考价值。

我正在实现一个卷积神经网络,我似乎无法掌握损失函数如何影响实现。

到目前为止,我有基本层,如卷积,池等。我也有密集(完全连接的层,没有隐藏层),没有激活功能,因为我实现了激活功能作为一个单独的层,放在完全连接后层,但也可以放在卷积层之后。我在一些实现中已经看到过。

激活层在前向传播期间简单地计算激活函数(例如,sigmoid,relu,softmax等),并且在向后传播期间,进入的梯度仅乘以输出的导数并传递。

sigmoid激活层的示例:

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

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

由于我使用均方误差,最后我简单地计算每个输出和预期输出(outputVector [i] - expectedVector [i])之间的差异,并将其作为梯度传递给反向传播。它首先通过激活层进行修改,并将其传递给完全连接。因此它作为普通神经网络工作,没有隐藏层,直接应用激活功能。

现在我想实现更多的损失函数 - 交叉熵是准确的。我已经看了一些简单神经网络的代码,没有隐藏层,它们具有直接计算的激活函数,它们将梯度传递为

(outputValue - expectedValue)

在Mean Squared Error中,他们将其传递为

(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)。

你现在想要的是做交叉熵而不是均方误差。这样做完全没问题,但会采取不同的形式。而不是MSE(F(w)),你将拥有CE(F(w)),其中CE = cross_entropy。梯度将类似地不同,其中它将是CE'(F(w))* F'(w)而不是MSE'(F(w))* F'(w)。 F'(w)是相同的,但现在你有交叉熵的导数乘以它。

因此,无论您的激活函数是什么,您都需要将F'(w)乘以激活函数的导数,以获得完整的梯度。希望能够清除它。我不能在细节上更有帮助,因为我没有看到你的代码,因此,不知道你是如何实现任何东西的。

以上是关于卷积神经网络中的损失函数的主要内容,如果未能解决你的问题,请参考以下文章

为什么卷积神经网络不是全连接,卷积,池化,激活,损失函数

为什么卷积神经网络不是全连接,卷积,池化,激活,损失函数

为什么卷积神经网络不是全连接,卷积,池化,激活,损失函数

CS231n 卷积神经网络与计算机视觉 6 数据预处理 权重初始化 规则化 损失函数 等常用方法总结

深度学习课程笔记卷积神经网络

涉及卷积的张量流中的自定义损失函数