推薦系統裏,你是怎麼 Embedding 的?

作者:十方

平時大家是如何做推薦系統的 Embedding 的呢?是不是這樣:

layers.Embedding(vocab_size, dim_size, dtype='float32')

如果是很高維度的類別特徵呢?比如電商場景下的 itemid,可以有上億,然後可能會這樣:

hash_itemid = hash(itemid, vocab_size)
layers.Embedding(vocab_size, dim_size, dtype='float32')(hash_itemid)

就這樣嗎?效果好嗎?不知道,反正跑起來了,看着 AUC 也不錯。

《Learning to Embed Categorical Features without Embeeding Tables for Recommendation》這篇論文告訴我們,別再瞎操作了,用 Deep Hash Embedding(DHE) 就對了,AUC 也有保障。

看下之前 embedding 和 DHE 的大致對比:

對比下左右兩邊很容易看出兩者 Embedding 的區別, 左邊就是傳統的 embedding, 先 one-hot 再 lookup, 這裏 vocab 有 2 百萬, 32 維度, 對於一個 ID 會映射成 32 維. 右邊就是用 DHE 的方式, 先通過 Identifier Vector 映射成 1024 維度的向量, 這個向量並不會接受梯度, 然後這個向量會通過多個 mlp 映射成 32 維度. 你能相信 DHE 只用了傳統方式 1/4 的參數卻達到了相同的 AUC 嗎.

爲什麼要用 DHE

其實在背景中已經說了一部分理由了, 主要總結爲以下 3 點:

總結下來用 DHE 就對了.

Deep Hash Embedding

先看下什麼是好的 encoding?

唯一性 (U): 好的 encoding 對每一個不同的特徵編碼都要是唯一的. 如果這個保證不了, 後續的 decoding 就沒辦法區分不同的特徵了, 那模型效果也大打折扣.

相似性 (E-S): 有唯一性並不足夠, 相似特徵編碼後也要足夠相似. 比如二進制編碼, 8(1000) 和 9(1001) 就比 8(1000) 和 7(0111) 看着相似, 這就會給模型帶來困擾, 誤導後面的 decoding 過程.

高維性 (H-D): 這個很容易理解, 越高維區分度越高, 極端情況就是 one-hot 了, 區分度最強.

高熵性 (H-D): 衆所周知, 熵越高信息量越高, 我們肯定不希望有哪一位編碼是冗餘的.

瞭解了什麼是好的 encoding, 我們看看哪些 encoding 滿足這些條件:

好吧, 說來說去只有 DHE 滿足了好的 encoding 的所有條件, 所以 DHE 是如何編碼的呢?

DHE 先用 k 個全域哈希函數, 把 id 映射成 k 維, 每一維度都是 1~m, 這時候相當於把 id 映射成了 k 維度的 INT, 但是這樣是不能夠餵給 Decoding(DNN) 的, 這裏有兩個方案:

1、Uniform Distribution: 因爲每一維都可以看作 1~m 均勻分佈, 所以直接把這 k 維度 INT normalize 了.

2、Gaussian Distribution: 先用第一種方式, 再用 Box-Muller 處理, 把均勻分佈轉變爲正太分佈.

論文說實踐證明兩種效果都很好, 所以大家用第一種, 簡單快捷. 這裏需要注意, k 需要很大效果纔好, 論文裏的 k 用了 1024.

至於 decoding(就是個 DNN) 就不過多介紹了, 這裏用了 h 層網絡. 需要注意的是, 論文提到這種 encoding-decoding 方式很容易造成欠擬合, 論文中的解決方案是把激活函數從 ReLU 換成了 MISH(如下圖), 同時這裏 DNN 增加 dropout, 正則化也不會有什麼增益.

實驗效果也不贅述了, 可以參考原文, 在 AUC 各項指標中, DHE 都優於各種 hash 方法.

參考文獻

1、Learning to Embed Categorical Features without Embeeding Tables for Recommendation

https://arxiv.org/pdf/2010.10784.pdf

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/kj2CMTEuDC1SfAUGBDnS4g