人工神經網絡的產生必定程度上受生物學的啓發,由於生物的學習系統是由相互鏈接的神經元相互鏈接的神經元組成的複雜網絡。而人工神經網絡跟這個差很少,它是一系列簡單的單元相互密集鏈接而成的。其中每一個單元有必定數量的輸入(多是其餘單元的輸出),併產生單一的實數值輸出(可能成爲其餘單元的輸入)。css
常見的人工神經網絡結果以下圖:html
(1) 網絡由三部分組成,輸入層、隱藏層和輸出層,每每隱藏層只有1層或2層;git
(2) 每層由若干個單元組成,全部單元分層互連造成一個無環的前饋網絡;github
(3) 下一層的某個單元的輸入由上一層的全部單元的輸出組成,每一個輸入的權重由相連的邊的權值決定。算法
不一樣類型的單元對輸入的處理方式不一樣,比較經常使用是sigmoid單元。sigmoid單元首先對全部輸入進行線性組合,而後將線性組合的結果經過sigmoid函數(F(x) = 1/(1+power(e,-x)))映射爲0跟1之間的某個值做爲輸出(sigmoid函數有一個比較有用的特徵就是F’(x) = F(x)*( 1-F(x)))。這樣,sigmoid單元的輸出是輸入的非線性函數,而且輸出是輸入的可微函數。網絡
人工神經網絡的學習訓練就是爲每一條邊選取一個合適的權值,使網絡輸出層的輸出和目標值之間的偏差平方和最小化。而像反向傳播(BackPropagation)這樣的算法,就是使用梯度降低來調節各條表的權重,來最佳擬合輸入-輸出組成的訓練數據。app
實驗:人臉朝向識別函數
實驗數據是具備不一樣朝向的600多張人臉圖片,每一個圖片的像素是30*32。分爲訓練集、驗證集和測試集,大體圖像張數比爲6:2:2。訓練集用來訓練人工神經網絡,驗證集用來選取在驗證集上具備最好性能的網絡,而測試集對選中的網絡進行最後的評估。性能
輸入:每一個像素對應一個網絡輸入,而且把範圍是0-255的亮度值按比例縮放到0-1之間。學習
輸出:使用4個不一樣的輸出單元,每一個單元對應一個臉的朝向,取具備最高值的輸出做爲人臉朝向的預測值。另外,使用0.1和0.9,而不是0和1,例如(0.9,0.1,0.1,01.)表示臉朝向正前方。
網絡結構:使用一個隱藏層,隱藏層的單元個數爲3個。
其餘參數:學習速率設定爲0.3,輸入單元的權值被設定爲0.0,輸出單元的權值被初始化爲一個較小的隨機值。
Python版反向傳播算法(隨機梯度降低版本)
1.把輸入沿網絡前向傳播
def feedForward(self): for j in xrange(1,self.hidNum): sum = 0.0 for i in xrange(self.inNum): sum += self.inOutput[i]*self.wIn2Hid[i][j] self.hidOutput[j] = self.sigmoid(sum) for k in xrange(self.outNum): sum = 0.0 for j in xrange(self.hidNum): sum += self.hidOutput[j] * self.wHid2Out[j][k] self.outOutput[k] = self.sigmoid(sum)
2.把偏差沿網絡反向傳播
def backPropagate(self,N=0.3): # calculate errors for output for k in xrange(self.outNum): error = self.targets[k]-self.outOutput[k] self.outOutputError[k] = self.outOutput[k]*(1-self.outOutput[k])*error # calculate errors for hidden layer for j in xrange(self.hidNum): error = 0.0 for k in xrange(self.outNum): error += self.outOutputError[k]*self.wHid2Out[j][k] self.hidOutputError[j] = self.hidOutput[j]*(1-self.hidOutput[j])*error # update hid-output weights for j in xrange(self.hidNum): for k in xrange(self.outNum): change = N*self.outOutputError[k]*self.hidOutput[j] self.wHid2Out[j][k] += change # update input-hid weights for i in xrange(self.inNum): for j in xrange(1,self.hidNum): change = N*self.hidOutputError[j]*self.inOutput[i] self.wIn2Hid[i][j] += change
實驗結果:經過調整輸入層、隱藏層中各個單元的權重,網絡在驗證集上最高的預測準確率是0.892,對應在測試集上的準確率爲0.844。