曾几何时,我们都是炼的不是丹,是特征!

2021-06-15 15:44:37 浏览数 (1)

作者:十方

对于炼丹师来说,特别是面对海量特征,还要从中挖掘出交叉特征"喂"给模型,是十分痛苦的。不得不说,人都是"懒惰"的,我们炼丹师当然希望有个厉害的深度学习模型,只需要对最原始的特征做预处理后,扔给模型,让它自己学习交叉特征。希望模型像"奶牛"吃草,挤得是"牛奶",那么我们必须保证"喂"的是草。并不是所有的交叉特征与推荐系统的最终优化目标都是相关的,盲目的"喂"特征只会带来更多的噪声和系统准确率的下降。《Detecting Beneficial Feature Interactions for Recommender Systems》这篇论文就提出了用GNN去自动检测对推荐系统有利的交叉特征。

01 问题定义

首先一个数据集定义如下:

其中ck表示类目特征,xk标志特征的值,J是所有特征的索引。

定义1: 有益的pairwise交互特征

这个定义其实比较简单,就是有一系列特征,所有特征两两组合,成一个大的集合,我们希望从中能找到一个交叉特征子集,它在验证集上的准确率优于其他子集。

定义2:pairwise statistical interaction

这个定义是这样,有x1~xk一共k个特征(特征是向量同理),F(X)能表示成两个分别不依赖xi和xj特征的函数之和,那么我们认为这两个特征间没有pairwise statistical interation,如下式:

02 L0-SIGN模型

L0-SIGN模型的输入是没有边信息的图,特征是nodes,特征交互是边,如果两个特征nodes之间存在边,代表这两个特征的交互特征对模型有益。

L0-SIGN有两个模块,第一个是L0边预估模块,就是预估边应不应该存在。然后是图分类SIGN模块,SIGN模块如下图所示:

首先有初始化embedding后的nodes,通过边进行交互,然后nodes的表达开始不断更新,最后更新完的所有nodes的表达产出最终预估。整体的预估函数如下:

L0 边预估模块:

这里我们使用基于矩阵分解的模型对边进行预估。矩阵分解通过对图的邻接矩阵进行分解,能够非常高效的对边进行建模,而且把所有node转成稠密向量。但在L0-SIGN中,我们并不知道该图的邻接矩阵真实应该是什么样,所以无法进行梯度更新。所以每条边的值,我们通过一个边预估函数:

输入两个节点embedding,输出0/1,表示node间是否有边,我们知道无向图邻接矩阵是对称的,所有fep也是对称的:

在这篇论文中,fep的输入是两个node向量的element-wise product,fep是多层感知器。在训练的时候,L0就像正则化一样最小化探测边的数量。

SIGN边预估模块:

如果两个节点之间边是1,那么这两个节点之间的交互特征用一个非加法的函数映射:

通过该函数映射后的embedding zij就是交互特征。和fep类似,h(ui, uj)函数同样要是对称的。接下来每个节点就可以开始更新过程,每个节点的更新用一个线性aggregation方程:

最后所有节点的embedding都会通过一个线性方程g转变成标量,所有的标量再通过一个线性方程转变成SIGN的输出,如下所示:

SIGN总体的预估函数如下:

总结完所有模块,L0-SIGN的预估方程就如下所示:

03 经验风险最小化方程

为了确保模型能够成功的找到有益的交互特征,损失函数定义如下:

一共3项,第一项就是正常预估偏差,第二项是所有边为1的概率和,第三项是l2正则项。

04 实验

从实验中,我们可以看到无论对比各种FM模型,还是图模型,L0-SIGN都表现最优。

更多细节见论文:

https://arxiv.org/pdf/2008.00404.pdf

0 人点赞