最近在做一些ratio预估方面的工作,看了华为诺亚实验室和上交合作的一篇文章,正好借机把CTR模型中关于数值特征的embedding方法整理一下。
- No Embedding:数值拼接后作为特征直接输入到模型中;
- [Google Play] Wide & Deep
- [JD] DMT
- [YouTube] DNN: 原始值、乘方、开方三者拼接
- [Facebook] DLRM: 两层全连接
- Field Embedding:多用于学术界。每一个数值都对应一个向量,数值的embedding是值与向量的乘积;
- Discretization:离散化,多用于工业界。离散边界的选择有下面三种方式:
- 基于固定距离/固定频数;
- 取对数(Kaggle某比赛的冠军使用过)后向下取整;
- 基于模型的分桶方式,如GBDT
论文提出:离散化的方式存在三个比较关键的问题:
- 分桶指标的选择比较固定,往往需要一个独立的模块,没法做成端到端的方式;
- 桶的上边界和上一个桶的下边界,两者数值相差可能很小,但实际的embedding差异很大;
- 同一个桶的上边界和下边界,两者数值相差可能很大,但实际的embedding是相同的。
论文主要的思路是将每个数值域的桶都用可学习的矩阵形式表示(行数为桶,列数为每个桶的embedding),随后学习一个长度为桶数的权重,来将每一个数值转化为每一个桶的权重。
论文的模型主要有三部分构成:
Meta-embeddings:每个数值类型特征学习一个向量,例如第$j$个数值域,学习$R^{H_j\times d}$的向量,其中$H_j$表示特征域$j$的桶数,$d$表示embedding维度;
Automatic Discretization:通过学习权重矩阵的方式获得每一个数值的分桶结果,这个结果不是一个$0\sim H_j$中的一个值,而是每一个桶对应的权重。例如对于数值$x_j$:
其中$w_j\in\textbf{R}^{1\times H_j}$,$W_j\in\textbf{R}^{H_j\times H_j}$,都是可学习的矩阵,$\alpha$是自定义的skip-connection的权重。最终获得的$\widetilde{x_j}\in{1\times H_j}$,这个向量经过带temperature的softmax作为数值$x_j$在每一个桶中的权重。
值得注意的是,temperature $\tau$也是一个可学习的值,在此不再赘述。
- Aggregation Function:作者提出了三种方法,但实际选择的默认就是最后一种:带权聚合。
- Max-pooling:softmax后选择值最大的一个取下标作为分到的桶
- Top-K Sum:取softmax后值最大的K个,将对应的桶向量求和
- Weighted-Average:使用softmax后的权重乘到1中的meta-embedding中,获得对应数值最终的权重。
实验的结果可参见原文。整体来说,和上面的方法比起来,论文的亮点是其中第二个部分,也就是使用soft分桶结果来替换掉了原来的(称之为hard)分桶结果,避免了上面提出的离散化三个问题的发生。