無心寫文章,吹吹其他水。
月前於《小城科學》blog 及電鋸處看到史丹福大學開了 database, artificial intelligence 與 machine learning 三科免費、公開但無學分的網上課程,儘管我全部都有興趣,但是 database 方面,總覺得若無實際問題在手,齋聽書還是讀不通;況且現今資料庫的應用,十居八九都與網絡有關,可是自己對網絡一竅不通,所以還是作罷。其餘兩科,本來只報其一,時間上比較鬆動,但心癢之下,還是兩科都報讀了。
根據校方數字,最後每科都有幾萬人報讀。面向如此大的群體,又除了聲譽之外沒有實利,課程自然較本科生所念的淺,許多材料會被 heavily dumbed down。例如看 AI 課的學生論壇,AI 的本科課程 CS221 於頭兩週過後,就要學生用課堂中所教的 A* search 做一個 project,寫一個類似用於 Pac-Man 遊戲的算則。參加 AI 網上網程的學生,不但毋須做 project,功課也大多只是網上選擇題,難度低很多。(後記:出乎意料,原來 AI 課的功課與考試與給予正規學生的相同,但 ML 的網上功課就和正規生的有別。)
AI 第一週所教的,大多與其他大學課程有重疊,例如用 BFS, DFS 搜索樹形圖等等,這些也是運籌學 (Operational Research) 的標準內容,不過學習一下 CS 佬的觀點也不是壞事。然而,不知是教授本身還是 CS 佬的慣例,課堂中好些語彙的用法,似乎都大大偏離學界常規。例如科學上,當我們說 discrete problem 與 continuous problem 的時候,discrete 的可以是 finite,也可以是 countably infinite,總之就是 countable。只有有 uncountably infinitely many states 的問題,才稱為 continuous problem。可是根據教授的說法,discrete problem 就是有 finitely many states 的問題,其餘的一律稱為 continuous problems。路徑的長度是另一個例子。教授稱 BFS 為 shortest first search,他又說 BFS 與 uniform cost search 都能夠找出 optimal path。然而 uniform cost search 尋求的,是最低代價 (cost) 的路徑,而 BFS 所得到的,只是一條最少節點的路徑,而完全不理會路徑的代價。要說 BFS 保證找到 optimal path 也可以,只不過這個 "optimal",指的是節點或層級的數目,而非路徑的代價。在其他學科中,例如圖論或運籌學,arc cost 歸 arc cost,no. of arcs 歸 no. of arcs,兩者決不輕易混為一談。
教授於 lectures, quizzes 跟 homework 的遣詞用字,亦常常過於含糊。這並非我獨有的印象,也是學生論壇裏的主流意見。甚至有些 quizzes,連教授到底想問甚麼,我也搞不清楚。感覺上,AI 兩位教授不是很 well prepared,有點急就章,不過他們的 lectures 很有啟發性,例如有一處談到 A* search,教授問,A* search 行得通,當中的 intelligence 究竟從何而來?要留意,並非人人也將 search method 當是 AI 的,例如早年深藍擊敗國際棋王卡斯巴洛夫,後來負責設計算則的許峰雄來港,就提及他的算則不過是 brute-force search,算不上是 AI。然而教授的問題,為何 A* search 行得通,就真的令我不禁要停下來,想一想,而他的答案,也令我有恍然大悟之感。
相比之下,ML 的教授較注重包裝,無論是 presentation 抑或 website 的設計都很講究。ML 的教授 Andrew Ng 風格有點「執手教」,即是連很顯淺的東西也唯恐你不明白,所以解釋得很仔細。要解釋詳盡但不冗贅,並非人人都做得到,華人尤其傾向太注重技術細節,令人失去 big picture,沒有 motivation,而 Andrew Ng 是罕見的例外。不過和 AI 課相比,我還是覺得 AI 課較能刺激思考,不知是否西人與華人的治學方式始終有別。只是現在始終開課不久,日後也許會有所不同。
儘管 Andrew Ng 的 presentation 很好,但也有些我不喜歡的地方,尤其是他有時舉一些很不設實際的例,很容易「教壞人」。譬如他解說 linear regression,以樓價與樓面面積的關係作例子。樓價的研究確實有用得上 linear regression 的地方,但是實際做法是有成例的,例如樓價幾乎一定要 take logarithm,而且,由於樓面面積幾乎一定不是決定樓價的唯一主要因素,若不考慮其他因素(例如地區、座向、層數、交通等等),regression 得出來的結果差不多肯定沒用,但是引入其他因素的話,又幾乎必定牽涉 hedonic regression 的概念。實例可以淺化,但不能偏離正軌,「老作」一個例子,然後硬套入現實場景,很容易誤導學生,令他們以為隨隨便便放幾個變數,就可以做 linear regression。其實隨便抽一本計量經濟學 (Econometrics) 的書,也可以找到許多實例,若無實例在手,還是只講抽象例子為妙。
此外,ML 課的內容也不時有錯。ML 要用到其他學科的技巧,而教授不是那些科目的專家,所以犯錯也情有可原,但是向學生胡亂解釋,就會造成真正問題。例如課堂中有處(大意)指,若要 minimize $\|X\theta-y\|^2$,其中 $X$ 是 $m\times n$,而 $n$ 遠大於 $m$(亦即 $X$ 是闊闊的矩陣),就應該用 gradient descent 而非 normal equation 來解決,原因是在 normal equation 之中,要計算 $(X^\top X)^{-1}X^\top$ 的話,由於 $n$ 很大,會很花時間云云。問題是,由於 $n>m$,$X^\top X$ 並不滿秩 (rank-deficient),所以它根本就不能反逆!最奇怪的,是 Andrew Ng 於 lecture 中有提及 pseudoinverse,可見他應該知道,當 $n>m$ 的時候,我們要計算的,應該是 $X^+$ 而不是 $(X^\top X)^{-1}X^\top$。為何仍有上述錯誤,真是木宰羊。(又後記:先前我跳過了許多我本身懂得的內容,現在打開來看,才發現教授並不真正熟悉 multiple regression ── 在 "normal equation" 的 video 約 10:23,他說用 Octave 解 normal equation 的時候,應該用 $\theta=\textrm{pinv}(X'\ast X)\ast X'\ast y$。技術上這沒有錯,但一般通用、等價而且較簡單的答案,其實是 $\theta=\textrm{pinv}(X)\ast y$,實際計算上,我們更罕會先算 $\textrm{pinv}(X)$,再算 $\theta=\textrm{pinv}(X)\ast y$,而是用諸如 QR factorisation 等等的數值方法尋求方程式 $X\theta=y$ 的解。Andrew Ng 取 $(X^\top X)^+X^\top$ 而捨 $X^+$,令人愕然。)
課堂中有關 feature normalization 的討論,更是完全錯誤。教授說 feature normalization 的目的,是為了令 gradient descent 加快收斂,但這兩件事,其實風馬牛不相及。試想像,若 features variables 未 normalized 之前,objective function 的 contour plot 本身已是同心圓狀,那麼,經過 feature normalization,contour plot 變成橢圓形,gradient descent method 豈非收斂得更慢,而不是更快?真正要改良 gradient descent,化橢圓為正圓,應該用 conjugate gradient method。Feature normalization 其實只是單純地從按每個 feature 的數值範圍 ── 而非 objective function landscape ── 去改變該 feature 的 learning rate,與加快/減慢 gradient descent method 的收斂,關係不大。
ML 的功課也設計得很奇怪。第一週的功課有兩部份,首部份是 ordinary linear regression,必答;第二部份是 multiple regression,是 bonus part。教授大概想弄得愈淺愈好,結果所謂功課,不過是在每個教授預先寫好的 script file 中加入一行指令。然而 multiple regression 部份要求加入的程式指令,其實與 ordinary linear regression 部份的完全相同,因此只要 OLS 部份答對,就等於懂得 bonus part,根本沒有額外挑戰。
另外,教授聲稱可以用 Matlab 或 Octave 來做功課,但是 submit 功課的 script file 其實呼叫了 Octave 的 urlread() function,所以 Octave 其實是不裝不行。然而我電腦 (Windows XP) 上的 Octave 又好像很 buggy,只要呼喚任何 plotting functions 就會 crash(後記,問題已解決;詳見此),令我不得不先用 Matlab 做好功課,再用 Octave 提交,但校方提供的 Octave script file,又時不時與 Matlab 不相容。例如 Matlab 的 function 應該用 "return" 來結束,但 ML 的 Octave script file 就用 "end";向量的長度,在 Matlab 是 length(),但是 ML 課的 script 就用 Octave 的 numel()。結果我要先修改那些聲稱與 Matlab 相容的 Octave script files,才可以做功課,十分麻煩。
我只報了 ML 及 DB 。 ML 真係不算難,講解清楚,功課也很簡單。
回覆刪除反而 DB 真係好難,那些 relational algebra 功課甚至考起 DB 高手。
DB 班沒有登記都可以看看。
http://goo.gl/Dmyrx
oh, enrollment is closed! what a pity!
回覆刪除