這兩年神經網絡各種火。但對很多人而言,只是聽著覺得各種高大上,究其本質,還是聽不懂。下面我們花三十分鐘把這個事情講清楚。
神經網絡算法是最早來源於某神經生理學家和某數學家聯合發表的壹篇論文,他們對人類神經運行規律的提出了壹個猜想,並嘗試給出壹個建模來模擬人類神經元的運行規律。
神經網絡壹開始由於求解問題的不穩定,以及範圍有限被拋棄。後面又在各個大神的努力下,對遇到的問題壹個個解決,加上因為遊戲帶來的計算能力的提升獲得了壹個爆發式的增長。
下面我們講講神經網絡是啥以及遇到的問題和探索出來的解決方案,最終我們給出壹個深度神經網絡的默認的最優配置項。
建立M個隱藏層,按順序建立輸入層跟隱藏層的聯結,最後建立隱藏層跟輸出層的聯結。為每個隱藏層的每個節點選擇激活函數。求解每個聯結的權重和每個節點自帶的bias值。參見下圖。
所謂激活函數就是對各個路徑的輸入求和之後進壹步增強的函數 。
典型的有如下幾個:
下面這個圖裏面,是已知的各個聯結線的權值,求y1, y2
這個練習可以測試對神經網絡的理解。
所謂神經網絡問題的訓練本質,就是已知 y1,y2....yn, 已知x1, x2....xm,求解每個連接的權值和每個神經元上的偏差值。對單層的激活函數為RELU的神經網絡而言就是, y = max(sum(w * x)+b, 0),已知y和x,求解w和b。
對於以上求解w和b的值,科學家們發現可以通過反向傳播和梯度下降相結合來求解。就是壹開始用隨機數初始化我們每個聯結的權值,然後通過神經網絡計算出來的y值跟真實的y值做比對。如果這個值相差比較大,則修改當前層的聯結的權重。當發現這個值相差不大時,則修改更低壹層的權重。這個步驟壹直重復,逐步傳遞到第壹層的權值 。
三大問題:
針對這三個問題,大拿們開始了壹場探索之旅。
神經網絡的求解是通過反向傳播的技術來解決的。通過梯度下降法。問題是,反向傳播從輸出層開始壹步壹步傳到Layer 1時,越到低層,聯結的權值變化越小,直到沒變化。這種叫梯度消失。還有壹些呢?則是越到第壹層,變化越來越大。這種叫梯度爆炸。常見於RNN。
解決方案探索如下:
目前來說,通常用1+2 多於 3 多於 4。就是現在壹般使用He initialization跟ReLU的演進版本作為作為激活函數來解決梯度消失和爆炸的問題,其次才使用Batch Normalization,最後使用Gradient Clipping。
通常來說,我們很難獲得足夠的標記好的訓練數據。常用解決方案如下:
對於大規模數據的訓練,很多時候速度很慢。除了解決梯度消失或爆炸的問題之外,還有使用AdamOptimizer替代GradientDescentOptimizer會大大加快收斂速度 。
我們後面會教大家用tensorflow構造出壹個神經網絡並求解。