推荐系统炼丹笔记:好想哭,我居然输在了内存问题上!
很多朋友都會發現,修改embedding的大小能對深度模型帶來非常大的影響,往往越大的embedding能帶來更佳的效果,但是卻因為Embedding內存的問題,沒法直接用,或者只能采用Hash Trick的技巧來彌補,真的是遺憾啊,太遺憾了,想哭。不急不急,本文就帶大家一起學習一下Embedding的內存問題的一種解法。
現代的基于深度學習的推薦系統利用了成百上千種不同的類別特征(Categorical Features),每一種分類都有數百萬種,從點擊到發布。為了符合類別數據中的自然多樣性,Embedding將每個類別映射到嵌入到一個稠密的向量中。由于每個類別特征可能包含上千萬個不同的可能類別(例如電商的商品個數很多都是上億的),因此嵌入表在訓練和推理過程中會出現內存瓶頸。
本文提出了一種新的方法,利用探索類別集合的互補劃分為每個類別生成一個唯一的嵌入向量。基于每個互補分區存儲多個較小的嵌入表,并結合每個表中的嵌入,可以以較小的內存開銷為每個類別定義一個唯一的嵌入。這種方法可以解釋為使用特定的固定碼本(codebook)來確保每個類別的表示的唯一性。實驗結果證明了該方法對于減少嵌入表的大小在模型損失和精確度方面的有效性,同時在參數上保留了相似的減少。
商余數技巧
1 問題
每個類別被映射到一個embedding向量表,數學上就是, 我們令
2 解決方法
2.1 Hash Trick
我們的Embedding可以通過下面的方式得到:
對應算法如下:
該方法將原始embedding矩陣的大小從O(|S|D)降低為O(mD), 因為m<<|S|,但這么做會將非常多不一樣的類別映射到同一個embedding向量,導致模型的質量大大下降,當然這么做也沒法為每個類別變量產出一個唯一的embedding向量。
2.2 quotient-remainder trick
我們令""表示正數除法, 或者是商操作, 使用兩個互補的函數:一個正數商,一個余數函數,這么做我們就可以得到兩個單獨的embedding表,這么做我們就可以對每個類使用唯一的embedding向量進行唯一的表示。
3. 互補分割
注意,給定分區的每個等價類都指定一個映射到嵌入向量的“bucket”。因此,每個分區對應于一個單獨的嵌入表。在互補分區下,每個分區產生的每個嵌入通過某種操作組合后,每個索引映射到一個不同的嵌入向量。
3.1 一些例子
更加抽象的, 我們還可以根據應用程序定義更多的互補分割。回到我們的汽車例子,我們可以根據年份、品牌、類型等對其進行定義分區。假設這些屬性是唯一規范的,能對應一輛獨一無二的汽車,那么這些分區確實是互補的。
4. 使用互補分割構建合成Embedding
對于每個分割,我們構建一個embedding表, 這樣每個等價的類被映射到一個embedding向量,這些embedding可以通過一些操作進行組合生成一個合成的embedding或者直接作為一個單獨的稀疏特征。特征生成的方法雖然高效,但是也會大大增加參數的量。
為了生成我們的合成embedding,們將給定類別的每個embedding表中所有對應的嵌入進行交互,以獲得最終的embedding向量。
4.1 基于路徑的合成embedding
生成嵌入的另一種方法是為每個分區定義一組不同的轉換(第一個embedding表除外); 特殊地, 我們可以使用一個分區來定義一個初始embedding表,然后通過其他分區確定的函數組合來傳遞初始嵌入,從而得到最終的嵌入向量.
我們將這種嵌入公式稱為基于路徑(path-based)的組合嵌入,因為組合中的每個函數都是基于來自每個分區的唯一等價類集來確定,從而產生一個唯一的轉換“路徑”。這些轉換可能包含參數,這些參數也需要與網絡的其他部分同時訓練。
1. 合成特征
- 當使用閾值化時,結果更加細微,性能的提高取決于所考慮的操作。特別是,我們發現元素級乘法最適合DCN,而級聯操作更適合Facebook DLRM。
- 對于DLRM,我們能夠觀察到相對于基線的0.7%的誤差到0.5%的誤差的改善,同時保持了大約4倍的模型尺寸減小。
2. 基于Path的合成Embedding
使用較小的網絡可能更容易訓練,但可能無法充分轉換Embedding,而較大的網絡可能具有更大的能力適應更復雜的轉換,但需要學習更多的參數。
3. 權衡的討論
- 商余trick可以對類別數據施加任意的結構,這會在內存和效果上產生一個trade-off。一個更大的embedding表可以帶來更好的效果, 但也會增加非常多的內存消耗。大多數模型的性能隨著參數的數量呈指數級下降。
- 這兩種類型的合成嵌入通過在生成每個類別的嵌入時隱式地強制執行由互補分區定義的某些結構來減少參數的數量。因此,模型的質量應該取決于所選的劃分反映范疇集及其各自嵌入的內在屬性的緊密程度。
- 基于路徑的組合嵌入也可以產生更具計算性的模型,其優點是模型復雜度較低,但是基于路徑的組合embedding不能取代基于operation的組合embedding;
小結
本文采用quotient-remainder的技巧降低高基數類別在Embedding表中出現的內存瓶頸。緩解了Hash Trick等技術帶來的沖突問題,使得我們每次都可以得到一個唯一的embedding表示。
這種技巧雖然可以令每個類別獲得唯一的embedding向量表示,但是中間存在多個約束(相乘,取余等必然會導致拆解的多個embedding之間出現共享),所以這種約束會對模型最終的影響是多少,仍然是一個值得思考的問題。比如拆解為兩個embedding矩陣表示和10個embedding矩陣表示,雖然節省了內存,但是最終的效果也會下降很多,如何設計既能緩解沖突又能盡可能維持效果是一個值得探討的問題。
參考文獻
http://weixin.qq.com/r/XSjP1zrEzGezrX60931P (二維碼自動識別)
總結
以上是生活随笔為你收集整理的推荐系统炼丹笔记:好想哭,我居然输在了内存问题上!的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 又一篇论文让我开始怀疑起了人生...
- 下一篇: 序列化推荐系统总结:Sequential
