更多幹貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)
即使對於老手而言,深度學習仍然是一種神祕的藝術。因為人們通常在大型資料集上進行復雜的實驗,這就掩蓋了資料集、超引數和效能之間的基本關係,人們無法窺一斑而知全豹。
本文的目標是通過在小型資料集上執行非常簡單的實驗,來獲得深度神經網路的一些基本直覺。這些實驗有助於人們理解通常在大型資料集上發生的趨勢。這些實驗被設計為“原子”的,因為它們試圖以一種可控的方式來分析深度學習的基本方面。此外,這些實驗並不需要專門的硬體,它們只需執行幾分鐘,不需要 GPU。執行時間是基於只使用 CPU 的機器測得的。
所有這些實驗都是用 Python 編寫的,使用了 tensorflow 和 sklearn 庫,但鑑於篇幅,本文中大部分程式碼都被抽象出來,以便使實驗更容易執行。請參閱 Github repo 的完整程式碼 (https://github.com/abidlabs/AtomsOfDeepLearning/ )。
通用逼近性定理指出,一個具有單個隱藏層和標準啟用函式的簡單前饋神經網路(即多層感知器),如果隱藏層具有足夠數量的單位,它就可以近似任何連續函式。讓我們在實踐中看一下,看看需要多少單位來近似一些特定函式。
方法:我們將在 50 個資料點 (x,y) 上訓練一個 1 層神經網路,這些資料點從域 [-1,1] 上的以下函式中繪製,所得擬合的均方誤差(mean square error,MSE)。我們將嘗試以下函式(你可隨時通過更改以下程式碼來嘗試自己的函式。):
假設: 隨著隱藏層中單位的數量增加,所得擬合的正確率(Accuracy)將會增加(誤差將會減少)。
執行實驗所需的時間: 91.595 s
結論: 隨著隱藏單位數量的增加,訓練資料的逼近誤差一般會減小。
討論: 儘管通用逼近定理指出,具有足夠引數的神經網路可以近似一個真實的分類 / 迴歸函式,但它並沒有說明這些引數是否可以通過隨機梯度下降這樣的過程來習得。另外,你可能想知道我們是否可以從理論上計算出需要多少神經元才能很好地近似給定的函式。你可參閱論文《NEURAL NETWORKS FOR OPTIMAL APPROXIMATION OFSMOOTH AND ANALYTIC FUNCTIONS》對此的一些討論。
論文地址:
https://pdfs.semanticscholar.org/694a/d455c119c0d07036792b80abbf5488a9a4ca.pdf
在實踐中,更深的多層感知器(具有超過一個隱藏層)在許多感興趣的任務上的表現,在很大程度上都勝過淺層感知器。為什麼會出現這種情況呢?有人認為,更深的神經網路僅需更少的引數就可以表達許多重要的函式類。理論上已經表明,表達簡單的徑向函式和組合函式需要使用淺層網路的指數級大量引數。但深度神經網路則不然。劇透警告:我打算用實驗來驗證這些論文,但我不能這樣做(這並不會使論文的結果無效——僅僅因為存在一組神經網路引數,並不意味著它們可以通過隨機梯度下降來輕鬆習得)。我唯一能做的就是,某種程度上可靠地再現來自論文《Representation Benefits of Deep Feedforward Networks》的唯一結果,這篇論文提出了一系列困難的分類問題,這些問題對更深層的神經網路而言更容易。
Representation Benefits of Deep Feedforward Networks 論文地址:https://arxiv.org/pdf/1509.08101.pdf
簡單徑向函式論文:https://arxiv.org/pdf/1512.03965.pdf
組合函式論文:https://arxiv.org/pdf/1603.00988.pdf
方法: 該資料集由沿著 x 軸的 16 個等距點組成,每對相鄰點都屬於相反的類。一種特殊型別的深度神經網路(一種跨層共享權重的神經網路)具有固定數量(152)的引數,但測試了層的不同數量。
假設: 隨著具有固定數量引數的神經網路中層數的增加,困難的分類問題的正確率將得到提高。
執行實驗所需的時間: 28.688 s
此處,紅點和藍點代表屬於不同類別的點。黑色的虛線表示最接近神經網路學習的訓練資料近似值(若神經網路分配的分數大於零,則被預測為紅點;否則,被預測為藍點)。零線顯示為黑色。
結論: 在大多實驗中,正確率隨深度的增加而增加。
討論: 似乎更深的層允許從輸入到輸出的學習到的函式出現更多“急彎”。這似乎跟神經網路的軌跡長度有關(即衡量輸入沿著固定長度的一維路徑變化時,神經網路的輸出量是多少)。
軌跡長度論文:https://arxiv.org/pdf/1606.05336.pdf
深度學習和大資料密切相關;通常認為,當資料集的規模大到足夠克服過擬合時,深度學習只會比其他技術(如淺層神經網路和隨機森林)更有效,並更有利於增強深層網路的表達性。我們在一個非常簡單的資料集上進行研究,這個資料集由高斯樣本混合而成。
方法: 資料集由兩個 12 維的高斯混合而成,每個高斯生成屬於一個類的資料。兩個高斯具有相同的協方差矩陣,但也意味著在第 i 個維度上有 1/i1/i 單位。這個想法是基於:有一些維度,允許模型很容易區分不同的類,而其他維度則更為困難,但對區別能力還是有用的。
假設: 隨著資料集大小的增加,所有技術方法的測試正確率都會提高,但深度模型的正確率會比非深度模型的正確率要高。我們進一步預計非深度學習技術的正確率將更快地飽和。
執行實驗所需的時間: 138.239 s
結論: 神經網路在資料集大小方面上表現始終優於 SVM 和隨機森林。隨著資料集大小的增加,效能上的差距也隨之增加,至少在神經網路的正確率開始飽和之前,這表明神經網路更有效地利用了不斷增加的資料集。然而,如果有足夠的資料,即使是 SVM 也會有可觀的正確率。深度網路比淺層網路的表現更好。
討論: 雖然增加的資料集大小確實會像我們預計的那樣有利於神經網路。但有趣的是,在相對較小的資料集上,神經網路已經比其他技術表現得更好。似乎 2 層網路並沒有顯著的過擬合,即使我們預計某些特徵(如 6-12 特徵,訊號水平低)導致網路過擬合。同樣有趣的是,SVM 看上去似乎有足夠的資料來接近於 1.0。
當資料集不平衡時(如一個類的樣本比另一個類還多),那麼神經網路可能就無法學會如何區分這些類。在這個實驗中,我們探討這一情況是否存在。同時我們還探討了過取樣是否可以減輕問題帶來的影響,這是一種流行的補救措施,該措施使用少數類中抽樣替換的樣本。
方法:我們生成兩個二維的結果(結果未在這裡顯示,表明相同的結果適用於更高維)高斯,每個產生屬於一個類別的資料。兩個高斯具有相同的協方差矩陣,但它們的意思是在第 i 個維度上相距 1/i1/i 單位。每個訓練資料集由 1,200 個資料點組成,但我們將類別不平衡從 1:1 變為 1:99。測試資料集以 1:1 的比例保持固定,以便於效能比較,並由 300 個點組成。我們還會在每種情況下顯示決策邊界。
假設:我們預計測試正確率會隨著類別不平衡的增加而降低,但我們預計過取樣可以緩解這個問題。
執行實驗所需的時間: 392.157 s
最下面的四張圖顯示了連同訓練點(左)或測試點(右)繪製的決策邊界的數量。第一行顯示沒有重取樣法的結果,底部顯示了使用重取樣法的結果。
結論: 研究結果表明,類的不平衡無疑地降低了分類的正確率。重取樣法可以顯著提高效能。
討論: 重取樣法對提高分類正確率有顯著的影響,這可能有點讓人驚訝了,因為它並沒有將分類器展示少數類中的新訓練的樣本。但該圖顯示,重取樣法足以“助推(nudge)”或將決策邊界推向正確的方向。在重取樣法不是有效的情況下,那麼可能需要複合方式來合成新的訓練樣本,以提高正確率。
相關論文地址:http://www.jair.org/media/953/live-953-2037-jair.pdf
具有許多引數的神經網路具有記憶大量訓練樣本的能力。那麼,神經網路是僅僅記憶訓練樣本(然後簡單地根據最相似的訓練點對測試點進行分類),還是它們實際上是在提取模式並進行歸納?這有什麼不同嗎?人們認為存在不同之處的一個原因是,神經網路學習隨機分配標籤不同於它學習重複標籤的速度。這是 Arpit 等人在論文中使用的策略之一。讓我們看看是否有所區別?
相關論文地址:https://arxiv.org/pdf/1706.05394.pdf
方法: 首先我們生成一個 6 維高斯混合,並隨機分配它們的標籤。我們測量訓練資料的正確率,以增加資料集的大小,瞭解神經網路的記憶能力。然後,我們選擇一個神經網路能力範圍之內的資料集大小,來記憶並觀察訓練過程中神經網路與真實標籤之間是否存在本質上的差異。特別是,我們觀察每個輪數的正確率度,來確定神經網路是真正學到真正的標籤,還是隨機標籤。
假設: 我們預計,對隨機標籤而言,訓練應該耗費更長的時間。而真正標籤則不然。
執行實驗所需的時間: 432.275 s
結論: 神經網路的記憶能力約為 150 個訓練點。但即便如此,神經網路也需要更長的時間來學習隨機標籤,而不是真實值(ground truth)標籤。
討論: 這個結果並不令人感到意外。我們希望真正的標籤能夠更快的學到,如果一個神經網路學會正確地分類一個特定的資料點時,它也將學會分類其他類似的資料點——如果標籤是有意義的,但前提它們不是隨機的!
當處理非常高維的資料時,神經網路可能難以學習正確的分類邊界。在這些情況下,可以考慮在將資料傳遞到神經網路之前進行無監督的降維。這做法提供的是幫助還是摧毀呢?
方法: 我們生成兩個 10 維高斯混合。高斯具有相同的協方差矩陣,但在每個維度上都有一個由 1 隔開的均值。然後,我們在資料中新增“虛擬維度”,這些特徵對於兩種型別的高斯都是非常低的隨機值,因此對分類來說沒有用處。然後,我們將結果資料乘以一個隨機旋轉矩陣來混淆虛擬維度。小型資料集大小 (n=100) 使神經網路難以學習分類邊界。因此,我們將資料 PCA 為更小的維數,並檢視分類正確率是否提高。
假設: 我們預計 PCA 將會有所幫助,因為變異最多的方向(可能)與最有利於分類的方向相一致。
執行實驗所需的時間: 182.938 s
結論: 當維度非常大時,無監督的 PCA 步驟可以顯著改善下游分類。
討論: 我們觀察到一個有趣的閾值行為。當維數超過 100 時(有趣的是,這數字是資料集中資料點的數量——這值得進一步探討),分類的質量會有顯著的下降。在這些情況下,5~10 維的 PCA 可顯著地改善下游分類。
在通過具有超出典型 ReLU() 和 tanh() 的特殊啟用函式的神經網路獲得小幅提高的研究,已有多篇論文報導。我們並非試圖開發專門的啟用函式,而是簡單地詢問它是否可能在神經網路中使用任何舊的非線性函式?
方法: 我們生成著名的二維衛星資料集,並訓練一個具有兩個隱藏層的神經網路來學習對資料集進行分類。我們嘗試了六種不同的啟用函式。
假設: 我們預計恆等函式執行很差(因為直到最後一個 softmax 層,網路仍然保持相當的線性)。我們可能會進一步期望標準的啟用函式能夠發揮最好的效果。
執行實驗所需的時間: 22.745 s
結論: 除去 sign(x) 外,,所有的非線性啟用函式對分類任務都是非常有效的。
討論: 結果有些令人吃驚,因為所有函式都同樣有效。事實上,像 x2 這樣的對稱啟用函式表現得和 ReLUs 一樣好!從這個實驗中,我們應該謹慎地推斷出太多的原因。首先,這是一個相對較淺的神經網路。對這種網路有好處的啟用函式可能與那些對深度網路有好處的函式非常不同。此外,這個任務可能過於簡單,即使幾乎完全線性的神經網路 f(x)=x 也能達到約 88% 的正確率。
方法: 我們生成兩個 12 維高斯混合。高斯具有相同的協方差矩陣,但在每個維度上都有一個由 1 隔開的均值。該資料集由 500 個高斯組成,其中 400 個用於訓練,100 個用於測試。我們在這個資料集上訓練一個神經網路,使用不同的批大小,從 1 到 400。我們測量了之後的正確率。
假設: 我們期望較大的批大小會增加正確率(較少的噪聲梯度更新),在一定程度上,測試的正確率將會下降。我們預計隨著批大小的增加,執行時間應有所下降。
執行實驗所需的時間: 293.145 s
結論: 正如我們預期那樣,執行時間確實隨著批大小的增加而下降。然而,這導致了測試正確率的妥協,因為測試正確率隨著批大小的增加而單調遞減。
討論: 這很有趣,但這與普遍的觀點不一致,嚴格來說,即中等規模的批大小更適用於訓練。這可能是由於我們沒有調整不同批大小的學習率。因為更大的批大小執行速度更快。總體而言,對批大小的最佳折衷似乎是為 64 的批大小。
相關論文:https://arxiv.org/abs/1508.02788
對於分類任務,通常使用交叉熵損失函式。如果我們像通常在迴歸任務中那樣使用均方差,結果會怎麼樣?我們選擇哪一個會很重要麼?
方法: 我們生成兩個 12 維高斯混合。高斯具有相同的協方差矩陣,但在每個維度上都有一個由 1 隔開的均值。該資料集由 500 個高斯組成,其中 400 個用於訓練,100 個用於測試。我們使用幾種不同的函式在這個資料集上訓練一個神經網路,以確定最終正確率是否存在系統差異。作為陰性對照,包括一個不變的損失函式。
假設: 我們預計交叉熵損失函式作為分類任務的標準損失函式,表現最好,同時我們預計其他損失函式表現不佳。
執行實驗所需的時間: 36.652 s
結論: 除去陰性對照外,所有的損失都有類似的表現。損失函式是標籤與邏輯之間的區別,提升到四次冪,其效能要比其他差一些。
討論: 損失函式的選擇對最終結果沒有實質影響,這也許不足為奇,因為這些損失函式非常相似。
方法: 我們生成兩個 12 維高斯混合。高斯具有相同的協方差矩陣,但在每個維度都有一個由 1 隔開的均值。該資料集由 500 個高斯組成,其中 400 個用於訓練,100 個用於測試。我們在這個神經網路中初始化權重值,看哪一個具有最好的訓練效能。
假設: 我們期望 Xavier 損失具有最好的效能(它是 tensorflow 中使用的預設值),而其他方法效能不佳(尤其是不斷的初始化)。
執行實驗所需的時間: 34.137 s
結論: Xavier 和高斯(具有較低的方差)初始化會得到很好的訓練。有趣的是,常數 0 的初始化最終導致訓練,而其他初始化並不會。
討論: Xavire 初始化提供了最好的效能,這並不奇怪。標準偏差小的高斯也適用(但不像 Xavire 那樣好)。如果方差變得太大,那麼訓練速度就會變得較慢,這可能是因為神經網路的大部分輸出都發生了爆炸。有趣的是,持續的初始化(理論上不應該能夠訓練神經網路)在幾個輪數之後就會導致訓練進行。這可能是由於核心並行化導致小的數值誤差,最終導致了不同權重的散度。有趣的是,當權重都為 1 時,這些就都不起作用了。
在本節中,我們將研究神經網路的權重值,並視覺化它們在整個訓練過程中的變化情況。
我們的第一個問題是,不同層的權重是否以不同的速度收斂。
方法: 我們生成兩個 12 維高斯混合。高斯具有相同的協方差矩陣,但每個維度上都有一個由 1 隔開的均值。該資料集由 500 個高斯組成,其中 400 個用於訓練,100 個用於測試。我們在這個資料集上訓練一個帶有 3 個隱藏層(將導致 4 層權重,包括從輸入到)第一層的權重)的神經網路,我們在訓練過程中繪製每層 50 個權重值。我們通過繪製兩個輪數之間的權重的差分來衡量收斂性。
假設: 我們期望後一層的權重會更快地收斂,因為它們在整個網路中進行反向傳播時,後期階段的變化會被放大。
執行實驗所需的時間: 3.924 s
結論: 我們發現後一層的權重比前一層收斂得更快。
討論: 看上去第三層的權重是幾乎單調地收斂到它們的最終值,而且這一過程非常快。至於前幾層權重的收斂模式,比較複雜,似乎需要更長的時間才能解決。
方法: 我們生成兩個 12 維高斯混合。高斯具有相同的協方差矩陣,但在每個維度上都有一個由 1 隔開的均值。該資料集由 500 個高斯組成,其中 400 個用於訓練,100 個用於測試。我們在這個資料集上訓練一個具有 2 個隱藏層的神經網路,並在整個訓練過程中繪製 50 個權重值。然後我們在損失函式中包含 L1 或 L2 正則項之後重複這一過程。我們研究這樣是否會影響權重的收斂。我們還繪製了正確率的影象,並確定它在正則化的情況下是否發生了顯著的變化。
假設: 我們預計在正則化的情況下,權重的大小會降低。在 L1 正則化的情況下,我們可能會得到稀疏的權重。如果正則化強度很高,我們就會預計正確率下降,但是正確率實際上可能會隨輕度正則化而上升。
執行實驗所需的時間: 17.761 s
結論: 我們注意到正則化確實降低了權重的大小,在強 L1 正則化的情況下導致了稀疏性。對正確率帶來什麼樣的影響尚未清楚。
討論: 從我們所選的 50 個權重的樣本可以清晰地看出,正則化對訓練過程中習得的權重有著顯著的影響。我們在 L1 正則化的情況下能夠獲得一定程度的稀疏性,雖然看起來有較大的正則化強度,這就導致正確率的折衷。而 L2 正則化不會導致稀疏性,它只有更小幅度的權重。同時,對正確率似乎沒有什麼有害的影響。
我們只是剛剛開始做了膚淺的研究。例如,所有這些實驗都涉及(不是那麼深的)MLP,並且有很多實驗如果用 CNN 或 RNN 來做會很有趣。如果你想新增一個實驗,請考慮以下我認為值得探討的一些觀點:
批大小和學習率之間的關係是什麼?
端到端的學習與訓練神經網路在任務上的區別是什麼?
什麼是批標準化?它為什麼有用?
當資料有限時,遷移學習對神經網路有沒有幫助?
更多幹貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)