深度學習的教學和課程,與傳統 CS 的教學和課程有什麼區別?

本題已加入知乎圓桌 ?「機器學習 · 學以致用」,更多「機器學習」相關話題討論歡迎關注。


深度學習的課程和傳統計算機課程有很大的不同,也可以說「獨樹一幟」,其獨特性主要來自於:1. 前置課程多 2. 缺乏完整的理論體系 3. 繁多的調參技巧 4. 知識迭代速度快 5. 交叉領域應用能力強。

以幾門傳統的計算機課程(數據結構和演算法、資料庫、操作系統)為參照對象,我覺得深度學習課程設置有以下不同:

1. 前置課程要求較多,需要較廣的基礎知識

一般我們把深度學習/機器學習的課程安排在大三以後,而研討課(seminar)一般安排在研究生博士階段,這與大部分傳統計算機課程不同。這是因為深度學習涉及了很多數學、統計概率、以及優化方向的知識,對剛入學的學生不大友好,具體包括:

  • 線性代數:矩陣/張量乘法、求逆,奇異值分解/特徵值分解,行列式,範數等
  • 統計與概率:概率分布,獨立性與貝葉斯,最大似然(MLE)和最大後驗估計(MAP)等
  • 資訊理論:基尼係數,熵(Entropy)等
  • 優化:線性優化,非線性優化(凸優化/非凸優化)以及其衍生的求解方法如梯度下降、牛頓法、基因演算法和模擬退火等
  • 數值計算:上溢與下溢,平滑處理,計算穩定性(如矩陣求逆過程)
  • 微積分:偏微分,鏈式法則,矩陣求導等

舉個例子,我曾短暫帶過多倫多大學神經網路的課程(就是Hinton原來教的那門csc321)的助教,當時給我們助教的資格測試是對矩陣進行奇異值分解和其他線性代數的知識,而不是推導BP演算法。這也是為什麼大部分深度學習課程的前幾節助教課都是講這些基礎知識,正所謂不積跬步無以至千里。

而大部分的傳統計算機課程不需要這麼多的前置知識,入門門檻相對低一些。即使以可計算理論(Computability Theory)這種理論性比較強的課來說,其要求的知識廣度也不及深度學習。但此處也想給大家提個醒,深度學習沒有必要等到掌握所有領域知識再開始,應該一邊學習一邊補充所需知識。

2. 知識更新速度快,時效性強

雖然深度學習的前身,也就是感知機(perceptron)已經有超過50年的歷史,但深度學習還屬於一個飛速發展的新興領域,因此很多經典的理論/技巧很快就被推翻。舉兩個例子:

  • 激活函數的選擇:在很多深度學習的教科書中,尤其是10年以前的教科書中都還依然把Sigmoid當作默認的激活函數。但事實上,整流函數(ReLu)以及其拓展變形函數,如Leaky ReLu早就成為了主流的深度學習激活函數。但因為知識的滯後性,很多課程/書籍甚至都沒有介紹ReLu的章節。
  • 鞍點和全局最小:長年以來學術界把深度學習使用BP演算法難以得到全局最優解的原因歸結於存在大量的局部最小(local minimum)導致梯度下降失敗,直到最近幾年大家才比較一致的認同可能問題出在了大量鞍點(saddle points)導致了梯度下降法在Hessian矩陣的條件數很差時在高維空間失效。

大部分計算機科學課程有可以自洽的經典體系,短時間內理論上不會發生很大的變化。你看幾年前的操作系統書籍或者課程,和現在的主流知識變化不是很大。而深度學習領域基本上每過一陣子都會出個大新聞,然後大家才發現一直都做錯了。所以深度學習課程很講究時效性,超過3年以上的書籍和課程或多或少都有錯誤或者不準確的地方,切記切記!

但換個角度思考,這也說明了深度學習還有很大的潛力,可以研究的方向很多。這兩年很火的多任務學習(multi-task learning), 遷移學習(transfer learning), 對抗生成網路(GAN)都給了研究者更多的挖坑方向。

3. 理論證明比較薄弱,高度依賴黑科技(調參技巧)

承接第二點,深度學習缺乏從數學角度的自洽解釋,而且好用有效的深度學習模型其實還是大量依靠人為進行構建和參數調整。換句話說,深度學習還沒有一套完整的,自上而下的操作流程,現階段還大量依靠人為的選擇、調整、優化。這也是為什麼深度學習被叫做「煉丹」,而從業人員被叫做「煉丹師」。

深度學習的調參技巧早就被外界所詬病,除了選擇良好的激活函數,小心的設計網路結構,還要給隱藏單元加入噪音(如Dropout),使用合適的正則化方法等。其中每一項展開都可以算作一個領域,更別提把這些步驟整合時可能造成指數級的選擇困難。高度的不確定性使得課程設置變得很難。

Goodfellow在《深度學習》一書中就指出「深度學習中使用的優化演算法幾乎都沒有理論保證,我們只有不斷進行強假設限制得到一些理論保證」。不僅僅是優化,深度學習作為一種表示學習(representation learning),對於特徵的提取和解釋也只有非常有限的解釋性。同理,剛剛提到的dropout操作,其使用的權重縮放推斷(weight scaling inference)也是一種經驗科學沒有理論的背書,但因為效果真的很好所以在該領域得到了廣泛應用。

深度學習現階段作為一門經驗科學,從課程設置角度來說面臨一個尷尬的局面。如果只講理論,那麼實用性很低。而如果只講實際技巧,這又太不像一門專業科學無法自洽。這也是深度學習和其他計算機領域的一個顯著不同,某種意義上說深度學習的實用性走在了理論性前面。這使得深度學習從授課角度來說很難,舉兩個典型的例子:

  • Neural Networks for Machine Learning | Coursera: Geof Hinton的課偏理論,輕實踐
  • Deep Learning | Coursera: Andrew Ng的課程偏實踐,輕理論

可以看出,深度學習對授課教師也提出了很高的要求。如果工程性太強那麼理論很薄弱像空中樓閣,而太理論缺乏實踐技巧又比較像屠龍之技。而其他計算機課程基本都已經有了一個比較好的自洽體系,能在理論和實踐中達到一個不錯的平衡。這也是為什麼知乎上曾有個非常有意思的熱門話題「為什麼有些學數學的看不慣甚至鄙視 Deep Learning?」

作為經驗科學,那實驗必不可少。但這對於學校/教育機構來說也面臨一個成本問題,是否有能力提供足夠的軟硬體支持,即學生是否可以在註冊期間使用伺服器/GPU。大部分深度學習的項目都無法在個人電腦上完成,尤其個人筆記本的主流操作系統還是Windows。這一點對於本科學生來說更不友好,因為從成本角度學校很難提供硬體支持,也沒有導師願意購買設備供大家使用。我個人比較看好的方法還是學校和雲服務廠商合作,保證註冊課程的學生在上課期間可以有「一定時長的GPU使用機會」。

4. 高學科交叉度,導致領域課程設置細分

深度學習的廣泛使用使得其課程設置更加細分化。其他計算機課程一般都叫做「XX入門」,「中級XX」,和「高級XX」。深度學習不同,作為一門工具學科既可以用來做視覺(Computer Vision),也可以做自然語言處理(NLP),還可以做很多其他的領域,導致了其課程設置非常細。以多倫多大學2017年的研究生博士課程為例,和深度學習相關的課程就超過了7門:

  1. Topics in Machine Learning: Scalable Flexible Models of Uncertainty
  2. Topics in Machine Learning: Learning Discrete Latent Structure
  3. Machine Learning and Data Mining
  4. Machine Learning in Computer Vision
  5. Natural Language Computing
  6. Topics in Computational Molecular Biology: Computational Methods in Medicine
  7. Advanced Machine Learning

這些課程中1,2,3,7是比較傳統的機器學習課程,4, 5, 6分別是機器學習/深度學習在機器視覺,自然語言處理,和計算生物方向的應用。以前系裡面的課還有 用深度學習+機器視覺做無人車等。而且統計系或者運籌學系又都有機器學習/深度學習的課程,這再一次證明了深度學習高交叉性、高遷移性的特點。

換個角度思考,深度學習的課程往往只有在入門階段才是純深度學習,進階學習往往都會將其應用於某個特定領域解決實際問題。這個和其他領域的計算機課程不同,你很少見到把操作系統或者資料庫領域的知識大規模的遷移到其他學科上的案例。

5. 總結

從以上分析不難看出,深度學習作為一個「年輕的」學科,和其他成熟的計算機課程還是有很大不同。比較明顯的就是因為其較高的前置背景,導致其入門要求高,一般是高年級課程。其次就是因為其並未形成完整自洽的理論體系,導致系統的課程設置很難,而且有很多人為的「黑科技」。但即使如此,深度學習的有效性已經在多個交叉領域被證明,這也導致了其課程設置非常細而且可覆蓋的話題比較靈活。深度學習的特別之處告訴我們:

  • 掌握好基礎知識,但不要矯枉過正,買櫝還珠
  • 不斷更新知識,追蹤主流熱點,不要抱著固有的觀念
  • 上手調參,有時候實踐比理論更重要,至少在現階段的深度學習領域
  • 專註特定領域,不要試圖短時間內能成為橫跨多個領域的專家

而從講課的角度來說,深度學習的課程很難掌握好理論與實踐的平衡,而且必須時時刻刻跟蹤前沿熱點進展,這樣才能防止被聽眾「打臉」。

不管是學生和老師都不容易啊,祝大家煉丹愉快 - ?????


深度學習,不要神秘化。

玩智能演算法的人都知道一點:現在做到什麼程度,就用到什麼程度。

高中可以不可以玩深度學習呢?可以。

只要學過解析幾何、數列、函數、概率和物理就可以了。

要知道,數值計算,差不多也就是這些了。

當然,這是以過去的教材作為衡量的。

現在高中的數學、物理教材,花花綠綠的,都是圖形,其實語言符號能力很爛。


作為學生,和深度學習的愛好者之一來說說自己的感受。

1.實驗成本

站在教學的角度來說,實驗的難度是和傳統CS的教學的主要區別。

這個區別大概有幾點,第一個是硬性條件,也就是兩個進行DL所必須的條件,數據和算力。深度學習能夠展露出其光彩和大數據這個時代背景下是分不開的(機器學習和人工智慧並非今天才有的課題),數據的問題隨著kaggle,imagenet等比賽公開數據,除了個別領域,如果只是學習的話,數據來源是不成問題。

但問題是有了數據後的存儲和計算問題。高校一堂課是40~50分鐘,但深度學習如果使用CPU,單機計算,只有極小數實驗能夠小於一小時(MINST的簡單分類任務可以,但如果是GAN,即使是MINST數據集,收斂基本上要一小時以上,老師總不能在課堂上說,因為時間關係,我們已經有一個訓練好了的模型吧?即便老師這樣說,要想學習好學生總得親自動手,依舊會面臨這個問題)。之前為了寫論文從斯坦福上下載了一個數據集,70G,而對於ImageNet的數據集會是更大,而你學習怎麼也得多個數據集對比測試吧,儲存和算力這兩點對於學生來說是難以負荷的。

當然,使用一些廠家,提供的雲平台或算力可以在一定程度上解決這個問題,但這同樣需要付出經濟上的代價。

而傳統的CS課程,實驗代價基本上理工科裡面最低的了,畢竟絕大多數大學生也已經有電腦了,在宿舍就已經可以完成大部分的實驗了……不然你看看隔壁化學的柱子,隔壁土木搭的模型……

2.缺少成熟的理論和方法論支持

深度學習是黑箱子是公認的了,因為深度學習是一門非常年輕的學科,其理論缺少是非常嚴重。這裡的說的理論缺少,除了缺少數學工具對深度學習原理的解釋以外,對其在實踐也缺少一套較成熟的方法論來指導,這一點情況在我的專欄文章https://zhuanlan.zhihu.com/p/28038354 裡面曾經提及過,出了問題可能老師都不知怎麼解決,在A數據集上work而在B數據集上不work也並非不可能,而參考資料也給不出答案,這時學生估計就只能一臉懵逼了。

3.學習路線問題

上面已經有答主提及,傳統的CS教學和課程已經有一定套路了,各校的課程安排一般差異不會太大。但深度學習有兩個問題,一是涉及的前置課程能力極多,教學上需要保證學生有一定代碼編寫能力的同時,要有一定數學能力,這一點放在現在的CS教育,也不是那麼容易達到,這固然有學科本身的難度問題,也有現在教育方法的問題。而第二個問題也就是重點來了,即使學生把前置技能點爆了,也不能保證學生能在深度學習上的表現好。你一套理論分析下來,有時真的不如別人大力出奇蹟。(但這不僅是深度學習,也是機器學習面臨著的一些問題)(打過比賽的都懂)

在文章的最後請大家思考多一個問題,為什麼現在阿貓阿狗都能import tensorflow,import torch,但稍微靠譜一點的公司,仍然招DL方面還是要求學歷碩士以上,並且有一定水平的論文或者在公認的演算法競賽上有優秀成績的人?

明白這點,就大概明白和傳統CS的區別了。

最後的最後…… @huybery 9月了,你打算啥時更新我們的專欄……


深度學習本身涉及概率論、統計學、逼近論、凸優化、演算法複雜度理論等多門學科,而且較新(Hinton等人於2006年才提出)所以造成了這門學科本身的門檻。

傳統的CS課程:例如數據結構、操作系統、計算機網路等已經在計算機這個體系中較為的成熟,也就是說很多前輩已經摸索出了很好的 「學習路徑」,這些學科成為了大家所說的「內功」,既然是內功也就是計算機學科需要掌握的基礎。所以只要你是計算機相關領域的人士,這些都少不了,這些是你不被技術更新所淘汰的保命牌。而就目前看來很多同學甚至從業者這部分基礎都是不過關的。

計算機領域很大的魅力就在於萬金油,可以往下深入的領域眾多。深度學習算是當前最為熱門的領域了。

深度學習正處於剛剛興起的時代,從相關頂會的優質論文數量來看(排除那些大灌水的會議)各種模型、思想層出不窮,可以說是日新月異。所以在學習或者授課時,我們除了要專註於深度學習的基礎之外,跟上時代也很重要。

正如 @阿薩姆 所說,深度學習現階段作為一門經驗科學。而這種經驗和我們平常說的多擼代碼還有很大的區別,譬如數據結構我們可能多刷刷題就可以過關,計算機網路親自去配置一下網路或者看看協議本身的實現都可以給我們帶來很多的知識。而深度學習當前的學習環境非常的局限,作為學生或者愛好者在學習過程中,缺少數據、缺少算力是非常大的阻礙。所以我們看到大部分教程只能局限在例如 mnist 這種數據集上面,很多模型如cnn等也只是介紹最傳統的模型。而當我們真的去處理一個新的問題的時候,往往會手足無措。如何去清洗數據,怎麼做特徵工程網路結構如何調整超參數如何選取,這些東西我們或許可以從書本、從老師那裡得知一些「有效」的方法,但終究是紙上知識,當你真的去嘗試的時候你就會發現很多東西行不通。典型的道理我都懂,依然過不好這一生。

所以我覺得深度學習最有利的學習方法目前來說還是自己多鼓搗鼓搗競賽,多嘗試一些不同的數據和模型,而且保持閱讀最新的優質論文的習慣,做到實踐和理論都不脫軌。譬如你在某篇論文中看到了某個方法,能不能用到你的某個實驗中?效果會不會好?作者的參數是怎麼調的?有沒有可以改進的地方?這一套都搞過去你才能對某種模型有深刻的理解,甚至提出新的想法(emm...靠運氣和積累)。

道阻且長。


推薦閱讀:

很多關於人工智慧的文章說,中國在人工智慧領域處於領先位置,可為什麼在學習過程中找到的資料都是國外的?
如何評價深度學習之父Hinton發布的Capsule論文?
如何評價卡內基梅隆大學的開源項目 OpenPose?
如何評價人們對電腦在圍棋上戰勝人類的時間預測?
如何評價amd的Radeon開放計算平台直接將CUDA編譯代碼直接轉換過來。?

TAG:人工智慧 | 開放課程 | 機器學習 | 計算機科學 | 深度學習DeepLearning |