为什么在神经网络中使用Sigmoid的衍生物?

Joh*_*n V 2 c# neural-network

我创建了一个具有典型激活功能(-1或1)的简单感知器,它似乎工作正常.然后我读了关于sigmoid及其在值之间更平滑过渡的用法,但是当使用衍生物时我总是得到0.0,这会弄乱计算.sigmoid本身很好,对于较小的数字,它的小数和较大的数字再次为-1或1.那么衍生物的好处是什么?
我的意思是一个例子:

double actual (-1 or 1 when using the "old" function)
double AdjustWeight(int input1,input2, expected, actual)
{
   double error=expected-actual;   //when actual is derivative, is 0 for me, instead of -1 or 1
 ....
}
Run Code Online (Sandbox Code Playgroud)

mmo*_*eri 10

感知器网络是单层的.由于它们的非连续激活功能,您无法对它们使用反向传播算法,因此它们不能是多层的.相反,Sigmoid函数是一个可微函数,您可以在它们上使用反向传播算法.在Perception中,您想要调整您使用的权重:

W(new) = W(old) + a·(t-x)·y
Run Code Online (Sandbox Code Playgroud)

什么a是学习率,t是目标值,x是你的输入向量,y是输出.

相反,当您想使用Sigmoid函数时,您必须使用基于梯度的算法.在这些算法中,您可以根据误差导数调整权重.

W(new) = W(old) - a·(dE/dW)
Run Code Online (Sandbox Code Playgroud)

在多层网络中,您不能使用Perception算法因为它需要正确的输出而您不知道隐藏神经元的正确输出.因此,在多层网络中,您必须使用基于梯度的算法和反向传播来反向传播Error和dE/dW.

在单层神经网络中,您可以使用Perception或基于梯度的算法.你不能告诉女巫更好.Perception为您提供更好的分组和渐变为您提供更强的抗噪性.

在基于梯度的算法中,您可以使用激活函数的导数来查找dE/dW.if Z是神经元的总输入(Z = [总和i] Wi·Xi):

dE/dWi = Xi·(dE/dZ)

dE/dZ = -f'(Z)·(dE/dY)
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,因为我们使用了Sigmoid函数,对于二元Sigmoid,f'(Z)是Y(1-Y),对于双极Sigmoid,f'(Z)是0.5(1-Y)(1 + Y).

通常我们使用以下等式来表示误差(成本函数):

E = 0.5(T-Y)^2
Run Code Online (Sandbox Code Playgroud)

所以我们的方程将转换为:

dE/dY = Y-T

dE/dZ = -0.5(1+Y)(1-Y)·(Y-T)

dE/dWi = - 0.5Xi·(1+Y)(1-Y)·(Y-T)

W(new) = W(old) + 0.5a·Xi·(1+Y)(1-Y)·(Y-T)
Run Code Online (Sandbox Code Playgroud)

如果您使用以下算法更新权重,我认为您的问题将得到解决.