ALS-WR算法原文譯文

經過3個晚上的翻譯,終於把ALS-WR算法的介紹論文翻譯完成。此次翻譯目的是加強對ALS-WR算法的理解和練習自己對專業性英文的能力,由於本人英文水平有限並且該算法使用到了多個高數甚至超越高數和線性代數的一些知識,所以如哪裏翻譯不對或理解有誤,望英語強人,數學高人,算法牛人給個糾正,先於此謝過。原文見:http://link.springer.com/chapter/10.1007%2F978-3-540-68880-8_32?LI=true#page-1,最好是看英文版的,因爲該算法的主要精髓是在那幾個數學公式上。譯文如下:

大規模並行協同過濾算法(Netflix Prize)

作者:Yunhong Zhou(http://www.linkedin.com/pub/yunhong-zhou/1/4b9/865), Dennis Wilkinson, Robert Schreiber and Rong Pan(http://www.linkedin.com/in/rongpan)

很多的推薦系統使用協同過濾技術向用戶推薦相關事物,該技術是基於用戶之前已經查閱,購買或評論過的事物所做出的推薦。該技術需要解決的兩個主要問題是可擴展性和用戶信息的稀疏程度帶來的問題。在此論文中,我們將會描述ALS-WR,它是我們爲Netflix Prize設計的並行算法。我們在linux集羣中使用並行Matlab作爲實驗平臺,根據經驗,ALS-WR的性能會伴隨着特徵值數量和ALS迭代的增加而增加。ALS-WR使用1000個從RMSE中 獲得的特徵值作爲Netflix數據集進行實驗最後獲得的得分是0.8985,這個得分是基於單純(串行)方法獲得的最好的得分。結合其他並行版本的方法,我們獲得了比Netflix自身的CineMatch推薦系統高出5.91%的性能。ALS-WR是很簡單的並且對於大數據集也有很好的擴展性的一種解決方法。

  1. 介紹

推薦系統嘗試基於可用的信息向潛在的客戶推薦如電影,音樂,網頁,產品等事物。可想而知,一個成功的推薦系統能夠明顯的提升電子商務公司的收入或促進社交網站上用戶的交互。在衆多的推薦系統中,基於內容的方法當然是要去分析對應的內容(如文本,元數據,特徵)來決定相似的事物,然而協同過濾對大量用戶的行爲/愛好向指定用戶推薦相似事物。協同過濾在如Amazon,Netflix,Google News等很多公司中都有使用。

Netflix Prize這個項目(據說有大量的獎金給參賽者)是由Netflix主持的大型的數據挖掘競爭項目,主要目的是爲了尋找最好的推薦系統算法來預測用戶對電影的評分,當然這是在一個多於1億得分(根據480000個用戶和將近18000部電影得出的得分)的訓練集的情況下完成的。每個訓練數據有用戶,電影,日期,評分四個元素組成,評分是一個介於1到5的值。測試數據集是由2800000個數據節點和評分組成,目標是在預測評分時將RMSE(均方根誤差,http://wiki.mbalib.com/zh-tw/%E6%A0%87%E5%87%86%E8%AF%AF%E5%B7%AE)的值最小化。Netflix自身的推薦系統在測試數據集上的得分是0.9514,Netflix Prize這個項目的目標是獲得比該得分高出10%的解決方案。

該問題展示了一系列的挑戰,(所以到目前爲止,獎金還未被參賽者贏取)第一個挑戰是數據集比之前的基準數據集還要大100倍,這會消耗大量的模型訓練時間和系統內存要求。第二個挑戰是隻有1%的用戶-電影矩陣是在觀察中的,大部分潛在的評分都是不可見的。第三個挑戰是由於用戶行爲訓練數據集和測試數據集都會存在髒數據,我們不能期望用戶是完全可預測的。第四個挑戰是分配給每個訓練和測試數據集中用戶的評分是不同的,由於訓練數據集是由1995-2005年之間的數據組成而測試數據集是由2006年的評分組成。特別的,評分越少的用戶在測試集中是更爲有效的。直觀來講,預測一個在訓練集中表示較爲稀疏(該用戶對事物的評分較少)的用戶的評分是一件很困難的事情。

在此論文中,我們將會詳細討論該問題,接着會描述一個並行算法:ALSWR。

 

2.問題結構(配方)

使R={rij}nu×nm(數學公式請參看原文)表示一個用戶-電影矩陣,其中rij表示i用戶對j電影的評分,這個分數可以是一個真實的數字或是無值的。nu指定了用戶數量,nm指定了電影數量。在許多的推薦系統中,其任務就是根據已知的評分值去估算那些未知的評分。

我們從矩陣R的一個低秩近似值開始講起。通過賦予用戶和電影一個小尺寸的特徵空間我們可以接近用戶和電影的數據模型。每個用戶電影都存在一個特徵,並且每個用戶對電影作出的評分(已知和未知的)對應着用戶和電影特徵向量值的一個模型。更爲特別的是,U=[ui]代表用戶的特徵矩陣,ui屬於 Rnf,其中i=1…nu,M=[mj]表示電影特徵矩陣,mj屬於Rnf其中j=1…nm,這裏的nf是特徵空間的尺寸,也就是模型中隱藏變量的數量。如果用戶評分是完全可以預測的並且nf也足夠的大,我們可能會期望rij = < ui,mj >, 8 i, j。然後在實驗當中,我們最小化U和M的一個損失函數(http://wiki.mbalib.com/zh-tw/%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0)來獲得矩陣U和M。在本文中,我們將會學習mean-square(http://en.wikipedia.org/wiki/Root_mean_square)這個損失函數,該損失是由於一個單一評分是被squared error(http://en.wikipedia.org/wiki/Mean_squared_error)定義的:

L2(r, u,m) = (r− < u,m >)2.。

接下來我們有以下的經驗,將所有的損失作爲已知評分的損失的和:

Lemp(R,U,M) =1/n X(i,j)2IL2(rij , ui,mj),其中i代表已知評分集合的索引,n代表I的大小。最後可以將低秩近似值問題定義爲:(U,M) = arg min(U,M)Lemp(R,U,M)。其中U和M是真實的矩陣,並有nf列。在這個問題中,等式3中有(nu+nm)*nf個參數將被決定,另一方面,已知的評分集合I的元素個數遠遠少於nu*nm,因爲對於很少的用戶來對18000個電影進行評分是不可能的。爲了解決此問題,對一個很稀疏的數據集使用等式3經常會過於龐大,爲了避免這個問題,一個簡單的方法就是使用一下方式:Lreg_ (R,U,M) = Lemp(R,U,M) + _(kUUk2 + kMMk2)。對於一系列的已選的Tikhonov(http://en.wikipedia.org/wiki/Tikhonov_regularization)矩陣。

 

3.解決方法

在此節中,我們描述了一個迭代算法(ALSWR)來解決低秩近似值問題,接着會實現基於並行Matlab平臺的並行實現。

3.1ALSWR

       由於評分矩陣同時包含信號和髒數據,重要的是移除髒數據和使用恢復的信號來預測失去的評分。奇異值分解(SVD,http://zh.wikipedia.org/zh-cn/%E5%A5%87%E5%BC%82%E5%80%BC%E5%88%86%E8%A7%A3)是一種估算原生用戶-電影評分矩陣R的方法,它使用兩個k排名的矩陣˜R = UT ×M的結果作爲估算標準。由SVD給出的解決方案最小化Frobenious norm(http://mathworld.wolfram.com/FrobeniusNorm.html),該方案與在R的所有元素上最小化RMSE是等效的。然而,由於在矩陣R中有很多的空值,標準的SVD算法不能找到U和M矩陣。

       在本文中,我們使用ALS來解決低秩近似矩陣分解問題的步驟如下:

  1. 使用指定電影的平均得分作爲矩陣M的第一行,餘下的行值使用小的隨機值來填充。
  2. 使用squared errors和的最小值來填充U矩陣。
  3. 相似的使用squared errors和的最小值來填充M矩陣。
  4. 重複2,3步直到滿足了停止標準(stopping criterion(http://www.netlib.org/utk/papers/templates/node83.html))。

這裏使用的停止標準是基於在探測數據集上觀測的RMSE,修改U和M的第一次循環之後,如果探測數據集上的觀測的RMSE之間的差異小於1個基點,那麼該循環就會停止並且會使用獲得的U,M來作爲測試數據集上的最後預測根據。該探測數據集是由Netflix提供的,它與那些隱藏的測試數據集有相同的結構。

之前的第二節中,存在許多的自由參數,在沒有正交化的情況下,ALS可能會導致過度擬合(http://en.wikipedia.org/wiki/Overfitting),一種常見的解決方法是使用吉洪諾夫正交化(Tikhonov regularization(http://en.wikipedia.org/wiki/Tikhonov_regularization)),該方法會使大量的參數儘量影響最小化。我們嘗試了很多的正交化矩陣,發現下面的WR正交矩陣的效率最高,因爲根據經驗當我們增加特徵值的數量或循環次數的時候它從不會導致測試數據過度擬合:f(U,M) = X(i,j)2I(rij − uTi mj)2 + _0@Xinuikuik2 +Xjnmj kmjk21A(公式看原文!!!),其中nui和nmj分別表示用戶i和電影j的評分數量,如果使Ii代表用戶i評論過的電影j的集合,那麼nui就是Ii的基數,相似的如果Ij表示對電影j評論過的用戶集合,那麼nmj就是Ij的基數。這個和吉洪諾夫正交化中的U = diag(nui)和M = diag(nmj )是一樣的。

現在我們將演示如何在M給定的情況下填充(solve)矩陣U。U的列數(ui)是在已知用戶i的評分和用戶i評論過的電影特徵向量關係下解決正規化的線性最小二乘問題時給定的。(公式省略見原文)。

相似的,當M被修改時,我們會通過正規化線性最小二乘解來計算mj的值,方法是使用用戶對電影j評分特徵向量和對電影j的評分,如下:mj = A−1j Vj , 8j。

3.2使用加權正規化來並行計算ALS

我們通過並行修改U和M來並行計算ALS,我們使用的是最新版本的Matlab,該版本的Matlab允許在分開的Matlab上進行並行計算並互相通信(如分佈式數據庫),這些分開的Matlab擁有自己的空間和硬件環境。每個這樣的Matlab被稱爲一個單獨的實驗室,所以我們就會通過識別碼(labindex)和一個靜態變量(numlabs)得知當前共有多少個labs。這些矩陣可以是私有(擁有自己的一個拷貝並且值都是不同的)的,也可以是複製過來的(私有但是所有的labs的值都是相同的)或是分佈式(只有一個矩陣但在所有的labs當中是分區存儲的)的。分佈式的矩陣是存儲和使用大容量數據集的簡單方式,因爲數據集過大的話,在一個存儲器上存儲是非常耗內存的。在我們的問題上,我們會使用評分矩陣R的拷貝作爲分佈式來存儲,一份只存儲行(例如只有用戶)另一份只存儲列(只有電影)。我們將會計算分佈式的值並修改U和M,在計算U時我們會使用一份M的拷貝,反之亦然。

爲了修改M,我們需要U的一份拷貝,我們會使用電影的評分數據來修改。這是由相同數量的電影分配的。存儲電影j評分的lab自然地會成爲M的列值,這些列值也被稱爲影片j的特徵向量。每個lab並行地在對應的影片組中爲所有的電影計算mj值,這些計算出來的值接着會被收集起來以保證在一個複製的數組當中每個節點都有M的所有數據。相同的要修改U,所有的用戶會被分成相同數量的用戶組,接下來每個lab用以行分開的評分值來在對應用戶組中修改用戶向量。下面的Matlab代碼片段實現了給定U情況下修改M的實現:

function M = updateM(lAcols, U)

lamI = lambda * eye(Nf);

lM = zeros(Nf,Nlm); lM = single(lM);

for m = 1:Nlm

users = find(lAcols(:,m));

Um = U(:, users);

vector = Um * full(lAcols(users, m));

matrix = Um * Um’ + locWtM(m) * lamI;

X = matrix \ vector;

lM(:, m) = X;

end

M = gather(darray(lM));

End

對於以上的Matlab代碼,lAcols是一份R中列值的本地拷貝,locWtM是所有電影在分開的電影組中的nmj向量,Nlm表示在電影組中的電影數量。Nf和lambda對應着nf和λ,它們是ALS-WR中唯一可變的參數。

由於使用了分佈式(不共享內存算法)方式,該方法的計算時間節省了5%。該算法實現了一個接近線性加速的功能:如果nf=100,那麼在使用一個處理器的情況下需要花費2.5小時來修改U和M,但如果有30個處理器那麼只需要5分鐘。在30個循環的條件下,計算100個隱藏因子需要2.5個小時。

 

4.Netflix Prize問題性能研究

將我們的實驗在HP Proliant DL380 G4上的30個處理器集羣上運行,所有的處理器是Xeon 2.8Hz並且每四個處理器分享6GB的內存。對於每個nf值,我們將ALS-WR進行了10到25此的循環,並且在修改U和M時如果在探測數據及上增加了少於1bps的RMSE分數時循環就會輕質。最佳的λ值會在試驗和錯誤的情況下產生,測試的RMSE集合是從Netflix Prize網站的子任務獲得的,該測試分數的真正之對我們來說是未知的,爲了創建模型和調整參數,我們將探測數據集從訓練數據集中排除並將它用於測試。探測數據集是訓練數據集的一個子集,是由Netflix提供的,它包含了2006年最新的1408395個評分,每個用戶是隨機分配並且最多隻擁有9個評分。Netflix將測試數據集隱藏了,測試數據集的分佈和探測數據集的分佈式一樣的。

4.1預處理

爲了在預測結果時進行預處理,我們首先將一個去全局的有待改進的方法應用到每個預測方法上,給定預測值P,如果該P的值和測試數據集的值不一樣,我們將使用一個變量T=mean(test)-mean(P)來轉換所有的預測值。另外一種方法是直接將不同的預測值結合起來或獲得一個更好的預測值。例如,給定兩個預測值P0和P1,我們可以獲得預測值Px=(1-x)P0+xP1,並且使用線性迴歸(linear regression(http://en.wikipedia.org/wiki/Linear_regression))來找到X*值來使RMSE(Px)的值減至最小。然後我們獲得的Px*值至少會比P0或P1值要好。

  

4.2ALS的實驗結果

在實驗當中最大的發現是ALS-WR從來不會發生數據過度擬合的情況,即使是增加循環的次數或隱藏特徵值的數量都會發生過度擬合。如圖1(請看原文,一定要看!!!)所示,對於給定的nf和λ,每次循環都會提升探測數據及中的RMSE分數,並在循環20次之後該分數會趨於收斂。不同的λ值會得出不同的分數,並且通常情況下我們更需要使用更小的λ值來得到更好的RMSE值。圖2(請看原文!!!)顯示了根據固定值λ和不同數量的隱藏特徵值(nf值介於2到20)獲取的ALS-WR性能,對於每次試驗,ALS-WR會重複循環直到RMSE值提升幅度小於1bps爲止。從該圖我們可以看出RMSE值會隨着大的nf值而單調遞減,即使nf值是漸漸變小的(只要夠大)。

接下來我們使用大的nf值來進行試驗,對於使用簡單的λ正規化(u = m = E)的ALS,我們獲得的RMSE值是0.9184,對於使用權重-λ-正規化和nf爲50的ALS,獲得的RMS值爲0.9114,如果nf值爲150,那麼值爲0.9066。如果nf值爲300並伴有全局偏量校正,RMSE值爲0.9017,這時如果nf=400,則RMSE=0.9006;nf=500並伴有全局偏移,則RMSE=0.9000。最終,當nf=1000,RMSE=0.8985,在特徵值從400增加到500的過程中獲得了6bps的提升,從500增加到1000的過程中大約有15bps的提升。然後,似乎0.8985是使用ALS-WR能夠獲得極限值了,這個值比Netflix自身的CineMatch算法有了5.56%的性能提升,並且它是我們所知道的的單一方法解決此問題的最高得分了。

4.3其他的方法和線性混合

我們也使用並行實現了其他兩種有名的協同過濾技術。

受限波爾茲曼機(Restricted_Boltzmann_machine(en.wikipedia.org/wiki/Restricted_Boltzmann_machine))是一種同時存在可見狀態和隱藏狀態的中立圖,它的無向邊鏈接這每個可見狀態和隱藏狀態,因此得名受限。該方法先前被證明在Netflix競賽中工作的很好,我們也用Matlab實現了RBM,並將它轉化爲了PMODE(http://en.wikipedia.org/wiki/PMODE)。對於一個有100個隱藏單元組成的模型,在沒有PMODE的情況下RBM花費了將近1小時的時間來完成一個循環,然後使用30個labs的PMODE只花費了3分鐘。

K-近鄰(KNN(http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm))算法也是一種進行推薦的好方法。對於一個正確的距離矩陣,該矩陣中的每個數據節點都需要預測的情況下,k個最鄰近值的平均得分會被用來預測當前節點的得分。由於有許多的用戶-用戶對需要在合理的時間和空間內計算,我們會使用電影-電影中的相似之處來計算。我們將用戶分成用戶組來實現並行KNN算法,這樣一個lab就只處理一組用戶了。

對於RBM,得到的分數是0.9181,對於KNN,當k=21並且有個優秀的相似方法,得到的分數爲0.9270。混合這三種方法得到的值是0.8952(ALS+KNN+RBM),同樣的比Netflix自身的CineMatch推薦系統也有了5.91%的性能提升。

 

5相關工作

現在有許多的學者和產業在研究推薦系統,低秩矩陣近似和Netflix prize問題。我們會簡單介紹一些和我們有關係的一些相關內容。

5.1推薦系統

推薦系統可以主要分爲基於內容和系統過濾兩類,推薦系統在學術和產業中已經有了很不錯的研究結果。基於內容的推薦系統當然是要去分析某個事物的內容(如文本,元數據和特徵)來鑑定關聯事物,做的比較好的如InfoFinder,NewsWeeder。協同過濾對大量的用戶行爲和口味進行聚合來爲指定用戶推薦相應的物品,做的比較好的有GroupLens和Bellcore Video。結合基於內容和協同過濾這兩種方法的推薦系統有Fab系統和統一概率框架。

5.2Netflix Prize方法

對於Netflix Prize,Salakhutdinov et al使用受限波爾茲曼機獲得了略低於0.91的RMSE分數,他們同時使用梯度下降實現了低秩近似值方法,這種方法在20-60個隱藏特徵值的情況下獲得的分數略高於0.91。他們的SVD方法和我們的ALS-WR是相似的,但是我們使用的是ALS並不是梯度下降來解決優化問題,並且我們可以使用一個更大的特徵值來獲得RMSE分數的明顯提升。

在衆多的Netflix問題的解決方案中,Bell et al結合KNN和低秩近似的方式獲得分數都比使用單獨一種方式獲得的分數要高。他們的團隊由於得到的RMSE分數爲0.8712(比Netflix自身的方法高出8.5%)在2007年10月獲得了進步獎。然而他們的解決方案是將107中個性化解決方案進行線性組合,這107中方案中的大部分都是從ALS,RBM,KNN衍生出來的。在單獨使用ALS的情況下他們的最好得分是高於0.9000。

5.3低秩近似值方法

我們可以使用低秩矩陣分解(奇異值分解的變體)來估算一個指定的矩陣,例如信息檢索就是這樣的一種情況。其他的矩陣分解方法如非負矩陣分解和最大邊矩陣分解都在Netflix Prize中有所應用。

對於部分指定的矩陣,SVD就不適用了,爲了將已知的元素和對應的低秩矩陣因子之間的平方差最小化,ALS被證明是一種有效地方式,它提供了非正交因子。SVD會在一個時間下計算一行值,而對於部分指定的矩陣,沒有這樣的遞歸公式來解決。使用ALS的好處是它可以很容易實現並行化,像Lanczos一樣,對於稀疏並全部指定的矩陣,ALS保留了已知的矩陣元素的稀疏結果並且它的存儲效率是很高的。

 

6.結語

在本文中我們介紹了一種簡單的並行算法來對大數據進行協同過濾,這種算法和在文獻中出版過的任何一種方法是相似的。該算法對於大數據集具有很好的可擴展性,通過使用RBM和KNN等其他複雜的混合模式可以適當地獲得更好的分數。特別地ALS-WR能夠在沒有日期和電影名稱的情況下獲得很好的結果,通過讓創建模型和調整參數這些過程並行化能夠獲得更快的運行速度,寫一篇文章來解釋爲什麼ALS-WR從不會過度擬合你的數據將會是一件很有趣的事情。

由於當今世界已經進入互聯網計算和網絡應用的時代,大型數據的計算變得無處不在。傳統的單片機單線程計算已經變得不可行。並行和分佈式計算對於大多數的計算環境來說已經是一個必不可少的組件了。互聯網老大Google公司將擁有它們自己的並行分佈式計算的基礎設施,這些技術如MapReduce,Google File System,Bigtable等都做出了巨大的貢獻。許多的技術型公司並沒有資本和相關技術來建立自己的並行分佈式計算設施,它們反而更願意使用可行的解決方案來解決這些問題。Hadoop是一個由Yahoo!投資的開源項目,它致力於使用開源方式來複制Google的計算設施。我們已經發現並行Matlab是靈活和有效的,並對於程序來說是很簡單的。因此,從我們的經驗出發,這看起來在將來會是一個解決可擴展並行分佈式計算的一個強有力的競爭者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章