1. 程式人生 > >神經網路演算法開發總結--網路結構開發

神經網路演算法開發總結--網路結構開發

      看了一段時間吳恩達老師的深度學習微課程,收穫較大,這階段做個總結。

演算法開發包含演算法框架開發、網路結構開發及改進、演算法應用優化及模型訓練、網路模型壓縮這幾個方向。今天主要總結下網路結構開發及改進方面相關的。

模型開發一般包含3方面工作,新網路結構提出、現有網路功能單元增加、現有網路的區域性演算法優化:

  1. 解決某一類問題的新的網路結構提出

新的演算法模型的開發一般為了解決幾個問題:

  • 提升某一類問題的精度和準確度
  • 減少計算量
  • 減少引數數量,降低計算及儲存硬體需求

比如用於圖片分類的CNN網路以,他們在上述3個方面都表現優異。

我們以經典的AlexNet來看,引入卷積層後比全連線減少的引數學習數量。

我們只對比第一層,當引入卷積層後,他的引數數量是11x11x3x96+96(96個卷積核,每個核大小是11x11),也就是第1個卷積層有34944個引數需要學習,若採用全連線的方式,即使L1的節點數量是4096個,需要學習的引數是227x227x3x4096=633M.

因此引入卷積層後減少的引數數量是驚人的。

  1. 現有網路結構功能新增及演進

現有網路結構的功能新增以及演進一般為解決以下兩類問題:

  • 引入更深的網路解決更復雜問題
  • 解決深度加深後引起的計算增長以及梯度收斂問題。

比如CNN實際上是指卷積神經網路這一大類,其中還包括多種網路模型,為了解決深度加深後出現的計算問題,結構不斷演進:

  1. LetNet-5
  2. AlexNet
  3. VGG-16(16指16個層)
  4. ResNet(為了解決層數較深時的梯度爆炸和梯度消失,引入了Residual Block,跳躍連線)

  1. Inception(同一層採用多種尺寸的卷積核,採用不同大小的卷積核意味著可以獲取不同尺度特徵的融合)

  1. 現有網路區域性演算法優化
  • 引數初始化

深度神經網路時,由於ReLU這些非線性函式的疊加,weight initialization對模型收斂速度和模型質量有重要影響。主要原因是:

深度很深後,後面幾層的每一層輸出結果分佈在0附近,根據鏈式法則,輸出值是計算gradient中的乘法因子,直接導致gradient很小,使得引數難以被更新。

因此不少研究人員提出一些方法,從引數初始化改善這個問題,比如:

Xavier Glorot et al.在2010年提出Xavier initialization。

Kaiming He et al.在2015年提出He initialization。

Sergey Ioffe et al.在2015年提出Batch Normalization。

這些初始化方法相比隨機初始化極大提升了收斂速度。

從程式設計實踐看,似乎He initialization效果最好。

  • 反向傳播優化演算法

好的反向傳播演算法可以極大提升收斂速度,特別在使用mini-batch的時候。目前的深度學習都是針對大資料,因此每次迭代不會使用全集,而是把資料隨機分成很多mini-batch,而mini-batch間的資料分佈是存在差異性,因此採用梯度下降更新引數時需要進行平滑操作。梯度下降演算法的優化由此而來。

  1. Momentum演算法

  

  1. RMSprop(Root Mean Square Prop(均方根傳播))

3)ADAM演算法

          而ADAM演算法結合了Momentum和RMSprop,是目前最有效的優化演算法之一。