簡體   English   中英

具有兩個神經元的神經網絡

[英]Neural Network with two neurons

我試圖使用 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

在執行反向傳播之前,請參閱規范化數據。 可能有幫助..!

您的簡單網絡無法學習此功能。

問題是神經元缺乏偏差。 如果我們稱你的兩個權重為 W1 和 W2,你可以看到問題:

  • 如果輸入為0 ,則 W1 沒有區別,第一層的輸出為0.5 ,第二層的輸出將為sigmoid( 0.5 * W2 ) 要學習輸出值 0,網絡必須使 W2 大且為負。

  • 如果輸入為1 ,則調用第一層的輸出為N ,必須介於 0 和 1 之間。第二層的輸出將為sigmoid( N * W2 ) 如果W2很大且為負,那么網絡能做的最好的事情就是為W1學習一個很大的負權重,使N接近於零。 但這充其量仍將學會輸出< 0.5 ,因為sigmoid(0)0.5

無論您選擇什么權重,都無法接近 [0,1] 輸入的 [0,1] 輸出。 解決方案是在第二層中添加至少一個偏置項,盡管在每個神經元上設置偏置更為正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM