神经网络有两个神经元

时间:2017-10-04 09:31:56

标签: python neural-network backpropagation

我试图使用python从头开始实现一个简单的神经网络。这个神经网络只有两个神经元,任务是匹配输入和输出。 (即x = 0 - >输出= 0,x = 1 - >输出= 1)

我使用偏导数并尝试使用渐变上升来最大化负损失。 (完整代码如下所示)即使经过10000次以上的迭代训练,输出也不够好。 (我想也许这种损失可能会停留在当地最大值。)任何人都可以帮我弄清楚我的实施有什么问题。

import random
import numpy as np
import math

def sigmoid(x):
  return 1 / (1 + np.exp(-x))

def error(d,z):
    return -0.5 * np.sum(np.power(d-z, 2))

# x = input
##x = np.random.choice((0,1),10000)
x = np.array([0, 1])
# y = desired output
d = np.copy(x)

# weights of two neurons
w = np.random.rand(2)

# now training using backprop
gradient = np.random.rand(2)

iterations = 800
rate = 5

k = 1
for i in xrange(1, iterations + 1):
    y = sigmoid(w[0] * x)
    z = sigmoid(w[1] * y)

    gradient[0] = np.sum(z * w[1] * y * x * (d-z) * (1-y) * (1-z))
    gradient[1] = np.sum(y * z * (d-z) * (1-z))

    w[0] += gradient[0] * rate
    w[1] += gradient[1] * rate

    print "Iteration %d, Error %f, Change %f" % (i, error(d,z), ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5)

    change = ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5

    if change < 0.00001:
        break

## now test
print "1",
x = 1
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z

print "0",
x = 0
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z

2 个答案:

答案 0 :(得分:1)

在执行反向传播之前,请参阅规范化数据。可能有帮助..!

答案 1 :(得分:1)

您的简单网络无法学习此功能。

问题是神经元缺乏偏见。如果我们调用你的两个权重W1和W2,你可以看到问题:

  • 如果输入为0,则W1没有区别,第一层的输出为0.5,第二层的输出为sigmoid( 0.5 * W2 )。要学会输出值0,那么网络必须使W2变大和消极。

  • 如果输入为1,则第一层的呼叫输出为N,必须介于0和1之间。第二层的输出为sigmoid( N * W2 )。如果W2很大且为负数,那么网络可以做的最好就是学会W1的负负值,使N接近于零。但是,由于< 0.5sigmoid(0),因此仍然会学习输出0.5的内容。

无论你选择什么权重,你都无法接近[0,1]输入的[0,1]输出。解决方案是在第二层添加至少一个偏置项,尽管对每个神经元产生偏差更为正常。