Tuesday, April 08, 2014

關於 recommender 的一些雜談 - 從聽歌App douban.fm 說起

大約三年前辦了 smart phone 之後,我就開始試玩各種不同的 app。Smart phone 對我來說一個重要的用途是代替收音機,在長途開車或做其它事的時候,播一些音樂,不然我車上老是放著在台大念書的時候燒來的十多年前的古董CD,實在是很像過氣的中年大叔會做的事。

所以,在剛辦了 smartphone 之後不久,我就開始尋找像 Pandora box 那樣,不需要購買歌曲,可以亂數播歌,但是以中文歌為主的 app。後來,經由我當時房東的分享,找到了中國製的 douban.fm 這個 app。它有很多內建的不同頻道,比較概括性的像華語頻道、粵語頻道、動畫頻道,或比較特別的像七十年代頻道、八十年代頻道等,可以自己選擇大致的範圍後,由系統亂數播放歌曲;更重要的,用戶也可以建立一個帳號,把當下聽到喜歡的歌標記起來,之後就可以選擇只播放有標記的歌(紅心頻道),或由 douban.fm 選擇亂數播放符合我偏好的歌曲(私人頻道)。

我用這個 app 已經至少兩年多了,我覺得它是一個非常好用的 app,強烈推薦給所有 Android 的用戶;至於 Apple 的愛好者,不知道為什麼,這個 app 只有列在 China Apple Store 裡,住在北美的人是無法 download 的。

不過,如果只是要推薦 app,我就不會特別寫這篇文章了。寫下這篇,主要是想記錄一些我經由使用這個 app,對現在處在顯學地位的 recommender 的想法。

如果說 douban.fm 會經由我 like 過的歌曲,來了解我的喜好,從而推薦符合我口味的歌的話,那我從一個單純使用者的角度,不去講 machine learning、clustering、dimension reduction 這些 recommender 背後牽涉的 computer science topics,我要怎麼評斷到底它這個功能到底好不好用,有沒有效果呢?

首先我就想起,我一開始使用 douban.fm 的時候,like 的歌還沒有那麼多,所以我的私人頻道常常出現的是同一個歌手的歌,我喜歡的無印良品、許美靜、優客李林、梁靜茹等人的新舊歌曲,都一一出現。一旦我 like 一首某歌手的歌,通常下一首馬上又會播同一個人的歌。雖然很開心(符合我的需要),但若只是推薦同一個歌手的歌,卻感覺不是特別厲害的 recommendation。

再用一陣子,私人頻道就開始出現一些別的好歌了,比如說阿妹的幾首經典歌曲。那的確也是我會喜歡的歌。不過轉念一想,像阿妹這種主流、多產、又長銷的重量級歌手,會出一些我喜歡的歌也不令人意外。不論把任何人所愛好的歌分析一下,推薦出幾首阿妹的歌應該都是很自然的結果吧?所以,或許這還是不能說它的 recommender 很厲害,因為這太好猜了。

不過轉念一想,或許我不應該只看它選了什麼歌給我,也要看看它不選什麼歌給我。想到這一點之後,我就發現,同樣是主流、多產、又長銷的重量級歌手,douban.fm 卻從來沒有播過周杰倫的歌給我聽,而我也的確不喜歡他的歌。從這一點來看,這個 recommender 的確有從我喜歡的歌單裡分析出一些有效的結論來。

除了已知的歌手之外,其實我最期待的,還是能經由這個 app,發現一些我本來不知道的新聲音。離開台灣多年,我已經和台灣的娛樂圈完全脫節,幾年前冬天回台灣,還發生不認識電視上唱跨年晚會壓軸的歌手是誰的窘境。後來我發現,douban.fm 在我 like 夠多的歌之後,就漸漸出現一些我不熟悉的名字,而我也的確發現了幾個我喜歡的歌手,一是范瑋琪(之前知道是誰,但對她的歌全然不熟),二是郭靜(這真的連名字都沒聽過,但是歌一放我就覺得超好聽,越聽越喜歡),三是 JS 這個二人組合,也是我本來完全不知道,但是覺得很好聽的。還有很多其他不知名的歌手(當中應該也有一些是中國歌手),讓我陸陸續續地發現了不少好聲音。所以,從推薦新歌的方面來思考,這個 recommender 應該是成功的。

而最後,最終極的判定,應該是比較使用私人頻道和公用頻道的差別。我發現,當我 like 的歌單夠大之後, douban.fm 總是可以選出我比較會喜歡的歌,有老的(二十多年前的,鳳飛飛時代的),有新的,有從來沒聽過的,甚至還有聽不太懂的日文歌或粵語歌,但是曲調也是我喜歡的。有時候,這個 app 會突然發生 error,把我的帳號登出,但是我大概只要聽個幾首它選播的歌就發現今天不太對,然後打開 app 發現帳號被登出了,需要重新登入。從這些角度來看,douban.fm 的歌曲推薦應該算是做得相當成功,確確實實抓住了我聽歌的口味,符合我的需求。

對於一個小小播歌 app 的 recommender 能夠做到這麼有效,我一開始有點訝異,但仔細想想 machine learning 發展多年,從我喜歡的歌選出別的相似的歌這種經典問題,早就有 well establish 的演算法,再加上 smart phone 時代廣大的用戶量和資料量,能夠達到這種好的表現其實並不讓人特別意外。

不過我又想,那又為什麼歌曲推薦能做得這麼成功,但像 Amazon 這種比 douban 大不知道幾十幾百倍的公司,每年招收不知多少做 big data 研究的 Ph.D. 的公司,卻沒有辦法準確推薦我想買的商品呢?我思考的結論是,Amazon 的商品推薦是遠比 douban 的歌曲推薦更困難的問題,理由有幾點:第一,歌曲愛好這個問題本身的 problem space 比較小,就只有歌而已,比起 Amazon 上的商品包山包海,什麼都賣什麼都不奇怪的情形,單純地多了;第二,歌曲的愛好是一個穩定不太變動的 property,我喜歡的歌曲口味,不會隨時間季節有劇烈的改變,因此比較容易建立正確的 profile,我現在喜歡的歌,對預測我別的會喜歡的歌,有直接的幫助,而我的購物偏好,則會有季節性(冬夏不同)、一次性購物(一陣子花很多時間研究某產品,一旦購買之後幾年都不再需要)種種變化不定的雜音,我現在有興趣的商品,不見得就會是我一直有興趣的商品;第三,聽歌按 like 是我自己一個人的行為,但我在 Amazon 上看或買東西,還包括了幫別人代買、代別人研究商品等等不是反映我個人行為的因子在裡面,也會使得 Amazon 更難抓住我真正的喜好;最後,根據 douban.fm 網站的統計,從我使用它們的 app 以來,我已經共計收聽 8585 首歌,而我整個有生之年應該是不可能在 Amazon 買到這種數量的商品。龐大的資料量也是 douban 可以準確預測我的喜好的重要因素。Big data 時代,資料就是黃金,由此約略可以了解。

如果對 douban.fm 有興趣的,可以去他們的網頁 http://douban.fm/  網頁上也可以透過 browser 線上收聽,用的是和 app 版本同一個帳號。網頁上也可以下載 Android 的 app 安裝檔(APK)  - 不知為何,這個 app 被 Google store 下架了,我猜有可能是侵犯版權之類的理由。不過 Android 的用戶仍然可以直接在 douban 的官網下載。