關於神經網路的調參順序?
神經網路裡面的超參在調參的時候有沒有什麼比較推薦的順序?
需要調節的參數比如:batch_size、learning rate、隱層units數、網路層數、L1/L2正則項參數之類的。
謝邀。現在不管是圖像分類還是目標檢測還是語意分割,模型方面基本上都做得非常好了,因此真正需要調的參數其實並不多了,或者說調很多參數實際帶來的提升都非常小了。不過有幾個參數還是非常重要的,根據我的經驗,按重要程度來說吧,希望能給需要的人提供幫助:
1、學習率
初始學習率很重要,學習率的變化策略也很重要,你真正跑過數據就會發現其中的奧秘,適當時候可微調,一般在0.1到0.00001範圍,根據具體情況定。
2、batch size
我們用的隨機梯度下降是建立在batch基礎上的,合適的batch size對你模型的優化是比較重要的,這個參數倒不需要微調,在一個大致數量即可,常取2的n次方,太大的batch size會受GPU顯存的限制,所以不能無限增大。
3、其他參數
比如L1,L2正則化的參數,也就是很多深度學習框架裡面的wd參數,一般默認是0.0001,調整正則化的參數可以根據模型表現來,過擬合的時候可以適當加大係數,非過擬合的時候可不調這個參數,畢竟跑一次模型得花不少時間。epoch,應該要和模型表現搭配,如果你的模型已經過擬合了,你就沒必要繼續跑了;相反,如果你的epoch太小,你epoch跑完了,模型的loss還在下降,模型還在優化,那麼你這個epoch就太小了,應該增加。至於卷積核個數,模型層數等個人認為看情況而定,現在的優秀模型都是很多前沿的研究者經過理論分析和無數次的實驗得到的,一般不會說你調一些卷積核個數或其他一些層結構就會有明顯提升,當然有時間你可以試試。
關注一下這個問題啊
調參 是種無奈
理論認識很深的時候參數就是一個公式或幾個公式
應該把精力放在認識水平的提高上Andrew Ng 的個人經驗和偏好是:
第一梯隊: learning rate α
第二梯隊: hidden units
mini-batch size
momentum β
第三梯隊: number of layers
learning rate decay
other optimizer hyperparameters
深度神經網路超參數選擇和訓練技巧探討
作者:盛宇清
本文主要針對深度神經網路訓練和調試過程中,從工程的角度對一些常見優化和調試方法進行探討。
目前谷歌開源的Tensorflow是一個目前比較常用流行的的深度學習框架,他採用了一種計算圖模型的思想,對搭建好的結構可以用TensorBoard進行展示。除此以外Keras 可以理解為是一個在 TensorFlow 頂部的layer,它可以讓模型實現起來變得更加簡單。
在用深度學習演算法實現一個新應用的時候,比較煩的一點有著很多的超參數和較多優化方法可選擇,所以需要嘗試多次不同的可能性來找到在該應用中的最匹配結果。這也是值得討論探討的地方。
在訓練一個深度學習模型的過程中,超參數選擇什麼最優,這是一個基於實驗和經驗的過程。需要不停的嘗試,直到找到合適的參數值。
1、一些術語的區分和定義
超參數:如學習率α、adam方法的β1和β2參數、網路層數、每層隱藏單元數、學習率衰減值、mini-batch大小等需要人工選取的參數。
參數:這裡所指的參數另外一種說法就是權重,需要被訓練的參數。比如:W*X+b,這裡W、b就是參數。
2、模型調試的技巧:
2.1 使用隨機參數調參
Bengio在http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf文章中指出,Random Search比Gird
Search更有效。網格搜索主要適合與超參數的數量較少時的情況。但是在深度學習等超參數較多的情況中,應該選用隨機實驗參數來效率更高。
2.2、由粗到細:
遵循從粗糙到精細的搜索過程。比如兩個參數的情況,首先對整個由兩個隨機參數組成的多個點劃定的區域進行粗略搜索,然後不斷縮小搜索區域,再在這個區域中不斷精細調節參數。
2.3、超參數選取尺度的考慮:
每一種超參數考慮的尺度是不一樣的,比如隱藏層數、隱藏層單元數肯定是以線性尺度進行搜索。而如果是學習率α,就需要取對數了,因為學習率有可能從0.00001到0.1之間,因此選用對數搜索尺度更加合理。
2.4、學習率的選擇:
參數更新時的學習率選擇,需要根據嘗試不同的學習率來確定。可以畫出損失函數隨迭代次數的收斂圖,選取學習率能使得代價函數收斂到最低的位置
2.5、泛化的問題:
不需要一上來就考慮泛化的問題。先要保證模型的複雜度能夠充分擬合數據,代價函數能夠快速的下降,在訓練集上達到一個非常高的準確率,再考慮泛化的問題。
3、 激活函數的選擇:
神經網路目前效果隨著網路的深度不斷增加,效果也不斷提升,一個重要原因就是通過非線性的變換。如果沒有非線性變換的激活函數,只是做多層的線性變換,實際上效果是跟單個函數是一樣的。
下面對各種激活函數進行介紹:
Sigmoid函數:
Sigmoid函數是以前神經網路中常用的一種激活函數。目前一般不用它,原因如下:
1、該函數輸出當X稍大或稍小的時候要麼非常接近0,要麼非常接近1。會導致梯度彌散(反向傳播演算法中出現梯度趨近0的問題)。這會導致訓練效率變的很差。
2、構造比較複雜,所以比較消耗系統資源。
3、sigmoid(X)均是大於0的數,輸出全部是正值,輸出的中心值趨近於0.5而不是0,這不利於下一層的學習。
Tanh函數:
表現形式如下
Tanh函數是sigmoid函數的改進版,它解決了sigmoid(X)的值均為正數的缺點,使得輸出的中心值趨近於0,而不是0.5這讓下一層的學習更方便一點。缺點是還不能解決梯度彌散的問題。
ReLU函數:
表現形式如下
最近ReLu函數非常流行。ReLu函數公式為max(0,x),它相比其它激活函數非常簡潔。
http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
在這篇關於卷積神經網路的中指出使用ReLu函數,而不使用sigmoid函數或者tanh函數可以使你的網路收斂的更快。
該文章指出,和tanh函數相比,通過ReLu函數訓練卷積神經網在他們的實驗中達到了之前六倍的收斂速度。
Leaky Relu:
該函數保留了Relu的特性,並優化了ReLu函數,但並不一定任何時候比Relu好,目前有爭議。
4、欠擬合和過度擬合的情況:
初始訓練完模型之後,首先要知道演算法的偏差高不高。如果偏差高,出現欠擬合,甚至無法擬合訓練集,就需要增加神經網路層數和大小,需要讓網路變得更複雜來充分擬合現有的數據。
如果方差高,出現過度擬合,最好的辦法是尋找更多的數據,或者使用正則化的方法。
下面介紹深度學習中正則化的一些方法:
2.1、增加懲罰項:
我們知道,在傳統的回歸、分類模型中,為了防止過度擬合,會在代價函數(cost function)加入懲罰項來防止過度擬合,其中有L1(Lasso回歸),L2(嶺回歸)等方法。同樣的在深度學習的由softmax產生的代價函數也可以用L1、L2等懲罰項的方法來防止過度擬合。
2.2、droupout 方法:
Droupout方法
原理:
Droupout方法是Srivastava et al發表的關於防止過度擬合的方法。
論文鏈接:http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf
該方法就是隨機讓一些神經元失活,隨機保留部分神經元。類似於從總體神經元中隨機抽樣。
這樣每次在訓練模型都會不一樣,這類似於一種集成模型的思想。
對於RNN網路如何放置droupout參見這篇文章:https://arxiv.org/abs/1409.2329
使用技巧:
隨機失活率一般設置為0.5。當然每一層的神經網路設置的失活率都可以設置成不一樣的,一般方法是對越大越複雜的隱藏層,意味著過度擬合的可能性越大,所以失活率設置越高,保留率要設置得越低。相反對於簡單的網路層,保留率設置越高,或者不用droupout。需要注意的是,除非演算法過擬合,不然最好不需要用droupout等方法。
使用droupout有個比較煩的點就是,損失函數不再被明確定義,因為每一次迭代所用的網路都不同。所以失去一種通過繪製(迭代次數-損失函數值)曲線圖來調試的工具。在這種情況下,通常是先關閉droupout,並設定keep.prop值為1,運行代碼確保損失函數單調遞減,然後再打開droupout功能。
5、數據預處理:
對輸入數據進行歸一化處理,能夠顯著加速梯度下降的收斂過程。至於為什麼有效,原因見下圖:
可以看到如果不歸一化,輸入數據每個維度的尺度範圍的差異會對梯度下降的迭代過程造成影響。
6、權重初始化:
目前有很多關於如何做權重參數初始化的研究。因為深度學習權重初始化很重要,如果有問題就不會有好結果。這是一個非常重要的問題。
如果權值初始化為0的話,用梯度下降演算法,那會完全失效。因為如果權重初始化為0,每個神經元將會輸出同樣的結果,方向傳播時就會計算出同樣的梯度,最後會得到完全相同的參數更新,所以演算法失效。
如果用很小的隨機數值初始化。比如用高斯分布乘以一個很小的常數進行初始化:W = 0.01 * np.random.randn()。對於層數較少的神經網路效果很好,但是隨著層數的增加,對於初始化更為敏感。
實驗表明隨著隱含層隱藏層的增加,前面的層還是服從高斯分布的,但是越到後面的隱藏層隱含層輸出值的分布圖會趨近於0。
Glorot的文章http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf這篇論文中,作者推薦的初始化方式是W=2/(n1+n2),其中n1是前一層的單元個數,n2是後一層的單元個數。Tensorflow的tf.contrib.layers.xavier_initializer()函數即使用的該方法。
最近Kai minghe發表的文章https://arxiv-web3.library.cornell.edu/abs/1502.01852也做出了很多關於這方面的最新研究。這篇論文中作者推薦的初始化方式是:W = np.random.randn(n) * sqrt(2.0/n)
7、批量歸一化(Batch Normalization)
最近提出了一種批量歸一化的方法。其實現方式是在連接層和激活函數之間加入一個BatchNorm層,確保每個進入激活函數的分布都成高斯分布。
原理詳見https://arxiv.org/abs/1502.03167。
該方法一定程度上減輕了對權重初始化的依賴性和麻煩。實驗表明該方法有時候還有著防過擬合的作用。
8、各種優化演算法:
傳統梯度下降運算在大規模神經網路學習過程中會很慢,為了加快速度,目前有了很多優化的演算法。如Momentum、Nesterov Momentum、Adagrad、RMSprop、Adam等。
8.1、Mini-batch(SGD演算法):
在做梯度更新的時候如果用全量話的數據會造成迭代的速度慢,選取Mini-batch可以加快學習速度。Min-batch的原理就是在梯度更新時不是每次對所有的數據進行求和運算,而是從總數據中隨機抽取小批量的數據進行更新。
使用技巧:
如果是小批量數據,可以使用全量數據,不需要使用SGD演算法,因為SGD演算法更新會造成收斂的波動,因為。但如果是大批量的數據,就需要考慮使用SGD算。batch size的經驗取值範圍在64~512之間。batch size太大,一般不會對結果有太大的影響,而batch size太小的話,結果有可能很差。
8.2、Momentum下降法:
動量更新是非常有意思的一種更新思想。它有意思的一點是引入了物理學的中的概念。momentum即動量,動量更新方法是依據物理學的勢能與動能之間能量轉換原理提出來的。梯度下降在更新權值時,採用如下公式:
w = w -
learning_rate * dwMomentum更新改採用如下公式:
v = mu * v -
learning_rate * dw (v可以看成速度)w += v (通過速度v改變w,而不直接是dw)
梯度不直接對w值進行更新,而是先更新速度值,再通過速度改變位移。dw可以看成加速度(即梯度),v可以看成速度,w是位移(即權重的值)。mu是摩擦係數,一般設定為0.9。
該演算法可以看成一個小球在一個封閉的物理凹形空間中,勢能和動能進行轉換,能量遵循守恆定律,加入摩擦係數會丟失能量,隨著能量不斷消耗最終會掉入全局最小值。
8.3、Adam優化演算法:
adam是最近比較火的一種優化演算法。Adam優化演算法將Momentum和RMSprop兩種優化演算法結合到了一起。
見論文:https://arxiv.org/pdf/1412.6980.pdf
該文所展示的實驗表明運用adam演算法對比其他優化演算法會使得代價函數收斂的更快。
論文中推薦的參數值eps=1e-8, beta1=0.9, beta2=0.999
8.4、學習率衰減(退火演算法):
在學習率選擇上,我們經常陷入如何在模型的學習速度和收斂效果的權衡問題。比如在訓練初期我們希望學習率偏大,這樣訓練模型的速度才能快,但是隨著迭代的不斷進行,我們希望學習率小一些,這樣才能達到一個良好的收斂效果。
如果不設置學習率(α)衰減值,學習率為一個固定的值,會發現在做梯度下降演算法時,雖然開始損失函數下降很快,但是並不能很好的收斂,會在最優值附近震蕩。
通常選用的優化演算法組合:SGD演算法+ Adam優化演算法+退火演算法
個人意見,純屬瞎扯 :)
1. 首先需要明確的是寬泛策略,不要一上來就恨不得把所有參數值都給一下,根據問題可以先設置比較簡單的神經網路(如兩層,每層10個神經元),跑一下看準確率如何,表現咋樣
2. 然後明確自己的模型提升目的,是提高準確率?縮短時間?根據不同的研究目的調參
3. 接著由易到難吧,從最簡單的激活函數種類開始調,接著mini-batch的batch大小,再過渡到諸如神經元層數,每層神經元個數等等。有人說層數太多會過擬合,那就適當增加L2懲罰項alpha的值,但一般層數不多於3
我最近也在研究一個case,是神經網路在情感分析裡面的應用,文章鏈接如下:
Emotion Detection and Recognition from Text Using Deep Learning
我也很想知道她那個125,25,5的隱藏層是咋搞出來的??!!
題主的問題本質就是屬於超參數的調優,網上看過幾篇文章寫的不錯這裡推薦下:
神經網路設置層的數量和尺寸
How to Tune Algorithm Parameters with Scikit-Learn
這塊目前感覺沒有一個很死板的理論的東西,更多的確實依賴於經驗,對模型和問題的理解,寫的不好,可以多多交流!
一般我更願意從數據入手,調整網路訓練參數的目的只是在train和val上有個合理的收斂結果,感覺學習率不管什麼策略都要自己適當調整下最好。overfit和模型大小也有關係,沒那麼大數據量可以減小下規模和參數量,另外感覺運氣也很重要
同問……
我最近也有這個疑問,這麼多參數,不知道優先調哪個參數,或者說哪個參數對模型的影響最大。比如卷積核的數量,卷積窗口的長度ws,優化器,還有學習率,激勵函數,,,,一臉懵。有沒有人有調參經驗可以分享的。謝謝了。
推薦閱讀:
※回歸(regression)問題是否比分類(classification)問題更難用神經網路模型學好?
※組合數學入門,求書籍推薦?
※深度學習會不會淘汰掉其他所有機器學習演算法?
※如何評價吳恩達-斯坦福-2017年秋最新機器學習視頻課程?
※人工智慧/機器學習領域,選愛丁堡還是劍橋?
TAG:機器學習 | 神經網路 | 深度學習DeepLearning |