深度學習系列3 - CNNs 以及應對過擬合的詳細探討

原文地址:Deep Learning-3-more-on-cnns-handling-overfitting

原文作者:Rutger Ruizendaal

譯文出自:掘金翻譯計劃

本文永久鏈接:github.com/xitu/gold-mi

譯者:曹真

校對者:Lilei&&changkun

深度學習系列3 - CNNs 以及應對過擬合的詳細探討

什麼是卷積、最大池化和 Dropout?

這篇文章是深度學習系列中一篇文章。請查看#系列1和#系列2

歡迎來到本系列教程的第三部分的學習!這周我會講解一些卷積神經網路(Convolutional Neural Network, CNN)的內容並且討論如何解決欠擬合和過擬合。

一、卷積(Convolution)

那麼究竟什麼是卷積呢?你可能還記得我之前的博客,我們使用了一個小的濾波器(Filter),並在整個圖像上滑動這個濾波器。然後,將圖像的像素值與濾波器中的像素值相乘。使用深度學習的優雅之處在於我們不必考慮這些濾波器應該是什麼樣的(神經網路會自動學習並選取最佳的濾波器)。通過隨機梯度下降(Stohastic Gradient Descent,SGD),網路能夠自主學習從而達到最優濾波器效果。濾波器被隨機初始化,並且位置不變。這意味著他們可以在圖像中找到任何物體。同時,該模型還能學習到是在這個圖像的哪個位置找到這個物體。

零填充(Zero Padding)是應用此濾波器時的有用工具。這些都是在圖像周圍的零像素的額外邊框 —— 這允許我們在將濾鏡滑過圖像時捕獲圖像的邊緣。你可能想知道濾波器應該多大,研究表明,較小的濾波器通常表現更好。在這個例子當中,我們使用大小為 3x3 的濾波器。

當我們將這些濾波器依次滑過圖像時,我們基本上創建了另一個圖像。因此,如果我們的原始圖像是 30x 30 ,則帶有12個濾鏡的卷積層的輸出將為 30x30x12 。現在我們有一個張量,它基本上是一個超過 2 維的矩陣。現在你也就知道 TensorFlow 的名字從何而來。

在每個卷積層(或多個)之後,我們通常就得到了最大池化(Max pooling)層。這個層會減少圖像中的像素數量。例如,我們可以從圖像中取出一個正方形然後用這個正方形裡面像素的最大值代替這個正方形。

得益於最大池化,我們的濾波器可以探索圖像的較大部分。另外,由於像素損失,我們通常會增加使用最大池化後的濾波器數量。

理論上來說,每個模型架構都是可行的並且為你的的問題提供一個很好的解決方案。然而,一些架構比其他架構要快得多。一個很差的架構可能需要超過你剩餘生命的時間來得出結果。因此,考慮你的模型的架構以及我們為什麼使用最大池並改變所使用的濾波器的數量是有意義的。為了在 CNN 上完成這個部分,這個頁面提供了一個很好的視頻,可以將發生在 CNN 內部的事情可視化。

二、欠擬合 vs. 過擬合

你如何知道你的模型是否欠擬合? 如果你的驗證集的準確度高於訓練集,那就是模型欠擬合。此外,如果整個模型表現得不好,也會被稱為欠擬合。例如,使用線性模型進行圖像識別通常會出現欠擬合的結果。也有可能是 Dropout(Dropout)的原因導致你在深層神經網路中遇到欠擬合的情況。

Dropout 在模型訓練時隨機將部分激活函數設置為零(讓網路某些隱含層節點的權重不工作),以避免過擬合。這種情況一般不會發生在驗證/測試集的預測中,如果發生,你可以移除Dropout來解決。如果模型現在出現大規模的過擬合,你可以開始添加小批量的Dropout。

通用法則:從過度擬合模型開始,然後採取措施消除過擬合。

當你的模型過度適合訓練集時,就會發生過擬合。那麼模型將難以泛化從而無法識別不在訓練集中的新例子。例如,你的模型只能識別你的訓練集中的特定圖像,而不是通用模型,同時你在訓練集上的準確性會高於驗證/測試集。那麼我們可以通過哪些方法來減少過擬合呢?

減少過擬合的步驟

  1. 添加更多數據
  2. 使用數據增強
  3. 使用泛化性能更佳的模型結構
  4. 添加正規化(多數情況下是 Dropout,L1 / L2正則化也有可能)
  5. 降低模型複雜性。

第一步當然是採集更多的數據。但是,在大多數情況下,你是做不到這一點的。這裡我們先假定你採集到了所有的數據。下一步是數據增強:這也是我們一直推薦使用的方法。

數據增強包括隨機旋轉圖像、放大圖像、添加顏色濾波器等等。

數據增加只適用於訓練集而不是驗證/測試集。檢查你是不是使用了過多的數據增強十分有效。例如,如果你那一隻貓的圖片放大太多,貓的特徵就不再可見了,模型也就不會通過這些圖像的訓練中獲得更好的效果。下面讓我們來探索一下數據增強!

對於 Fast AI 課程的學習者:請注意教材中使用 「width_zoom_range」 作為數據擴充參數之一。但是,這個選項在 Keras 中不再可用。

現在我們來看看執行數據增強後的圖像。所有的「貓」仍然能夠被清楚地識別出來。

第三步是使用泛化性能更佳的模型結構。然而,更重要的是第四步:增加正則化。三個最受歡迎的選項是:Dropout,L1 正則化和 L2 正則化。我之前提到過,在深入的學習中,大部分情況下你看到的都是 Dropout 。Dropout 在訓練中刪除隨機的激活樣本(使其為零)。在 Vgg 模型中,這僅適用於模型末端的完全連接的層。然而,它也可以應用於卷積層。要注意的是,Dropout 會導致信息丟失。如果你在第一層失去了一些信息,那麼整個網路就會丟失這些信息。因此,一個好的做法是第一層使用較低的Dropout,然後逐漸增加。第五個也是最後一個選擇是降低網路的複雜性。實際上,在大多數情況下,各種形式的正規化足以應付過擬合。

左邊是原來的神經網路,右邊是採用 Dropout 後的網路

三、批量歸一化(Batch Normalization )

最後,我們來討論批量歸一化。這是你永遠都需要做的事情!批量歸一化是一個相對較新的概念,因此在 Vgg 模型中尚未實現。

如果你對機器學習有所了解,你一定聽過標準化模型輸入。批量歸一化加強了這一步。批量歸一化在每個卷積層之後添加「歸一化層」。這使得模型在訓練中收斂得更快,因此也允許你使用更高的學習率。

簡單地標準化每個激活層中的權重不起作用。隨機梯度下降非常頑固。如果使得其中一個比重非常高,那麼下一次訓練它就會簡單地重複這個過程。通過批量歸一化,模型可以在每次訓練中調整所有的權重而非僅僅只是一個權重。

四、MNIST 數字識別

MNIST手寫數字數據集是機器學習中最著名的數據集之一。數據集也是一個檢驗我們所學 CNN 知識的很好的方式。Kaggle也承載了 MNIST 數據集。這段我很快寫出的代碼,在這個數據集上的準確度為96.8%。

import pandas as pdnfrom sklearn.ensemble import RandomForestClassifiernntrain = pd.read_csv(train_digits.csv)ntest = pd.read_csv(test_digits.csv)nnX = train.drop(label, axis=1)ny = train[label]nnrfc = RandomForestClassifier(n_estimators=300)npred = rfc.fit(X, y).predict(test)n

然而,配備深層 CNN 可以達到 99.7% 的效果。本周我將嘗試將 CNN 應用到這個數據集上,希望我在下周可以報告最新的準確率並且討論我所遇到的問題。

如果你喜歡這篇文章,歡迎推薦它以便其他人可以看到它。您還可以按照此配置文件跟上我在快速AI課程中的進度。到時候見!

譯者註: 翻譯本文的時候,我事先查閱了一些資料以保證對於原文有更好的理解,但是由於個人水平有限等等原因,有些地方表達的不甚清楚,同時還添加了一定的輔助參考信息以更好的說明問題。若讀者在譯文中發現問題,歡迎隨時與我聯繫或提 issue。

掘金翻譯計劃是一個翻譯優質互聯網技術文章的社區,文章來源為掘金上的英文分享文章。內容覆蓋Android、iOS、React、前端、後端、產品、設計等領域,想要查看更多優質譯文請持續關注掘金翻譯計劃。

推薦閱讀:

從梯度下降到擬牛頓法:盤點訓練神經網路的五大學習演算法
Python寫簡單的線性分類器
3blue1brown的神經網路:part1 筆記
《A COMPARE-AGGREGATE MODEL FOR MATCHING TEXT SEQUENCES》閱讀筆記

TAG:深度学习DeepLearning | 神经网络 | 人工智能 |