稀疏編碼在推薦系統中的應用

稀疏編碼在推薦系統中的應用

6 人贊了文章

目錄

一、為什麼推薦中需要使用稀疏編碼

二、稀疏自編碼的基本方法

1、基礎稀疏自編碼結構[1]

2、多層結構[2]

三、音樂推薦中的應用

1、稀疏編碼的訓練方法及問題

2、如何解決用戶沒有顯示評分及矩陣稀疏的問題?

四、如何部署到實時推薦中

稀疏編碼可以看作是稀疏自編碼方法的一個變形,該方法試圖直接學習數據的特徵集,利用與此特徵集相應的基向量,將學習得到的特徵集從特徵空間轉換到樣本數據空間,這樣我們就可以用學習得到的特徵集重構樣本數據。其根本是一種數據降維的方法。

一、為什麼推薦中需要使用稀疏編碼

大型推薦系統,物品的數量級為千萬,用戶的數量級為億。所以用戶對物品的打分基本不可能靠離線計算完成,只能依靠在線計算。而在線計算能更快地響應最近的事件和用戶交互,但必須實時完成。這又會限制使用演算法的複雜性和處理的數據量。所以個性化推薦實時架構的關鍵問題,就是如何以無縫方式結合、管理在線和離線計算過程。

使用稀疏編碼進行數據降維後,用戶或者物品均可用一組低維基向量表徵,便於存儲計算,可供在線層實時調用。

例如Netflix對外公開的實時推薦框架(圖1)也是運用了這種離線計算參數數據,並用其內部工具Hermes將數據以接近實時的方式交付給在線計算層。在QQ音樂推薦系統中,這部分離線計算結果主要存儲在ckv/tssd中,供核心計算模塊使用。

圖1:Netflix推薦架構參考

二、稀疏自編碼的基本方法

1、基礎稀疏自編碼結構[1]

稀疏自編碼神經網路是一種無監督學習演算法。假設我們只有一個沒有帶類別標籤的訓練樣本集合:{ x^{1},x^{2},x^{3}... },其中 x^{(i)}in R^{n} 。稀疏編碼使用了反向傳播演算法,並讓目標值等於輸入值,比如 y^{(i)}=x^{(i)} 。下圖是一個自編碼神經網路的示例。

自編碼神經網路嘗試學習一個

的函數。換句話說,它嘗試逼近一個恆等函數,從而使得輸出 	ilde{x} 接近於輸入 x 。當我們為自編碼神經網路加入某些限制,比如限定隱藏神經元的數量,我們就可以從輸入數據中發現一些有趣的結構。

假設某個自編碼神經網路的輸入 x 是100維的數據 ,其隱藏層 L_{2} 。我們限定為50個隱藏神經元,輸出也是100維的 yin R^{100} 。由於只有50個隱藏神經元,我們迫使自編碼神經網路去學習輸入數據的壓縮表示,也就是說,它必須從50維的隱藏神經元激活度向量 a^{(2)}in R^{50} 中重構出100維的輸入 x 。如果網路的輸入數據是完全隨機的,比如每一個輸入 x_{i} ,都是一個跟其它特徵完全無關的獨立同分布高斯隨機變數,那麼這一壓縮表示將會非常難學習。但是如果輸入數據中隱含著一些特定的結構,比如某些輸入特徵是彼此相關的,那麼這一演算法就可以發現輸入數據中的這些相關性。

另外當隱藏神經元的數量較大(有時為了能更有效地找出隱含在輸入數據內部的結構與模式,會尋找一組超完備基,其維度可能比輸入的維度還要高),也可以通過給自編碼神經網路施加一些限制,使得滿足稀疏性要求;例如如果當神經元的輸出接近於1的時候我們認為它被激活,而輸出接近於0的時候認為它被抑制,那麼使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。

2、多層結構[2]

以上是自編碼最基礎的結構,另外我們也可以用深度學習的一些思想,學習到高層抽象特徵。其中一種方法是棧式自編碼,其採用逐層貪婪訓練法進行訓練。即先利用原始輸入來訓練網路的第一層,得到其參數

;然後網路第一層將原始輸入轉化成為由隱藏單元激活值組成的向量(假設該向量為A),接著把A作為第二層的輸入,繼續訓練得到第二層的參數

;最後,對後面的各層同樣採用的策略,即將前層的輸出作為下一層輸入的方式依次訓練。

例如如下圖,假設我們用原始輸入 x^{(k)} ,訓練第一個自編碼器,它能夠學習得到原始輸入的一階特徵表示 h^{(1)(k)} .

(如下圖所示)。

接著,你需要把原始數據輸入到上述訓練好的稀疏自編碼器中,對於每一個輸入 x^{(k)}

,都可以得到它對應的一階特徵表示 h^{(1)(k)} 。然後你再用這些一階特徵作為另一個稀疏自編碼器的輸入,使用它們來學習二階特徵 h^{(2)(k)} 。(如下圖所示)

同樣,再把一階特徵輸入到剛訓練好的第二層稀疏自編碼器中,得到每個 h^{(1)(k)}

對應的二階特徵激活值 h^{(2)(k)} 。接下來,你可以把這些二階特徵作為softmax分類器的輸入,訓練得到一個能將二階特徵映射到數字標籤的模型。

如下圖所示,最終,你可以將這三層結合起來構建一個包含兩個隱藏層和一個最終softmax分類器層的棧式自編碼網路。

三、推薦系統中的應用

1、稀疏編碼的訓練方法及問題:

在推薦實踐中,我們主要使用稀疏編碼的方法,輸入用戶點擊/收藏/購買數據,訓練出物品及用戶的特徵向量,具體構造自編碼網路的方法如下:

輸入層,每首物品的輸入向量為( { u_{1} , u_{2} ,u_{3} ... } )

,其中 u_{i} 表示用戶i是否點擊/收藏/購買這個物品。輸入矩陣為(m+1)*n維(包含一個截距項),m為用戶數量,n為物品數量。

輸出層,指定為和輸出層一致(無截距項)。

隱藏層,強制指定神經元的數量為k+1個,此時隱藏層其實就是物品的低維特徵向量,矩陣為(k+1)*n,k+1為特徵維數(包含一個截距項1,之所以保留,是為了可以重構出輸出層),n為物品數量。

隱藏層到輸出層的連接。一般的神經網路中,往往會忽略隱藏層到輸出層的連接權重

的意義,只是將其作為一個輸出預測的分類器;但在自編碼網路中,連接層是有實際意義的。這些權重作用是將物品特徵向量映射到用戶是否聽過/喜歡該物品,其實可就是用戶的低維特徵,所以該稀疏網路同樣可以學習到用戶的特徵矩陣m*(k+1)。值得注意的是,當網路結構為3層時,其目標函數與svd基本一致,演算法上是相通的。

2、如何解決用戶沒有顯示評分及矩陣稀疏的問題?

1)大部分物品用戶都是沒有接觸過的,但並不代表用戶不喜歡,同時這部分缺失的數據正是我們需要預測補充的。

2)即使用戶點擊過這個物品,也並不代表用戶喜歡。

傳統的svd等演算法中,往往會使用用戶的打分結果,譬如使用1-5分的打分數據,並利用用戶整體打分結果做一些處理。但是顯然大部分app中並沒有打分的入口,也不可能僅為了推薦準確性,而加入該特性;而強制加入打分規則也是不合理的。所以我們對目標函數進行了一些改造,原目標函數(1):

min(||As-x||_{2}^{2}+lambda||s||_{1}+gamma||A||_{2}^{2}) (1)

其中x 是輸入層數據,s是希望學習到稀疏特徵集 ,A是將特徵集從特徵空間轉換到樣本數據空間的基向量 。

參考[3]的思路,我們使用了一種基於用戶隱式反饋的訓練方式,即增加一個因子項

c_{ui}=1+alpha log(1+varepsilon r_{ui}) 。當用戶u越喜歡物品i時, c_{ui} 值越大。其中 r_{ui} 我們是這樣構造的:當用戶u收藏物品i時直接取1;當用戶僅點擊時,會根據點擊次數和駐留時長綜合計算

r_{ui}=1 (if u fav i)

r_{ui}=min(n,5)/5*f_{ui} (if u only click i)

並且當用戶沒有接觸過該物品時,為0,即該連接的數據在最優化求解時並沒有實際貢獻,這也就解決了缺失值的問題,同時因為這個矩陣是稀疏的,也大大降低了計算時間與空間的複雜度。

至此,我們就訓練出了第一個自編碼器。再利用棧式自編碼逐層貪婪的思想,可以進一步重複計算出第2、3…個自編碼器,但是需要注意的是之後的自編碼器均沒有因子,但是通過第一個自編碼器已經將維度大大降低了。

[1] UFLDL Tutorial:deeplearning.stanford.edu

[2] UFLDL Tutorial:

deeplearning.stanford.edu

[3]Yifan Hu,Collaborative Filtering for Implicit Feedback Datasets

推薦閱讀:

個性化推薦系列之推薦系統的演化及常見推薦演算法
個性化推薦系列之初步認識推薦系統
Netflix 20年拼殺史:推薦系統捧起來的千億美金公司
個性化推薦帶來的內容泛濫終歸會回歸品質
達觀數據:簡談馬爾可夫模型在個性化推薦中的應用

TAG:個性化推薦 | 編碼 | 神經網路 |