Andrew Ng(吳恩達) deep learning 課程 (coursera)

引言

前段時間 Andrew Ng(吳恩達)在 Coursera 開設了深度學習的課程,正如 Andrew 在 Coursera 上的機器學習課程一樣,Andrew 總是面向零基礎的工程師來授課,而不是有專業背景的人員。所以課程總是會力求直觀且應用性強,但是往往對專業從事機器學習的人員來看略顯簡單,但是大牛對事物的理解還是值得參考的,所以我把課程中自己學到的要點記錄如下。

第一課:神經網絡和深度學習

第一週:深度學習引言

  1. 結構化數據與非結構化數據?
    • 機器學習中的結構數據可以理解爲意義明確的特徵,這樣我們可以像數據庫一樣構建一個表每一行代表一個樣本,每一列代表一個特定的特徵或者屬性值。
    • 機器學習中的非結構數據就像圖像、語音和文本一樣,不是特別容易存成表的形式。
  2. 深度學習爲什麼會流行?
    • 本質上講是因爲深度學習的算法在大數據量上的表現遠勝其他算法,尤其在非結構化數據上。
    • 客觀上講流行的原因是受到:1)數據量的增加;2)計算速度的提高;3)算法的改進;的三方面的影響。

第二週:神經網絡基礎

  1. 講解了 logistic 迴歸以及如何如何通過最大似然估計導出其代價函數。
  2. 講解了基於鏈式法則的反向傳導算法的直觀理解,比較容易理解,但是還是不如嚴格的證明來的舒服,嚴格推導可參考吳恩達在斯坦福大學UFLDL的材料的漢譯版(具有更加詳細的推導)
  3. 講解了向量化的代碼實現,相信習慣了寫 MATLAB 代碼的人都習慣了向量化的實現,提高並行化、高效
  4. 講解了Python包numpy的廣播機制以及numpy容易出錯的地方,這個細節我也沒有注意過。就是大家要注意 np.random.randn(5)、np.random.randn(5,1)、np.random.randn(1,5)的區別,最後兩種比較好理解,可以理解爲5*1的向量和1*5的向量,而第一種的方式最好不要使用,會比較凌亂,大家可以做一些矩陣和向量的運算測試一下。
  5. 總的來說,這一課的內容基本沒有特別的營養,都是一些基本的機器學習知識和python的代碼常識,大家有基礎的可以直接略過,不會遺漏什麼知識點。

第三週:淺層神經網絡

  1. 講解了一個單個隱藏層的神經網絡的例子以及激活函數選擇和隨機初始化的問題,都是基礎內容,沒有學到新的知識點

第四周:深層神經網絡

  1. 這周課主要講解了如何構建一個多層的全連接神經網絡,包括前向傳導和反向傳導。如果你曾經手寫過此過程這節課基本可以略過。
  2. Andrew在此課程中介紹了對 deep learning 一詞的看法,本質就是多隱層的神經網絡,deep learning其實就是一個噱頭,高大上吸引人們的目光。第一次聽到這個詞的時候我也覺得好厲害好像算法會做thinking一樣,其實本質上跟其他的機器學習方法沒什麼不一樣。至於神經網絡和大腦關係,Andrew也強調了大腦怎麼運作,我們根本不知道,神經網絡只是簡單想象大腦的運行方式,也許根本沒有半毛錢關係。非常認同Andrew這樣務實的態度。

大師採訪

  1. Geoffrey Hinton
    • 不用多說,Hinton可以說是深度學習的教父級別人物,其在推動深度學習的發展上起了巨大的作用,其貢獻太多不再詳述,但是第一次瞭解到Hinton原來最早學的心理學、哲學等專業,輾轉幾許最後來到了機器學習,還是很厲害的。
    • Hinton的第一個建議就是讀論文但是不要太多,這可能是在強調思考吧,學而不思則罔,讀的文章太多思想可能被束縛。
    • 第二個建議是堅持自己的看法,“當別人都以爲不對的時候,你就快成功了。”感覺有點假啊,但是,對他本人起碼是適用的。
  2. Pieter Abbeel
    • Abbeel是深度強化學習的先驅之一,採訪視頻也多次敘述了他對深度學習、強化學習以及深度強化學習的看法。
    • Abbeel給出的建議是“try things yourself”,就是要自己動手做的意思,非常認同,估計這個建議大家都會非常認可吧。deep learning的trick太多,所以紙上得來終覺淺啊
  3. Ian Goodfellow
    • Goodfellow是GAN的提出者,生成對抗網絡從提出就變得非常火爆,是生成模型的經典。Yann LeCun對此更是高度評價,認爲其實當今深度學習中最令人興奮的突破。
    • 另外,其和Yoshua Bengio等人合作的《deep learning》一書已有漢譯版,大家有興趣可以看看,是比較好的綜述涉及很多知識。但是具體在某一方面比如RNN上,總是感覺講的東西很多但是又不是特別細緻,難以有效把握重點。
    • 其在採訪中表示,自己在頭疼感覺快要死的時候,想到的第一件事竟然是自己的研究想法會不會有人繼續下去。不知是真是假,感覺這纔是真的愛研究,還以爲人之將死,想到都會是感情。

第二課:改善深層神經網絡:超參數調試、正則化以及優化

第一週:深度學習的實用層面

  1. 講解了過擬合以及偏差和方差的平衡關係,這是經典機器學習的必學內容,第一次見到時還是感覺很驚喜。
  2. 講解了dropout的正則化方法,以及其缺點:也就是用了dropout後很難再畫出一個Loss Function(平滑後)隨着迭代次數而逐漸下降的過程,這使得程序的運行過程更加難以觀察。
  3. 講解了數據增廣和提前停止(early stopping)的正則化方法,其中early stopping 可以減少正則化超參數的搜索空間
  4. 講解了梯度消失和梯度爆炸的情形,以及可以減輕其影響的參數初始化方法-讓參數的方差和上一層的神經元的個數的平方根成反比。
  5. 講解了梯度檢驗的方法沒有具體實踐過,但是實現不難,只需要兩次前向傳導的過程,即可計算近似的數值梯度進行檢驗。以下是Andrew給出的梯度檢驗的建議:
    這裏寫圖片描述
    • 其中再次提到dropout的複雜性,不能與梯度檢驗共存。

第二週:優化算法

  1. 講了Mini-batch的算法思路,和指數加權平均的算法和作用。
  2. 講了動量和RMSprop以及Adam的梯度下降加速算法,是我見過最直觀的理解,講得非常的好。
  3. 講了學習率衰減問題,這個也是大家常用的手段。
  4. 最後這個講解局部最優的這一小節讓我感覺收穫頗豐,也是第一次看到對deep learning目標函數的理解,感覺非常好。
    局部最優
    • 如上圖所示,很多人當然包括我都以爲我們使用梯度下降經常會陷入局部最優如左圖所示,但是deep deeplearning由於參數很多,所以很多導數爲零的點是鞍點如右圖所示,所以較差的局部最小點較少。而deep learning可能的主要如下圖所示,在鞍點可能會下降很慢,纔會走出困境。
      下降緩慢

第三週:超參數調試、Batch Normalization、深度學習框架

  1. 講解了調參技巧、Batch Normalization、softmax迴歸等深度學習中的實用框架。
  2. 講解了深度學習框架主要是tensorflow。關於框架來講我簡單試用過的有caffe、tensorflow、keras、paddlepaddle,這些工具有些基於計算圖、有些基於layer來設計模型,但是這些都有一些編譯語言的感覺,你要你把機構定義好,然後才能跑模型。而我喜歡的方式是像torch這樣一種腳本語言的感覺,可以實時顯示中間結果,查看變量的維數和值,非常有利於觀察模型是否正確運行,但是torch使用lua語言編寫,實在不想爲了使用torch再學一門不常用的語言,而最近使用python寫的pytorch越來越趨於成熟,有時間一定會進行首選學習,並以此作爲首先的研究deep learning的框架,據說kaggle上很多top的選手已經大量使用pytorch。

大師採訪

  1. Yoshua Bengio
    • Bengio是深度學習的三駕馬車之一,還是Ian Goodfellow的導師一個,大神人物。採訪談及其對現在deep learning研究的看法,其表示失望,因爲現在的研究已經偏離了原來希望機器具有認知的那種高層次的想法,而是如何設計更好的網絡架構和更好的優化算法讓deep learning work。
    • Bengio給出的建議是,做deep learning的研究和利用deep learning做產品需要努力和具備的知識是不一樣的,但有一點共識就是try things yourself,可見大家都十分認同基礎的重要性。
  2. 林元慶
    • 林元慶不用說了,原來我廠深度實驗室的主任,可以說是國內deep learning的先驅,給出了一些工業界的看法。
    • 給出的建議是學習一些機器學習的基礎,可以使用一些開源框架。我相信所有研究deep learning一定會機器學習的機器,一定也會使用開源框架的。

第三課:結構化機器學習項目

個人認爲這周的課是這門課的精華,也是在其他地方(公開課、書籍等)很難瞭解到的一些工程的方法論的東西。

第一週:機器學習策略

  1. 講了正交化的策略,其實類似於我們熟知的控制變量法,便於找到問題的所在。
  2. 講解了如何設置評價指標,和劃分訓練集、驗證集、測試集。這是我們首先要做的事情,相當於我們設立好了目標,就像射箭的靶子一樣。接下來我們所做的優化都是爲了提搞驗證集上的評價指標。如果我們沒有設好目標,那麼所做的努力很大概率無意義。現實中太多這樣的案例!!!
  3. 講解了算法如何與人的表現對比同時進步,其實這個問題主要集中在人擅長的領域,比如圖像識別、語音識別,想超過人的水平不是特別容易,所以存在對比和進步。然而對於一些結構的數據人往往是做不過機器的,這是機器擅長做的,記住大量的數據並擬合。

第二週:機器學習策略

  1. 誤差分析,這是模型後期調整非常重要的手段,指明我們調整的方向。
  2. 講解了如何應對訓練數據和最終的測試數據分佈不一樣的情況,首先要定位分佈不一帶來的誤差是多少,提高的主要策略是人工合成數據。
  3. 講解了遷移學習、多任務學習、端到端學習,這些都是在深度學習領域會比較經常遇到的問題。

大師採訪

  1. 採訪了兩位大牛,一位是斯坦福CS231課程的老師,一位是蘋果公司的技術總監。給出的建議比較一致,希望大家不僅僅會調用深度學習的框架,還要能夠親自寫出神經網絡的前向傳導和後向傳導的全部過程。我也是覺得自己手寫完神經網絡之後就會特別有自信,對其中的每一個過程做什麼都詳細的瞭解。以後再遇到什麼高大上的方法都不懼。PS:曾經在matlab上手寫全連接神經網絡和CNN卷積神經網絡。

第四課:卷積神經網絡

因爲筆者是做圖像出身的,所以在看整個第四課的過程中基本所有內容都是瞭解的,沒有發現新的知識點。同時,Andrew在講解風格轉移網絡時,隨口提了一句:“隨機初始化一張生成圖片,大小爲100*100*3”這邊可能有些草率,我印象中的風格轉移網絡,這張生成的學習圖像是要和內容圖像保持一樣尺寸的,這樣才能夠計算內容損失函數。

第五課:序列模型

課程主要講解了RNN、LSTM、GRU等方法,以及NLP中 word embedding等。因爲一直沒有實踐過NLP的問題,在這邊沒有太多的深入體會以及細節把握。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章