前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >曾几何时,我们都是炼的不是丹,是特征!

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

作者头像
炼丹笔记
发布2021-06-15 15:44:37
3560
发布2021-06-15 15:44:37
举报
文章被收录于专栏:炼丹笔记炼丹笔记

作者:十方

对于炼丹师来说,特别是面对海量特征,还要从中挖掘出交叉特征"喂"给模型,是十分痛苦的。不得不说,人都是"懒惰"的,我们炼丹师当然希望有个厉害的深度学习模型,只需要对最原始的特征做预处理后,扔给模型,让它自己学习交叉特征。希望模型像"奶牛"吃草,挤得是"牛奶",那么我们必须保证"喂"的是草。并不是所有的交叉特征与推荐系统的最终优化目标都是相关的,盲目的"喂"特征只会带来更多的噪声和系统准确率的下降。《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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 炼丹笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档