【问题标题】:Neural Network with two neurons具有两个神经元的神经网络
【发布时间】:2017-10-04 09:31:56
【问题描述】:

我试图使用 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

【问题讨论】:

    标签: python neural-network backpropagation


    【解决方案1】:

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

    问题在于神经元缺乏偏差。如果我们称你的两个权重为 W1 和 W2,你就能看出问题所在:

    • 如果输入是0,那么W1没有区别,第一层的输出是0.5,第二层的输出是sigmoid( 0.5 * W2 )。要学习输出 0 的值,那么网络必须使 W2 大而负。

    • 如果输入是1,那么第一层的调用输出是N,它必须在0和1之间。第二层的输出是sigmoid( N * W2 )。如果W2 很大且为负数,那么网络能做的最好的事情就是为W1 学习一个较大的负权重,使N 接近于零。但这充其量仍然会学习输出&lt; 0.5,因为sigmoid(0)0.5

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

    【讨论】:

    • 谢谢!很好的解释。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。但我不明白你所说的标准化是什么意思。我只是使用 x=0 和 x=1 作为训练数据。
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2016-09-08
    • 2017-09-11
    • 1970-01-01
    • 2017-05-21
    • 2021-02-07
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多