如何ensemble多個神經網路?
就是比如imagenet的ensemble是怎麼做的?
最近參加了個機器閱讀理解比賽,粗暴地試了下同模型設置不同參數,四個模型加權ensemble提升了2.94%,不過混合模型排名第一名的那個團隊在單模型上提升了7%,也是厲害了。
http://www.hfl-tek.com/cmrc2017/leaderboard.html
===================================
最近正好研究這個,不請自來。Ensemble俗稱「博採眾長」 ,就是針對一個任務,訓練多個模型,最後把各個學習結果加權輸出。
(圖片來自 Bagging, boosting and stacking in machine learning,侵刪)
方法主要有以下2種:
1. Bagging (bootstrap aggregating) :
即再取樣 (Bootstrap) ,在每個樣本上訓練出來的模型取平均,從而降低模型的 variance。
A)從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping的方法抽取 n 個訓練樣本。共進行k輪抽取,得到k個訓練集。
B)每次使用一個訓練集得到一個模型,k 個訓練集共得到 k 個模型。
C)對分類問題:將上步得到的k個模型採用多數投票或者對輸出求均值的方法統計所有分類器的分類結果,結果最高的類別即為最終標籤。對回歸問題,計算上述模型的均值作為最後的結果。
例如隨機森林(random forest )。 準確的說隨機森林應該是Bagging的一種延伸。
(圖片來自http://lib.csdn.net/article/machinelearning/35135,侵刪)
2. Boosting:
Boosting 是一種迭代演算法,根據上一次迭代的預測結果對樣本進行加權,減小誤差,降低模型的bias。 代表演算法是adaboost(adaptive boosting)。
(A) 在初始化時訓練數據,對每一個訓練集賦予相同的權重1/n
(B) 對訓練集訓練 k 輪,每次訓練後,對訓練失敗的訓練列賦予較大的權重(在後續的學習中集中對比較難的訓練列進行訓練),從而得到一個預測函數序列{h_1,..., h_m},預測效果好的預測函數權重大,反之小。
(C) 最終的預測函數H對分類問題採用有權重的投票方式,對回歸問題採用加權平均的方式對新樣本判別。
可以參考這個PPT,https://courses.cs.washington.edu/courses/cse473/12au/slides/lect27.pdf
同時推薦周志華老師的綜述:http://www.islab.ece.ntua.gr/attachments/article/86/Ensemble%20methods%20-%20Zhou.pdf
此外,Ensembling neural networks: Many could be better than all
這裡面提到了一種GASEN,首先訓練多個模型,然後隨機給每個模型賦予權重,使用遺傳演算法對權值進行進化,最後得到權值化的神經網路。據說這樣有利於提升泛化能力。
基於投票的ensemble的代碼
Hvass-Labs/TensorFlow-Tutorials謝邀。
腦子裡第一個想到的也是投票
(也許是句題外話)神經網路的dropout其實可以看作bagging,能緩解過擬合。
Dropout或者Dropconnect可以看成是多個神經網路的ensemble,每次迭代隨機去掉一些神經元或者連接,帶來的好處就是泛化能力更強。
之前做了個展示,介紹了下VC維和模型的方差-偏差,以及具體解決過擬合的一些方法,其中Dropout/Dropconnect就是其中的一些思路。
具體可以參見:過擬合與模型容量 - 知乎專欄
ImageNet 不清楚,不過我可以說說 Neural Machine Translation 怎麼搞。
從本質上講,一個訓好的翻譯器就是一個條件語言模型,一般是用解碼時是做鏈式分解,每一步都需要根據得到分布 P(當前詞 | 目標語言句子已經解碼出的單詞,源語言句子) 並從中選取一個合適的詞。
Nematus 的論文裡面說:
Nematus provides support for applying single models, as well as using multiple models in an ensemble – the latter is possible even if the model architectures differ, as long as the output vocabulary is the same. At each time step, the probability distribution of the ensemble is the geometric average of the individual models』 probability distributions.
也就是,如果幾個模型輸出辭彙表一樣,每一步就把這幾個模型預測的下一個詞的概率拿出來做幾何平均(其實我覺得算數平均更合適,也確實有系統是用算數平均做的),作為最終融合後的模型的下一個詞的分布。
參見大概15年前的ijcai best paper runner up:
Ensembling neural networks: Many could be better than all每個network輸出的都是一個distribution,在上面stack一個classifier就行了
adaboost如何實現?sklearn裡面那個好像是對單一模型做的。誰有對多模型的實現例子?
把多個網路的輸出concatenate後接fc層
推薦閱讀:
※如何自學平面設計專業的幾個軟體?
※VOT2016有什麼值得關注的?
※怎麼能夠有效地知道自己對計算機視覺哪個方向感興趣?
※除了美帝的學校,哪些國家的哪些學校CS的ML,CV方向的PHD值得去讀?為什麼?
※學習了哪些知識,計算機視覺才算入門?
TAG:機器學習 | 計算機視覺 | 深度學習DeepLearning |