1。 有錢:

Auto ML自動調參(20美元/小時,聽說這個調參似乎挺耗時的。。。)

2。 人工調參:

1)

資料輸入

最優加速效能不僅依賴於高速的計算硬體,也要求有一個高效的

資料輸入

管道。要解決I/O傳輸問題,有幾個方面:SSD、緩衝池、資料讀入及處理和模型計算並行起來

2)

大batch size

為了充分利用大規模叢集算力以達到提升訓練速度的目的,人們不斷的提升batch size大小,這是因為更大的batch size允許我們在擴充套件GPU數量的同時不降低每個GPU的計算負載。然而,過度增大batch size會帶來明顯的精度損失!這是因為在大batch size(相對於訓練樣本數)情況下,樣本隨機性降低,梯度下降方向趨於穩定,訓練就由SGD向GD趨近,這導致模型更容易收斂於初始點附近的某個區域性最優解,從而抵消了計算力增加帶來的好處。

解決方向:Learning Rate自適應

3)

防止模型過擬合

a。 新增

Batch normalization

層:用以規範特徵的分佈,使輸出的特徵圖分佈更加均勻。這個效果一般不錯。

b。 對引數做

正則化

:其他防止模型過擬合的策略比如對引數做正則化,包括weight, bias, BN beta和gamma,這些引數佔模型所有引數的比例可能很小,比如在AlexNet模型,它們僅佔總引數量的0。02%,對這些引數進行正則化會

增加計算量,還會讓模型損失一些靈活性。

c。

dropout

:dropout可阻礙網路學習僅存在於訓練集中區域性的“額外規律”,這個效果比較強,但如果加的dropout層過多,比如每層後面都加一個dropout,

阻礙網路學習規律的強度也會增加。

4)

Inception 結構

Inception 結構中嵌入了多尺度資訊,聚合多種不同感受野上的特徵來獲得性能增益。參考ResNet變形,GoogLeNet,SENet等。

如何最佳化神經網路?(加快訓練速度,提高準確度)

Inception結構

5)權重初始化

權重初始化決定了網路從什麼位置開始訓練,良好的起始位置不僅可以減少訓練耗時,也可以使模型的訓練更加穩定,並且可以避開很多訓練上的問題。比如“dying ReLU”問題,Relu可能會使節點無法被啟用,那麼就需要對w權重進行合理的初始化;還可以使用leaky relu函式解決。

6)超參調優

引數步長由粗到細:調優引數值先以較大步長進行劃分,可以減少引數組合數量,當確定大的最優範圍之後再逐漸細化調整,例如在調整學習速率時,

採取較大步長測試發現

:學習率lr較大時,收斂速度前期快、後期平緩,lr較小時,前期平緩、後期較快,根據這個規律繼續做細微調整,最終得到多個不同區間的最佳學習速率;

低精度調參:在低精度訓練過程中,遇到的最大的一個問題就是精度丟失的問題,透過分析相關資料,放大低精度表示邊緣數值,

保證引數的有效性是迴歸高精度計算的重要方法

初始化資料的調參:隨著網路層數的增多,由於啟用函式的非線性,初始化引數使得模型變得不容易收斂,可以像VGGNet那樣透過首

先訓練一個淺層的網路,再透過淺層網路的引數遞進初始化深層網路引數

,也可以根據輸入輸出通道數的範圍來初始化初始值,一般以輸入通道數較為常見;對於全連線網路層則採用高斯分佈即可;對於shortcut的batch norm,引數gamma初始化為零。

還有其他細節,比如每一個epoch就shuffle訓練資料等,想要最佳化神經網路,加快訓練速度,提高準確度,更重要的是創造

更好的網路結構,更有優的公式。

參考資料:

【1】機器之心:

https://

zhuanlan。zhihu。com/p/40

993775

【2】YJango的前饋神經網路:

https://

zhuanlan。zhihu。com/p/27

854076

【3】CS231n Convolutional Neural Networks for Visual Recognition:

http://

cs231n。github。io/convol

utional-networks/