1. 程式人生 > >提升深度學習模型的表現,你需要這20個技巧

提升深度學習模型的表現,你需要這20個技巧

機器之心編譯 

本文原文的作者 Jason Brownlee 是一位職業軟體開發者,沒有博士學位的他通過「從應用中學習」的方法自學了機器學習,他表示對幫助職業開發者應用機器學習來解決複雜問題很有熱情,也為機器學習社群貢獻了很多實用的建議和指南,本文所講解的是「能幫助你對抗過擬合以及實現更好的泛化」的 20 個技巧和技術。

你可以怎樣讓你的深度學習模型實現更好的表現?

這是一個我常被問到的問題:「我該怎麼提升準確度?」或者「如果我的神經網路表現很糟糕我該怎麼辦?」……

我常常給出的回答是:「我也不完全知道,但我有很多想法。」

然後我開始列出所有我可以想到的可能能夠帶來效果改進的想法。我將這些想法彙集到了這篇部落格中,這些想法不僅能在機器學習上為你提供幫助,而且實際上也適用於任何機器學習演算法。

提升演算法的表現的想法

這份列表並不是完整的,但是卻是一個很好的開始。

我的目標是給你大量可以嘗試的想法,希望其中會有一兩個是你從來沒有想到過的。畢竟,你總是需要好的想法來獲得進步。

我將這份列表分成了 4 個子主題:

1. 通過資料提升效能表現

2. 通過演算法提升效能表現

3. 通過演算法微調提升效能表現

4. 通過整合提升效能表現

列表越往後,其所能帶來的增益就越小。比如說,關於你的問題的新型框架或更多的資料所帶來的效果總是會比微調你表現最好的演算法所帶來的效果更好。儘管並不總是如此,但一般而言確實是這樣。

其中一些想法是特定於人工神經網路的,但還有許多是很通用的,你可以借鑑它們從而在使用其它技術來提升你的效能表現上獲得靈感。

下面就讓我們正式開始吧!

1. 通過資料提升效能表現

修改你的訓練資料和問題定義可以給你帶來巨大的好處,也可能能帶來最大的好處。

下面是一些我們將會涵蓋的內容的一個短列表:

1. 獲取更多資料

2. 創造更多資料

3. 重新調整資料的規模

4. 轉換資料

5. 特徵選擇

1)獲取更多資料

你能獲取更多訓練資料嗎?

基本上,你的訓練資料的質量就限制了你的模型的質量。你需要為你的問題尋找最好的資料,而且是很多很多資料。

深度學習和其它現代非線性機器學習技術都是資料越多越好,深度學習尤其是這樣。這也是深度學習如此激動人心的主要原因之一。

讓我們看一下下面的圖:

為什麼選擇深度學習?來自吳恩達的幻燈片

更多的資料並不總是有用,但它可以有用。如果要我選擇,我肯定會希望獲得更多的資料。

相關推薦:

  • 演算法上的資料集(https://www.edge.org/response-detail/26587)

2)創造更多資料

深度學習演算法得到的資料越多,通常就表現得越好。如果你無法合理地得到更多資料,你可以創造更多資料。

  • 如果你的資料是數字的向量,就在已有的向量上進行隨機的修改來創造資料。

  • 如果你的資料是影象,就在已有的影象上進行隨機的修改。

  • 如果你的資料是文字,就在已有的文字上進行隨機的修改……

這個過程常被稱為資料增強(data augmentation)或資料生成(data generation)。

你可以使用生成模型,也可以使用某些簡單的技巧。

比如,對於照片影象資料,你可以通過隨機移位和旋轉已有的影象來獲得新影象。這能夠提升模型對於資料中這種變換的歸納能力——如果它們也預計會出現新資料中。這也和增加噪聲有關,我們過去叫做新增抖動(adding jitter)。這可被用作是抑制過擬合訓練資料集的正則化方法。

相關推薦:

  • 使用 Keras 進行深度學習的影象增強(http://machinelearningmastery.com/image-augmentation-deep-learning-keras/)

  • 什麼是抖動?(使用噪聲進行訓練)(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_jitter)

3)重新調整資料的規模

這是個快速的方法。

將傳統的拇指規則應用於神經網路:將你的資料的規模重新調整到你的啟用函式的範圍內。

如果你使用的是 S 型啟用函式,那麼就將你的資料調整到值位於 0 到 1 之間。如果你使用的是雙曲正切(tanh),就將你的值調整到 -1 到 1 之間。這適用於輸入(x)和輸出(y)。比如說,如果你在輸出層有一個 S 型函式來預測二元值,你可以將你的 y 值規範為二元的。如果你使用的是 softmax,你仍然可以從規範化 y 值中獲益。

這仍然是一個好的拇指規則,但我會更進一步。

我建議你按以下形式創造你的訓練資料集的不同版本:

  • 規範成 0 到 1;

  • 重新調整到 -1 到 1;

  • 標準化。

然後在每一個數據集上評估你的模型的表現。選擇其中一個,然後再雙倍下注。如果你修改了你的啟用函式,再重複這個小實驗。

網路中大數值的積累並不是好事。此外,還有一些讓你的網路中的數值變小的方法,例如規範化啟用和權重,但我們會在後面談論這些技術。

相關推薦:

  • 我應該標準化輸入變數(列向量)嗎?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_std)

  • 如何在 Python 環境中利用 Scikit-Learn 包來為機器學習準備資料?(http://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

4)轉換你的資料

這和上述建議的規模重調相關,但是需要更多的工作。

你必須真正瞭解你的資料,並將其視覺化,然後尋找出那些離群的資料。

估計每個列的單變數分佈。

  • 列是否看起來像是一個傾斜的高斯分佈,考慮用 Box-Cox 變換來調整傾斜的情況

  • 列是否看起來像是一個指數分佈,考慮用對數變換

  • 列是否看起來像是擁有一些特徵,但正在被一些明顯的東西衝擊,試著利用平方或者平方根

  • 能否用某些方式讓特徵更具體或者離散來更好地強調這些特徵

根據你的直覺,去嘗試一些新的東西。

  • 能否利用主成分分析一類的投影方法預處理資料?

  • 能否將多個屬性聚合成為一個單一變數?

  • 能否用一個新的布林標誌揭示問題的一些有趣的地方?

  • 能否用其他方式探索時間結構或者其他結構?

神經網路可以進行特徵學習。它們能做到這點。

但如果你能更好地將問題的結構展示給神經網路用於學習,它們能更好地解決問題。

抽查大量的不同轉換形式的資料或者某些特定屬性,看看什麼可行什麼不可行。

相關推薦:

  • 如何定義你的機器學習問題(http://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)

  • 挖掘特徵工程。如何設計特徵以及如何合理利用它們(http://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)

  • 如何用 Python 和 Scikit-learn 結合的方式為機器學習準備資料(http://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

5)特徵選取

神經網路一般都對無關聯的資料是穩健的。

它們將使用一個接近於零的權重並邊緣化那些非預測屬性的貢獻。

不過,這是運用在那些無需做出好的預測的資料上的資料、權重和訓練週期。能否從你的資料中刪除某些屬性?有很多特徵選擇方法和特徵重要性的方法可以給你一些關於特徵的想法,從而能更好的利用它們。嘗試一部分。嘗試全部。這樣做是為了獲得想法。。同樣,如果你有時間,我會建議利用相同的網路來評估一些不同選擇視角下的問題,看看它們的表現如何。

  • 也許你可以用更少的特徵做得一樣好,甚至有更好表現。是的,更快!

  • 也許所有的特徵選擇方法可以引匯出相同特定子集的特徵。是的,對無用的功能達成共識!

  • 也許選定的子集給你提供了一些想法或者更多的你可以執行的特徵工程。是的,更多的想法!

相關推薦:

  • 特徵選擇簡介(http://machinelearningmastery.com/an-introduction-to-feature-selection/)

  •  Python 環境中機器學習的特徵選擇(http://machinelearningmastery.com/feature-selection-machine-learning-python/)

6)重構你的問題

退一步再看你的問題。

你所收集的觀察是唯一能構建你問題的方式嗎?

也許還有其他更好的地方。也許其他的問題框架可以更好地展示問題的某些結構從而能更好地進行學習?

我真的很喜歡這項練習,因為這迫使你開啟你的內心。這很難,尤其是當你現階段已經投資了你的自負、時間和金錢。

即使你只是列出了 3 到 5 個備用的框架並讓它們打了折扣,至少你正在你選擇的方式中建立你的信心。

  • 也許你可以在某個允許時間步驟的視窗或方法中整合時間元素

  • 也許你的分類問題可以變成一個迴歸問題,或者相反

  • 也許你的二元輸出可以變成一個 softmax 輸出

  • 也許你可以對一個子問題建模

這是一個想清問題的好方法,這也是一個在你想要利用工具之前的可行框架,因為你在解決方案上的投資會更少。

不管怎樣,如果你卡住了,這個簡單的方式還可以讓你思若泉湧。

此外,你不必丟棄任何你之前的工作,看看之後的整合吧。

相關推薦:

  • 如何定義你的機器學習問題(http://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)

2. 通過演算法提升表現表現

機器學習就是關於演算法的。

所有的理論和數字都描述了運用不同的方式從資料中學習一個決策過程(如果我們將自己限制在一個可預測模型中)。你已經選擇利用深度學習來處理問題。這是你可以選擇的最好方式嗎?

在本節中,在繼續深入研究你為何選擇深度學習方法的某些細節之前,我們討論一些關於演算法選擇的小的想法。

  • Spot-Check Algorithms. 抽查演算法

  • Steal From Literature. 從文獻中獲取

  • Resampling Methods. 重取樣方法

讓我們開始吧。

1)抽樣演算法

振作起來,你在事前可以不知道哪種演算法能最好地執行你的問題。如果你知道,你可能不會需要機器學習。你收集的什麼證據能證明你所選擇的方法是一個好的選擇?讓我們來解決這個難題。

當表現在所有的問題中處於平均值時,沒有一種單獨的演算法可以比其他任何的都執行地更好。所有的演算法都是平等的。這是從沒有免費的午餐定理中總結歸納的。也許你的演算法並不是解決你的問題的最好的方式。現在,我們不是要解決所有可能的問題,但是在所有演算法中最新最熱的那個不一定是你處理某個特定訓練集最好的方法。我的建議是收集證據。想象可能會有更好的演算法並給它們一個處理你問題的公平的機會。抽查一系列頂級的演算法,看看哪些表現不錯,哪些表現不好。

  • 評估某些線性方法,比如邏輯迴歸和線性判別分析

  • 評估一些樹的方法,比如分類迴歸樹、隨機森林和 Gradient Boosting

  • 評估一些例項方法,比如支援向量機和 K 最近鄰

  • 評估其他的一些神經網路演算法,比如 LVQ、MLP、CNN、LSTM、混合結構等等

重點關注表現最佳的,並通過進一步的調整或者資料準備提高表現。對你選擇的深度學習方法進行結果排名,它們如何比較?也許你可以放下深度學習模型,並使用一些更快更簡化的方式去訓練,這甚至可以很容易理解。

相關推薦:

  • 一種用於機器學習的資料驅動方法(http://machinelearningmastery.com/a-data-driven-approach-to-machine-learning/)

  • 為什麼你應該在你的機器學習問題上進行演算法抽查(http://machinelearningmastery.com/why-you-should-be-spot-checking-algorithms-on-your-machine-learning-problems/)

  • 在 Python 環境中使用 Scikit-learn 抽查分類機器學習演算法(http://machinelearningmastery.com/spot-check-classification-machine-learning-algorithms-python-scikit-learn/)

2)從文獻中獲取演算法

一種獲取好演算法的捷徑是從文獻中獲取。還有誰跟你處理過一樣的問題,他們用了什麼方法?檢視論文、書籍、部落格、問答網站、教程和一切谷歌丟給你的東西。寫下所有的想法,並按照你自己的方式處理它們。這不是研究的複製,這是關於一些你沒有想到過的但可能能夠提升你的思路的新想法。發表出來的研究是高度優化過的。有很多聰明的人寫下了很多有趣的事情。在這些廣袤的資源中挖掘你需要的金礦吧。

相關推薦:

  • 如何研究一個機器學習演算法(http://machinelearningmastery.com/how-to-research-a-machine-learning-algorithm/)

  • 谷歌學術搜尋(http://scholar.google.com/)

3)重取樣方法

你必須知道你的模型有多好。你對你的模型的效能估計可靠嗎?深度學習演算法的訓練很慢。這通常意味著我們不能使用黃金標準方法來估計模型的效能,比如 k-fold 交叉驗證。

  • 也許你正在使用一個簡單的訓練集/測試集分割,這是很常見的。如果是這樣,你需要確保這個分割能夠代表這個問題。單變數統計和視覺化將會是一個良好的開端。

  • 也許你可以利用硬體來提高評估結果。比如,如果你有一個叢集或者 Amazon Web Services 的賬戶,我們可以並行訓練 n 個模型然後再取領軍和標準差去得到一個更穩健的估計。

  • 也許你可以使用一個驗證 hold out 集來在它正在訓練時獲得一個驗證模型效能的想法(對過早終止有用,見後文)。

  • 也許你能撤回一個你只在模型選擇演算後使用的完全無效的驗證集。

走另一條路,也許可以使資料集更小,使用更強的重取樣方法。

  • 也許你可以在一個只在某一樣本中訓練的模型和在整個樣本中訓練的模型之間看到很強的相關性。也許你可以進行模型選擇並利用小資料集微調,然後將最終的技術擴充套件到完整的資料集上。

  • 也許你可以任意約束資料集,然後取樣,並將其用於所有的模型開發

你必須對你模型的效能估計有充足的信心。

相關推薦:

  • 評估 Keras 中深度學習模型的效能

  • 評估利用重取樣方法的 Python 中機器學習演算法的效能

3. 通過演算法調優改進效能

這才是肥肉所在。

你總能夠從抽查中找出一兩個不錯的演算法。得到表現最好的演算法可能要花費一定的時間。下面是一些調優神經網路演算法從而得到更好的表現的方法:

  • 診斷

  • 權重初始化

  • 學習率

  • 啟用函式

  • 網路拓撲

  • Batches 和 Epochs

  • 正則化

  • 優化與損失

  • 早停

你可能需要對給定網路的配置訓練許多次(3-10 次或更多),從而對該配置的表現作出很好的評估。在這個小節中你學到的微調技可應用於所有方面。

  • 推薦一篇很好的講解超引數優化的文章:http://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/

1) 診斷

如果你知道架構的表現為什麼沒有改進,那你就能更好的改進其表現了。比如,是因為模型過擬合或者欠擬合?要切記這個問題。網路總是會在擬合上出問題,只是程度不同而已。一個快速瞭解你的模型的學習行為的方式是在每個 epoch 在訓練和驗證資料集上對模型進行評估,並標繪結果。

模型在訓練和驗證資料集上的準確率

  • 如果訓練比驗證集的結果更好,你可能過擬合了,可以使用正則化技術進行調整

  • 如果兩個結果都很低,你可能欠擬合了,可以通過增加網路的容量並進行更多、更長的訓練進行調整

  • 如果有一個訓練高於驗證結果的拐點,你可以使用早停(Early Stopping)

經常標繪這樣的圖,並研究使用不同的技術改進模型的表現。這些圖可能是你所能創造的最有價值的診斷方法。另外一個有幫助的診斷方法是學習網路正確和錯誤的觀察值。

在一些問題上,下面這些建議可以嘗試一下:

  • 在難以訓練的樣本上,你可能需要更多的或增強的樣本。

  • 在容易建模的訓練資料集上,你可能需要移除大量樣本。

  • 可能你需要使用專門的模型,專注於輸入空間不同的明確區域。

相關推薦:

  • 在 Keras 中顯示深度學習模型訓練歷史(http://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/)

  • 深度學習演算法的過擬合和欠擬合(http://machinelearningmastery.com/overfitting-and-underfitting-with-machine-learning-algorithms/)

2)權重初始化

過去的經驗法則是:使用小型隨機數值進行初始化。

在實踐中,這個法則仍然很好,但對你的網路而言它是最好的嗎?

不同的啟用函式也所啟發,但我在實踐中不記得看到過有什麼不同。

修定好你的網路並嘗試不同的初始化方案。記住,權重是你一直想要找到的模型的實際引數。有許多套權重能給出好的表現,但你需要的是更好的表現。

  • 嘗試所有的初始化方法,看有沒一個是最好的。

  • 嘗試用自編碼器(autoencoder)這樣的無監督方法進行預學習。

  • 為了解決你的問題,嘗試使用已有的方法重複訓練新的輸入和輸出層(遷移學習)

記住,改變權重初始化方法會影響到啟用函式,甚至是優化函式。

相關推薦:

  • 深度網路的初始化:http://deepdish.io/2015/02/24/network-initialization/

3)學習率

調整學習率總會有所收穫。下面是一些可以探索的方法:

  • 用超大或超小的學習率進行試驗

  • 從文獻中找到常用的學習率值,看你能將網路改進到什麼地步

  • 嘗試隨著 epoch 降低學習率。

  • 嘗試經過一定量的 epoch 訓練後,就按一定概率降低學習率

  • 嘗試增加一個動量項,然後同時對學習率和動量進行網格搜尋

越大的網路需要越多的訓練,反之亦然。如果你增加更多的神經元或更多的層,請增加你的學習率。學習率與訓練 epoch 的數量、batch 的大小、優化方法是緊密相關的。

相關推薦:

  • 在 Python 中對深度學習模式使用學習率方案:http://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/

  • 反向傳播應該使用什麼樣的學習率?:ftp://ftp.sas.com/pub/neural/FAQ2.html#A_learn_rate 

4)啟用函式

你或許應該使用 rectifier 啟用函式。

它們用起來更好。

在那之前,在輸出層上,一開始是 sigmoid 和 tanh 函式,然後是一個 softmax 函式、線性函式或者 sigmoid 函式。我不推薦做更多的嘗試,除非你知道你在做什麼。

嘗試這三個函式並且調整你的資料以滿足這些函式的邊界。

很明顯,你想選擇適合輸出的形式的傳遞函式(transfer function),但是要考慮利用不同的表徵。

例如,從二元分類(binary classification)的 sigmoid 函式切換到解決迴歸問題的線性函式,然後後處理(post-process)你的輸出。

這或許也需要將損失函式換成某些更加適合的東西。下面是關於資料轉換的更多的想法。

相關推薦:

  • 為什麼要使用啟用函式:ftp://ftp.sas.com/pub/neural/FAQ2.html#A_act

5)網路拓撲

改變你的網路結構會有回報。

你需要多少層和多少個神經元?

沒人只知道,所以別問。

你必須為你的問題開發出好配置。試驗。

  • 嘗試一個隱藏層包含很多個神經元(寬)

  • 嘗試每層只有少量神經元的深度網路(深)

  • 嘗試將以上結合起來

  • 從最新的論文中找出與你類似的架構並嘗試它們

  • 嘗試拓撲模式(扇出然後扇入)和書與論文中的好的經驗規則(見下面連結)

後面的網路需要更多的訓練,在 epochs 和學習率上都需要。做相應的調整。

相關推薦:

下面的連結可以給你很多嘗試的想法,對我很有用。

  • 我應該用多少個隱藏層?:ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hl

  • 我應該用多少個隱藏單元?:ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu

6)Batches 和 Epochs

Batch 的大小限定了梯度以及多久更新權重。一個 epoch 是分批(batch-by-batch)暴露給網路的整個訓練資料。你試驗過不同的 batch 大小和 epochs 量嗎?

上面我已經談過學習率、網路大小和 epochs 之間的關係了。帶有大 epoch 的小 batch 和大量的訓練 epoch 在現在的深度學習部署中很常見。以下這些方法可能不符合你的問題:

  • 嘗試將 batch 大小與訓練資料的大小對等,這依賴於記憶體(batch learning)

  • 嘗試大小為 1 的 batch(線上學習)

  • 嘗試不同 mini-batch 大小(8、16、32...)的網格搜尋

  • 嘗試分別訓練一些 epoch 以及大量的 epoch

考慮下接近無限量的 epoch,並設立抽查點捕捉最好的表現模型。一些網路架構要比其他架構對 batch 的大小更敏感。我認為多層感知機對 batch 大小比較穩健,LSTM 和 CNN 比較敏感,但這只是傳聞。

相關推薦:

  • What are batch, incremental, on-line, off-line, deterministic, stochastic, adaptive, instantaneous, pattern, constructive, and sequential learning?:ftp://ftp.sas.com/pub/neural/FAQ2.html#A_styles

  • 直觀上,mini-batch 的大小如何影響(隨機)梯度下降的效能?:https://www.quora.com/Intuitively-how-does-mini-batch-size-affect-the-performance-of-stochastic-gradient-descent

7)正則化

正則化是遏制過擬合訓練資料的很好的方法。最新的熱門正則化技術是 dropout,你試過嗎?Dropout 在訓練期間隨機跳過神經元,並強迫層內其他演算法重拾這些神經元。簡單而有效,開始 dropout 吧!

網格搜尋不同的 dropout 百分比。

在輸入層、隱藏層和輸出中試驗 dropout。

關於 dropout 的想法還有一些擴充套件,可以像 drop connect(http://cs.nyu.edu/~wanli/dropc/)那樣嘗試它們。

你也可以考慮其他更傳統的神經網路正則化技術,比如:

  • 權重衰減以懲罰最大的權重

  • 啟用約束,以懲罰最大啟用

在可被懲罰的不同方面和可以應用的不同型別的懲罰(L1,L2,L1 和 L2 同時使用)上進行試驗。

相關推薦:

  • Keras 的深度學習模型中的 dropout 正則化:http://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/

  • 什麼是權重衰減:ftp://ftp.sas.com/pub/neural/FAQ3.html#A_decay

8)優化和損失

曾經的方法是隨機梯度下降,但現在有很多可以優化的方式。你有試過不同的優化程式嗎?隨機梯度下降是預設的。首先用不同的學習率、動量和學習率計劃充分利用它。許多更高階的優化方法會提供更多的引數,更多的複雜性以及更快的收斂性。這是好是壞,取決於你的問題。

為了最大化給定的方法,你真的需要深入到每一個引數,然後根據你的問題網格搜尋不同的值。這困難,且耗費時間。但也可能有回報。

我發現新的/流行的方法可以收斂得更快並且能對於一個給定的網路拓撲結構的能力給出一個很快的想法,例如:

  • ADAM(論文請點選「閱讀原文」下載)

  • RMSprop

你還可以探索其他的優化演算法,比如更傳統的(Levenberg-Marquardt)和不太傳統的(遺傳演算法)。其他的方法可以為隨機梯度下降法提供很好的起點和優化的方式。要優化的損失函式和你將要解決的問題是密切相關的。不過,你會有一些迴旋的餘地(用於迴歸的 MSE 和 MAE 度量,等等),你也可能會通過換算你問題的損失函式得到一個小的凸點。這也可能與輸入資料的規模和正在使用的啟用函式的規模緊密相關。

相關推薦:

  • 梯度下降優化演算法概述:http://sebastianruder.com/optimizing-gradient-descent/

  • 什麼是共軛梯度,Levenberg-Marquardt 等?ftp://ftp.sas.com/pub/neural/FAQ2.html#A_numanal

  • 深度學習的優化演算法,點選「閱讀原文」下載

9)早停

一旦效能開始下降,你可以終止學習。這可以節省大量的時間,甚至可能讓你使用更復雜的重取樣方法來評估模型的效能。早停是一種遏制訓練資料過擬合的正則化手段,要求你在每一個 epoch 中監控訓練模型的表現並驗證資料集。一旦驗證資料集的表現開始下降,訓練就可以停止。如果這一條件得到滿足(測量精度損失),你還可以設定檢查點來儲存模型,並允許模型繼續學習。檢查點可以讓你在沒有停止的情況下早停,給你幾個模型在執行結束時進行選擇。

相關推薦:

  • 如何在 Keras 的深度學習模型中設定檢查點:http://machinelearningmastery.com/check-point-deep-learning-models-keras/

  • 什麼是早停?:ftp://ftp.sas.com/pub/neural/FAQ3.html#A_stop

4. 用模型組合(Ensemble)來提升表現

你可以將多個模型的預測相結合。演算法除錯後,這是需要改進的下一個大區域。事實上,你可以從多個足夠好的模型的預測結合中獲取好的表現,而不是多個高度調整(脆弱)的模型。我們會看看你可能要考慮的模型組合的三大領域:

  • Combine Models. 模型結合

  • Combine Views. 視角結合

  • Stacking. 堆

1)模型結合

不要選擇一個模型,把它們結合起來。如果你有多個不同的深度學習模型,每個模型都在這個問題上的表現良好,那麼通過取均值來結合它們的預測。模型越不相同,效果越佳。例如,你可以使用完全不同的網路拓撲結構或者不同的技術。如果每個模型都很靈巧,但方式不同,那麼整合預測將更為強勁。或者,你可以用相反的位置進行試驗。每次訓練網路的時候,你要用不同的權重對這個網路進行初始化,該網路會收斂成一組不同的最終權重。將此過程重複多次,生成許多的網路,然後結合這些網路的預測。

它們的預測將是高度相關的,但它可能會在這些模式上給你一個更難預測的小凸點(bump)。

相關推薦:

  • 在 Python 中用 scikit-learn 組合機器學習演算法:http://machinelearningmastery.com/ensemble-machine-learning-algorithms-python-scikit-learn/

  • 如何提高機器學習演算法的結果:http://machinelearningmastery.com/how-to-improve-machine-learning-results/

2)視角結合

正如上文所述,但是以你的問題的一個不同視角或框架來訓練每個網路。再一遍,目標是得到熟練的的模型,但是用不同的方式(比如不相關的預測)。你可以依靠非常不同的縮放(scaling)和上文中提到的轉換技巧。用於訓練不同模型的問題的轉換和框架越多,就越有可能改善你的結果。運用預測的簡單平均將是一個良好的開端。

3)層疊

你還可以瞭解如何最好地結合多種模型的預測。這就是所謂的層疊泛化,簡稱層疊(是 stacking)。通常情況下,你可以利用像正則迴歸這樣學習如何為不同模型的預測加權的簡單線性方法來取得更好均值結果。基準結果使用多個子模型的預測的平均,但是會用學到的模型權重提升表現。

相關推薦:

  • 層疊泛化(層疊):http://machine-learning.martinsewell.com/ensembles/stacking/

附加資源

有很多很好的資源,但很少能將所有的想法都聯絡在一起。我將列出一些資源和相關的釋出資訊,如果你想深入瞭解,你會發現這很有趣。

相關推薦:

  • 神經網路常見問題解答:ftp://ftp.sas.com/pub/neural/FAQ.html

  • 如何在 Python 中使用 Keras 網格搜尋深度學習模型的超引數:http://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/

  • 必須知道的深度神經網路提示/技巧:http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html

  • 如何增加深度神經網路驗證的準確性:http://stackoverflow.com/questions/37020754/how-to-increase-validation-accuracy-with-deep-neural-net