###神經網絡基礎概念
人工神經網絡又叫神經網絡,是借鑒了生物神經網絡的工作原理形成的一種數學模型。神經網絡是機器學習諸多算法中的一種,它既可以用來做有監督的任務,如分類、視覺識別等,也可以用作無監督的任務。同時它能夠處理復雜的非線性問題,它的基本結構是神經元,如下圖所示:

其中,x1、x2、x3代表輸入,中間部分為神經元,而最后的hw,b(x)是神經元的輸出。整個過程可以理解為輸入——>處理——>輸出。
由多個神經元組成的就是神經網絡

如圖所示:
這是一個4層結構的神經網絡,layer1為輸入層,layer4為輸出層,layer2,layer3為隱藏層,即神經網絡的結構由輸入層,隱藏層,輸出層構成。其中除了輸入層以外,每一層的輸入都是上一層的輸出。
###神經網絡數學原理
單個神經元的數學構成很簡單,包含兩個部分權重和偏置,每個輸入值進入神經元都會進行類似y=wx+b其中w為權重,b為偏置,x為輸入值,y為單個輸入值的結果,經過激活函數激活后輸出結果為f(wx+b),其中f為激活函數。存在多個輸入值使用激活函數的情況下輸出值為f(w1x1+w2x2+...+wnxn+b)。
激活函數的作用
激活函數也成為映射函數,可以對計算結果進行非線性轉換,從而提升神經網絡的表達能力,從而能夠處理線性不可分的問題,比如語音識別和圖像識別等。常見的激活函數有sigmoid,tanh,relu...等。
####激活函數之sigmoid
sigmoid的表達式為:

其圖形為一個s型曲線,會將所有的輸入結果映射到0-1之間,圖形樣式如下:

sigmoid常備用於處理二分類問題,比較典型的像邏輯回歸就是使用sigmoid處理二分類問題。
####激活函數之tanh
tanh的表達式為:

tanh函數的圖形和sigmoid類似,不同的是它是將輸入值映射到-1~1之間。它的圖形如下圖所示:

由於tanh函數的壓縮范圍在-1~1之間,因而它的輸出基本是0均值,即下一層的輸入為0均值,這使得tanh函數的收斂速度要快於sigmoid函數。
假設后層神經元的輸入都為正(e.g. x>0 elementwise in f=wTx+b),那么對w求局部梯度則都為正,這樣在反向傳播的過程中w要么都往正方向更新,要么都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。這是sigmoid函數容易出現的問題,而tanh函數的映射特點很好的避開了這個問題。因而在實際使用中,人們會更經常使用tanh函數作為激活函數。
sigmoid函數和tanh函數的共同問題是在求導過程中可能出現梯度消失的現象。
####激活函數之ReLU
ReLU的表達式為:

根據表達式描繪它的圖形也很簡單,如下圖所示:

它相比於sigmoid和tanh有更快的收斂速度,同時不會出現梯度消失的問題。另外從函數表達中可以知道,輸入小於0時,輸出會變成0,這就使得神經網絡變得稀疏,並減少參數的相互依存關系,緩解過擬合問題,而且由於函數的本身特性,不涉及指數等操作,實現起來也更加容易。
但它也有缺點,ReLU單元脆弱且可能會在訓練中死去。例如,大的梯度流經過ReLU單元時可能導致神經不會在以后任何數據節點再被激活。當這發生時,經過此單元的梯度將永遠為零。ReLU單元可能不可逆地在訓練中的數據流中關閉。例如,比可能會發現當學習速率過快時你40%的網絡都“掛了”(神經元在此后的整個訓練中都不激活)。當學習率設定恰當時,這種事情會更少出現。
###反向傳播
反向傳播的目的在於通過不斷的回傳誤差,對權重進行更新,重新計算輸出,最終從已有的輸入值經過神經網絡得到我們需要的結果。要理解反向傳播,我們需要先理解前向傳播的過程。
假設一個三層神經網絡,在隨機分配獲得權重的情況下,數據從輸入層——>隱藏層——>輸出層過程可以稱為前向傳播,當然在這個過程中會涉及很多數學計算,最終會在輸出層有一個輸出值,而輸出值和我們需要的目標值或實際值之間一般會存在差距,即我們通常說的誤差。
接下來,根據誤差進行反向更新權值的過程就稱之為誤差的反向傳播,要對權值進行更新,我們需要評估權值對誤差產生的影響大小,這個通過計算誤差對權值的偏導值進行估計,過程中有一個重要的概念是鏈式法則。

其中鏈式求導表現為:

即誤差對權值的偏導值可以看成每一個反向計算步驟的偏導值的乘積。
在得到誤差對權值的偏導值后,我們就可以對權值進行更新,更新公式為:

其中n是學習速率。
按照相同的步驟對所有的權重進行更新,然后再次進行前向傳播,獲得新誤差,再反向傳播更新權值,不斷的重復這個過程,直到誤差達到我們設定的閾值范圍結束迭代。
參考資料:
一文弄懂神經網絡中的反向傳播法——BackPropagation
https://www.cnblogs.com/charlotte77/p/5629865.html
