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