facebook 將協同過濾加上深度學習來解決搜索推薦問題 (二) - 論文翻譯

總述:facebook 在技術行業上一直和谷歌這些公司一樣,處於一個領頭羊的地位,在 facebook 的業務當中,搜索推薦算法一直是一個比較重要的板塊,在今年他們提出來一個新的算法,就是在“深度方法”的基礎上,再加上這個行業剛興起時候的“協同過濾”!本文先從論文翻譯入手,後續還會給出源碼理解、以及博主的實踐理解

 

原文地址鏈接:https://arxiv.org/pdf/1906.00091.pdf

下面這篇論文的翻譯,也可以在這個鏈接進行下載,我已經上傳了上去:https://download.csdn.net/download/a1066196847/11294026  默認需要積分才能下載,沒積分的可以給我留言,我發給你

英文題目:Deep Learning Recommendation Models for Personalization and Recommendation Systems

中文題目:個性化和推薦系統中的深度學習推薦模型

 

摘要

隨着深度學習的發展,基於神經網絡的推薦模型已經成爲解決個性化和推薦的重要工具。這些網絡與其他深度學習網絡有很大不同,他們需要處理分類特徵,這個方向還沒有得到很好的研究和理解。在本文中,我們開發了一種最先進的深度學習推薦模型(DLRM),並且提供了他們基於pytorch和caffe2的實現,此外,我們還設計了一種專用的並行化方案,利用嵌入表上的模型並行性來減少內存約束,同時利用他們的數據並行性來從“全連接層”向外擴展計算。我們把DLRM模型和現有的推薦模型進行比較,並且在Big Basin人工智能平臺上來描述其性能,展現他在未來的算法試驗和系統協同過濾上作爲基準的有用性。

1:介紹

目前,個性化和推薦系統已經在各大互聯網公司用於各種業務上,包括CTR預估和排序模型。雖然這些方法歷史悠久,這些方法最近才採用了神經網絡。兩個主要觀點爲深度學習模型的設計做出了貢獻。

第一個是來自於推薦系統的觀點,這些系統最初利用協同過濾的思想,用戶可以根據自己相近的人來進行推薦喜歡的東西【22】。推薦的內容是基於用戶過去的行爲,利用以前用戶對產品的評價等。鄰域方法【21】通過對用戶分組、產品聚類、潛在因素辦法來給用戶進行推薦,通過這些隱含的特徵,來構建矩陣分解技術來表徵用戶和產品【9,17】在後來已經成功在線上得到證實可用。

第二個是來自於預測分析,他依賴於統計模型來進行分類或者根據給定的數據來預測事件發生的概率【5】。預測模型從使用簡單的模型開始,比如線性迴歸、邏輯迴歸模型,一直到包含深度網絡的模型。爲了處理類別特徵,這些模型採用了用嵌入式轉換的辦法,將one-hot和multi-hot的向量在一個“抽象空間”中變成dense向量。這個抽象的空間可以被看做推薦系統發現潛在因素的空間。

在本文中,我們介紹了由兩者思想結合的個性化模型,這個模型用嵌入式embedding的方式來表徵“類別特徵”,還有一個多層感知器(MLP)來處理“數值特徵”,最後,用在【24】中提出來的統計技術的方法來明確的進行相互作用這些特徵,最後,他通過和另一個MLP模型後處理這些相互作用,找到了事件概率。我們將這種模型成爲深度學習推薦模型(DLRM)。這個流程可以參見Figure 1。這個模型已經用Pytorch和caffe2來實現,並且隨着這個手稿的發出已經用於測試和試驗。

 

2:模型設計和架構

在本節中,我們將描述DLRM的設計。我們將從這個網絡的高級組件開始,解釋他們怎麼、爲什麼能夠組裝在一起,對未來模型設計產生影響;然後介紹低級操作和基本元件構成這個模型,對未來的硬件系統設計產生影響。

2.1:DLRM的組成部分

DLRM的高級組件可以很容易的通過回顧更早之前的model來進行理解。我們將避免全盤科學回顧,我們將專注早期用過的4種技術,這些可以解釋爲DLRM的高級組件。

2.1.1 向量

爲了處理類別特徵,我們需要把每個category表徵成一個dense的向量。特別是,一個向量可能用一個one-hot向量ei(第i個位置是1,其他位置是0,第i個位置和第i個取值保持一致)來獲取相應的行向量。向量表W屬於R(m*d),可以寫成下面這樣

在更復雜的場景中,一個embedding也可以代表多個item加權後的結果,一個multi-hot向量的權重,其中每個元素,ai不等於0,,其他的地方填補0。這些index可以代表相應的item。要注意到假設一個mini-batch的size爲t的話,向量的查詢可以被寫成,,稀疏矩陣A是

DLRMS將會利用embedding tables將每一個類別特徵都轉換成N維的向量,然而即使可以做到這種映射是有意義的,他們又將如何被應用?爲了回答這個問題,我們回到“潛在因子方法”。

 

2.1.2 矩陣分解

回想一下,在推薦問題的典型描述中,我們給出來一組用戶S,這些用戶已經評定了一些產品。我們想要用向量來表徵第i個產品,i的取值是1,…,n,第j個user也用向量表徵,,j的取值也是1,…,m,n m分別表示產品和用戶的總數。更嚴格的說當第j個用戶對第i個產品進行交互時,可以用一個索引元祖(i,j)來進行表達。矩陣分解方法可以通過最小化下面這個公式來表達

我們用來表示第i個item和第j個user向量的乘積,i和j的取值範圍和上面一樣,我們讓,我們可以用來表示近似於整個矩陣的乘積,這裏的W V是兩個向量表,每一行都代表一個item或者一個user,這些嵌入向量的點乘產生了對後續評級有意義的預測,這是設計DLRM的關鍵點。

 

2.1.3 分解機

在分類問題中,我們想要定義一個預測函數,,從輸入的數據到一個目標target。舉個栗子,我們可以通過定義T={+1,-1}來預測點擊率(+1表示存在點擊,-1表示不存在)。分解機FM通過定義一個模型將二階交互轉化到一個線性模型中,這個模型長下面這個樣子

這個公式中,,upper這個參數選擇矩陣的上三角部分。

FM與具有多項式、核的支持向量機明顯不同【4】,因爲FM將二階相互作用矩陣分解成潛在因子(或者說是嵌入向量),這種方式更加有效的處理了稀疏數據。這顯著減少了通過僅捕獲不同對這件的交互產生的embedding向量的複雜度,產生線性計算複雜度。

 

2.1.4 多層感知機

最近很多在機器學習上的成功歸功於深度學習的興起。其中最基礎的模型是多層感知器(MLP),一種由全連接層組成的交錯序列,激活函數是,

這些方法已經用於捕獲更復雜的交互。這表明了,如果給定足夠多的參數,MLP也具有足夠深度、寬度,就能使數據適應任意精度【1】,這些方法的變換已經廣泛的被用在計算機在內的各種計算版本、神經語言處理上。一個特例,NFC[15,25]使用MLPerf基準【19】中的一部分,使用MLP而非點乘來計算矩陣分解中的embedding的相互作用

 

 

2.2 DLRM的架構

截止到目前爲止,我們已經描述了推薦系統和預測分析中使用的不同模型。讓我們直覺性的來比較一下他們,以創建一個截止到目前爲止最先進的模型。

首先讓user和item被許多連續、離散的特徵來描述,爲了處理這些類別特徵,每一個類別特徵都會被表達成同一個維度的向量,概括了矩陣分解中使用到的潛在因素的概念(3)。爲了處理連續特徵,連續特徵將由一個MLP(我們稱之爲底部或稠密的MLP),將產生一個與嵌入相同長度的embedding向量。

我們將根據直覺,明確的計算不同特徵間的二階交叉,處理FMs(4)中提供的稀疏數據,選擇性的把它們通過我們的MLP模型,這個操作已經被在所有的向量對中通過點乘和處理dense特徵解決。這些點乘的item被原始處理的dense特徵和一個後處理的MLP(output MLP)所連接,然後將預測結果輸入到一個sigmoid函數來給出預測概率。

我們將得到的模型稱爲DLRM,在Fig1中展示。我們展示了一些在pytorch中、Caffe2中常用的操作。

 

2.3 與先前模型的比較

許多基於深度學習的推薦模型【3,13,27,18,28,29】使用類似的主意去生成高階項以便來處理這些稀疏特徵。比如這些Widw and Deep、Deep and Cross、deepfm、xDeepFM網絡,設計專門的網絡去構建高階表達。這些網絡然後把他們輸出的模型和一個MLP模型的結果加起來,然後通過linear模型和一個sigmoid激活函數把最終的概率輸出。DLRM用一個可以模型向量機的結構化方法來專門嵌入這些embedding,通過在最後一層MLP只考慮有交叉的item之間的點乘,來顯著降低模型的維數。我們再下面這個理論上有個爭論,我們在其他模型裏面發現高階交叉要比二階交叉效果好,但這在計算內存成本上來說是不划來的。

DLRM和其他網絡比較看,一個最主要的不同點是:模型如何來對待已經被變成向量的特徵、已經他們之間的交叉。特別支持,DLRM(and xDeepFM[18])把每一個特徵向量解釋成一個,用單神經元表達單特徵,與此同時,像Deep和Cross這樣的網絡把特徵向量中的每一個元素看成一個新的神經元,並且進行互相交叉。因此,Deep and Cross網絡不僅把不同特徵向量和item進行點乘,像在DLRM中醫藥,並且在不同特徵之間也進行了交叉,最終就導致了一個很高的參數維度。

 

3:並行化

現代個性化模型和推薦系統需要大批量參數、複雜的模型才能hold得住大規模數據。DLRMs更是包含很多的參數,最多可以比一些常見的深度模型,比如CNN,RNN,GAN多出幾個數量級。這導致模型的訓練時間會長達幾個周。因此,爲了在實際規模上有效的解決這些問題,有效的建模,將這些任務並行化是非常重要滴。

正如上一節所述,DLRM可以同時處理類別特徵(需要用embedding表達)、和連續特徵(最後一層使用MLP)。Embedding有助於實現主要的參數,每個表需要好多G的內存,使得DLRM內存佔用過大並且帶寬也比較密集。Embedding的size使得他可能禁止進行並行化,因爲他需要在每個worker上都複製一份lookup table。在很多種情況下,這種內存約束使得訓練模型的時候,需要將一份參數跨多個設備複製到每個機器上。

另一方面,MLP這種模型在內存中的參數了是非常小的,但需要轉換成相當大的數量來進行計算。因此,數據並行性對於MLP來說是首選的,因爲這能模型當在更新模型參數的時候,能夠進行併發處理不同設備上的樣本。我們得並行化DLRM將使用模型並行化的組合,來實現embedding的分享和數據並行,MLP的並行化可以緩解查找embedding向量帶來的內存,並且在整個MLP階段,也就是前向和後向傳播階段都可以這樣做。由於MLRM的結構、大規模模型,組合模型、數據並行在DLRM上是一個特別的要求。這樣的組合、並行不管在caffe2和pytorch上都是不支持的(其他的深度學習框架上也是不支持),所以我們設計了一個自定義的實現,我們會在下面的論文中詳細說說他。

 

在我們的設計中,top MLP和相互操作,需要從bottom MLP和總體的embedding查找表中,訪問小批量的數據。由於模型並行性已經用在在各個設備上去分佈這些數據,這需要個性化的全面通信【12】。在embedding lookup的最後,每一個設備都有整個embedding table裏的一部分數據,需要驗證小批量維度進行分割並傳送到適當的設備。就像在Fig2中記錄的一樣

 

我們注意到數據並行NLP模型中,向後傳遞中的參數更新是使用 allreduce來進行累計的,並且把參數應用於每一個設備上【12】,確保在每一次迭代之前,每個設備上的參數都是最新的。IN pytorch,數據並行可以用 nn.DistributedDataParallel和nn.DataParallel模塊來做,並且用於在每個設備上覆制模型,並且插入 allreduce 必須的依賴。在 caffe2 中,我們在每次 梯度更新時 手動插入 allreduce。

 

4:Data

爲了測量模型的準確性,測試其整體性能,並對每個獨立的操作進行表徵,我們需要爲我們得試驗創造或者獲取到一個數據集,我們現在的方式是:隨機造一個、合成一個、公開的數據。

前兩個數據集可用於從系統角度試驗模型,特別是,他允許我們測試不同的硬件屬性,並且在移除數據存儲系統的依賴關係中動態獲取數據,並且測試準確率。

 

4.1

回想一下,DLRM模型接受類別特徵、連續特徵作爲輸入。前者可以通過使用均勻或者正態(高斯)分佈,生成隨機數矢量,這兩個函數使用默認的參數 numpy.random/rand/randn。輸入數據的一個小批量可以通過隨機生成一個矩陣完成,每一行都是小批量中的一個元素。

爲了生成類別特徵,我們需要首先確定,在一個multi-hot中我們需要多少個非0元素。在基準測試的時候,可以允許這個數字固定或者是隨機,在[1,k]直接生成。然後,我們生成相對數量的整數索引,取值範圍是[1,m],m就是行數。最後,爲了創造一個mini-batch的lookups,我們連接上面的索引,並且描述每個單獨的查找,用SparseLengthsSum或者nn.EmbeddingBag

 

4.2

有很多理由支持自定義生成與分類特徵相對應的索引。例如,如果我們得應用使用了一個特殊的數據集,但我們因爲隱私不想公開它,然後我們就會通過分佈來表達分類特徵。這可以作爲應用程序中,使用的隱私保護技術的替代方案,比如在 federated learning[2,10]。另外,如果我們想要鍛鍊系統的組件的健壯性,比如學習記憶行爲,我們或許想要捕獲原始痕跡訪問的基本位置。

現在讓我們說一下如何使用合成數據集。假定我們有一系列指數,對應於單個分類特徵的lookup table(並且爲所有特徵重複這個過程)。我們可以記錄重複訪問之間的唯一訪問、距離頻率(Alg.1),然後生成一個合成的軌跡(Alg.2),就像在【14】中提出的方法一樣。

請注意,我們只能生成一個堆棧距離,最多可以是s個唯一的訪問,因此,s用於控制在分佈p中的一個支持,就像在Alg.2中一樣。給定一定數量的唯一訪問,較長的輸入軌跡將導致在Alg.1中分配給他們的概率更低,這將導致在Alg.2中爲了全分佈式的操作造成更多的時間。爲了解決這個問題,我們將唯一訪問的概率挺高到最小閾值,並且一旦有了全部內容,我們就刪掉唯一訪問的那些記錄。基於原始和合成軌跡的概率分佈p如圖3所示。在我們的原始實驗,和調整合成軌跡中,生產了一些低緩存命中或者未命中率。

Alg.1和Alg.2是爲了更準確的緩存模擬才被設計的,但他們說明了一個一般概念,怎麼樣概率分佈可以用來生成具有所需屬性的合成軌跡。

4.3 公開

很少有公開數據集可用於推薦和個性化系統。有兩個比賽的數據可以用,一個是 The Criteo AI Labs Ad kaggle,一個是 Terabyte,這兩個數據集是開放的並且包含了點擊日誌和CTR預估的label。每一個數據集都包含13個連續的特徵、26個類別特徵。一般來說,對連續的特徵都會使用log(x+1)來進行處理,類別特徵都拿到相應的index,一些NULL數據就給個0或者NULL吧。

The Criteo AI Labs Ad kaggle這個比賽的數據報告超過7天的數據量,總數據了大約4500萬。這7天的數據,前6天會被當做訓練集,最後1天當做驗證集。Terabyte超過24天,前23當做訓練集,最後1天當做測試集。每天都有大約相等數量的樣本。

 

5  試驗

讓我們現在說明下DLRM的準確性。這個模型是基於caff2和pytorch框架的,可以再github中得到。在模型參數、索引上,他的精度是使用的fp32,int32(Caffe2)/int64(Pytorch)。這個試驗是在 Big Basin 平臺上進行,基於 Dual Socket Intel Xeon 6138CPU,2.0Ghz,還有8塊 16gb的V100卡

5.1 模型在公共數據集上的準確率

我們再Criteo Ad kaggle數據集上進行評估模型,並且使用了DLRM模型,我們和一個Deep Cross網絡(DCN)來進行對比性能,而且沒有進行大量的參數調整。我們還對比了DCN網絡,因爲這個網絡是少量的幾個在同一數據上具有全面結果的模型之一。在這種情況下,模型的大小取決於數據量的多少。特別是,DLRM由可以處理Dense數據的底部MLP組成,三個隱藏層包含有512 256 64個節點,top MLP包含有兩個隱藏層,512 256個節點。另一方面,DCN包含有6個交叉層,和一個深度網絡包含有512 256個節點。Embedding的尺寸是16,這些造成的結果是,DLRM和DCN都有大約540M的參數。

我們在一個epoch上,繪製了完整的訓練集、驗證集的準確率曲線,使用的優化器是 SGD、Adagrad optimizers【6】。沒有使用正則化。在這個試驗中,DLRM表現出了稍高的訓練和驗證準確率。就想在Fig 5中表現的那樣。需要強調下,這是沒有對模型參數進行調整過的一個泛化結果。

5.2 在單個通道/設備上的模型表現

爲了在單臺設備上看看我們模型的性能,我們準備了一個小數據集,8個類別特徵,512個連續特徵。所有的類別特徵都通過一個1M大小的lookup table進行查詢,64維度,連續特徵就 assembled 成512維度的特徵。讓最後一層的MLP有兩個層,第一層的MKP有4個層。我們隨機選擇了2048個樣本,batch_size大小是1000

Caffe2中這個模型在cpu上運行大約256秒,在GPU上運行62秒。和我們期待的一樣,大多數時間都花費在了從lookup table中查找、和全連接層。在cpu上,全連接層佔據的時間分量很大,在gpu上就忽略不計了。

 

6  結論

在這個論文中,我們提出並開源了一個新穎的,可以利用類別特徵的,基於深度學習的推薦模型。雖然現在推薦系統上,深度學習的引入已經取得了成功,我們提出的網絡在今後的學術界、生活中還是能得到很大的實際使用。通過提供最先進的推薦模型的系統描述,我們希望可以引起人們的主意,這個網絡展現出他的獨特魅力,以便進一步的實現算法試驗、建模、系統協同設計和基準測試。

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