我创建了一个具有典型激活功能(-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
....
}
答案 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范围内的值。