問題背景
目前推薦系統中, 在特征維度上低頻特征和高頻特征的維度是通過遍歷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
Single-shot Embedding Dimension Search
這篇文章介紹的方法主要分成3步, 用一種高效的方式在一次fp/bp內, 把所有的mf維度的重要度跑出來

第一步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}_{i, j}\right), \hat{\Theta} ; \mathcal{D}\right)\) 即遍歷所有的維度, 評估這個維度mask后對應的loss變化情況
這里做了一個優化
\(\begin{aligned}
\Delta \mathcal{L}_{i, j} & \approx g_{i, j}\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|_{\boldsymbol{\alpha}=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}_{i, j}\right), \hat{\Theta} ; \mathcal{D}_b\right)}{\delta}\right|_{\boldsymbol{\alpha}=\mathbf{1}}
\end{aligned}\)
, 把他約等于了這個維度的梯度, 這個在bp的時候已經算好了
最后根據梯度來算維度得分:
\(\mathbf{s}_{i, j}=\frac{\left|g_{i, j}\left(\hat{\mathbf{V}}, \hat{\Theta} ; \mathcal{D}_b\right)\right|}{\sum_{i=0}^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}_{i, j}-\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
整體演算法的流程如下:
方案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演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/548614.html
標籤:其他
上一篇:一文詳解擴散模型:DDPM
下一篇:全網最詳細中英文ChatGPT-GPT-4示例檔案-事實性回答應用從0到1快速入門——官網推薦的48種最佳應用場景(附python/node.js/curl命令源代碼,小白也能學)
