關於在51CTO上的深度學習入門課程視頻(9)中的code進行解釋與總結:
(1)單層神經網絡:
#coding:cp936 #建立單層神經網絡,訓練四個樣本, import numpy as np def nonlin(x,deriv=False): #deriv為False計算前向傳播值,為True時計算反向偏導 if deriv == True: return x*(1-x) return 1/(1+np.exp(-x)) X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]]) #輸入樣本,四個樣本,每個樣本三個特征向量 y = np.array([[0,0,1,1]]).T #期望輸出 np.random.seed(1)#對這句作用暫時不太了解? w = 2*np.random.random((3,1))-1 #使用高斯變量初始化權值,E(x)=0,D(x)=1,w的值在[-1,+1]之間; for iter in xrange(10000): #迭代一萬次 l0 = X #輸入給l0 l1 = nonlin(np.dot(l0,w)) #計算經過第一層后的得分函數 l1_error = y-l1 #計算Loss值,相當於損失函數的偏導 l1_grad = l1_error*nonlin(l1,True) #Loss值帶入梯度公式計算梯度 w += np.dot(l0.T,l1_grad) #最終的權重梯度 print (l1)
(2)雙層神經網絡:
#coding:cp936 #兩層神經網絡 import numpy as np def nonlin(x,deriv=False): #deriv為False時計算前向傳播,為True計算反向偏導,激活函數為sigmoid函數 if deriv == True: return x*(1-x) return 1/(1+np.exp(-x)) X=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]]) #輸入樣本 y = np.array([[0,0,1,1]]).T #期望輸出 w0 = 2*np.random.random((3,4))-1 #第一層權重 w1 = 2*np.random.random((4,1))-1 #第二層權重 for iter in xrange(10000): #迭代一萬次 l0 = X l1 = nonlin(np.dot(l0,w0)) #計算第一層后的得分 l2 = nonlin(np.dot(l1,w1)) #經過第二層后的得分 l2_error = y-l2 #計算Loss值,損失函數的偏導 l2_grad = l2_error*nonlin(l2,deriv=True)#第二層梯度,l2_error越大,第二層的梯度也越大 l1_error = l2_grad.dot(w1.T)#l1_error由l2_error迭代進來 l1_grad = l1_error*nonlin(l1,deriv=True) w1+=l1.T.dot(l2_grad) w0+=l0.T.dot(l1_grad) print(l2)
summing up:這里單層網絡和雙層神經網絡的代碼中,有幾個變量要注意一下;第一個是誤差變量,單層網絡中是l1_error,其值為y-l1(由於這里的損失函數是二次損失函數,C關於l1的偏導即是y-l1),雙層網絡中是l1_error和l2_error,分別對應第一層和第二層,而l1_error由l2_error反向傳播得到;第二個是梯度變量,單層網絡中為l1_grad,雙層網絡中是l1_grad和l2_grad,注意每層的梯度變量的值都由后面反向傳播過來的誤差變量和該層的激活函數的導數相乘得到(這里沒有將該層的權值放在求梯度的式子中,是為了反向傳播中迭代形式的統一性);