聊聊推荐系统的高阶特征交叉问题

bac89627397f8b905714f5a1da3861f7.png

文 | 水哥
源 | 知乎

Saying

1. DCN看起来给了我们很好的允诺,但是细细想来是有一些问题的,这里也可以参考大佬的意见

62f3ada21aae3667fedb20ac881d6c25.png

2. 高阶FM的核心设计是先element-wise乘,再对embedding求和。核心优化方法是利用计算中的冗余构建递推关系,然后使用动态规划解决
3. 计算出现冗余的地方,动态规划就可能出现;冗余的部分和新的信息组成递推的时候,动态规划就可以应用
4. DCN的形式对于交叉有点表面化,我们要的不是交叉这个概念,我们要的是确切的谁和谁交叉

FM引入了特征embedding的交叉之后,还顺带引入了另一个很自然的问题:除了二阶关系,是否还有更高阶的交叉存在?这些交叉应该选用什么样的数学形式,又如何来优化?在本讲中我们来探讨这个问题。按照上一讲提到的文章,仅仅凭借MLP是很难做到element-wise,以及内积这种交叉的。想要有高阶,首先想到的还是FM自然的向高阶的拓展,但是这个形式中需要优化茫茫多的参数,higher-order FM的作者抓到了计算中的冗余,巧妙地化解了指数复杂度的问题。从另一个角度,在DNN中如果能引入很自然的交叉结构,实践起来当然也是非常便利的。鼎鼎大名的Deep&Cross Network就做了这方面的工作,可惜它给我们的,可能是梦幻泡影,这又是为何呢?

扩展简单优化难——Higher-Order Factorization Machines(HOFM[1]

核心观点:高阶特征的交叉形式是所有的embedding element-wise乘,再求和,乘以所有要交叉的特征。在这个计算中存在大量的冗余,通过推导递推关系可以简化为动态规划求解

HOFM这篇工作发表于2016年的NIPS,作者重新思考了高阶FM的问题(主要是优化的问题)。其实在原来的FM中就有一个自然的扩展,二阶的特征是两个特征乘起来,以及他们embedding的内积,那么照葫芦画瓢,可以设计出 阶的交叉关系:

其中, 表示要进行交叉的特征索引的集合,里面的 , , 这些都是对应的索引。还是特征, 是对应的embedding,这些表示方法还和之前一样。这里的交叉分为两部分,一部分是所有涉及到的特征的连乘,而另一部分是先把所有涉及到的embedding做element-wise乘法(操作),然后再把所有元素加起来(即上面的sum函数)。这样就得到了一个交叉单项的形式,而整体的高阶FM就可以表示为:

前面的三项就和之前的FM是一样的。这里我们用上标(m)表示这个embedding是给 阶交叉使用的(因此每到一阶都有一份独立的embedding)。 是一个缩写,实际表示的是,而 也就是 。就等价于上面的 这样,我们就得到了高阶FM的表示。

由于高阶交叉求和中的每一项其实都是组合数的一项(比如4阶就是从 个特征里面挑出4个来做交叉),这个计算复杂度是指数级的。直接按照这个形式去优化,forward,backward计算量都太大了。

如果把上面的交叉项用ANOVA核(这里不用关心背景知识,不影响下面的阅读)表示的话,可以记为 ,其中求和和后面的乘都是 项。上面的表示还可以展开为:。HOFM的核心是指出这里存在一个递推的关系

这里表示的是单向量的关系,要注意这里 的 表示的是取第个元素操作,请不要和上面混淆了。表示除了 之外剩下的部分。

这个递推关系用数学来表示是很难受的,我们尽量用语言来证明这个递推:原来的表示的是从所有个特征中挑出个(称为组合数),遍历所有可能性,每一项算好乘加起来。如果我们把单独拿出来,原来的组合数可以分为两部分,一部分是不含 的,而一部分是包含的。不含 的这部分,还是从 个里面挑出 个,只是这里面没有 ,那么这一项就是 。而包含的这部分,可以先把 提到外面去,这部分组合数因为一定包含了这个位置,那么就相当于 挑 中的一个已经固定了,剩下的其实是在中挑出 个,而且是不含 的。所以后面这一项就是 ,这样就得到上面的递推关系。

当有了这个递推关系之后,就可以用动态规划来解决接下来的问题。我们用一张表格来表示:

fd1bacf423e212c62cea3624fbc170af.png

在这里我们保证每次计算到的最新的 都是当前向量的最后一维。假设更小的和更短的的结果已经计算好了(图上的深色部分),那么当前所需要的结果就是该点左上角和左边结果的融合。只要保证先从上到下,再从左到右的计算顺序,就可以在 的时间复杂度内得到结果,避免了指数级的运算。在优化的过程中,梯度的传导也是类似的。区别是从下往上,从右往左倒着回来的,这里就不再赘述了。

我们仅仅知道这里有一个很好的动态规划的简化是不关键的,而是要知道,为什么这里可以出现动态规划?我们再次观察,其实在 阶和 阶之间,不涉及新加的 的部分,算出来的结果大部分是一样的,而且在两边都得各自算一遍。由于有大量的冗余计算,当我们把计算过程分解为“新的结果=冗余的计算+新的信息”的时候,就可以得到动态规划的递推形式。关于更多动态规划的本质,可以参考笔者的另一篇文章(专栏)进行理解[2]

如果直接按照原来的形式来做,每一阶所有的参数都是独立的,这样庞大的参数量还是会带来不小的麻烦。论文中也提出了一些实践的建议,比如可以所有阶都共享embedding,只是有的地方阶高,有的地方阶低,节省了大量的参数。

HOFM中的高阶交叉确实优化的很到位,但是这还是限定在了FM这个大框架下去做的。现在基本都使用DNN了,如果在DNN中能够很方便的引入高阶交叉,对于实践再方便不过了。Deep&Cross Network就是这么一个工作,我们来看看,它是不是能够很好地完成高阶交叉。

天下没有免费的午餐——Deep & Cross Network(DCN[2]

DCN是斯坦福的学者们在2017年设计的一个新的网络结构,其核心是一个叫做Cross Network的旁路,这一路是专门对特征进行交叉的。按照设计,这路网络会对特征进行任意有限阶交叉。其核心设计可以用下面的公式来表示:

其中, , 分别是DNN中,输入层和输出层的中间结果(向量)。 为一开始的输入特征的embedding的拼接,它会在每一个层都参与运算。就是这层要学习的权重了,这也是一个向量。结构上也可以用下面的图来辅助理解:

40e4d0b23a92a80148076641c2dfb152.png

这里的 对应上面的 , 对应公式中的 。之所以要写成上面公式的形式是因为这个公式的模块是可以层层堆叠的。

那么DCN这样的设计是如何进行特征交叉的呢?设想在第一层,其实就是先和 做向量外积,得到一个矩阵,然后在矩阵中,每一个元素都是原先embedding中两个元素的乘:

当后面再乘以 的时候,其实是让 进行筛选,选出哪些交叉项留下,继续进行后面的运算。在第一层计算完毕之后,结果其实保留了一部分二阶的embedding元素交叉,那么再往下继续,就会有3阶,4阶。。。一直到网络层数的阶层。这样,只要我的网络有 层,我就能让输出带有 阶的交叉。下面的图展示了这个过程, 出现在每一层的中间,只要产生了新的中间输出,就要和 作用来得到下一层的结果:

50aa02bfcf83490b17e9c7876fffb1c2.png

高阶交叉空许约

就到目前为止,一切看起来都很美好,但是看完DCN这篇文章,睡一觉,再起来,就有一个问题钻进脑海:HOFM用了指数级的参数来优化高阶交叉特征,而DCN每一层仅仅就一个向量 就把高阶交叉做了,会不会太廉价了

抛开DCN许诺的高阶交叉,我们来想象一下,假设 我们可以人为指定了,需要什么样的形式,才能完全达到挑出交叉的效果?比如就让DCN只有一层,然后还原出FM的形式?

想要达到这个目的,必须拿出上面 矩阵的上三角或者下三角(不包含对角线)的所有元素加到一起才可以,这时候怎么解出 呢?我发现不论如何设计 其实都是做不到的(本质原因还是因为 是个向量,势单力薄)。所以这里的交叉最后和我们见到的FM以及类似模型中的交叉已经不是一个东西了。这是我个人对DCN的最大疑问点,可能也是文章开头大佬观点的部分原因吧。光有交叉这个概念是不能达到工业目的的,就像我们上一讲所讲的。我们要的交叉甚至谁和谁交叉比较好都有详细的门道在里面。

第二点是,当交叉变成了embedding中的一个元素的乘法,而不是原来整个embedding合起来内积的。如果后面这个不成立,就不存在embedding泛化性的保证了,那么交叉的意义还剩下多大呢?

上面这两个问题,在xDeepFM[3]这篇文章中相当于是做了一个归纳:DCN的本质实际上是给 乘了一个系数!重新考虑这个公式,根据结合律和分配率,可以重新写作:

结合上面的图,括号里面的两个向量分别是行向量和列向量,乘起来就是一个数字,也就是说,最后一层一层迭代完了,只得到一个 的倍数。你要说没有交叉吧,系数其实还是和 有关系的,你要说有交叉吧,又不是我们FM,PNN,ONN等等网络中讲得这么回事。

这么看下来,DCN给我们的,大体上是一个空头支票。它的交叉也不一定是我们想要的交叉,如果想要真正的交叉应该怎么做呢?

写到这又发现写的太多了,先鸽住,下期继续讲如何做真正的高阶交叉~

下期预告

推荐系统精排之锋(7):xDeepFM与DCN-V2,兑现交叉的诺言

往期回顾

1.召回 粗排 精排,如何各司其职?

2.拍不完的脑袋:推荐系统打压保送重排策略

3.简单复读机LR如何成为推荐系统精排之锋?

4.召回粗排精排-级联漏斗(上)

5.召回粗排精排-级联漏斗(下)

6.推荐系统精排:看阿里妈妈再试线性模型

7.推荐精排之锋:FM的一小步,泛化的一大步

7.推荐中使用FNN/PNN/ONN/NFM优化特征交叉

8559f40b9b40e250f619bcca113a41b0.png后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

72362846e931a95e484cb8954a7f5425.gif 8d7604e173a9f97ff194b125f1c1c688.png

[1] Higher-Order Factorization Machines,NIPS,2016
https://proceedings.neurips.cc/paper/2016/file/158fc2ddd52ec2cf54d3c161f2dd6517-Paper.pdf
[2] 水哥:从零单排leetcode第二十五期之动态规划(2):动态规划的本质是状态压缩
https://zhuanlan.zhihu.com/p/390344991
[3] Deep & Cross Network for Ad Click Predictions,AdKDD,2017
https://arxiv.org/pdf/1708.05123.pdf
[4] xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems,KDD,2018  
https://arxiv.org/pdf/1803.05170.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值