google youtube 電影推薦演算法
在面試實習生的時候,我有個習慣,就是面試快結束的時候,會像聊天一樣和麵試的學生聊一下他們對某個技術方向的看法。很多時候不是期望他們能提供什麼靈感,也不期望能聊出太多結果,更多的是想通過這些溝通,看一下現在學生對這些問題的看法達到什麼程度,而且這些溝通很能反映一個面試者的個性。 比如有些人對問題比較堅持, 或者叫做偏執,或者叫做執著,都能夠反映出來。
前幾天面試的時候到了最後環節的時候,忘了是說什麼問題了,面試的實習生提到一般工業界使用的推薦演算法都是比較簡單的,不會去嘗試複雜的演算法。 我問他為什麼,他說覺得工業界不會投入太多人力; 後來我告訴他還需要考慮處理的資料量和可維護性等因素。 當然他說的這個現象的確比較普遍: 工業界一般都傾向於使簡單粗暴有效的演算法,只有這些方法都搞不定時,才會嘗試更復雜的潛在演算法。
兩個例子: 一個是 youtube 使用的電影推薦演算法(參見論文: The Youtube Video Recommendation System);另一個例子就是Baidu關鍵詞推薦系統中使用的級聯二步圖; 應該說Baidu關鍵詞推薦系統中的級聯二步圖的思路是借鑑於youtube電影推薦演算法並應用在關鍵詞推薦的場景中。 下邊就簡單介紹下youtube Video推薦演算法。
演算法的思想其實比較簡單:使用關聯規則找到有關聯的電影,計算權值後進行ranking推薦。其中的新意在於,這種關聯關係能夠進行多次傳遞,逐漸擴大和種子電影相關的電影集合(當然關係傳遞得越遠,一般關聯程度也會相應減弱)
具體的推薦過程可以分為3步:
建立video間的關係
建立video間關係的方式比較簡單,使用關聯規則中的共現方式即可。此處youtube使用的是24小時內session的co-visitation。具體為:
使用 r(vi, vj) = cij/f(vi,vj) 表示video i和video的關聯程度, 其中 r為兩個video/item的相關係數, ci為i,j共同出現次數, f 為 vi, vj歸一化後的分母總量(最簡單的方式就是ci * cj),這樣就能找到相關的兩個vedio
產生特定使用者的video候選
該過程在經典資訊檢索中可以被理解為觸發邏輯,及找到待推薦video/item的候選(觸發邏輯在推薦系統中所處的位置及重要性參見另外一篇blog: 傳統推薦引擎系統架構)
定義S為特定使用者的種子video集合, 例如在youtube推薦系統中可以選擇使用者最新觀看(或者最新完整觀看的video),之後的問題就是怎麼找到和種子詞相關的video進行推薦。我們將其分為以下3步:
- 定義Cn(S)為和種子集合S相關聯的,通過n步擴充套件後的推薦候選集合。 例如 C1(S) = 所有Ri的並, 其中Ri是與S中的vi相關聯的v(尋找相關聯v的過程參見上述:產生特定使用者的video候選)。 相當於找到所有與S中種子vi想關聯的v的並集;該做法的缺點是可能範圍比較小且太相似。
- 使用Cn(S)進行觸發, 即得到C(n-1)(S)後,再找到與C(n-1)(S)中每一個vi相關聯的v,之後去除種子詞S,我們稱Cn(S)為對S的n步擴充套件。
- 同時在C(n)(S)中保留著每一個v被找到的原因, 便於後續ranking及給出explanation。
經過上述3步,對於特定user的候選video就觸發完畢了。 該觸發步驟可以說是該論文中的值得借鑑的點。 組裡之前一位工程架構策略都很牛的同學指導實習生實現了一個通用的級聯二步圖演算法框架, 該演算法框架能夠將有關聯的節點的關係進行傳遞:
例如對於關鍵詞,我們可以使用topic 主題(由topic model產生)建立關鍵詞之間的跳轉關係, 或是關鍵詞中的核心term(一般是歸一化後的核心term)建立跳轉關係。 而該框架更令人著迷的是, 二步圖的左右兩邊可以不是同樣的item, 例如左邊節點是keyword而右邊是user, 則可以使用topic 直接建立keyword與user的關係進行推薦。
Ranking
youtube 的ranking策略主要考慮以下3個因素:
- video質量, 這個可以通過網名對video投票打分得到。
- user specificity: 在觸發後,可以通過使用user profile和電影的一些質量, 或是內容屬性進行排序
- divercification:特別是類似video這種興趣相關的內容, divercification的引入就顯得非常重要了;相反, divercification在不同的場景下可能不同,百度關鍵詞推薦中, 根據種子詞直接檢索得到的結果需要考慮與種子query的強相關性, 此時divercification的引入, 或者引入的程度需要比較慎重保守。
當然, ranking機制一般都會非常複雜, 論文中此處只是簡單介紹; 例如在構造百度關鍵詞推薦系統的過程中, 我們引入了提詞率預估, 效用預估, 價值預估等模型對返回結果進行ranking。同時也需要結合user interaction的樣式,演算法出口等進行調整。 具體ranking機制會在後續blog中介紹。
效果上, 級聯二步圖的引入,能夠找到非常多靠譜的結果(當然二步圖邊的建立是核心,選對了邊的建立方式,才會有好效果),具體效果資料就不便透露了:) 反正是基本上能夠覆蓋全部鳳巢使用者,每個客戶都能推出數量驚人的關鍵詞(當然,需要使用字面, 語義等技術進行後續filtering and ranking)
更進一步, 級聯二步圖是圖關係挖掘的一個簡單有效的特例, 使用類似於pagerank等經典演算法, 也能夠很好地找出類似的關係進行推薦。
參考來源:
The Youtube Video Recommendation System
Google Adwords
也可關注微博: weibo.com 或者直接訪問 http://semocean.com