《Learning to Embed Categorical Features without Embedding Tables for Recommendation》Google KDD 2021 Research Track
文章以 NLP的视角切入推荐系统中embedding的问题:
文章提出Deep Hash Embeddings (DHE) 的方式来缓解以上问题,AUC相等的情况下模型参数量更少。
这种方式就是最常见的方法,即把所有类别特征进行编号,假设共 n 个特征。特征s 首先通过one-hot进行编码 E ( s ) = b = { 0 , 1 } n E(s)=b=\{0,1\}^n E(s)=b={0,1}n , 其中只有第 b s b_s bs 项为1,其他都为0。接着通过一个可学习的线性变换矩阵(说白了就是embedding table,可以看作一层神经网络,但没有bias项)得到对应的embedding表示: e = W T b e=W^Tb e=WTb 。
这种方法的缺点:1、embedding table随特征数量线性增长(即内存问题);2、无法处理新出现的特征(OOV)。
为了解决One-hot Full Embedding中的内存消耗巨大的问题,可以使用**「哈希函数」对类别特征进行「映射分桶」**,将原始的 n 维的 one-hot 特征编码映射为 m 维的 one-hot 特征编码(即m个桶, m < < n m<
相比One-hot Full Embedding,编码部分变为: E ( s ) = b = { 0 , 1 } m E(s)=\mathbf{b}=\{0,1\}^{m} E(s)=b={0,1}m,然后还是通过lookup查找得到embedding: e = W T b \mathbf{e}=W^{T} \mathbf{b} e=WTb
但是这也会带来哈希冲突的问题:多个id共享一个embedding,肯定会confuse模型。
解决方法可以用k个不同的哈希函数 { H ( 1 ) , H ( 2 ) , … H ( k ) } \left\{H^{(1)}, H^{(2)}, \ldots H^{(k)}\right\} {H(1),H(2),…H(k)},按照上述方法生成k个one-hot编码: { b ( 1 ) , b ( 2 ) , … b ( k ) } \left\{\mathbf{b}^{(1)}, \mathbf{b}^{(2)}, \ldots \mathbf{b}^{(k)}\right\} {b(1),b(2),…b(k)},即一个特征分别落到了k个桶中,分别从embedding table取出向量,并且把最后的结果concat到一起或者做avg-pooling。
这种做法相当于利用特征组合构造独特性。 文章其实用NN把这句话做的更深!
文章把 id --> emb 这个过程建模成 encoding- decoding的过程,one-hot的过程xxxx。
DHE是先通过多个(k=1024个)哈希函数将特征表示为稠密的Identifier vector, 解码阶段通过多层神经网络得到该特征的唯一表示。
文章首先提出如何衡量一个好的encoding function:
DHE运用 k 个哈希函数把每个类别特征(id)映射为一个 k 维的稠密向量。
具体的,每个哈希函数 H ( i ) H^{(i)} H(i) 都将一个正整数 N \mathbb{N} N 映射到 { 1 , 2 , … m } \{1,2, \ldots \mathrm{m}\} {1,2,…m}, 本实验中取 m = 1 e 6 m=1 e 6 m=1e6 。因此, k k k 个哈希函数就把1个正整数id N \mathbb{N} N 映射成了 k k k 维的向量 E ′ ( s ) = [ H ( 1 ) ( s ) , H ( 2 ) ( s ) , … , H ( k ) ( s ) ] E^{\prime}(s)=\left[H^{(1)}(s), H^{(2)}(s), \ldots, H^{(k)}(s)\right] E′(s)=[H(1)(s),H(2)(s),…,H(k)(s)] ,向量中的每个元素都取自 { 1 , 2 , … m } \{1,2, \ldots \mathrm{m}\} {1,2,…m} 。实验中取 k = 1024 \mathrm{k}=1024 k=1024。
然而,直接用上面得到的编码表示送入神经网络是不合适的,因此作者进行了两个变换操作来保证数值稳定性:
均匀分布(Uniform Distribution):把 E ′ ( s ) E^{\prime}(s) E′(s) 中的每个值映射到[-1,1]之间
高斯分布(Gaussian Distribution):把经过均匀分布后的向量转化为高斯分布 N ( 0 , 1 ) N(0,1) N(0,1)。
作者说,这里是受到GAN网络的启发,用服从高斯分布的随机变量做GAN网络的输入。实验结果显示这二者相似,作者就默认用均匀分布。
作者说经过理论分析这样设计的encoding满足上面的4个条件,然后把理论分析放在附录,然后在附录写了一些莫名其妙的东西,直觉上感觉这种方法并不符合同质性:
decoding阶段就是用多层神经网络,依赖的是“多层NN可以拟合任何函数”。但是由于参数量比embedding table少了很多,所以模型会欠拟合。
为了解决这一点作者引入MISH激活函数 f ( x ) = x ⋅ tanh ( ln ( 1 + e x ) ) f(x)=x \cdot \tanh \left(\ln \left(1+e^{x}\right)\right) f(x)=x⋅tanh(ln(1+ex))代替ReLU,引入更多的非线性从而提升表达能力:
同时还加了BN这种优化技巧。
作者也觉得他这种方法不能满足同质性Equal Similarity,因此提出对于物品ID、用户ID,在encode之后再拼接上属性(年龄、性别、品牌等),然后在输入到DHE中解码,为最终生成的embedding补充同质性。
所以附录里证明了个寂寞。