當前位置:
首頁 > 知識 > 小心訓練模型,數據少也可以玩轉深度學習

小心訓練模型,數據少也可以玩轉深度學習

選自Github

作者:Andrew L. Beam

機器之心編譯

最近,Jeff Leek 在 Simply Stats 上發表了一篇題為「如果你的數據量不夠大就不要使用深度學習」(Don"t use deep learning your data isn"t that big)的文章(鏈接見文末),認為只有獲得了谷歌、Facebook 這樣規模的數據才有資格做深度學習。對於這點 Andrew L. Beam(本文作者)並不反對,他認為這使我們清楚地意識到深度學習並不是一種萬能的靈藥;但是,雖然 Beam 同意其核心觀點,但是其還有很多不明確或不清晰的地方,並且 Beam 認為只要小心地訓練模型,就能在小數據設置中使用深度學習。機器之心對該文進行了編譯,原文鏈接請見文末。

Jeff Leek 採用兩種方法基於 MNIST 數據集對手寫字體進行分類。他對比了五層神經網路(激活函數使用的是 hyperbolic tangent)的系統和 Leekasso,Leekasso 僅僅使用了帶最小邊際 p-value 的 10 塊像素。他驚訝地表明,在使用少量樣本時,Leekasso 要比神經網路性能更加出色。

難道如果你的樣本量小於 100,就因為模型會過擬合并且會得出較差的性能而不能使用深度學習?可能情況就是如此,深度學習模型十分複雜,並且有許多訓練的技巧,我總感覺缺乏模型收斂性/複雜度訓練也許才是性能較差的原因,而不是過擬合。

深度學習 VS. Leekasso Redux

首先第一件事就是建立一個使用該數據集的深度學習模型,也就是現代版的多層感知機(MLP)和卷積神經網路(CNN)。如果 Leek 的文章是正確的話,那麼當只有少量樣本時,這些模型應該會產生嚴重的過擬合。

我們構建了一個激活函數為 RELU 的簡單 MLP 和一個像 VGG 那樣的卷積模型,然後我們再比較它們和 Leekasso 性能的差異。

所有的代碼都可下載:https://github.com/beamandrew/deep_learning_works/blob/master/mnist.py

多層感知機模型是非常標準的:

CNN 模型也和以前的十分相似:

作為參考,MLP 大約有 12 萬個參數,而 CNN 大約有 20 萬個參數。根據原文的假設,當我們有這麼多的參數和少量樣本時,模型好像真的會出錯。

我們儘可能地靠近原始分析,我們使用了 5 層交叉驗證(5-fold cross validation),但使用了標準 MNIST 測試集進行評估(大約有 2000 張測試樣本)。我們將測試集分為兩部分,上半部分用於評估訓練過程的收斂,而下半部分用於測量樣本預測的準確度。我們甚至沒有調整這些模型,對於大多數超參數,僅僅只是使用合理的默認值。

我們儘可能地重新構建了原文中 Leekasso 和 MLP 的 Python 版本。代碼可以在此處下載:https://github.com/beamandrew/deep_learning_works/blob/master/mnist.py

以下是每個模型的樣本精度:

這兩個模型的精度和原來的分析有很大的不同,原始分析中對小樣本使用 MLP 仍然有很差的效果,但我們的神經網路在各種樣本大小的情況下都可以達到非常完美的精度。

為什麼會這樣?

眾所周知,深度學習模型的訓練往往對細節要求極高,而知道如何「調參」是一件非常重要的技能。許多超參數的調整是非常具體的問題(特別是關於 SGD 的超參數),而錯誤地調參會導致整個模型的性能大幅度下降。如果你在構建深度學習模型,那麼就一定要記住:模型的細節是十分重要的,你需要當心任何看起來像深度學習那樣的黑箱模型。

下面是我對原文模型出現問題的猜測:

激活函數是十分重要的,而 tanh 神經網路又難以訓練。這也就是為什麼激活函數已經大量轉而使用類似「RELU」這樣的函數。

確保隨機梯度下降是收斂的。在原始比較中,模型只訓練了 20 個 epoch,這可能是不夠的。因為當 n=10 個樣本時,20 個 epochs 僅僅只有 20?10=200 次的梯度迭代更新。而遍歷全部的 MNIST 數據集大概相當於 6 萬次梯度更新,並且更常見的是遍曆數百到數千次(大約百萬次梯度更新)。如果我們僅僅執行 200 次梯度更新,那麼我們需要比較大的學習率,否則模型就不會收斂。h2o.deeplearning() 的默認學習率是 0.005,這對於少量的更新次數來說太小了。而我們使用的模型需要訓練 200 個 epoch,並且在前 50 次 epoch 中,我們能看到樣本精度有很大的一個提高。因此我猜測模型不收斂可以解釋兩者樣本精度的巨大差別。

經常檢查超參數的默認值。Keras 之所以這麼優秀,是因為其默認參數值通常反映了當前的最佳訓練,但同時我們也需要確保選擇的參數符合我們的問題。

不同的框架可能得出很不一樣的結果。我嘗試使用原 R 代碼去觀察能不能得到相似的結果。然而,我並不能使用 h2o.deeplearning() 函數得出一個優異的結果。我猜測可能是和其使用的優化過程有關,其好像使用的是彈性均值 SGD 以計算多個結點而加速訓練。我不知道當你僅有少量樣本數據時會不會出現故障,但我認為可能性是很大的。

幸好,RStudio 那些人太好了,他們剛剛發布了 Keras 的 R 介面:https://rstudio.github.io/keras/,這樣我就可以完全用 R 語言重建我的 Python 代碼了。我們之前使用 MLP 用 R 實現了就是這樣:

我將這個放進了 Jeff 的 R 代碼中,並重新生成了原來的圖表。我對 Leekasso 進行了一點修改。原來的代碼使用了 lm()(即線性回歸),我覺得很奇怪,所以我切換成了 glm()(即 logistic 回歸)。新的圖表如下所示:

深度學習真是厲害了!一個類似的現象可能能夠解釋 Leekasso 的 Python 和 R 版本之間的不同。Python 版本的 logistic 回歸使用了 liblinear 作為其解算器,我認為這比 R 默認的解算器更加可靠一點。這可能會有影響,因為 Leekasso 選擇的變數是高度共線性的(collinear)。

這個問題太簡單了,以致於不能說明什麼有意義的東西。我重新運行了 Leekasso,但僅使用了最好的預測器,其結果幾乎完全等同於全 Leekasso。實際上,我確定我可以做出一個不使用數據的且具有高準確度的分類器。只需要取其中心像素,如果是黑色,則預測 1,否則就預測 0,正如 David Robinson 指出的那樣:

David 還指出,大多數數字對(pairs of numbers)都可以由單個像素進行分類。所以,這個問題很可能不能給我們帶來任何關於「真實」小數據場景的見解,我們應當對其結論保持適當的懷疑。

關於深度學習為什麼有效的誤解

最終,我想要重新回到 Jeff 在文中所提出的觀點,尤其是這個聲明:

問題在於:實際上僅有少數幾個企業有足夠數據去做深度學習,[…] 但是我經常思考的是,在更簡單的模型上使用深度學習的主要優勢是如果你有大量數據就可以擬合大量的參數。

這篇文章,尤其是最後一部分,在我看來並不完整。很多人似乎把深度學習看成一個巨大的黑箱,有大量可以學習任何函數的參數,只要你有足夠的數據。神經網路當然是極其靈活的,這種靈活性正是其成功原因的一部分,但不是全部,不是嗎?

畢竟,這種超級靈活的模型在機器學習和統計學中有著 70 多年的發展歷史。我並不認為神經網路是先驗(priori)的,我也不認為比同等複雜度的其他演算法更靈活。

下面是我對其成功所作的原因總結:

在偏差/方差折衷中一切都是一個練習。更明白地講,我認為 Jeff 真正在做的辯駁是關於模型複雜度和偏差/方差折衷。如果你沒有很多數據,很可能訓練一個簡單模型(高偏差/低方差)要比複雜模型(低偏差/高方差)效果更好。客觀來講,在大多數情況下這是一個好建議,然而...

神經網路有很多技術來防範過擬合。神經網路有很多參數,按照 Jeff 的觀點如果我們沒有足夠的數據去可靠地評估這些參數值,將會導致高方差。我們清楚地意識到了這個問題,並且開發了很多降低方差的技術。比如 dropout 結合隨機梯度下降導致了一個像 bagging 一樣糟糕的處理,但是這是發生在網路參數上,而不是輸入變數。方差降低技術(比如 dropout)以其他模型難以複製的方式被加進了訓練程序。這使得你可以真正訓練大模型,即使沒有太多數據。

深度學習允許你輕易地把問題的具體約束直接整合進模型以降低方差。這是我想說明的最重要的一點,也是我們以前經常忽視的一點。由於其模塊化,神經網路使你可以真正整合,極大降低模型方差的強約束(先驗)。最好的一個實例是卷積神經網路。在 CNN 中,我們實際上把圖像的屬性編碼進模型本身。例如,當我們指定一個大小為 3x3 的過濾器時,實際上是在直接告訴網路本地連接的像素的小集群將包含有用的信息。此外,我們還可以把圖像的平移和旋轉不變性直接編碼進模型。所有這些都將模型偏差至圖像屬性,以極大地降低方差,提升預測性能。

你並不需要擁有谷歌量級的數據。以上所述意味著即使人均 100 到 1000 個樣本也能從深度學習中受益。通過所有這些技術,我們可以改善方差問題,而且依然可以從其靈活性中受益。你甚至可以通過遷移學習來創建其他工作。

總結一下,我認為上述原因很好地解釋了為什麼深度學習在實踐中奏效,打破了深度學習需要大量參數和數據的假設。最後,本文並不是想說 Jeff 的觀點錯了,而是旨在提供一個不同的新視角,為讀者帶來啟發。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

觀點|小心訓練模型,數據少也可以玩轉深度學習
學界|讓機器耳濡目染:MIT提出跨模態機器學習模型
引爆學術界的新型歸一化方法:SNN提出新型激活函數SELU
Yoav撰文再回應LeCun:「深度學習這群人」不了解NLP
OpenAI提出強化學習新方法:讓智能體學習合作、競爭與交流

TAG:機器之心 |

您可能感興趣

為什麼深度學習要使用大量數據?
機器學習到底需要多少數據?可能並不是越多越好
數據科學,人工智慧,機器學習,深度學習到底啥關係?
使用實體嵌入的結構化數據進行深度學習
努力學習,開始數據結構導論
如今的數據科學家,距離深度學習有多遠?
數據大爆炸,硬碟不夠用!超大容量機械硬碟才是最經濟的選擇
數據化科學養魚,懂水才能不暴斃
數據增強:數據有限時如何使用深度學習?
創建深度學習數據平台時,你需要考慮的五個因素
對深度學習系統的數據流攻擊
染髮大師基礎數據模型,看懂了你就是調色大師
深度學習工程模板:簡化載入數據、構建網路、訓練模型和預測樣本的流程
通過機器學習讓醫療數據更好用
Lobe:超小白的機器學習平台,讓你不懂編程也能自造數據集
大數據潮流下的機器學習及應用場景
用數據集訓練演算法識別惡意軟體,就像識別貓一樣簡單
從概念到應用:一文搞定數據科學和機器學習的最常見面試題
推斷時代的數據流動性:概率計算帶來了太多的希望,但這一切可能被數據的零和博弈所抑制
打造數據中心高可用性的五大步驟