《視覺機器學習20講》中簡單講解了一下bp算法的基本原理,公式推導看完后不是特別能理解,在網上找到一個不錯的例子:BP算法淺談(Error Back-propagation),對bp算法的理解非常有幫助。於是為了加強記憶,將文中的示例代碼用Python重新寫了一遍。

使用梯度下降算法不斷迭代更新參數w,使得損失函數(例子中選取平方和誤差)最小。參數更新值Δw用鏈式求導法則求出。
1 # -*- coding: utf-8 -*- 2 import numpy as np 3 def sigmoid(x):#激活函數 4 return 1/(1+np.exp(-x)) 5 input = np.array([[0.35], [0.9]]) #輸入數據 6 w1 = np.array([[0.1, 0.8], [0.4, 0.6]])#第一層權重參數 7 w2 = np.array([0.3, 0.9])#第二層權重參數 8 9 real = np.array([[0.5]])#真實值 10 for s in range(0,100,1): 11 pq = sigmoid(np.dot(w1,input))#第一層輸出 12 output = sigmoid(np.dot(w2,pq))#第二層輸出,也即是最終輸出 13 e = output-real #誤差 14 if np.square(e)/2<0.01: 15 break 16 else: 17 #否則,按照梯度下降計算權重參數 18 #其中,應用鏈式法則計算權重參數的更新量 19 w2 = w2 - e*output*(1-output)*pq.T 20 w1 = w1 - e*output*(1-output)*w2*pq.T*(1-pq.T)*input 21 print w1,'\n',w2 #輸出最終結果 22 print output
最終結果:
w1: [[ 0.09606536 0.78371966] [ 0.38988235 0.55813627]] w2: [[ 0.12472196 0.72965595]] output: [[ 0.63690405]]
###
為什么沿着梯度的反方向函數f(x,y)在點P0(x0,y0)處下降得最快?

###
梯度下降是求解機器學習算法模型參數的一種常用方法

