我從吳恩達深度學習課程中學到的21個心得
今年8月,吳恩達的深度學習課程正式上線,并即刻吸引了眾多深度學習粉絲的“頂禮膜拜”。一如吳恩達此前在Coursera上的機器學習課程,這幾門深度學習課程也是好評如潮。
本文引用地址:http://butianyuan.cn/article/201712/372725.htm在諸多粉絲中,加拿大國家銀行金融市場的首席分析師Ryan J. Shrott從前三門深度學習課程中總結出了21點心得,總結了該系列課程的諸多精華。
今天,文摘菌就帶大家一起來讀一讀這份“學霸“筆記。
首先來看一下Ryan對該課程的總體評價:
吳恩達先生(Andrew Ng)的3門課程都超級有用,教會了我許多實用的知識。吳教授擅長過濾掉流行詞匯,用一種清晰簡潔的方式解釋了一切。比如他闡明了監(jiān)督式深度學習(supervised deep learning)只不過是一個多維的曲線擬合程序,而其他任何具有代表性的理解,如人類神經(jīng)系統(tǒng)的通用參照,則有些太過玄乎了。
官方介紹說只需要有一些基本的線性代數(shù)和Python編程知識就可以聽懂這些課程。然而我認為你還應該懂得矢量微積分(vector calculus),有助于懂得優(yōu)化過程的內(nèi)部機理。如果你不關心內(nèi)部如何運行,只是關注獲取更高層面的信息,你可以跳過那些微積分的視頻。
下面,就是Ryan在學習完該系列課程后的心得。
心得1:為什么深度學習得以迅速發(fā)展
我們?nèi)祟惍斀駬碛械?0%的數(shù)據(jù)都是于最近2年內(nèi)收集的。深度神經(jīng)網(wǎng)絡(DNN’s)可以更好地利用大規(guī)模的數(shù)據(jù),從而超越較小的網(wǎng)絡及傳統(tǒng)學習算法。
此外,還有好多算法方面的革新使DNN‘s的訓練變得非??臁1热鐚igmoid激活函數(shù)轉(zhuǎn)換成ReLU激活函數(shù)已經(jīng)對梯度下降等優(yōu)化過程產(chǎn)生了巨大的影響。這些算法的優(yōu)化使得研究者們的“創(chuàng)意-編碼-驗證”循環(huán)迭代速度越來越快,從而引導了更多的創(chuàng)新。
心得2:深度學習內(nèi)的矢量化(vectorization)
在上這門課之前,我從沒有意識到一個神經(jīng)網(wǎng)絡可以不用for循環(huán)來搭建。吳恩達很好地傳達了矢量化代碼設計的重要性。在作業(yè)中,他還提供了一個標準化的矢量代碼設計樣本,這樣你就可以很方便的應用到自己的應用中了。
心得3:DNN的深層理解
在第一個課程中,我學會了用NumPy庫實現(xiàn)前向和反向傳播過程,我因而對諸如TensorFlow和Keras這些高級別框架的內(nèi)部工作機理產(chǎn)生了更深層次的理解。吳恩達通過解釋計算圖(comptation graph)背后的原理,讓我懂得TensorFlow是如何執(zhí)行“神奇的優(yōu)化”的。
心得4:為什么需要深度表征(Deep Representations)
吳恩達對DNN‘s的分層方面有著直觀的理解。比如,在面部識別方面,他認為先前的分層用于將臉部邊緣分組,后續(xù)的分層將這些分好的組形成五官(如鼻子、眼睛、嘴等等),再接下來的分層把這些器官組合在一起用以識別人像。他還解釋了回路理論(circuit theory),即存在一些函數(shù),需要隱藏單元的指數(shù)去匹配淺層網(wǎng)絡的數(shù)據(jù)??梢酝ㄟ^添加有限數(shù)量的附加層來簡化這個指數(shù)問題。
心得5:處理偏差(bias)和方差(variance)的工具
吳教授解釋了識別和修繕偏差和方差相關問題的步驟。下圖顯示了解決這些問題系統(tǒng)性的方法。
機器學習的基本“秘訣” 解決偏差和方差的“秘訣”
他還解決了偏差和方差之間被普遍引用的“權衡”(tradeoff)問題。他認為在深度學習的時代,我們擁有獨立解決每個問題的能力,所以這種“權衡”問題將不再存在。
心得6:正則化的直觀解釋
為什么向成本函數(shù)中加入一個懲罰項會降低方差效應?在上這門課之前我對它的直覺是它使權重矩陣接近于零,從而產(chǎn)生一個更加“線性”的函數(shù)。吳教授則給出了另一個關于tanh激活函數(shù)的解釋。他認為更小的權重矩陣產(chǎn)生更小的輸出,這些輸出集中圍繞在tanh函數(shù)的線性區(qū)域。
tanh激活函數(shù)
他還為dropout給出了一個直觀的解釋。之前我認為dropout僅僅在每個迭代中消滅隨機神經(jīng)元,就好比一個越小的網(wǎng)絡,其線性程度就越強一樣。而他的觀點是從單個神經(jīng)元的角度來看這一做法。
單個神經(jīng)元的角度
因為dropout隨即消滅連接,使得神經(jīng)元向父系神經(jīng)元中更加均勻地擴散權重。以至于更傾向于縮減權重的L2范數(shù)(squared norm)的效果。他還解釋了dropout只不過是L2正則化的一種自適應形式,而這兩種的效果類似。
心得7: 為什么歸一化(normalization)有效?
吳恩達展示了為什么歸一化可以通過繪制等高線圖(contour plots)的方式加速優(yōu)化步驟。他詳細講解了一個案例,在歸一化和非歸一化等高線圖上梯度下降樣本進行迭代。
心得8: 初始化的重要性
吳恩達展示了不好的參數(shù)初始化將導致梯度消失或爆炸。他認為解決這個問題的基本原則是確保每一層的權重矩陣的方差都近似為1。他還討論了tanh激活函數(shù)的Xavier初始化方法。
心得9: 為什么使用小批量(mini-batch)梯度下降?
吳教授使用等高線圖解釋了減小和增加小批量尺寸的權衡。基本原則是較大的尺寸每次迭代會變慢,而較小的尺寸則可以加快迭代過程,但是無法保證同樣的收斂效果。最佳方法就是在二者之間進行權衡,使得訓練過程比立即處理整個數(shù)據(jù)集要快,又能利用向量化技術的優(yōu)勢。
心得10: 高級優(yōu)化技術的直觀理解
吳恩達解釋了動量(momentum)和RMSprop等技術是如何限制梯度下降逼近極小值的路徑。他還用球滾下山的例子生動地解釋了這一過程。他把這些方法結合起來以解釋著名的Adam優(yōu)化過程。
心得11: 基本TensorFlow后端進程的理解
吳恩達解釋了如何使用TensorFlow實現(xiàn)神經(jīng)網(wǎng)絡,并闡明了在優(yōu)化過程中使用的后端進程。課程作業(yè)之一就是鼓勵你用TensorFlow來實現(xiàn)dropout和L2正則化,加強了我對后端進程的理解。
心得12: 正交化
吳恩達討論了機器學習策略中正交化的重要性。基本思想是執(zhí)行一些控件,這些控件一次只作用于算法性能的單一組件。例如為了解決偏差問題,你可以使用更大的網(wǎng)絡或更多的魯棒優(yōu)化技術。你希望這些控件只影響偏差而不會影響其他如較差泛化等問題。一個缺少正交化的控件過早停止了優(yōu)化過程。因為這會同時影響模型的偏差和方差。
心得13:建立單一數(shù)字評估指標的重要性
吳恩達強調(diào)選擇單一數(shù)字評估指標來評估算法的重要性。在模型開發(fā)過程中,如果你的目標改變,那么隨后才可以更改評估度量標準。 Ng給出了在貓分類應用程序中識別色情照片的例子!
心得14:測試集/開發(fā)集的分布情況
始終確保開發(fā)集和測試集具有相同的分布。這可確保你的團隊在迭代過程中瞄準正確的目標。這也意味著,如果你決定糾正測試集中錯誤標記的數(shù)據(jù),那么你還必須糾正開發(fā)集中錯誤標記的數(shù)據(jù)。
心得15:處理訓練集和測試集/開發(fā)集處于不同分布的情況
吳恩達給出了為什么一個團隊會對具有不同分布的訓練集和測試集/開發(fā)集感興趣的原因。原因在于,你希望評估標準是根據(jù)你真正關心的例子計算出來的。例如,你也許想使用與你的問題不相關的示例作為訓練集,但是,你別指望使用這些示例對你的算法進行評估。你可以使用更多的數(shù)據(jù)訓練你的算法。經(jīng)驗證明,這種方法在很多情況下會給你帶來更好的性能。缺點是你的訓練集和測試集/開發(fā)集有著不同的分布。解決方案是留出一小部分訓練集,來單獨確定訓練集的泛化能力。然后,你可以將此錯誤率與實際的開發(fā)集錯誤率進行比較,并計算出“數(shù)據(jù)不匹配”度量標準。吳恩達隨后解釋了解決這個數(shù)據(jù)不匹配問題的方法,如人工數(shù)據(jù)合成。
心得16:訓練集/開發(fā)集/測試集的大小
在深度學習時代,建立訓練集/開發(fā)集/測試集劃分的參考標準發(fā)生了巨大的變化。在上課之前,我知道通常的60/20/20劃分。 Ng強調(diào),對于一個非常大的數(shù)據(jù)集,你應該使用大約98/1/1甚至99 / 0.5 / 0.5的劃分。這是因為開發(fā)集和測試集只需足夠大,以確保你的團隊提供的置信區(qū)間即可。如果你正在使用10,000,000個訓練集示例,那么也許有100,000個示例(或1%的數(shù)據(jù))已經(jīng)很大了,足以確保在你的開發(fā)集和/或測試集具有某些置信界限。
心得17:逼近貝葉斯最優(yōu)誤差
吳恩達解釋了在某些應用中,人類水平的表現(xiàn)如何被用作貝葉斯誤差的代表。例如,對于諸如視覺和音頻識別的任務,人的水平誤差將非常接近貝葉斯誤差。這可以讓你的團隊量化你的模型中可以避免的偏差。沒有貝葉斯誤差等基準,將很難理解網(wǎng)絡中的方差和可避免的偏差問題。
心得18:錯誤分析
吳恩達展示了一個效果比較明顯的技術,即通過使用錯誤分析,來顯著提高算法性能的有效性。基本思想是手動標記錯誤分類的示例,并將精力集中在對錯誤分類數(shù)據(jù)貢獻最大的錯誤上。
識別貓的應用程序錯誤分析
例如,在識別貓的應用中,吳恩達判定模糊圖像對錯誤貢獻最大。這個靈敏度分析可以讓你看到,在減少總的錯誤方面,你的努力是值得的。通??赡苁沁@樣的情況,修復模糊圖像是一個非常艱巨的任務,而其他錯誤是明顯的,且容易解決。因此敏感性和模糊工作都將被納入決策過程。
心得19:何時使用遷移學習?
遷移學習允許你將知識從一個模型遷移到另一個模型。例如,你可以將圖像識別知識從識別貓的應用程序遷移到放射診斷。實現(xiàn)遷移學習涉及到用更多的數(shù)據(jù)重新訓練用于類似應用領域的最后幾層網(wǎng)絡。這個想法是,網(wǎng)絡中較早的隱單元具有更廣泛的應用,通常不是專門針對你正在使用的網(wǎng)絡中的特定任務。總而言之,當兩項任務具有相同的輸入特征時,而且當你嘗試學習的任務比你正在嘗試訓練的任務有更多的數(shù)據(jù)時,遷移學習是有效的。
心得20:何時使用多任務學習?
多任務學習迫使一個單一的神經(jīng)網(wǎng)絡同時學習多個任務(而不是每個任務都有一個單獨的神經(jīng)網(wǎng)絡)。Ng解釋說,如果一組任務可以從共享較低級別的特征中受益,并且每個任務的數(shù)據(jù)量在數(shù)量級上相似,則該方法可以很好地工作。
心得21:何時使用端到端的深度學習?
端到端的深度學習需要多個處理階段,并將其組合成一個單一的神經(jīng)網(wǎng)絡。這使得數(shù)據(jù)能夠自己說話,而不會存在人們在優(yōu)化過程中手動顯示工程步驟出現(xiàn)的偏差。相反,這種方法需要更多的數(shù)據(jù),可能會排除可能手動設計的組件。
總結
Ryan總結道,雖然吳恩達的深度學習課程不能讓你成為真正的深度學習專家,但可以讓你對深度學習模型的發(fā)展過程有了基本的直覺了解。當然,這21點心得也遠遠不能涵蓋該系列課程的全部信息,要想入門深度學習,還是的自己親自學習這系列課程。
那么,學霸對這門課程有什么負面評價么?
沒錯,也還是有的。Ryan認為,這門課的作業(yè)實在太過簡單——并順手收過了文摘菌的膝蓋。
評論