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

时间:2013-04-04 06:27:39

标签: 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
 ....
}

2 个答案:

答案 0 :(得分:10)

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

W(new) = W(old) + a·(t-x)·y

a为学习率时,t为目标值,x为您的输入向量,y为输出。

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

W(new) = W(old) - a·(dE/dW)

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

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

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

dE/dWi = Xi·(dE/dZ)

dE/dZ = -f'(Z)·(dE/dY)

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

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

E = 0.5(T-Y)^2

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

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)

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

答案 1 :(得分:0)

以下是Sigmoid功能的区别。 " np.exp"是相同的; 数字e,一个以自然对数为基础的数学常数:自然对数等于1的唯一数字。它大约等于2.71828 。 (维基百科)

# This is how mathematical the derivative of sigmoid is computed.
# Variables are only used as example for differentiation.
import numpy as np

x = 0.32

sigmoid = 1 / 1 + np.exp(-x)
differentiate = np.exp(-x) / (1+np.exp(-x)**2
differentiate_1 = np.exp(-x) - 1 / (1+np.exp(-x)**2
differentiate_2 = (1+np.exp(-x) / (1+np.exp(-x)**2) - (1/1+np.exp(-x))**2
differintiate_3 = sigmoid - sigmoid**2
sigmoid_prime = sigmoid * (1- sigmoid)

传递函数或sigmoid函数将值转换为概率 从0到1.Sigmoid prime有一条漂亮的曲线,可以转换0到0.5范围内的值。