神經網絡入門——15反向傳播
阿新 • • 發佈:2018-04-27
html 多層 產生 https none 算法 erro 實現 節點和
反向傳播
如何讓多層神經網絡學習呢?我們已了解了使用梯度下降來更新權重,反向傳播算法則是它的一個延伸。以一個兩層神經網絡為例,可以使用鏈式法則計算輸入層-隱藏層間權重的誤差。
要使用梯度下降法更新隱藏層的權重,你需要知道各隱藏層節點的誤差對最終輸出的影響。每層的輸出是由兩層間的權重決定的,兩層之間產生的誤差,按權重縮放後在網絡中向前傳播。既然我們知道輸出誤差,便可以用權重來反向傳播到隱藏層。
例如,輸出層每個輸出節點 kk 的誤差是 \delta^o_kδko? ,隱藏節點 jj 的誤差即為輸出誤差乘以輸出層-隱藏層間的權重矩陣(以及梯度)。
然後,梯度下降與之前相同,只是用新的誤差:
其中 w_{ij} 是輸入和隱藏層之間的權重, x_i 是輸入值。這個形式可以表示任意層數。權重更新步長等於步長乘以層輸出誤差再乘以該層的輸入值。
現在,你有了輸出誤差,\delta_{output},便可以反向傳播這些誤差了。V_{in} 是該層的輸入,比如經過隱藏層激活函數的輸出值。
範例
以一個簡單的兩層神經網絡為例,計算其權重的更新過程。假設該神經網絡包含兩個輸入值,一個隱藏節點和一個輸出節點,隱藏層和輸出層的激活函數都是 sigmoid,如下圖所示。(註意:圖底部的節點為輸入值,圖頂部的 \hat yy^?為輸出值。輸入層不計入層數,所以該結構被稱為兩層神經網絡。)
反向傳播練習
接下來你將用代碼來實現一次兩個權重的反向傳播更新。我們提供了正向傳播的代碼,你來實現反向傳播的部分。
要做的事
- 計算網絡輸出誤差
- 計算輸出層誤差項
- 用反向傳播計算隱藏層誤差項
- 計算反向傳播誤差的權重更新步長
def sigmoid(x): """ Calculate sigmoid """ return 1 / (1 + np.exp(-x)) x = np.array([0.5, 0.1, -0.2]) target = 0.6 learnrate = 0.5 weights_input_hidden= np.array([[0.5, -0.6], [0.1, -0.2], [0.1, 0.7]]) weights_hidden_output = np.array([0.1, -0.3]) ## Forward pass hidden_layer_input = np.dot(x, weights_input_hidden) hidden_layer_output = sigmoid(hidden_layer_input) output_layer_in = np.dot(hidden_layer_output, weights_hidden_output) output = sigmoid(output_layer_in) ## Backwards pass ## TODO: Calculate output error error = target - output # TODO: Calculate error term for output layer output_error_term = error * output * (1 - output) # TODO: Calculate error term for hidden layer hidden_error_term = np.dot(output_error_term, weights_hidden_output) * hidden_layer_output * (1 - hidden_layer_output) # TODO: Calculate change in weights for hidden layer to output layer delta_w_h_o = learnrate * output_error_term * hidden_layer_output # TODO: Calculate change in weights for input layer to hidden layer delta_w_i_h = learnrate * hidden_error_term * x[:, None] print(‘Change in weights for hidden layer to output layer:‘) print(delta_w_h_o) print(‘Change in weights for input layer to hidden layer:‘) print(delta_w_i_h)
神經網絡入門——15反向傳播