自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重磅長文|提高深度學(xué)習(xí)性能的四種方式

企業(yè)動態(tài)
我經(jīng)常被問到諸如如何從深度學(xué)習(xí)模型中得到更好的效果的問題以及類似的問題,對于這些問題,我經(jīng)常這樣回答,“我并不知道確切的答案,但是我有很多思路”,接著我會列出了我所能想到的所有或許能夠給性能帶來提升的思路。

[[178049]]

選文|Aileen

翻譯|王昱森

校對|寒小陽

導(dǎo)語

我經(jīng)常被問到諸如如何從深度學(xué)習(xí)模型中得到更好的效果的問題,類似的問題還有:

  • 我如何提升準(zhǔn)確度
  • 如果我的神經(jīng)網(wǎng)絡(luò)模型性能不佳,我能夠做什么?

對于這些問題,我經(jīng)常這樣回答,“我并不知道確切的答案,但是我有很多思路”,接著我會列出了我所能想到的所有或許能夠給性能帶來提升的思路。

為避免一次次羅列出這樣一個(gè)簡單的列表,我決定把所有想法詳細(xì)寫在這篇博客里。

這些思路應(yīng)該是通用的,不僅能在深度學(xué)習(xí)領(lǐng)域幫助你,還能適用于任何機(jī)器學(xué)習(xí)算法。

[[178050]]

如何提升深度學(xué)習(xí)性能

照片來源:Pedro Ribeiro Simões

提升算法性能思路

這個(gè)列表里提到的思路并完全,但是一個(gè)好的開始。

我的目的是給出很多可以嘗試的思路,希望其中的一或兩個(gè)你之前沒有想到。你經(jīng)常只需要一個(gè)好的想法就能得到性能提升。

如果你能從其中一個(gè)思路中得到結(jié)果,請?jiān)谠u論區(qū)告訴我。我很高興能得知這些好消息。

如果你有更多的想法,或者是所列思路的拓展,也請告訴我,我和其他讀者都將受益!有時(shí)候僅僅是一個(gè)想法或許就能使他人得到突破。

我將此博文分為四個(gè)部分:

1. 通過數(shù)據(jù)提升性能

2. 通過算法提升性能

3. 通過算法調(diào)參提升性能

4. 通過嵌套模型提升性能

通常來講,隨著列表自上而下,性能的提升也將變小。例如,對問題進(jìn)行新的架構(gòu)或者獲取更多的數(shù)據(jù),通常比調(diào)整***算法的參數(shù)能帶來更好的效果。雖然并不總是這樣,但是通常來講是的。

我已經(jīng)把相應(yīng)的鏈接加入了博客的教程中,相應(yīng)網(wǎng)站的問題中,以及經(jīng)典的Neural Net FAQ中。

部分思路只適用于人工神經(jīng)網(wǎng)絡(luò),但是大部分是通用的。通用到足夠你用來配合其他技術(shù)來碰撞出提升模型性能的方法。

OK,現(xiàn)在讓我們開始吧。

1. 通過數(shù)據(jù)提升性能

對你的訓(xùn)練數(shù)據(jù)和問題定義進(jìn)行適當(dāng)改變,你能得到很大的性能提升。或許是***的性能提升。

以下是我將要提到的思路:

  • 獲取更多數(shù)據(jù)
  • 創(chuàng)造更多數(shù)據(jù)
  • 重放縮你的數(shù)據(jù)
  • 轉(zhuǎn)換你的數(shù)據(jù)
  • 特征選取
  • 重架構(gòu)你的問題

1) 獲取更多數(shù)據(jù)

你能獲取更多訓(xùn)練數(shù)據(jù)嗎?

你的模型的質(zhì)量通常受到你的訓(xùn)練數(shù)據(jù)質(zhì)量的限制。為了得到***的模型,你首先應(yīng)該想辦法獲得***的數(shù)據(jù)。你也想盡可能多的獲得那些***的數(shù)據(jù)。

有更多的數(shù)據(jù),深度學(xué)習(xí)和其他現(xiàn)代的非線性機(jī)器學(xué)習(xí)技術(shù)有更全的學(xué)習(xí)源,能學(xué)得更好,深度學(xué)習(xí)尤為如此。這也是機(jī)器學(xué)習(xí)對大家充滿吸引力的很大一個(gè)原因(世界到處都是數(shù)據(jù))。如下圖所示:

為什么選擇深度學(xué)習(xí)?

為什么選擇深度學(xué)習(xí)?

圖片由Andrew Ng提供,版權(quán)所有

更多的數(shù)據(jù)并不是總是有用,但是確實(shí)有幫助。于我而言,如果可以,我會選擇獲取更多的數(shù)據(jù)。

可以參見以下相關(guān)閱讀:

• Datasets Over Algorithms(www.edge.org/response-detail/26587)

2) 創(chuàng)造更多數(shù)據(jù)

上一小節(jié)說到了有了更多數(shù)據(jù),深度學(xué)習(xí)算法通常會變的更好。有些時(shí)候你可能無法合理地獲取更多數(shù)據(jù),那你可以試試創(chuàng)造更多數(shù)據(jù)。

  • 如果你的數(shù)據(jù)是數(shù)值型向量,可以隨機(jī)構(gòu)造已有向量的修改版本。
  • 如果你的數(shù)據(jù)是圖片,可以隨機(jī)構(gòu)造已有圖片的修改版本(平移、截取、旋轉(zhuǎn)等)。
  • 如果你的數(shù)據(jù)是文本,類似的操作……

這通常被稱作數(shù)據(jù)擴(kuò)增(data augmentation)或者數(shù)據(jù)生成(data generation)。

你可以利用一個(gè)生成模型。你也可以用一些簡單的技巧。例如,針對圖片數(shù)據(jù),你可以通過隨機(jī)地平移或旋轉(zhuǎn)已有圖片獲取性能的提升。如果新數(shù)據(jù)中包含了這種轉(zhuǎn)換,則提升了模型的泛化能力。

這也與增加噪聲是相關(guān)的,我們習(xí)慣稱之為增加擾動。它起到了與正則化方法類似的作用,即抑制訓(xùn)練數(shù)據(jù)的過擬合。

以下是相關(guān)閱讀:

  • Image Augmentation for Deep Learning With Keras(http://machinelearningmastery.com/image-augmentation-deep-learning-keras/)
  • What is jitter? (Training with noise)(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_jitter)

3) 重縮放(rescale)你的數(shù)據(jù)

這是一個(gè)快速獲得性能提升的方法。

當(dāng)應(yīng)用神經(jīng)網(wǎng)絡(luò)時(shí),一個(gè)傳統(tǒng)的經(jīng)驗(yàn)法則是:重縮放(rescale)你的數(shù)據(jù)至激活函數(shù)的邊界。

如果你在使用sigmoid激活函數(shù),重縮放你的數(shù)據(jù)到0和1的區(qū)間里。如果你在使用雙曲正切(tanh)激活函數(shù),重縮放數(shù)據(jù)到-1和1的區(qū)間里。

這種方法可以被應(yīng)用到輸入數(shù)據(jù)(x)和輸出數(shù)據(jù)(y)。例如,如果你在輸出層使用sigmoid函數(shù)去預(yù)測二元分類的結(jié)果,應(yīng)當(dāng)標(biāo)準(zhǔn)化y值,使之成為二元的。如果你在使用softmax函數(shù),你依舊可以通過標(biāo)準(zhǔn)化y值來獲益。

這依舊是一個(gè)好的經(jīng)驗(yàn)法則,但是我想更深入一點(diǎn)。我建議你可以參考下述方法來創(chuàng)造一些訓(xùn)練數(shù)據(jù)的不同的版本:

  • 歸一化到0和1的區(qū)間。
  • 重放縮到-1和1的區(qū)間
  • 標(biāo)準(zhǔn)化(譯者注:標(biāo)準(zhǔn)化數(shù)據(jù)使之成為零均值,單位標(biāo)準(zhǔn)差)

然后對每一種方法,評估你的模型的性能,選取***的進(jìn)行使用。如果你改變了你的激活函數(shù),重復(fù)這一過程。

在神經(jīng)網(wǎng)絡(luò)中,大的數(shù)值累積效應(yīng)(疊加疊乘)并不是好事,除上述方法之外,還有其他的方法來控制你的神經(jīng)網(wǎng)絡(luò)中數(shù)據(jù)的數(shù)值大小,譬如歸一化激活函數(shù)和權(quán)重,我們會在以后討論這些技術(shù)。

以下為相關(guān)閱讀:

  • Should I standardize the input variables (column vectors)?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_std)
  • How To Prepare Your Data For Machine Learning in Python with Scikit-Learn(http://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

4) 數(shù)據(jù)變換

這里的數(shù)據(jù)變換與上述的重縮放方法類似,但需要更多工作。

你必須非常熟悉你的數(shù)據(jù)。通過可視化來考察離群點(diǎn)。

猜測每一列數(shù)據(jù)的單變量分布。

  • 列數(shù)據(jù)看起來像偏斜的高斯分布嗎?考慮用Box-Cox變換調(diào)整偏態(tài)。
  • 列數(shù)據(jù)看起來像指數(shù)分布嗎?考慮用對數(shù)變換。
  • 列數(shù)據(jù)看起來有一些特征,但是它們被一些明顯的東西遮蓋了,嘗試取平方或者開平方根來轉(zhuǎn)換數(shù)據(jù)
  • 你能離散化一個(gè)特征或者以某種方式組合特征,來更好地突出一些特征嗎?

依靠你的直覺,嘗試以下方法。

  • 你能利用類似PCA的投影方法來預(yù)處理數(shù)據(jù)嗎?
  • 你能綜合多維特征至一個(gè)單一數(shù)值(特征)嗎?
  • 你能用一個(gè)新的布爾標(biāo)簽去發(fā)現(xiàn)問題中存在一些有趣的方面嗎?
  • 你能用其他方法探索出目前場景下的其他特殊結(jié)構(gòu)嗎?

神經(jīng)網(wǎng)層擅長特征學(xué)習(xí)(feature engineering)。它(自己)可以做到這件事。但是如果你能更好的發(fā)現(xiàn)問題到網(wǎng)絡(luò)中的結(jié)構(gòu),神經(jīng)網(wǎng)層會學(xué)習(xí)地更快。你可以對你的數(shù)據(jù)就不同的轉(zhuǎn)換方式進(jìn)行抽樣調(diào)查,或者嘗試特定的性質(zhì),來看哪些有用,哪些沒用。

以下是相關(guān)閱讀:

  • How to Define Your Machine Learning Problem(http://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)
  • Discover Feature Engineering, How to Engineer Features and How to Get Good at It(http://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)
  • How To Prepare Your Data For Machine Learning in Python with Scikit-Learn(http://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

5) 特征選擇

一般說來,神經(jīng)網(wǎng)絡(luò)對不相關(guān)的特征是具有魯棒的(校對注:即不相關(guān)的特征不會很大影響神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和效果)。它們會用近似于0的權(quán)重來弱化那些沒有預(yù)測能力的特征的貢獻(xiàn)。

盡管如此,這些無關(guān)的數(shù)據(jù)特征,在訓(xùn)練周期依舊要耗費(fèi)大量的資源。所以你能去除數(shù)據(jù)里的一些特征嗎?

有許多特征選擇的方法和特征重要性的方法,這些方法能夠給你提供思路,哪些特征該保留,哪些特征該剔除。最簡單的方式就是對比所有特征和部分特征的效果。

同樣的,如果你有時(shí)間,我建議在同一個(gè)網(wǎng)絡(luò)中嘗試選擇不同的視角來看待你的問題,評估它們,來看看分別有怎樣的性能。

  • 或許你利用更少的特征就能達(dá)到同等甚至更好的性能。而且,這將使模型變得更快!
  • 或許所有的特征選擇方法都剔除了同樣的特征子集。很好,這些方法在沒用的特征上達(dá)成了一致。
  • 或許篩選過后的特征子集,能帶給特征工程的新思路。

以下是相關(guān)閱讀:

  • An Introduction to Feature Selection(http://machinelearningmastery.com/an-introduction-to-feature-selection/)
  • Feature Selection For Machine Learning in Python(http://machinelearningmastery.com/feature-selection-machine-learning-python/)

6) 重新架構(gòu)你的問題

有時(shí)候要試試從你當(dāng)前定義的問題中跳出來,想想你所收集到的觀察值是定義你問題的唯一方式嗎?或許存在其他方法?;蛟S其他構(gòu)建問題的方式能夠更好地揭示待學(xué)習(xí)問題的結(jié)構(gòu)。

我真的很喜歡這個(gè)嘗試,因?yàn)樗仁鼓愦蜷_自己的思路。這確實(shí)很難,尤其是當(dāng)你已經(jīng)對當(dāng)前的方法投入了大量的時(shí)間和金錢時(shí)。

但是咱們這么想想,即使你列出了3-5個(gè)可供替代的建構(gòu)方案,而且最終還是放棄了它們,但這至少說明你對當(dāng)前的方案更加自信了。

  • 看看能夠在一個(gè)時(shí)間窗(時(shí)間周期)內(nèi)對已有的特征/數(shù)據(jù)做一個(gè)合并。
  • 或許你的分類問題可以成為一個(gè)回歸問題(有時(shí)候是回歸到分類)。
  • 或許你的二元輸出可以變成softmax輸出?
  • 或許你可以轉(zhuǎn)而對子問題進(jìn)行建模。

仔細(xì)思考你的問題,***在你選定工具之前就考慮用不同方法構(gòu)建你的問題,因?yàn)榇藭r(shí)你對解決方案并沒有花費(fèi)太多的投入。除此之外,如果你在某個(gè)問題上卡住了,這樣一個(gè)簡單的嘗試能釋放更多新的想法。

而且,這并不代表你之前的工作白干了,關(guān)于這點(diǎn)你可以看看后續(xù)的模型嵌套部分。

以下為相關(guān)閱讀:

  • How to Define Your Machine Learning Problem(http://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)

2. 通過算法提升性能

機(jī)器學(xué)習(xí)當(dāng)然是用算法解決問題。

所有的理論和數(shù)學(xué)都是描繪了應(yīng)用不同的方法從數(shù)據(jù)中學(xué)習(xí)一個(gè)決策過程(如果我們這里只討論預(yù)測模型)。

你已經(jīng)選擇了深度學(xué)習(xí)來解釋你的問題。但是這真的是***的選擇嗎?在這一節(jié)中,我們會在深入到如何***地發(fā)掘你所選擇的深度學(xué)習(xí)方法之前,接觸一些算法選擇上的思路。

下面是一個(gè)簡要列表:

  1. 對算法進(jìn)行抽樣調(diào)查
  2. 借鑒已有文獻(xiàn)
  3. 重采樣方法

下面我解釋下上面提到的幾個(gè)方法。

1) 對算法進(jìn)行抽樣調(diào)查

其實(shí)你事先無法知道,針對你的問題哪個(gè)算法是***的。如果你知道,你可能就不需要機(jī)器學(xué)習(xí)了。那有沒有什么數(shù)據(jù)(辦法)可以證明你選擇的方法是正確的?

讓我們來解決這個(gè)難題。當(dāng)從所有可能的問題中平均來看各算法的性能時(shí),沒有哪個(gè)算法能夠永遠(yuǎn)勝過其他算法。所有的算法都是平等的,下面是在no free lunch theorem中的一個(gè)總結(jié)。

或許你選擇的算法不是針對你的問題***的那個(gè)

我們不是在嘗試解決所有問題,算法世界中有很多新熱的方法,可是它們可能并不是針對你數(shù)據(jù)集的***算法。

我的建議是收集(證據(jù))數(shù)據(jù)指標(biāo)。接受更好的算法或許存在這一觀點(diǎn),并且給予其他算法在解決你的問題上“公平競爭”的機(jī)會。

抽樣調(diào)查一系列可行的方法,來看看哪些還不錯(cuò),哪些不理想。

  • 首先嘗試評估一些線性方法,例如邏輯回歸(logistic regression)和線性判別分析(linear discriminate analysis)。
  • 評估一些樹類模型,例如CART, 隨機(jī)森林(Random Forest)和Gradient Boosting。
  • 評估一些實(shí)例方法,例如支持向量機(jī)(SVM)和K-近鄰(kNN)。
  • 評估一些其他的神經(jīng)網(wǎng)絡(luò)方法,例如LVQ, MLP, CNN, LSTM, hybrids等

選取性能***的算法,然后通過進(jìn)一步的調(diào)參和數(shù)據(jù)準(zhǔn)備來提升。尤其注意對比一下深度學(xué)習(xí)和其他常規(guī)機(jī)器學(xué)習(xí)方法,對上述結(jié)果進(jìn)行排名,比較他們的優(yōu)劣。

很多時(shí)候你會發(fā)現(xiàn)在你的問題上可以不用深度學(xué)習(xí),而是使用一些更簡單,訓(xùn)練速度更快,甚至是更容易理解的算法。

以下為相關(guān)閱讀:

  • A Data-Driven Approach to Machine Learning(http://machinelearningmastery.com/a-data-driven-approach-to-machine-learning/)
  • Why you should be Spot-Checking Algorithms on your Machine Learning Problems(http://machinelearningmastery.com/why-you-should-be-spot-checking-algorithms-on-your-machine-learning-problems/)
  • Spot-Check Classification Machine Learning Algorithms in Python with scikit-learn(http://machinelearningmastery.com/spot-check-classification-machine-learning-algorithms-python-scikit-learn/)

2) 借鑒已有文獻(xiàn)

方法選擇的一個(gè)捷徑是借鑒已有的文獻(xiàn)資料。可能有人已經(jīng)研究過與你的問題相關(guān)的問題,你可以看看他們用的什么方法。

你可以閱讀論文,書籍,博客,問答網(wǎng)站,教程,以及任何能在谷歌搜索到的東西。

寫下所有的想法,然后用你的方式把他們研究一遍。

這不是復(fù)制別人的研究,而是啟發(fā)你想出新的想法,一些你從沒想到但是卻有可能帶來性能提升的想法。

發(fā)表的研究通常都是非常贊的。世界上有非常多聰明的人,寫了很多有趣的東西。你應(yīng)當(dāng)好好挖掘這個(gè)“圖書館”,找到你想要的東西。

以下為相關(guān)閱讀:

  • How to Research a Machine Learning Algorithm(http://machinelearningmastery.com/how-to-research-a-machine-learning-algorithm/)
  • Google Scholar(http://scholar.google.com/)

3) 重采樣方法

你必須知道你的模型效果如何。你對模型性能的估計(jì)可靠嗎?

深度學(xué)習(xí)模型在訓(xùn)練階段非常緩慢。這通常意味著,我們無法用一些常用的方法,例如k層交叉驗(yàn)證,去估計(jì)模型的性能。

  • 或許你在使用一個(gè)簡單的訓(xùn)練集/測試集分割,這是常規(guī)套路。如果是這樣,你需要確保這種分割針對你的問題具有代表性。單變量統(tǒng)計(jì)和可視化是一個(gè)好的開始。
  • 或許你能利用硬件來加速估計(jì)的過程。例如,如果你有集群或者AWS云端服務(wù)(Amazon Web Services)賬號,你可以并行地訓(xùn)練n個(gè)模型,然后獲取結(jié)果的均值和標(biāo)準(zhǔn)差來得到更魯棒的估計(jì)。
  • 或許你可以利用hold-out驗(yàn)證方法來了解模型在訓(xùn)練后的性能(這在早停法(early stopping)中很有用,后面會講到)。
  • 或許你可以先隱藏一個(gè)完全沒用過的驗(yàn)證集,等到你已經(jīng)完成模型選擇之后再使用它。

而有時(shí)候另外的方式,或許你能夠讓數(shù)據(jù)集變得更小,以及使用更強(qiáng)的重采樣方法。

  • 有些情況下你會發(fā)現(xiàn)在訓(xùn)練集的一部分樣本上訓(xùn)練得到的模型的性能,和在整個(gè)數(shù)據(jù)集上訓(xùn)練得到的模型的性能有很強(qiáng)的相關(guān)性。也許你可以先在小數(shù)據(jù)集上完成模型選擇和參數(shù)調(diào)優(yōu),然后再將最終的方法擴(kuò)展到全部數(shù)據(jù)集上。
  • 或許你可以用某些方式限制數(shù)據(jù)集,只取一部分樣本,然后用它進(jìn)行全部的建模過程。

以下為相關(guān)閱讀:

  • Evaluate the Performance Of Deep Learning Models in Keras(http://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras/)
  • Evaluate the Performance of Machine Learning Algorithms in Python using Resampling(http://machinelearningmastery.com/evaluate-performance-machine-learning-algorithms-python-using-resampling/)

3. 通過算法調(diào)參提升性能

這通常是工作的關(guān)鍵所在。你經(jīng)??梢酝ㄟ^抽樣調(diào)查快速地發(fā)現(xiàn)一個(gè)或兩個(gè)性能優(yōu)秀的算法。但是如果想得到***的算法可能需要幾天,幾周,甚至幾個(gè)月。

為了獲得更優(yōu)的模型,以下是對神經(jīng)網(wǎng)絡(luò)算法進(jìn)行參數(shù)調(diào)優(yōu)的幾點(diǎn)思路:

  1. 診斷(Diagnostics)
  2. 權(quán)重初始化(Weight Initialization)
  3. 學(xué)習(xí)速率(Learning Rate)
  4. 激活函數(shù)
  5. 網(wǎng)絡(luò)拓?fù)?Network Topology)
  6. 批次和周期(Batches and Epochs)
  7. 正則化
  8. 優(yōu)化和損失
  9. 早停法

你可能需要訓(xùn)練一個(gè)給定“參數(shù)配置”的神經(jīng)網(wǎng)絡(luò)模型很多次(3-10次甚至更多),才能得到一個(gè)估計(jì)性能不錯(cuò)的參數(shù)配置。這一點(diǎn)幾乎適用于這一節(jié)中你能夠調(diào)參的所有方面。

關(guān)于超參數(shù)優(yōu)化請參閱博文:

  • How to Grid Search Hyperparameters for Deep Learning Models in Python With Keras(http://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/)

1) 診斷

如果你能知道為什么你的模型性能不再提高了,你就能獲得擁有更好性能的模型。

你的模型是過擬合還是欠擬合?永遠(yuǎn)牢記這個(gè)問題。永遠(yuǎn)。

模型總是會遇到過擬合或者欠擬合,只是程度不同罷了。一個(gè)快速了解模型學(xué)習(xí)行為的方法是,在每個(gè)周期,評估模型在訓(xùn)練集和驗(yàn)證集上的表現(xiàn),并作出圖表。

模型狀態(tài)

  • 如果訓(xùn)練集上的模型總是優(yōu)于驗(yàn)證集上的模型,你可能遇到了過擬合,你可以使用諸如正則化的方法。
  • 如果訓(xùn)練集和驗(yàn)證集上的模型都很差,你可能遇到了欠擬合,你可以提升網(wǎng)絡(luò)的容量,以及訓(xùn)練更多或者更久。
  • 如果有一個(gè)拐點(diǎn)存在,在那之后訓(xùn)練集上的模型開始優(yōu)于驗(yàn)證集上的模型,你可能需要使用早停法。

經(jīng)常畫一畫這些圖表,學(xué)習(xí)它們來了解不同的方法,你能夠提升模型的性能。這些圖表可能是你能創(chuàng)造的最有價(jià)值的(模型狀態(tài))診斷信息。

另一個(gè)有用的診斷是網(wǎng)絡(luò)模型判定對和判定錯(cuò)的觀察值。

  • 對于難以訓(xùn)練的樣本,或許你需要更多的數(shù)據(jù)。
  • 或許你應(yīng)該剔除訓(xùn)練集中易于建模的多余的樣本。
  • 也許可以嘗試對訓(xùn)練集劃分不同的區(qū)域,在特定區(qū)域中用更專長的模型。

以下為相關(guān)閱讀:

  • Display Deep Learning Model Training History in Keras(http://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/)
  • Overfitting and Underfitting With Machine Learning Algorithms(http://machinelearningmastery.com/overfitting-and-underfitting-with-machine-learning-algorithms/)

2) 權(quán)重初始化

經(jīng)驗(yàn)法則通常是:用小的隨機(jī)數(shù)進(jìn)行初始化。

在實(shí)踐中,這可能依舊效果不錯(cuò),但是對于你的網(wǎng)絡(luò)來說是***的嗎?對于不同的激活函數(shù)也有一些啟發(fā)式的初始化方法,但是在實(shí)踐應(yīng)用中并沒有太多不同。

固定你的網(wǎng)絡(luò),然后嘗試多種初始化方式。

記住,權(quán)重是你的模型真正的參數(shù),你需要找到他們。有很多組權(quán)重都能有不錯(cuò)的性能表現(xiàn),但我們要盡量找到***的。

  • 嘗試所有不同的初始化方法,考察是否有一種方法在其他情況不變的情況下(效果)更優(yōu)。
  • 嘗試用無監(jiān)督的方法,例如自動編碼(autoencoder),來進(jìn)行預(yù)先學(xué)習(xí)。
  • 嘗試使用一個(gè)已經(jīng)存在的模型,只是針對你的問題重新訓(xùn)練輸入層和輸出層(遷移學(xué)習(xí)(transfer learning))

需要提醒的一點(diǎn)是,改變權(quán)重初始化方法和激活函數(shù),甚至優(yōu)化函數(shù)/損失函數(shù)緊密相關(guān)。

以下為相關(guān)閱讀:

  • Initialization of deep networks(http://deepdish.io/2015/02/24/network-initialization/)

3) 學(xué)習(xí)率

調(diào)整學(xué)習(xí)率很多時(shí)候也是行之有效的時(shí)段。

以下是可供探索的一些想法:

  • 實(shí)驗(yàn)很大和很小的學(xué)習(xí)率
  • 格點(diǎn)搜索文獻(xiàn)里常見的學(xué)習(xí)速率值,考察你能學(xué)習(xí)多深的網(wǎng)絡(luò)。
  • 嘗試隨周期遞減的學(xué)習(xí)率
  • 嘗試經(jīng)過固定周期數(shù)后按比例減小的學(xué)習(xí)率。
  • 嘗試增加一個(gè)動量項(xiàng)(momentum term),然后對學(xué)習(xí)速率和動量同時(shí)進(jìn)行格點(diǎn)搜索。

越大的網(wǎng)絡(luò)需要越多的訓(xùn)練,反之亦然。如果你添加了太多的神經(jīng)元和層數(shù),適當(dāng)提升你的學(xué)習(xí)速率。同時(shí)學(xué)習(xí)率需要和訓(xùn)練周期,batch size大小以及優(yōu)化方法聯(lián)系在一起考慮。

以下為相關(guān)閱讀:

  • Using Learning Rate Schedules for Deep Learning Models in Python with Keras(http://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/)
  • What learning rate should be used for backprop?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_learn_rate)

4) 激活函數(shù)

你或許應(yīng)該使用修正激活函數(shù)(rectifier activation functions)。他們也許能提供更好的性能。

在這之前,最早的激活函數(shù)是sigmoid和tanh,之后是softmax, 線性激活函數(shù),或者輸出層上的sigmoid函數(shù)。我不建議嘗試更多的激活函數(shù),除非你知道你自己在干什么。

嘗試全部三種激活函數(shù),并且重縮放你的數(shù)據(jù)以滿足激活函數(shù)的邊界。

顯然,你想要為輸出的形式選擇正確的傳遞函數(shù),但是可以考慮一下探索不同表示。例如,把在二元分類問題上使用的sigmoid函數(shù)切換到回歸問題上使用的線性函數(shù),然后后置處理你的輸出。這可能需要改變損失函數(shù)使之更合適。詳情參閱數(shù)據(jù)轉(zhuǎn)換那一節(jié)。

以下為相關(guān)閱讀:

  • Why use activation functions?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_act)

5) 網(wǎng)絡(luò)拓?fù)?/strong>

網(wǎng)絡(luò)結(jié)構(gòu)的改變能帶來好處。

你需要多少層以及多少個(gè)神經(jīng)元?抱歉沒有人知道。不要問這種問題...

那怎么找到適用你的問題的配置呢?去實(shí)驗(yàn)吧。

  • 嘗試一個(gè)隱藏層和許多神經(jīng)元(廣度模型)。
  • 嘗試一個(gè)深的網(wǎng)絡(luò),但是每層只有很少的神經(jīng)元(深度模型)。
  • 嘗試上述兩種方法的組合。
  • 借鑒研究問題與你的類似的論文里面的結(jié)構(gòu)。
  • 嘗試拓?fù)淠J?扇出(fan out)然后扇入(fan in))和書籍論文里的經(jīng)驗(yàn)法則(下有鏈接)

選擇總是很困難的。通常說來越大的網(wǎng)絡(luò)有越強(qiáng)的代表能力,或許你需要它。越多的層數(shù)可以提供更強(qiáng)的從數(shù)據(jù)中學(xué)到的抽象特征的能力?;蛟S需要它。

深層的神經(jīng)網(wǎng)絡(luò)需要更多的訓(xùn)練,無論是訓(xùn)練周期還是學(xué)習(xí)率,都應(yīng)該相應(yīng)地進(jìn)行調(diào)整。

以下為相關(guān)閱讀:

這些鏈接會給你很多啟發(fā)該嘗試哪些事情,至少對我來說是的。

  • How many hidden layers should I use?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hl)
  • How many hidden units should I use?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu)

6) Batches和周期

batch size大小會決定***的梯度,以及更新權(quán)重的頻度。一個(gè)周期(epoch)指的是神經(jīng)網(wǎng)絡(luò)看一遍全部訓(xùn)練數(shù)據(jù)的過程。

你是否已經(jīng)試驗(yàn)了不同的批次batch size和周期數(shù)?

之前,我們已經(jīng)討論了學(xué)習(xí)率,網(wǎng)絡(luò)大小和周期之間的關(guān)系。

在很深的網(wǎng)絡(luò)結(jié)構(gòu)里你會經(jīng)??吹剑盒〉腷atch size配以大的訓(xùn)練周期。

下面這些或許能有助于你的問題,也或許不能。你要在自己的數(shù)據(jù)上嘗試和觀察。

  • 嘗試選取與訓(xùn)練數(shù)據(jù)同大小的batch size,但注意一下內(nèi)存(批次學(xué)習(xí)(batch learning))
  • 嘗試選取1作為batch size(在線學(xué)習(xí)(online learning))
  • 嘗試用格點(diǎn)搜索不同的小的batch size(8,16,32,…)
  • 分別嘗試訓(xùn)練少量周期和大量周期。

考慮一個(gè)接近無窮的周期值(持續(xù)訓(xùn)練),去記錄到目前為止能得到的***的模型。

一些網(wǎng)絡(luò)結(jié)構(gòu)對batch size更敏感。我知道多層感知器(Multilayer Perceptrons)通常對batch size是魯棒的,而LSTM和CNNs比較敏感,但是這只是一個(gè)說法(僅供參考)。

以下為相關(guān)閱讀:

  • What are batch, incremental, on-line … learning?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_styles)
  • Intuitively, how does mini-batch size affect the performance of (stochastic) gradient descent?(https://www.quora.com/Intuitively-how-does-mini-batch-size-affect-the-performance-of-stochastic-gradient-descent)

7) 正則化

正則化是一個(gè)避免模型在訓(xùn)練集上過擬合的好方法。

神經(jīng)網(wǎng)絡(luò)里***最熱的正則化技術(shù)是dropout方法,你是否試過?dropout方法在訓(xùn)練階段隨機(jī)地跳過一些神經(jīng)元,驅(qū)動這一層其他的神經(jīng)元去捕捉松弛。簡單而有效。你可以從dropout方法開始。

  • 格點(diǎn)搜索不同的丟失比例。
  • 分別在輸入,隱藏層和輸出層中試驗(yàn)dropout方法
  • dropout方法也有一些拓展,比如你也可以嘗試drop connect方法。

也可以嘗試其他更傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)正則化方法,例如:

  • 權(quán)重衰減(Weight decay)去懲罰大的權(quán)重
  • 激活約束(Activation constraint)去懲罰大的激活值

你也可以試驗(yàn)懲罰不同的方面,或者使用不同種類的懲罰/正則化(L1, L2, 或者二者同時(shí))

以下是相關(guān)閱讀:

  • Dropout Regularization in Deep Learning Models With Keras(http://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/)
  • What is Weight Decay?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_decay)

8) 優(yōu)化和損失

最常見是應(yīng)用隨機(jī)梯度下降法(stochastic gradient descent),但是現(xiàn)在有非常多的優(yōu)化器。你試驗(yàn)過不同的優(yōu)化(方法)過程嗎?

隨機(jī)梯度下降法是默認(rèn)的選擇。先好好利用它,配以不同的學(xué)習(xí)率和動量。

許多更高級的優(yōu)化方法有更多的參數(shù),更復(fù)雜,也有更快的收斂速度。 好與壞,是不是需要用,取決于你的問題。

為了更好的利用好一個(gè)給定的(優(yōu)化)方法,你真的需要弄明白每個(gè)參數(shù)的意義,然后針對你的問題通過格點(diǎn)搜索不同的的取值。困難,消耗時(shí)間,但是值得。

我發(fā)現(xiàn)了一些更新更流行的方法,它們可以收斂的更快,并且針對一個(gè)給定網(wǎng)絡(luò)的容量提供了一個(gè)快速了解的方式,例如:

  • ADAM
  • RMSprop

你還可以探索其他優(yōu)化算法,例如,更傳統(tǒng)的(Levenberg-Marquardt)和不那么傳統(tǒng)的(genetic algorithms)。其他方法能夠?yàn)殡S機(jī)梯度下降法和其他類似方法提供好的出發(fā)點(diǎn)去改進(jìn)。

要被優(yōu)化的損失函數(shù)與你要解決的問題高度相關(guān)。然而,你通常還是有一些余地(可以做一些微調(diào),例如回歸問題中的均方誤(MSE)和平均絕對誤差(MAE)等),有時(shí)候變換損失函數(shù)還有可能獲得小的性能提升,這取決于你輸出數(shù)據(jù)的規(guī)模和使用的激活函數(shù)。

以下是相關(guān)閱讀:

  • An overview of gradient descent optimization algorithms(http://sebastianruder.com/optimizing-gradient-descent/)
  • What are conjugate gradients, Levenberg-Marquardt, etc.?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_numanal)
  • On Optimization Methods for Deep Learning, 2011 PDF(http://ai.stanford.edu/~ang/papers/icml11-OptimizationForDeepLearning.pdf)

9) Early Stopping/早停法

一旦訓(xùn)練過程中出現(xiàn)(驗(yàn)證集)性能開始下降,你可以停止訓(xùn)練與學(xué)習(xí)。這可以節(jié)省很多時(shí)間,而且甚至可以讓你使用更詳盡的重采樣方法來評估你的模型的性能。

早停法是一種用來避免模型在訓(xùn)練數(shù)據(jù)上的過擬合的正則化方式,它需要你監(jiān)測模型在訓(xùn)練集以及驗(yàn)證集上每一輪的效果。一旦驗(yàn)證集上的模型性能開始下降,訓(xùn)練就可以停止。

如果某個(gè)條件滿足(衡量準(zhǔn)確率的損失),你還可以設(shè)置檢查點(diǎn)(Checkpointing)來儲存模型,使得模型能夠繼續(xù)學(xué)習(xí)。檢查點(diǎn)使你能夠早停而非真正的停止訓(xùn)練,因此在***,你將有一些模型可供選擇。

以下是相關(guān)閱讀:

  • How to Check-Point Deep Learning Models in Keras(http://machinelearningmastery.com/check-point-deep-learning-models-keras/)
  • What is early stopping?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_stop)

4. 通過嵌套模型提升性能

你可以組合多個(gè)模型的預(yù)測能力。剛才提到了算法調(diào)參可以提高***的性能,調(diào)參之后這是下一個(gè)可以提升的大領(lǐng)域。

事實(shí)上,你可以經(jīng)常通過組合多個(gè)“足夠好的”模型來得到優(yōu)秀的預(yù)測能力,而不是通過組合多個(gè)高度調(diào)參的(脆弱的)模型。

你可以考慮以下三個(gè)方面的嵌套方式:

  1. 組合模型
  2. 組合視角
  3. 堆疊(Stacking)

1) 組合模型

有時(shí)候我們干脆不做模型選擇,而是直接組合它們。

如果你有多個(gè)不同的深度學(xué)習(xí)模型,在你的研究問題上每一個(gè)都表現(xiàn)的還不錯(cuò),你可以通過取它們預(yù)測的平均值來進(jìn)行組合。

模型差異越大,最終效果越好。例如,你可以應(yīng)用非常不同的網(wǎng)絡(luò)拓?fù)浠蛘卟煌募夹g(shù)。

如果每個(gè)模型都效果不錯(cuò)但是不同的方法/方式,嵌套后的預(yù)測能力將更加魯棒。

每一次你訓(xùn)練網(wǎng)絡(luò),你初始化不同的權(quán)重,然后它會收斂到不同的最終權(quán)重。你可以多次重復(fù)這一過程去得到很多網(wǎng)絡(luò),然后把這些網(wǎng)絡(luò)的預(yù)測值組合在一起。

它們的預(yù)測將會高度相關(guān),但是在那些難以預(yù)測的特征上,它會給你一個(gè)意外的小提升。

以下是相關(guān)閱讀:

  • Ensemble Machine Learning Algorithms in Python with scikit-learn(http://machinelearningmastery.com/ensemble-machine-learning-algorithms-python-scikit-learn/)
  • How to Improve Machine Learning Results(http://machinelearningmastery.com/how-to-improve-machine-learning-results/)

2) 組合視角

同上述類似,但是從不同視角重構(gòu)你的問題,訓(xùn)練你的模型。

同樣,目標(biāo)得到的是效果不錯(cuò)但是不同的模型(例如,不相關(guān)的預(yù)測)。得到不同的模型的方法,你可以依賴我們在數(shù)據(jù)那一小節(jié)中羅列的那些非常不同的放縮和轉(zhuǎn)換方法。

你用來訓(xùn)練模型的轉(zhuǎn)換方法越不同,你構(gòu)建問題的方式越不同,你的結(jié)果被提升的程度就越高。

簡單使用預(yù)測的均值將會是一個(gè)好的開始。

3) stacking/堆疊

你還可以學(xué)習(xí)如何***地組合多個(gè)模型的預(yù)測。這稱作堆疊泛化(stacked generalization),或者簡短來說就叫堆疊。

通常上,你使用簡單線性回歸方法就可以得到比取預(yù)測平均更好的結(jié)果,像正則化的回歸(regularized regression),就會學(xué)習(xí)如何給不同的預(yù)測模型賦權(quán)重?;€模型是通過取子模型的預(yù)測均值得到的,但是應(yīng)用學(xué)習(xí)了權(quán)重的模型會提升性能。

  • Stacked Generalization (Stacking)(http://machine-learning.martinsewell.com/ensembles/stacking/)

其余的可參考資源

別的地方有很多很好的資源,但是幾乎沒有能將所有想法串聯(lián)在一起的。如果你想深入研究,我列出了如下資源和相應(yīng)的博客,你能發(fā)現(xiàn)很多有趣的東西。

  • Neural Network FAQ(ftp://ftp.sas.com/pub/neural/FAQ.html)
  • How to Grid Search Hyperparameters for Deep Learning Models in Python With Keras(http://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/)
  • Must Know Tips/Tricks in Deep Neural Networks(http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html)
  • How to increase validation accuracy with deep neural net?(http://stackoverflow.com/questions/37020754/how-to-increase-validation-accuracy-with-deep-neural-net)

后 記

這是一篇很長的博客,我們講述了很多內(nèi)容。你并不需要去做所有事,也許這里面的某一點(diǎn)就足以給你好的想法去提升性能。簡單說來大概包括下面這些:

  • 選取一個(gè)方向
    • 數(shù)據(jù)
    • 算法
    • 調(diào)參
    • 嵌套模型
  • 在某一方向里選取一種方法
  • 在選取的方法中選取一件事情去嘗試
  • 比較結(jié)果,如果性能有提升,則保留
  • 不斷重復(fù)

來源:http://machinelearningmastery.com/improve-deep-learning-performance/

【本文是51CTO專欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】

 大數(shù)據(jù)文摘二維碼

責(zé)任編輯:趙寧寧 來源: 大數(shù)據(jù)文摘
相關(guān)推薦

2016-10-25 13:46:25

深度學(xué)習(xí)機(jī)器學(xué)習(xí)性能提升

2024-11-18 08:08:21

2014-05-14 10:13:50

程序員機(jī)器學(xué)習(xí)

2010-07-28 13:54:42

Flex數(shù)據(jù)綁定

2022-03-25 14:47:24

Javascript數(shù)據(jù)類型開發(fā)

2023-05-22 08:03:28

JavaScrip枚舉定義

2017-04-17 19:31:03

Android多線程

2013-06-14 15:24:57

Android開發(fā)移動開發(fā)數(shù)據(jù)存儲方式

2020-06-12 08:28:29

JavaScript開發(fā)技術(shù)

2014-12-25 09:41:15

Android加載方式

2021-12-22 09:34:01

Golagn配置方式

2013-10-17 09:25:52

2015-04-02 16:54:52

災(zāi)難恢復(fù)VDI災(zāi)難恢復(fù)

2015-04-13 11:39:26

VDI災(zāi)難恢復(fù)

2021-07-14 10:31:15

JavaScript開發(fā) 技巧

2021-12-01 15:40:40

節(jié)日開源剪貼畫

2024-01-17 13:56:00

Redis節(jié)點(diǎn)映射關(guān)系

2022-07-04 08:29:13

electron通信

2011-05-20 09:55:26

Oracle連接

2015-09-06 09:23:23

Android異步更新
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號