你是否有過這樣的經曆?當你在亞馬遜商城浏覽一些書籍,或者購買過一些書籍後,你的偏好就會被系統學到,系統會基于一些假設為你推薦相關書目。為什麼系統會知道,在這背後又藏着哪些秘密呢?
推推薦系統可以從百萬甚至上億的内容或商品中把有用的東西高效地顯示給使用者,這樣可以為使用者節省很多自行查詢的時間,也可以提示使用者可能忽略的内容或商品,使使用者更有黏性,更願意花時間待在網站上,進而使商家賺取更多的利潤,即使流量本身也會使商家從廣告中受益。
那麼推薦系統背後的魔術是什麼呢?其實任何推薦系統本質上都是在做排序。
你可能注意到了,排序的前提是對喜好的預測。那麼喜好的資料從哪裡來呢?這裡有幾個管道,比如你和産品有過互動,看過亞馬遜商城的一些書,或者買過一些書,那麼你的偏好就會被系統學到,系統會基于一些假設給你建立畫像和構模組化型。你和産品的互動越多,資料點就越多,畫像就越全面。除此之外,如果你有跨平台的行為,那麼各個平台的資料彙總,也可以綜合學到你的偏好。比如谷歌搜尋、地圖和應用商城等都有你和谷歌産品的互動資訊,這些平台的資料可以通用,應用的場景有很大的想象力。平台還可以利用第三方資料,比如訂閱一些手機營運商的資料,用來多元度刻畫使用者
那推薦系統又是如何建立模型、知道使用者愛好的?作者提供了兩種重要的算法:矩陣分解模型和深度模型,快來一起探個究竟吧!
矩陣分解可以認為是一種資訊壓縮。這裡有兩種了解。第一種了解,使用者和内容不是孤立的,使用者喜好有相似性,内容也有相似性。壓縮是把使用者和内容數量化,壓縮成 k 維的向量。把使用者向量次元進行壓縮,使得向量次元變小,本身就是資訊壓縮的一種形式;向量之間還可以進行各種計算,比如餘弦(cosine)相似性,就可以數量化向量之間的距離、相似度等。第二種了解,從深度學習的角度,使用者表示輸入層(user representation)通常用 one hot編碼,這沒問題,但是通過第一層全連接配接神經網絡就可以到達隐藏層,就是所謂的嵌入層(embedding layer),也就是我們之前提到的向量壓縮過程。緊接着這個隐藏層,再通過一層全連接配接網絡就是最終輸入層,通常用來和實際标注資料進行比較,尋找差距,用來更新網絡權重。從這個意義上講,完全可以把整個資料放進神經系統的架構中,通過淺層學習把權重求出來,就是我們要的向量集合了。經過這麼分析,矩陣分解在推薦系統中是如何應用的就顯而易見了。
這兩種情形都可以用矩陣分解來解決。假設資料庫裡m 個使用者和 n 部電影,那麼使用者電影矩陣的大小就是 m×n。每個單元 (i,j) 用r ij 表示使用者是否看了該電影,即0 或 1。我們把使用者和電影用類似 word2vec 的方法分别進行向量表示,把每個使用者 i 表示成 d 維向量 x i ,把每部電影 j 表示成 d 維向量 y j 。我們要尋找 x i 和 y j ,使得 x i ×y j和使用者電影矩陣 r ij 盡可能接近,如圖所示。這樣對于沒出現過的使用者電影對,通過 x i ×y j 的表達式可以預測任意使用者對電影的評分值。
用數學表達式可以這麼寫:
注意:這裡d 是一個遠小于m; n 的數。從機器學習的角度來說,模型是為了抓住資料的主要特征,去掉噪聲。越複雜、越靈活的模型帶來的噪聲越多,降低次元則可以有效地避免過度拟合現象的出現。
下面展示進階版的深度模型。我們将建立多層深度學習模型,并且加入 dropout技術。
這個模型非常靈活。因為如果有除使用者、電影之外的資料,比如使用者年齡、地區、電影屬性、演員等外在變量,則統統可以加入模型中,用嵌入的思想把它們串在一起,作為輸入層,然後在上面搭建各種神經網絡模型,最後一層可以用評分等作為輸出層,這樣的模型可以适用于很多場景。深度模型的的架構如下圖所示。
首先,做使用者和電影的嵌入層。
第三個小神經網絡,在第一、二個網絡的基礎上把使用者和電影向量結合在一起。
然後加入dropout 和relu 這個非線性變換項,構造多層深度模型。
因為是預測連續變量評分,最後一層直接上線性變化。當然,讀者可以嘗試分類問
題,用softmax 去模拟每個評分類别的機率。
将輸出層和最後的評分數進行對比,後向傳播去更新網絡參數。
接下來要給模型輸入訓練資料。
首先,收集使用者索引資料和電影索引資料。
收集評分資料。
構造訓練資料。
然後,用小批量更新權重。
模型訓練完以後,預測未給的評分。
最後,對訓練集進行誤差評估。
訓練資料的誤差在0.8226 左右,大概一個評分等級不到的誤差。
你可能會問,為什麼這個誤差和之前矩陣分解的淺層模型誤差的差距比較大?作者的了解是,這裡的dropout 正則項起了很大的作用。雖然我們建了深層網絡,但是由于有了dropout 這個正則項,必然會造成訓練資料的資訊丢失(這種丢失會讓我們在測試資料時受益)。就好比加了l1, l2 之類的正則項以後,估計的參數就不是無偏的了。是以,dropout 是訓練誤差增加的原因,這是設計模型的必然結果。但是,需要記住的是,我們始終要對測試集上的預測做評估,訓練集的誤差隻是看優化方向和算法是否大緻有效。
想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。