2017-02-02 95 views
-1

我一直在努力學習人工智能,但我有關於它的以下疑問。神經網絡的疑惑python代碼

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

# Derivative of the sigmoid function 
def sigmoid_prime(x): 
    return sigmoid(x) * (1 - sigmoid(x)) 

x = np.array([0.1, 0.3]) 
y = 0.2 
weights = np.array([-0.8, 0.5]) 

# The learning rate, eta in the weight step equation 
learnrate = 0.5 

# The neural network output 
nn_output = sigmoid(x[0]*weights[0] + x[1]*weights[1]) 
# or nn_output = sigmoid(np.dot(x, w)) 

# output error 
error = y - nn_output 

# error gradient 
error_grad = error * sigmoid_prime(np.dot(x,w)) 

# Gradient descent step 
del_w = [ learnrate * error_grad * x[0], 
      learnrate * error_grad * x[1]] 
# or del_w = learnrate * error_grad * x 

疑惑:

  • 我們爲什麼要乘以權重,只有X,而不是與Y'

    nn_output = sigmoid(x[0]*weights[0] + x[1]*weights[1]) 
    
  • 爲什麼我們在計算梯度下降時增加x的值?

    del_w = [ learnrate * error_grad * x[0], 
    learnrate * error_grad * x[1]] 
    

x[0]x[1]

+0

你可以看看這個和比較你的代碼:https://seat.massey.ac.nz/personal/srmarsland/Code/Ch3/pcn.py – ppasler

+0

你是什麼意思,增加' x'? – Amadan

回答

2

嗯。比喻救援!

想象一下,您正在瞄準大炮瞄準目標。您可以調整您的目標曲柄(w)以移動大炮(x)以擊中目標(y)。所以你試着通過應用曲柄設置(w)來打大炮(x); 你不能使用目標本身(y),,因爲它不在你的控制之下。所以你開火了,你擊中目標的某個位置(nn_output)。您會看到如何更改下一次拍攝的方位角和角度(w),以及您錯過了多少(error)。實際上,在一個神經網絡中,更精確一點,x(「輸入」)並不是真正的大炮,而是所有射擊的情況:風速,加農炮位置,加農炮模型和特徵。w (「重量」)並不僅僅是一個曲柄:它是根據所有x參數設置曲柄的知識(「如果大炮遠離目標,使角度更高」,「如果風來自北方,調整這條路」...)。

learnrate你是如何調整的。大的學習速度意味着你更快地調整(當你偏離目標時更好),但是當你需要更好的控制時,你有可能在另一個方向上超調。

可能令您困惑的一件事是xy不是座標,因此在它們的應用中不是對稱的。當您在屏幕上繪製圓圈時,請同樣對待xy。然而,在這裏,xy是至關重要不同的值:x是實際輸入(例如x[0]風速,x[1]風向,x[2]大炮時代,雷達曇花一現的x[3]方向,對雷達曇花一現x[4]距離...),y是什麼應該是輸出(y[0]目標的經度,y[1]目標的緯度) - 它是沒有意義的對待他們是一樣的。