分享一下Facebook新發的深度學習

推薦系統的論文Deep Learning Recommendation Model for Personalization and Recommendation Systems.

這篇文章概述了當前推薦系統實現的主要思路,提出了一種通用的模型結構DLRM,與其他常見的paper不同,該篇有著濃濃的工業界風格,不僅和其他模型進行效果對比,還講述了常見的特徵如何處理,內在思維邏輯如何,在大規模的現實場景中會面臨哪些問題。像大規模稀疏特徵如何解決,比如用數據並行與模型並行相結合。以及CPU和GPU在實踐中的性能如何,等等。

有在真實線上實踐的同學應該都有過各自的思考,其實我覺得這裡邊的思路相關同學都是瞭解的,模型結構也不是壁壘,許多推薦系統問題在實踐中更偏向於工程問題。像現今的開源框架都無法支持大規模推薦系統,所以各家其實都有自研的框架和配套設施,去解決海量用戶&產品等對應的embeddings,合適的online training等等問題。

博客裏latex公式顯示的更好些

Deep Learning Recommendation Model for Personalization and Recommendation Systems?

wd1900.github.io

另外發個廣告,位元組跳動抖音火山技術團隊開啟2020屆校招提前批,失敗也不影響正常秋招流程, 需要內推可發我郵箱[email protected] or [email protected],社招同學也歡迎,演算法,大數據,服務端等都需要

簡介

目前個性化推薦有兩個主要的方向,現在基本都投奔了深度學習的懷抱中。

the view of recommendation systems

早期系統僱傭專家們來對產品進行分類,用戶選擇他們喜好的類別並基於他們的偏好進行匹配。此領域後來演變成了協同過濾,推薦基於用戶過去的行為,比如對產品的打分。Neighborhood methods將用戶和產品分組並用矩陣分解來描述用戶和產品的latent factors,獲得了成功。

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開源實現地址

模型設計&結構

Components of DLRM

Embeddings

處理類別特徵時,一般使用embedding,實現的時候其實是搞了個lookup table,然後去查對應類別的embedding,所以one-hot vector $e_i$就相當於是embedding lookup(對位i是1,其他為0),embedding table $W in mathbb{R}^{m imes d}$

oldsymbol{w}{i}^{T}=oldsymbol{e}{i}^{T} W

embedding也可以被理解為是多個items的帶權組合,mulit-hot vector oldsymbol{a}^{T}=left[0, ldots, a_{i_{1}}, ldots, a_{i_{k}}, ldots, 0
ight]a_{i} 
eq 0 , index $i_k$ 對應items.一個大小為t的mini-batch embedding lookups可以寫為:

S=A^{T} W

DLRMs利用embedding tables將類別特徵映射到稠密表示。但即使embeddings是有意義的,但我們要如何利用它們進行準確的預測呢? latent factor methods。

Matrix Factorization

回顧推薦問題的典型場景,有一組用戶S已經給一些產品進行了評價。我們將產品表示為vector $w_i$,將用戶表示為vector $v_j$,共n個產品,m個用戶。$(i,j) S$

The matrix factorization approach solves this problem by minimizing

min sum_{(i, j) in mathcal{S}} r_{i j}-oldsymbol{w}{i}^{T} oldsymbol{v}{j}  (3)

R approx W V^{T} ,R其實就是Reward matrix,W,V是兩個embedding tables,每一行分別表示著laten factor space裏的user/product. vectors的點積代表對rating的預測。

Factoriation Machine

在分類問題中,我們會頂一個預測函數:$phi : mathbb{R}^{n}
ightarrow T$ 輸入x預測 label y. 我們定義T={+1, -1},+1代表有點擊,-1代表每點擊,去預測click-through rate。 FM在線性模型上引入了二階交叉。

hat{y}=b+oldsymbol{w}^{T} oldsymbol{x}+oldsymbol{x}^{T} 	ext { upper }left(V V^{T}
ight) oldsymbol{x} (4)

V in mathbb{R}^{n 	imes d}, oldsymbol{w} in mathbb{R}^{n}, 	ext { and } b in mathbb{R}

FM明顯不同於多項式核函數SVM的是,它將分解二階交叉矩陣到latent factors(or embedding vectors)就像矩陣分解似的,更高效的處理了稀疏數據。通過僅用不同embedding vectors交叉顯著減少了二階交叉的複雜度。轉為了線性計算複雜度。

Multilayer Perceptrons

當然,當前許多在機器學習上的成功是源於深度學習的興起。這裡邊最基礎的模型就是MLP了,一個由FC layers和激活函數組成的預測函數。

hat{y}=W_{k} sigmaleft(W_{k-1} sigmaleft(ldots sigmaleft(W_{1} oldsymbol{x}+oldsymbol{b}{1}
ight) dots
ight)+oldsymbol{b}{k-1}
ight)+oldsymbol{b}_{k} (5)

	ext { weight matrix } W_{l} in mathbb{R}^{n_{l} 	imes n_{l-1}}, 	ext { bias } oldsymbol{b}{l} in mathbb{R}^{n{l}} 	ext { for layer } l=1, ldots, k

這些方法備用來捕獲更複雜的interactions。比如在有足夠的參數下,MLPs有足夠的深度和廣度來適應數據到任意精度。各種方法的變種被廣泛應用到了各種場景下,包括cv和nlp。有一個特別的case,NCF被用來做MLPerf benchmark的一部分,它使用MLP來計算矩陣分解中embeddings直接的interaction,而非dot product。

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函數輸出概率。

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這樣結構和大模型尺寸的一個特別需要。這樣組合的並行Caffe2Pytorch都不支持,其他流行的深度學習框架也如此,因此我們需要設計一個定製的應用。會在未來的工作中提供詳細的性能研究。

在我們的設置裏,top MLP和interaction op需要能連接到bottom MLP和所有embeddings。因為模型並行已經將embeddings分散到各個device上,這就需要個性化的all-to-all的通信。在embedding lookup最後這塊,每個設備都駐留著一個embedding tables的向量,用於mini-batch中的所有樣本,需要沿著min-batch的維度進行拆分並於對應設備通信,如圖2所示。

PytorchCaffe2都沒有提供原生的模型並行,因此我們通過顯示的去不同設備上mapping the embedding op來實現。然後使用butterfly shuffle operator實現個性化的全對所有通信,適當地對所得到的embedding vectors進行切片並將它們傳送到目標設備。 在當前版本中,這些傳輸是顯式複製,但我們打算使用可用的通信原語(例如all-gather和send-recv)進一步優化它。我們注意到,對於數據並行的MLP,反向傳播中的參數更新是用allreduce一起累積的,並以同步方式將參數複製到每個設備上,確保每次迭代前每個設備上的更新參數一致。 在PyTorch中,數據並行性通過nn.DistributedDataParallel和nn.DataParallel模塊在每個設備上複製模型並插入allreduce與必要性依賴。 在Caffe2中,我們在梯度更新之前手動插入allreduce。

Data

搞了三個數據集,隨機集、人造集和公開數據集.前兩個可用於從系統角度試驗模型,它允許我們通過動態生成數據,消除對數據存儲系統的依賴性來測試不同的硬體屬性和瓶頸。 後者讓我們對實際數據進行實驗並測量模型的準確性。

Random

連續特徵用numpy根據均勻分佈或者高斯分佈來生成。

離散特徵我們直接生成embedding matrix以及對應的index

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。

Public

個性化推薦系統的公開數據比較少,The Criteo AI Labs Ad Kaggle和Terabyte數據集為了做點擊率預估包含了點擊日誌。每個數據有13個連續特徵,26個離散特徵。連續特徵用log(1+x)處理。離散特徵映射到對應embedding的index, 無標註的離散特徵被映射到0或NULL.

Experiments

DLRM實現地址(Pytorch and Caffe2)

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

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.值得注意的是,這裡邊沒有進行額外的調參。

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

在本文中,我們提出並開源了一種新的基於深度學習的推薦模型,利用分類數據。儘管推薦和個性化系統已在當今工業界中通過深度學習獲得了實用的成功,但這些網路在學術界仍然很少受到關注。通過詳細描述先進的推薦系統並開源其實現,我們希望人們能關注到這類特別的網路,以便進一步進行演算法實驗、建模、系統協同設計和基準測試。


推薦閱讀:
相關文章