本文是针对数值型特征做embedding的方法。较长的公式可以左右滑动查看
背景
图1
常用的数值型embedding方法可以分为以下三类:
No Embedding
这类方法不做embedding,而是直接用原始的数值作为特征,或者在数值上面做一些改进,例如youtube对于数值型特征分别做平方和平方根得到
\mathrm{e}_{\text {YouTube }}=\left[\tilde{x}_{1}^{2}, \tilde{x}_{1}, \sqrt{\tilde{x}_{1}}, \tilde{x}_{2}^{2}, \tilde{x}_{2}, \sqrt{\tilde{x}_{2}}, \ldots, \tilde{x}_{N}^{2}, \tilde{x}_{N}, \sqrt{\tilde{x}_{N}}\right]例如facebook的DLRM直接用DNN对数值特征建模
e_DLRM=[DNN([x_1,x_2...,x_N])]直接用DNN提取。以上这些No Embedding方法无法捕获数值型特征域中的高阶信息,只是粗暴的直接利用了这些特征值。
Field Embedding
Field Embedding方法将一个域(field)内的数值型特征共享一个field embedding,简单理解就是同一个域内的特征采用同一个向量来转换。公式如下:
e_{EF}=[x_1 \cdot e_1,...,x_N \cdot e_N]
其中
e_i \in R^d表示第i个域对应的转换向量,d为转换后的维度。由于每一个域共享了单个embedding向量使得这种方式的表达能力也是受限的。
Discretization
离散化的方式就是将连续特征转换为离散特征(例如分桶)。将域内的特征进行离散化,然后在进行转换。
e_j=E_j \cdot d_j(x_j)
E_j \in R^{H_j \times d}表示第j个域对应的embedding矩阵,
H_j就是第j个域内离散化后的桶的个数。
d_j
就是离散化函数。常用的离散化函数有以下三种:
EDD/EFD(Equal Distance/Frequency Discretization)
等距or等频离散化。
等距就是每个区间大小一样,将原始特征划分为
H_j个等宽的桶。找到最大、最小值,然后根据桶的个数进行等分
w_{j}=\left(x_{j}^{\max }-x_{j}^{\min }\right) / H_{j},通过下式得到每个区间内的值对应的离散值。
\widehat{x}_{j}=d_{j}^{E D D}\left(x_{j}\right)=\text { floor }\left(\left(x_{j}-x_{j}^{m i n}\right) / w_{j}\right)等频就是希望每个区间内的特征数得一样。
LD (Logarithm Discretization)
log离散化也是比较常用的离散化方法,公式如下:
\widehat{x}_{j}=d_{j}^{L D}\left(x_{j}\right)=\text { floor }\left(\log \left(x_{j}\right)^{2}\right)
TD (Tree-based Discretization).
基于树模型的离散化(例如GBDT),树本身可以通过节点的划分对不同特征值划分到不同的节点,从而对其进行离散化。虽然上述方法应用很广泛,但是存在以下三个问题:
- TPP (Two-Phase Problem):上述方法如果要用到ctr模型中都得是两阶段的,即先做离散化,然后在做模型训练,无法同模型一起优化训练。
- SBD (Similar value But Dis-similar embedding):这些划分方法可能存在将相似的值划分到不同的组,从而导致最终的embedding表征相差很大,比如一些边界值。例如5和6,而当时的分界条件刚好是5.5的话,5和6就会被分到不同的组。
- DBS (Dis-similar value But Same embedding):同一个桶中可能会包含两个相差很大的值,但是他们却被分到一组,导致他们的embedding表征最后就是很相似。
方法
AutoDis总体框架
AutoDis主要包含三部分:meta embeddings, automatic discretization and aggregation,将这三部分结合起来可用公式表示为
\mathrm{e}_{j}=f\left(d_{j}^{\text {Auto }}\left(x_{j}\right), \mathrm{ME}_{j}\right)
其中
ME_j表示第j个域对应的meta embedding矩阵,
d_j^{Auto}()表示automatic discretization自动离散化方法,最终的f()表示aggregation将他们融合到一起。
Meta Embedding
最直接的方式是将对每一个数值型特征值都赋予embedding,但是这会导致参数特别多。而field embedding的方式对每一个域内直接用单个向量进行转换,导致表达能力差。为了平衡该参数量和表达能力,本文设计了Meta embedding对第j个域内进行分桶后得到Hj个桶,对每个桶对应一个embedding。
Automatic Discretization
自动离散化。上述离散化方法我们可以称之为硬离散化(hard discretization),是完全限定好条件,然后将值固定划分到一个区域内。而本文所提方法可以称之为软离散化(soft),采用网络学习的方法。
\begin{array}{l}
\left.\mathbf{h}_{j}=\text { Leaky_ReLU( } \mathbf{w}_{j} x_{j}\right) \\
\widetilde{\mathbf{x}}_{j}=\mathrm{W}_{j} \mathrm{~h}_{j}+\alpha \mathbf{h}_{j}
\end{array}将第j个特征输入到两层神经网络中,具体计算方式如上式所示,
\alpha为超参数,控制结合比例,
w_j \in R^{1 \times H_j},
W_j \in R^{H_j \times H_j},因此计算后得到
H_j维的向量,在通过softmax标准化得到该向量属于每一个桶的概率。
\widehat{x}_{j}^{h}=\frac{e^{\frac{1}{\tau} \widetilde{x}_{j}^{h}}}{\sum_{l=1}^{H_{j}} e^{\frac{1}{\tau} \widetilde{x}_{j}^{l}}}
其中温度系数
\tau控制离散化后的分布情况。硬离散化后,得到的是具体分到哪一个桶中,而这里的软离散化是分到各个桶的概率
\widehat{\mathrm{x}}_{j}=d_{j}^{\text {Auto }}\left(x_{j}\right)=\left[\widehat{x}_{j}^{1}, \ldots, \widehat{x}_{j}^{h}, \ldots, \widehat{x}_{j}^{H_{j}}\right]。当温度系数接近无穷大时,离散化后的整体分布接近均匀分布;而当系数接近0时,整体分布接近one-hot。因此调整到合适的温度系数对最终结果影响很大,而本文提出了自适应的方法,将温度系数的计算和模型融合到一起。
\tau_{x_{j}}=\operatorname{Sigmoid}\left(\mathbf{W}_{j}^{2} \text { Leaky_ReLU }\left(\mathbf{W}_{j}^{1}\left[\bar{n}_{j} \| x_{j}\right]\right)\right)
其中W为可学习参数,而x为特征,
n_j表示统计特征(均值,累积分布cdf)
Aggregation Function
通过自动离散化,我们可以得到对应每个分桶的概率,而每个分桶都会对应meta embedding中的一个embedding,现在需要用一些方法将这两个部分结合起来。
- Max-Pooling:选择概率最大的桶对应的embedding,这种就是之前的硬离散化
- Top-K-Sum:将最大的前K个概率对应的embedding求和,无法根本上解决DBS问题,并且没有考虑到embedding之间的相互关系
- Weighted-Average:很久分桶的概率对embedding进行加权平均,其实也很好理解,一方面,所有embedding都考虑到了;另一方面,权重大的占比大,更重要。