導讀:今天分享一下 facebook 新發的深度學習推薦系統的論文:
Deep Learning Recommendation Model for Personalization and Recommendation Systems
https://arxiv.org/pdf/1906.00091.pdf
這篇文章概述了當前推薦系統實現的主要思路,提出了一種通用的模型結構 DLRM,與其他常見的 paper 不同,該篇有着濃濃的工業界風格,不僅和其他模型進行效果對比,還講述了常見的特徵如何處理,內在思維邏輯如何,在大規模的現實場景中會面臨哪些問題。像大規模稀疏特徵如何解決,比如用數據並行與模型並行相結合。以及 CPU 和 GPU 在實踐中的性能如何,等等。
有在真實線上實踐的同學應該都有過各自的思考,其實我覺得這裏邊的思路相關同學都是瞭解的,模型結構也不是壁壘,許多推薦系統問題在實踐中更偏向於工程問題。像現今的開源框架都無法支持大規模推薦系統,所以各家其實都有自研的框架和配套設施,去解決海量用戶 & 產品等對應的 embeddings,合適的 online training 等等問題
簡介
目前個性化推薦有兩個主要的方向,現在基本都投奔了深度學習的懷抱中。
1. the view of recommendation systems
早期系統僱傭專家們來對產品進行分類,用戶選擇他們喜好的類別並基於他們的偏好進行匹配。此領域後來演變成了協同過濾,推薦基於用戶過去的行爲,比如對產品的打分。Neighborhood methods 將用戶和產品分組並用矩陣分解來描述用戶和產品的 latent factors,獲得了成功。
2. the view of predictive analytics
用統計學模型去分類或預測給定數據的事件概率。預測模型從原來的用簡單的 linear and logistic regression 建模轉向了用 deep networks。爲了處理類別特徵,一般採用 embeddings,將 one-hot 或 multi-hot vectors 轉換到抽象空間的 dense respresentations。這裏的抽象空間其實也就是推薦系統中的 latent factors 空間。
本文結合了上邊的兩種角度,模型使用 embeddings 處理稀疏特徵,MLP 處理稠密特徵,然後用統計技術進行顯示的特徵交叉。最後用另一個 MLP 來處理交差後的特徵,得到事件的概率。我們將這個模型稱爲 RLRM,見圖1。
Pytorch & Caffe2 開源實現地址:
https://github.com/facebookresearch/dlrm
模型設計&結構
1. Components of DLRM
① Embeddings
處理類別特徵時,一般使用 embedding,實現的時候其實是搞了個 lookup table,然後去查對應類別的 embedding,所以 one-hot vector ei 就相當於是 embedding lookup ( 對位 i 是1,其他爲0 ),embedding table $W\in{\mathbb R}^{m\times d}$
embedding 也可以被理解爲是多個 items 的帶權組合,mulit-hot vector
$\boldsymbol{a}^T=[0,\dots,a_{i_1},\dots,a_{i_k},\dots,0]$,$a_i\neq0$,index ik 對應 items。一個大小爲 t 的 mini-batch embedding lookups 可以寫爲:
DLRMs 利用 embedding tables 將類別特徵映射到稠密表示。但即使 embeddings 是有意義的,但我們要如何利用它們進行準確的預測呢?latent factor methods。
② Matrix Factorization
回顧推薦問題的典型場景,有一組用戶S已經給一些產品進行了評價。我們將產品表示爲 vector wi 將用戶表示爲 vector vj,共 n 個產品,m 個用戶。( i,j ) S
The matrix factorization approach solves this problem by minimizing:
$R\approx WV^{T}$,R 其實就是 Reward matrix,W,V 是兩個 embedding tables,每一行分別表示着 laten factor space 裏的 user/product。
vectors 的點積代表對 rating 的預測。
③ Factoriation Machine
在分類問題中,我們會定一個預測函數:輸入 x 預測 label y。我們定義 T={+1, -1},+1代表有點擊,-1代表每點擊,去預測 click-through rate。FM 在線性模型上引入了二階交叉。$\phi:{\mathbb R}^n\to T$ 輸入 x 預測 label y。我們定義 T={+1, -1},+1代表有點擊,-1代表每點擊,去預測 click-through rate。FM 在線性模型上引入了二階交叉。
FM 明顯不同於多項式核函數 SVM 的是,它將分解二階交叉矩陣到 latent factors ( or embedding vectors ) 就像矩陣分解似的,更高效的處理了稀疏數據。通過僅用不同 embedding vectors 交叉顯著減少了二階交叉的複雜度。轉爲了線性計算複雜度。
④ Multilayer Perceptrons
當然,當前許多在機器學習上的成功是源於深度學習的興起。這裏邊最基礎的模型就是 MLP 了,一個由 FC layers 和激活函數組成的預測函數。
weight matrix $W_l\in{\mathbb R}^{n_l\times n_{i-1}}$,bias $b_l\in{\mathbb R}^{n_l}$ for layer $l=1,\dots,k$
這些方法被用來捕獲更復雜的 interactions。比如在有足夠的參數下,MLPs 有足夠的深度和廣度來適應數據到任意精度。各種方法的變種被廣泛應用到了各種場景下,包括 cv 和 nlp。有一個特別的 case,NCF 被用來做 MLPerf benchmark 的一部分,它使用 MLP 來計算矩陣分解中 embeddings 直接的 interaction,而非 dot product。
2. DLRM Architecture
上邊描述了推薦系統和預測分析使用的不同模型,現在我們將其組合起來,構建一個 state-of-the-art 的個性化模型:
- users 和 products 可以用許多的連續特徵和類別特徵來描述。
- 類別特徵,用同一尺寸的 embedding vector 表示。
- 連續特徵用 MLP( bottom or dense MLP ) 轉換爲同樣長度的稠密向量。
我們按照 FM 的方式處理稀疏特徵,顯示地計算不同特徵的二階交叉,可選的將其傳給 MLPs。將這些 dot products 與原始的 dense features 拼接起來,傳給另一個 MLP ( the top or output MLP ),最後套個 sigmoid 函數輸出概率。
3. Comparison with Prior Models
許多基於深度學習的推薦模型使用類似的想法去處理稀疏特徵,生成高階項。
Wide and Deep,Deep and Cross,DeepFm,xDeepFM 都設計了特別的網絡去系統性地構建 higher-order interactions。這些網絡將他們特別的結構和 MLP 相加,然後傳到一個 linear layer 使用 sigmoid 函數去輸出一個最終概率。DLRM 模仿因子分解機,以結構化的方式 interacts embeddings,通過僅在最終 MLP 中對 embeddings 進行 dot product 產生交叉項來顯着降低模型的維數。 我們認爲其他網絡中發現的二階以上的高階交互可能不值得額外的計算/內存消耗。
DLRM 與其他網絡之間的關鍵區別在於這些網絡如何處理 embedded feature vectors 及其交叉項。 特別是,DLRM ( 和 xDeepFM ) 將每個特徵向量解釋爲表示單個類別的單個 unit,而像 Deep and Cross 這樣的網絡將特徵向量中的每個元素視爲一個新的 unit 來產生不同交叉項。因此,Deep and Cross 不僅會像 DLRM 中通過點積產生來自不同特徵向量的元素之間的交叉項,還會在相同特徵向量內的元素之間產生交叉項,從而產生更高的維度。
Parallelism
現在的個性化推薦系統需要大且複雜的模型去充分利用巨大的數據。DLRMs
尤其包含了非常多的參數,比其他常見的深度學習模型如 CNN,RNN,GAN 還要大幾個數量級。
這導致訓練過程可能要到幾周甚至更多。爲此,要想在實際場景中解決這些問題,就必須有效的並行化這些模型。
如上描述,DLRMs
用耦合的方式處理離散特徵和連續特徵。其中 Embeddings 貢獻了主要的參數,每個表都要需要很多 GB 的內存,所以 DLRM 是內存容量和帶寬密集型。Embeddings 的規模讓數據並行變得不可行,因爲他需要在每個設備上都複製 Embeddings。在很多場景下,內存的約束強制讓模型的分佈必須跨多個設備來滿足內存容量的需求。
另一方面,MLP 的參數佔用內存比較小,但是在計算量上佔大頭。因此,數據並行適合 MLPs,支持對不同設備上的樣本進行併發處理,並且僅在累積更新時需要通信。並行 RLRM
對 embeddings 用模型並行,對 MLP 用數據並行,在緩解 embeddings 的內存瓶頸的同時讓 MLPs 進行前向和反向傳播。模型 & 數據並行的結合是 DLRM 這樣結構和大模型尺寸的一個特別需要。這樣組合的並行 Caffe2
和 Pytorch
都不支持,其他流行的深度學習框架也如此,因此我們需要設計一個定製的應用。會在未來的工作中提供詳細的性能研究。
在我們的設置裏,top MLP 和 interaction op 需要能連接到 bottom MLP 和所有 embeddings。因爲模型並行已經將 embeddings 分散到各個 device 上,這就需要個性化的 all-to-all 的通信。在 embedding lookup 最後這塊,每個設備都駐留着一個 embedding tables 的向量,用於 mini-batch 中的所有樣本,需要沿着 min-batch 的維度進行拆分並於對應設備通信,如圖2所示。
Pytorch
和 Caffe2
都沒有提供原生的模型並行,因此我們通過顯示的去不同設備上 mapping the embedding op 來實現。然後使用 butterfly shuffle operator 實現個性化的全對所有通信,適當地對所得到的 embedding vectors 進行切片並將它們傳送到目標設備。在當前版本中,這些傳輸是顯式複製,但我們打算使用可用的通信原語 ( 例如 all-gather 和 send-recv ) 進一步優化它。我們注意到,對於數據並行的 MLP,反向傳播中的參數更新是用 allreduce 一起累積的,並以同步方式將參數複製到每個設備上,確保每次迭代前每個設備上的更新參數一致。在 PyTorch 中,數據並行性通過 nn.DistributedDataParallel 和 nn.DataParallel 模塊在每個設備上覆制模型並插入 allreduce 與必要性依賴。在 Caffe2 中,我們在梯度更新之前手動插入 allreduce。
Data
搞了三個數據集,隨機集、人造集和公開數據集。前兩個可用於從系統角度試驗模型,它允許我們通過動態生成數據,消除對數據存儲系統的依賴性來測試不同的硬件屬性和瓶頸。後者讓我們對實際數據進行實驗並測量模型的準確性。
1. Random
- 連續特徵用 numpy 根據均勻分佈或者高斯分佈來生成。
- 離散特徵我們直接生成 embedding matrix 以及對應的 index。
2. Synthetic
有很多理由讓我們定製化的生成類別特徵的 indices,比如我們用了個特別的數據集,並因爲隱私問題不想共享它。那麼我們可以通過分佈來表達類別特徵。這可能有助於替代應用中使用的隱私保護技術,比如 federated learning。同樣,如果我們想要研究內存行爲,我們 synthetic trace 中原始 trace 的基本訪問位置。
假設我們有所有特徵的 embedding lookups indices 的 trace。我們可以記錄軌跡中的去重後的訪問和重複訪問的距離頻率(算法1),生成 [14] 提到的 synthetic trace ( 算法2 )。
請注意,我們只能生成到目前爲止看到的s次唯一訪問,因此s是控制算法2中分佈 p 的支撐集。給定固定數量的唯一訪問,input trace 越長將導致在算法1中分配給它們的概率越低,這將導致算法2要更長的時間取得完整分佈支撐集。爲了解決這個問題,我們將唯一訪問的概率提高到最小閾值,並調整支撐集以便在看到所有訪問後從中刪除唯一訪問。基於 original and synthetic traces 的概率分佈p的可視化比較如圖3所示。在我們的實驗中,original and adjusted synthetic traces 產生了類似的緩存命中/未命中率。
算法1和算法2設計過去用於更精確的緩存模擬,但是它們表明一般概念,那就是概率分佈可以怎樣用來生成具有期望屬性的 synthetic traces。
3. Public
個性化推薦系統的公開數據比較少,The Criteo AI Labs Ad Kaggle 和 Terabyte 數據集爲了做點擊率預估包含了點擊日誌。每個數據有13個連續特徵,26個離散特徵。連續特徵用 log(1+x) 處理。離散特徵映射到對應 embedding 的 index,無標註的離散特徵被映射到0或 NULL。
Experiments
DLRM 實現地址 ( Pytorch and Caffe2 ) :
https://github.com/facebookresearch/dlrm
The experiments are performed on the Big Basin platform with Dual Socket Intel Xeon 6138 CPU @ 2.00GHz and eight Nvidia Tesla V100 16GB GPUs
1. Model Accuracy on Public Data Sets
我們在 Criteo Ad Kaggle 數據集上和 Deep and Cross(DCN)
比較模型的準確率和性能,因爲這個模型在同樣數據集上有比較綜合的結果。值得注意的是,模型的大小可以根據數據集中的特徵數去調整。特別地,DLRM 包括用於處理稠密特徵的 bottom MLP,其包括 512,256 和 64 個節點的三個隱層,以及由 512 和 256 個節點的兩個隱層組成的 top MLP。而 DCN 由六個 cross layer 和一個 512 和 256 個節點的深度網絡組成,embedding dimension 是 16,所以 DLRM 和 DCN 都大概有 540M 的參數。
我們畫出了訓練集和驗證集在單 epoch 的準確率,每個模型都使用了 SGD 和 Adagrad 優化器,沒有使用正則化。實驗中 DLRM 在訓練集和驗證集的準確率都略高一些,如圖5。值得注意的是,這裏邊沒有進行額外的調參。
2. Model Performance on a Single Socket/Device
這裏使用8個離散特徵+512個連續特徵的模型去測我們模型在單 socket device 上的性能。每個離散特徵被處理爲有 1M vectors 的 embedding table,vector dimension 是64,這些連續特徵等價一個有512維的 vector。讓 bottom MLP 有兩層,top MLP 有四層。我們在一個 2048K 的隨機生成樣本數據集即 1K 個 mini-batches 上評估模型。
這個模型用 Caffe2 實現,在 CPU 上要跑 256s,GPU 上跑 62s,具體見圖6。如所預期,主要的時間花費在 embedding lookups 和全連接層。在 CPU 上全連接層的計算消耗顯著,而 GPU 上幾乎可以忽略。
Conclusion
在本文中,我們利用分類數據提出並開源了一種新的基於深度學習的推薦模型。儘管推薦和個性化系統已在當今工業界中通過深度學習獲得了實用的成功,但這些網絡在學術界仍然很少受到關注。通過詳細描述先進的推薦系統並開源其實現,我們希望人們能關注到這類特別的網絡,以便進一步進行算法實驗、建模、系統協同設計和基準測試。
本文來自 DataFun 社區