Friday, January 23, 2009

Question: Netflix Prize within months?

獲得2008年度 Netflix Progress Prize 的團隊 BellKor in BigChaos 在今年一月初,又提交一次成果,這回他們把成績從 RMSE 0.8616 推進到 RMSE 0.8598,距離得獎所需的標準 0.8563 又推進一大步。


雅虎的資深研究員 John Langford 在閱讀 BellKor in Chaos 釋出的文件(1,2)後,在他的個人部落格 Machine Learning (Theory) 指出也許距離獎金揭曉的時間不遠了,他同時指出該團隊演算法包含了 stochastic gradient descent, ensemble prediction, and targeting residuals 各領域的技術,並且指出他們在 2008 年間將演算法參數化的努力。他同時意味深長的說,或許- the right parameterization might very well succeed - 正確的參數就能將大獎抱走呢!
Several aspects of solutions are taken for granted including stochastic gradient descent, ensemble prediction, and targeting residuals (a form of boosting). Relatively to last year, it appears that many approaches have added parameterizations, especially for the purpose of modeling through time.
當然,John Langford 也在他的短文裡,提出了他的疑慮:One fear is that the progress is asymptoting on the wrong side of the 10% threshold,可是他也承認從去年底到今年一月的進步的的確令人印象深刻 。

不過我個人比較好奇的是這些演算法,能不能作適當的改變後,應用到其他的產品,或許參數化正是往這個方向努力的指標之一,但是我對 overfitting 這件事仍然有點疑慮。雖然還沒有時間深入研讀相關文件,但在 John Langford 的部落格留言區以及 Netflix 網站的論壇裡有讀者討論到 overfitting 的問題,雖然有人認為這個比賽已經在各方面取得平衡(請參考這裡),不需擔心 overfitting,但是我個人仍然存疑。

或許 - Time will tell。

Monday, January 5, 2009

小數點後多少位才夠

前些日子,家裡的長官因為指導學生科展的緣故,需要計算根號二、根號三的數值到小數點後三千位,在網路上找了兩天,始終找不到合適的資料。幾經思索,她發現找到資料的最佳方法,就是把任務交代下去,於是這個任務就落到我頭上,並且責令鄙人於兩日內限時完成任務。

每個對程式設計有興趣有野心的初學者,都曾經想過寫作自己的程式庫,任意位數四則運算無疑是一個不錯的練手標的,甫接到任務指令時,原也興致勃勃,覺得正是好好活動筋骨的機會,大不了自己寫個模組,再到網上找個 Newton's Method(牛頓法) 的算法就可交差。

仔細研究維基百科裡關於 Arbitrary-precision arithmetic 的說明,發現事情可沒有那麼容易,僅僅是要把任意位數乘法做出來,連規劃帶測試除錯,恐怕就不是一個晚上可以完工的。依照維基百科的說明,高明的算法,甚至要用到快速傅立葉轉換咧,這豈是一個週末項目(weekend project)的格局。所以,上策還是做個善用工具的人吧!

就在同一份資料裡,介紹了一些好心人撰寫並公開使用權的程式庫,我一一查訪,發現一個 Python 的模組mpmath , 完全符合需求。安裝 mpmath 非常容易,下載解壓縮之後,只要在檔案所在的目錄下,執行 sudo python setup.py install 就成了;需要引用這個模組的函數前,記得先載入 (from mpmath import *)這個模組,就算完成一切準備動作。

真正的重頭戲也簡單得不得了,閱讀文件之後發現,只要在進行運算前宣告本次運算的位數精度,比如說要計算三千位(3000 digits)的數字,就執行 mp.dps = 3000。mpmath 只問你要計算多少位元(digit),不管你要把小數點放在哪裡, dps 宣告數值是多少,mpmath 就給你那麼長的數字。

求根號二的過程簡單到出乎意料,先載入 mpmath (from mpmath import *), 宣告需要的精度(mp.dps=100),宣告一個多精度的浮點數(a=mpf(2.0)),然後直接用 ** 運算子求出答案(開根號是二分之一次方),用經過最佳化的 sqrt() 函數也可以達成相同目標。運算過程看下面截圖就一目了然:


我另外寫了一個 Newton's Method 的副程式,驗算的結果發現,不管求到小數點後多少位(我最多測到5000位),a**0.5 的答案和牛頓法求出來的結果是完全一樣的,而且用函式庫內建的函式速度更快。結論很簡單:在這個年代,要做個善用工具的人,才能快速完成任務。

Saturday, January 3, 2009

偶拾

平日服用的藥(慢性病,長期處方)在年前兩天就用完了,但是因為某個不可抗力的突發工作的緣故,竟抽不出空去領藥。只得拼命趕工,在完工報告寄送到美國之後,趁著年假中趕到醫院領藥。大醫院裡掛號繳費,現在都得先抽號碼牌,然後坐在櫃台前的等候區,等著合成的機器聲音叫號,才上前辦理。



輪到我繳費,在繳費窗口前,聽到隔鄰窗口一個年輕而悅耳的女聲平靜的說:「今天下午婦產科,謝謝!」

正在低頭清點著找回零錢的我愕然抬頭向旁邊望去,一張清秀素顏的臉,年紀很輕,看來就像個昨天才剛進大學的新鮮人。女孩身邊半公尺遠的地方,站著一個同樣年輕的男孩,表情看來有些靦腆,不時試著把手抬起放在女孩肩頭高的位置,隨即輕巧的放下。

我深知在醫院種地方,什麼故事都可能發生的道理,不想作任何負面的揣測;況且若真是一時貪玩造成的後果,年輕人應該不會也不敢到這個醫學中心來尋找解決之道。可是,這樣一對年輕的情侶,到婦產科究竟是為了什麼,我還是有些困惑,或許,在這個掛號櫃台前,每個人的背後都是一篇小說的題材?!



繳完費,拐過穿堂,到院裡的星巴克小坐。這裡的星巴克是個開放空間,只有一面牆隔著喝咖啡的空間和掛號區的走道,其他三面是完全開放的空間,對於咖啡座而言,是不尋常的設計。牆下一張小小的兩人桌上,擺著一台黑色簇新的 MacBook,機子後方伸出的電源線斜斜地往牆上高處蔓延,懸在空中的電線很是礙眼,電源線盡頭,插頭接在原本是緊急照明燈使用的插座上。

桌前的年輕人和方才在掛號區遇到的小情侶一樣年輕,雙眼緊緊盯著螢幕,因為好奇,我特地借著拿餐具的理由走到桌邊,螢幕裡播放著 YouTube 的影片。

年假期間,來領長期處方藥的人不多,很快就論到我領藥,離開星巴克的時候,看著半空中的電源線,心裡嘆了一口氣,無言

如果我的心是一朵蓮花

~ 林徽因 · 馬雁散文集 · 蓮燈 ~ 馬雁 在她的散文《高貴一種,有詩為證》裡,提到「十多年前,還不知道林女士的八卦及成就前,在期刊上讀到別人引用的《蓮燈》」 覺得非常喜歡,比之卞之琳、徐志摩,別說是毫不遜色,簡直是勝出一籌。前面的韻腳和平仄的處理顯然高於戴...