为什么在神经网络中使用Sigmoid的导数

本文关键字:Sigmoid 神经网络 为什么 | 更新日期: 2023-09-27 18:07:31

我用典型的激活函数(-1或1(创建了一个简单的感知器,它似乎工作得很好。然后我读到了sigmoid及其在值之间更平滑过渡的使用,但当使用导数时,我总是得到0.0,这会打乱计算。S形本身是好的,对于较小的数字,它是十进制,对于较大的数字,又是-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
 ....
}

为什么在神经网络中使用Sigmoid的导数

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

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

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

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

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

在多层网络中,你不能使用Perception算法,因为它需要正确的输出,而你不知道隐藏神经元的正确输出。因此,在多层网络中,必须使用基于梯度的算法和反向传播来反向传播Error和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是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)

若你们使用下面的算法来更新权重,我想你们的问题会得到解决。

以下是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素数有一条很好的曲线,可以转换0到0.5之间的值。