深度學習關鍵問題
一、深度學習開發為啥需要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的標準正態分佈,這樣可以使得輸入值可以落在非線性函式對於輸入比較敏感的地方,也就是說讓梯度變大,避免梯度消失的問題。