1. 程式人生 > >深度學習關鍵問題

深度學習關鍵問題

一、深度學習開發為啥需要pythonn語言和C++

    模型訓練python➕gpu就夠了,真正需要C++的地方是部署,直接用gpu伺服器部署實在太昂貴,而CPU伺服器則廉價的多
很多深度學習模型都很重,計算量非常大,python實在太慢,C++則必不可少。C++ OpenMP MKL MPI瞭解一下?現在的算力還是非常不足, 我們的深度學習的語言模型效果已經比N-gram的好了非常多, 但部署不了 ,就是速度還是不行。

二、調參方案

1、引數範數懲罰,即L1、L2正則化 (L2比L1好,更容易求解)

2、資料增強,即將原資料給裁剪,或加入噪聲,或翻轉影象,使用更多的資料來訓練網路

3、提前終止,可以有效的減緩過擬合現象

4、RNN中用到的引數共享,在其整條時間鏈上可以進行引數的共享,這樣才使得其能夠被訓練.

5、bagging 和其他整合方法  
         其實bagging的方法是可以起到正則化的作用,因為正則化就是要減少泛化誤差,而bagging的方法可以組合多個模型起到減      少泛化誤差的作用. 
    在深度學習中同樣可以使用此方法,但是其會增加計算和儲存的成本

 6、dropout
 7、輔助分類節點  
        Google Inception V1中,採用了輔助分類節點的策略,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分      類結果中,這樣相當於做了模型的融合,同時給網路增加了反向傳播的梯度訊號,提供了額外的正則化的思想.

8. Batch Normalization
       在Google Inception V2中所採用,是一種非常有用的正則化方法,可以讓大型的卷積網路訓練速度加快很多倍,同時收斂後分      類的準確率也可以大幅度的提高. 
    BN在訓練某層時,會對每一個mini-batch資料進行標準化(normalization)處理,使輸出規範到N(0,1)的正太分佈,減少了                 Internal convariate shift(內部神經元分佈的改變),傳統的深度神經網路在訓練是,每一層的輸入的分佈都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN後,可以有效的解決這個問題,學習速率可以增大很多倍。

9、可變的學習率

    import tensorflow as tf

    global_step = tf.Variable(0, trainable=False)

    initial_learning_rate = 0.1   #初始學習率
    learning_rate = tf.train.exponential_decay(initial_learning_rate,
                                           global_step=global_step,
                                           decay_steps=10,decay_rate=0.9)

10、初始化反捲積層的引數W時用雙線性插值

11、U-Net

12、RefineNet   編碼用的ResNet,主要在於解碼部分RefineNet。

13、DeconvNet/SegNet  卷積部分與FCN一致,主要針對上取樣部分進行改進。DeconvNet/SegNet這兩個網路區別不          大,細節上的改動。

14、使用momentum優化函式

當然,這些方法不一定都有用,我也只是暫時蒐集了這麼多,只能慢慢的來花時間來驗證到底有沒有用。後面的那幾個網路我也只是想參考一下結構,看能不能借鑑到FCN裡。

   談到BN:由於網路結構越深,則後面網路層的輸入發生的偏移越大,則對於網路的收斂越不利,所以BN 的思想就是對網路中的每一層都做規範化,也就是均值為0方差為1的標準正態分佈,這樣可以使得輸入值可以落在非線性函式對於輸入比較敏感的地方,也就是說讓梯度變大,避免梯度消失的問題。