AutoEmbedding論文閱讀筆記

SunStriKE發表於2023-03-29

問題背景

目前推薦系統中, 在特徵維度上低頻特徵和高頻特徵的維度是透過遍歷mask特徵獲得到的auc衰減衡量特徵對模型的重要度來決定的. 如果想提升模型效果, 在field層面上需要減少進行基於經驗的特徵維度調參, 在feasign層面上對作用不大的feasign對應的mf進行縮維, 裁剪掉冗餘維度, 將對作用較大的feasign進行自動擴維.

調研方案

方案1: 啟發式方法

通常基於預定義的人工規則為每個特徵分配維數。根據特徵出現頻率來分配embedding維數。優點是實現比較簡單,但其所基於的冪律分佈並不能保證總是滿足,因此限制了其在複雜任務中的推廣

擴維主要是2種方法, 一種是線性變換(每個維度的向量經過FC後進行batch_norm), 一種是直接填0, 降維應該只能用線性變換.

我們預先設定1/4/8/16/32/64等閾值, 根據跑的全量特徵重要度任務總的引數數量 計算閾值比例, 然後按降序分別分配到對應順序的slot上.
這個閾值是個超參..同時起多組任務不斷調整超參拿到最佳的那一組結果.嘗試會很麻煩而且手動效率不高

方案2: Pruning方法

Auto-EDS看作嵌入剪枝問題,透過不同的剪枝策略對整個嵌入矩陣進行嵌入剪枝,從而自動獲得混合維度嵌入矩陣。因此,這類方法的關鍵思想是透過識別並去除嵌入矩陣中的冗餘引數,建立記憶體高效的模型,並儘可能保持準確性。雖然剪枝方法可以透過選擇性地減少embedding中的引數實現維度搜尋,但這些方法通常需要進行迭代最佳化,耗時較長(原因是因為需要加入新的mask layer用於刪除和驗證冗餘引數. 另外還有新的引數刪除閾值需要訓練)

目前看到的調研成功可能性最高的論文是Single-shot Embedding Dimension Search

這篇文章介紹的方法主要分成3步, 用一種高效的方式在一次fp/bp內, 把所有的mf維度的重要度跑出來

image-20230327172112450

第一步pretraining,把所有特徵的embedding設定成等長而且一定包含冗餘引數的長度, 比如都變成64維

第二步single-shot pruning, 計算每一維對離線指標的影響,降序排列, 把達到引數閾值之後的引數刪除 (論文核心)

我們傳統計算方法是

$\Delta \mathcal{L}{i, j}=\mathcal{L}(\hat{\mathbf{V}} \odot 1, \hat{\Theta} ; \mathcal{D})-\mathcal{L}\left(\hat{\mathbf{V}} \odot\left(1-\boldsymbol{\epsilon}\right), \hat{\Theta} ; \mathcal{D}\right)$ 即遍歷所有的維度, 評估這個維度mask後對應的loss變化情況

這裡做了一個最佳化$\begin{aligned}
\Delta \mathcal{L}{i, j} & \approx g\left(\hat{\mathbf{V}}, \hat{\Theta} ; \mathcal{D}b\right)=\left.\frac{\partial \mathcal{L}\left(\mathbf{V} \odot \boldsymbol{\alpha}, \Theta ; \mathcal{D}b\right)}{\partial \boldsymbol{\alpha}{i, j}}\right|=1} \
& =\left.\lim _{\delta \rightarrow 0} \frac{\mathcal{L}\left(\hat{\mathbf{V}} \odot \boldsymbol{\alpha}, \hat{\Theta} ; \mathcal{D}b\right)-\mathcal{L}\left(\hat{\mathbf{V}} \odot\left(\boldsymbol{\alpha}-\delta \boldsymbol{\epsilon}\right), \hat{\Theta} ; \mathcal{D}b\right)}{\delta}\right|=\mathbf{1}}
\end{aligned}$ , 把他約等於了這個維度的梯度, 這個在bp的時候已經算好了

最後根據梯度來算維度得分:$\mathbf{s}{i, j}=\frac{\left|g\left(\hat{\mathbf{V}}, \hat{\Theta} ; \mathcal{D}b\right)\right|}{\sum^m \sum_{j=0}^d\left|g_{i, j}\left(\hat{\mathbf{V}}, \hat{\Theta} ; \mathcal{D}_b\right)\right|}$

把維度得分算出來後根據設定的引數量閾值就能把alpha向量算出來 $\begin{gathered}
\boldsymbol{\alpha}{i, j}=\mathbb{I}\left(\mathbf{s}-\tilde{s} \geq 0\right), \forall i \in{1, \ldots, m}, j \in{1, \ldots, d} \
\text { s.t. }|\boldsymbol{\alpha}|_0<\kappa|\mathbf{V}|_0
\end{gathered}$

第三步retraining, 把裁剪後的重新transform後輸入fm, 原因是fm需要定長輸入

他這裡還提到了一個重要的問題:

為啥是基於slot維度做的裁剪, 而不是feasign維度的裁剪: 原因是要求驗證集必須包括所有的feasign, 但是這個基本不可能實現. 所以長尾feasign沒法處理.

最後把冗餘的model裁剪完成後,熱啟重訓練, 冷啟第一層dense

整體演算法的流程如下:

image-20230327184254901

方案3: 超引數最佳化(HPO)

(HPO)受神經結構搜尋(NAS)在深度神經網路體系結構自動搜尋方面的啟發,將嵌入維度搜尋視為超引數最佳化(HPO)問題,從預定義的候選維度集搜尋嵌入維度。缺點:generally requires a well-designed search space for candidate embedding dimensions and expensive optimization processes to train the candidates

實現成本較高, 暫不考慮.

參考文章

推薦系統中的Auto Embedding Size演算法

相關文章