吳恩達Deeplearning.ai 全部課程學習心得分享

 2017-10-27 10:38:59.0

選自Medium

作者:Ryan Shrott

機器之心編輯部

本文作者,加拿大國家銀行首席分析師 Ryan Shrott 完成了迄今為止(2017 年 10 月 25 日)吳恩達在 Coursera 上發布的所有深度學習課程,並為我們提供了課程解讀。

目前 Coursera 上可用的課程中,有三門課非常值得關注:

1. 神經網絡與深度學習(Neural Networks and Deep Learning)

2. 改進深度神經網絡:調整超參數、正則化與優化(Improving Deep Neural Networks: Hyperparamater tuning, Regularization and Optimization)

3. 結構化機器學習項目(Structuring Machine Learning Projects)

我發現這三門課非常重要,在其中,我們可以從吳恩達教授那裡獲得很多有用的知識。吳恩達在教學語言上做得很好,解釋概念清晰明了。例如,吳恩達明確指出監督學習並沒有超出多維曲線擬合過程的範疇,而對於這種方法的其他理解方式,如對人類神經系統的模擬,實際上並不嚴謹。

學習這些課程的基礎知識要求不多,只要求你事先掌握一些線性代數,以及 Python 基礎編程知識。在我看來,你也需要了解向量計算來理解優化過程的內在知識。但如果你不關心內部運作方式,並只希望了解高級層面上的內容,儘管跳過微積分的部分。

第 1 課:為什麼深度學習如此熱門?

現在人類產生的 90% 數據是在最近 2 年內被收集的。深度神經網絡(DNN)能夠利用體量巨大的數據。因此,DNN 超越了較小的網絡和傳統學習算法。


規模是如何推動 DNN 性能的

此外,算法上的創新也使得 DNN 的訓練速度變得更快。例如,從 Sigmoid 激活函數改為 RELU 激活函數對梯度下降等任務的優化過程產生了巨大影響。這些算法的改進使得研究人員可以更快地遍歷靈感→ 代碼→ 經驗的開發循環,從而帶來更多的創新。


深度學習開發循環

第 2 課:深度學習中的向量化

在開始這門課之前,我並不知道神經網絡可以在沒有任何明確循環語句的情況下被實現(除了層之間的)。吳恩達點明了 Python 中向量化編程設計的重要性。課程附帶的作業引導你進行向量化的編程,同時這些方法也可以很快遷移到你自己的項目中。

第 3 課:深入了解 DNN

前幾門課實際上在引導你使用 NumPy 從頭開始實現前向和反向傳播。通過這種方法,我更加深入了解了高級深度學習框架(如 TensorFlow 和 Keras)的工作原理。吳恩達解釋了計算圖背後的想法,從而讓我們了解了 TensorFlow 如何實現「神奇優化」的。

第 4 課:為什麼需要深度?

在這一節中,吳恩達深入解釋了 DNN 的層概念。例如,對於面部識別系統,他向我們解釋了先處理的層是用於處理面部邊界的,其後的層用於將這​​些邊界識別為面部組件(如鼻子、眼睛、嘴等),再其後的層會將這些組件整合到一起識別人的身份。他還解釋了電路理論(circuit theory)的思想——存在一個函數,需要來自隱藏單元指數式的數字來適應淺網絡的數據。可以通過添加有限數量的附加層來簡化指數問題。

第 5 課:處理偏差和方差的工具

吳恩達解釋了研究者識別和處理偏差方差相關問題的步驟。下圖詮釋了一種解決這些問題的系統性方法。


解決偏差和方差問題的方法

他還解決了偏差和方差之間的「權衡」(tradeoff)。他認為在現在這個深度學習的時代,我們擁有獨立解決每個問題的工具,使權衡不再存在。

第 6 課:正則化

為什麼向成本函數添加懲罰項會降低方差?在上這門課之前我的理解是它使權重矩陣接近於零,從而產生一個更「線性」的函數。吳恩達給出了另外一種和 tanh 激活函數相關的解釋,即較小的權重矩陣生成較小的輸出,使得輸出圍繞在 tanh 函數線性區域的中心。


tanh 激活函數

他還給出了 dropout 的有趣解釋。之前我認為 dropout 在每次迭代中消滅隨機神經元,就像越小的網絡線性程度就越強一樣。但是吳恩達的解釋是從單個神經元的角度來看待生命(life)。


單個神經元的角度

由於 dropout 隨機消滅連接,這促使神經元向父系神經元中更加均勻地擴展權重。通過擴展權重,它可以減少權重的 L2 範數(squared norm)。他還解釋了 dropout 是 L2 正則化的自適應形式,兩種方法效果相近。

第 7 課:歸一化為何有效?

吳恩達展示了為什麼歸一化可以通過繪製等高線圖的方式加速優化步驟。他詳細講解了在歸一化和非歸一化等高線圖上進行梯度下降所需要的迭代次數變化,即相同優化算法沒經過歸一化操作會需要更多的迭代數。

第 8 課:初始化的重要性

吳恩達表示不使用參數初始化可能導致梯度消失或爆炸。他展示了多個步驟來解決這些問題。基本原則是確保每一層的權重矩陣的方差都近似為 1。他還討論了 tanh 激活函數的 Xavier 初始化。

第 9 課:為什麼使用小批量梯度下降?

吳恩達使用等高線圖解釋了使用小批量和大批量訓練之間的權衡。基本原則是較大的批量每次迭代會變慢,較小的批量可以加快迭代過程,但是無法保證同樣的收斂效果。最佳方法就是在二者之間進行權衡,使得訓練過程比一次性處理整個數據集要快,又能利用向量化技術的優勢。

第 10 課:高級優化技術的直觀理解

吳恩達解釋了合適使用動量(momentum)和 RMSprop 等技術限制梯度下降逼近極小值的路徑。他還用球滾下山的例子生動地解釋了這一過程。他把這些方法結合起來來解釋著名的 Adam 優化。

第 11 課:基本的 TensorFlow 後端理解

吳恩達不僅解釋瞭如何使用 TensorFlow 實現神經網絡,同時還講解了在優化過程中出現的後端進程。有一個家庭作業就是鼓勵我們使用 TensorFlow 實現 dropout 和 L2 正則化,這加強了我對後端過程的理解。

第 12 課:正交化

吳恩達還討論了機器學習策略中正則化的重要性。其基本思想是,我們希望實現並控制影響算法性能的因素,即一次只控制一個影響性能的因素。例如為了解決偏差問題,我們可以使用更大的網絡或更魯棒的優化技術,我們希望這些控制只影響偏差而不會影響其它如泛化等問題。缺少正交化控制的案例是過早停止了算法的最優化過程,因為這樣會同時影響模型的偏差和方差。

第 13 課:單數值評估度量的重要性

吳恩達強調了選擇單數值評估度量(single number evaluation metric)的重要性,它可以允許我們評估算法。如果目標改變,我們應該在模型開發過程中僅更改評估度量。吳恩達給我們講解了一個使用貓分類應用識別色情圖片的案例。

第 14 課:測試和開發集的分佈

通常我們會假設測試集與開發集(dev sets)的分佈相同,這就確保了我們在迭代過程中朝向正確的目標優化。這同樣意味著如果你決定糾正測試集中錯誤的標註數據,那麼你需要在開發集中糾正錯誤標註的數據。

第 15 課:處理不同的訓練和測試/開發分佈

吳恩達介紹了為什麼我們對訓練和測試/開發集沒有相同的分佈這一問題感興趣。因為我們希望根據實際關心的樣本來計算評估度量。例如我們可能希望使用和訓練問題無關的的樣本進行訓練,但我們並不希望算法使用這些樣本進行評估,這就令我們的算法可以在更多的數據上進行訓練。經驗上,這種方法可以在許多案例上產生非常好的效果。缺點是可能我們的訓練和測試/開發集有不同的分佈,這個問題的通常解決辦法是,可以留出一小部分訓練集,並確定訓練集的泛化性能。然後我們可以比較這些誤差率與實際的開發誤差,併計算一個「數據誤匹配」的度量標準。吳恩達還解釋了解決這些數據誤匹配問題的方法,例如人工數據合成。

第 16 課:訓練集/開發集/測試集大小

在深度學習時代,訓練集/開發集/測試集的分隔方法也發生了巨大的改變。之前,我只知道較普遍的 60/20/20 分隔。吳恩達強調,對於一個非常大的數據集,應該使用 98/1/1 甚至 99/0.5/0.5 的分隔。這是因為開發集合測試集只要足夠大能保證模型處於團隊設定的置信區間即可。如果你使用 1 千萬個訓練樣本,那麼 10 萬樣本(即數據集的 1%)就足夠保證開發集和/或測試集的置信區間了。

第 17 課:近似貝葉斯最優誤差

吳恩達解釋了在某些應用中人類級別的性能如何作為貝葉斯誤差的替代。例如,在視覺和聽覺識別任務中,人類級別的誤差通常很接近貝葉斯誤差,可以用於量化模型中可避免的偏差。如果沒有諸如貝葉斯誤差這樣的基準測試,理解網絡中的方差和可避免的偏差問題是很困難的。

第 18 課:誤差分析

吳恩達介紹了一種能顯著提高算法性能的有效性的誤差分析技術。基本想法是手工標註錯誤分類的樣本,集中精力處理對錯誤分類數據影響最大的誤差。


貓識別 App 誤差分析

例如,在貓識別中吳恩達認為模糊的圖像最容易導致誤差。這種敏感性分析可以令人看到在降低總體誤差的過程中,你花費的精力到底有多值得。還有一種可能是,修復模糊圖像是很費力的任務,而其它的誤差更容易理解和修復。敏感性分析和近似操作都將作為決策過程的因素。

第 19 課:什麼時候使用遷移學習?

遷移學習允許將一個模型的知識遷移到另一個。例如,你可以將一個貓識別 app 中的圖像識別知識遷移到放射診斷中去。實現遷移學習需要用更多的數據重訓練網絡的最後幾個層,以用於相似的應用領域。其思想基礎是網絡的低層的隱藏單元擁有更加廣闊的應用範圍,即對具體的任務類型不敏感。總之,當任務之間擁有相同的輸入特徵,並且需要學習的任務擁有比需要訓練的任務多得多的數據的時候,遷移學習是可行的。

第 20 課:什麼時候使用多任務學習?

多任務學習迫使單個神經網絡同時學習多個任務(和每一個任務都配置單獨的神經網絡相反)。吳恩達解釋道,當任務集合通過共享低級特徵獲得學習增益,以及每一個任務的數據量規模相似的時候,這種方法能工作得很好。

第 21 課:什麼時候用端到端的深度學習?

端到端的深度學習需要多層處理並將它們組合到單個神經網絡中,這使得數據能在沒有人工設計步驟引進偏差的前提下自主進行優化過程。另一方面,這個方法需要非常多的數據,有可能排除潛在的手工設計成分。

結論

吳恩達的深度學習課程使我對深度學習模型的開發過程有了基本的直觀理解,以上我解釋過的課程只不過是這個課程中展示資料的一部分。即使完成了課程你也還不能稱為深度學習專家,而我唯一的不滿是課程的作業佈置太簡單了。順便提一句,寫這篇文章並沒有得到 deeplearning.ai 的批准。

原文鏈接: https://medium.com/towards-data-science/deep-learning-specialization-by-andrew-ng-21-lessons-learned-15ffaaef627c

文章來源:機器之心