文 | 水哥
源 | 知乎

Saying

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

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的核心是指出这里存在一个递推的关系

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

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

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

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

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

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

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

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

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

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

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

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

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

高阶交叉空许约

就到目前为止,一切看起来都很美好,但是看完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优化特征交叉

后台回复关键词【入群

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

后台回复关键词【顶会

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

 

[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

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

  1. 真正的高阶特征交叉:xDeepFM与DCN-V2

    文 | 水哥 源 | 知乎 Saying 1. xDeepFM和DCN-V2是真正的高阶交叉,和前面讲的High Order Factorization Machine(HOFM)又有着千丝万缕的联系 ...

  2. 深度学习中的高阶特征

    由于自己研究方向为基于高阶的图像分类,故在这里对相关论文做一个简单的划分和总结. 按照计算高阶的层,位于卷积神经网络的位置划分,可以分为: 网络末端 网络中部 2022-05-24 update (C ...

  3. paper survey(2019.06.11)——卷积网络高阶特征表示

    类似于博文< paper survey(2019.06.05)--卷积网络feature map的传递与利用> 本博文也是系列论文的阅读笔记(基本都是CVPR和ICCV的论文). 对于跟本 ...

  4. 一文看懂推荐系统:排序16:Dual Augmented Two-tower Model和张俊林的SENet,都是为了加入特征交叉想,增强重要特征,去掉噪声,类似于attention的骚操作

    一文看懂推荐系统:排序16:Dual Augmented Two-tower Model和张俊林的SENet,都是为了加入特征交叉想,增强重要特征,去掉噪声,类似于attention的骚操作 提示:最 ...

  5. 【推荐系统】深入理解推荐系统:无需人工特征工程的xDeepFM

    [推荐系统]专栏历史部分文章: 深入理解推荐系统:召回 深入理解推荐系统:排序 深入理解推荐系统:Fairness.Bias和Debias 深入理解推荐系统:推荐系统中的attention机制 深入理 ...

  6. 深度学习 - 42.特征交叉与 SENET、Bilinear Interaction 与 FiBiNet

    目录 一.引言 二.摘要 - ABSTRACT 三.介绍 - INTRODUCTION 四.相关工作 - RELATED WORK 1.因式分解机及其变体 - Factorization Machin ...

  7. 【论文解读】DCN-M:Google提出改进版DCN,用于大规模排序系统的特征交叉学习(附代码)...

    " 本文结合DeepCTR-Torch中的代码实现,介绍了DCN的改进版--DCN-M.该模型能更有效地学习特征交叉,并通过低秩矩阵分解对参数矩阵进行降维,降低计算成本.受MOE结构启发,作 ...

  8. 推荐系统中特征交叉模型之——DeepWide/DeepFM/NFM

    前言 上篇文章中我们引入了推荐系统中特征交叉的概念,以及介绍了一些常见的特征交叉方法,这篇文章我们将详细地讨论一下推荐系统中特征交叉地模型,他们的特点,以及他们为什么会这样.本文中介绍的模型有Wide ...

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

    文 | 水哥 源 | 知乎 saying DNN时代来临的时候,LR没打过,也很难加入.FM打不过,但他可以加入 FM的精髓,最上在于latent embedding,有了它才能把交互拆解到基底上:居 ...

最新文章

  1. Linux下的CST和UTC时间的区别
  2. Docker 不香吗,为啥还要 K8s?
  3. c调用其他类的方法_Java 的 Native 方法——今天又进步了
  4. 简述ajax的优缺点
  5. 数据仓库与联机分析处理技术
  6. 【生活智慧】005.信守诺言的约束
  7. create-react-app 支持多入口
  8. 金笛JDMAIL打造公务员邮件系统
  9. 小说网站的源码设计实现
  10. 获取全国客运火车站的详细信息(包括行政区号,详细到街道!!!)
  11. 如何在php文件中插入图片,使用PHPWord读取Word文件并插入图片
  12. 超好玩的css3-3d效果
  13. oracle快照点,Oracle快照(snapshot)管理
  14. cesium天气(晴、雨、雪、雾)
  15. 书舟计划丨国鸿公益amp;MINI书箱漂流乡村公益行 为爱启程
  16. 【渝粤教育】国家开放大学2018年秋季 7179-22T文献检索 参考试题
  17. 解析春运玄学:携程飞猪去哪儿们的抢票加速包,到底灵不灵?
  18. Transform.Forward和Vector3.Forward的正确使用方法
  19. Linux环境下Shell脚本基础篇-鸡兔同笼问题
  20. PHP设计模式之适配器模式(Adapter)了解下

热门文章

  1. JAVA多线程程序ProgressBar
  2. Laravel框架开发规范-修订版
  3. [转]java 组播
  4. WPF学习笔记-第二周【基本笔刷】
  5. static关键字 void和void指针 函数指针
  6. socket api中send()和recv()函数工作原理与要点
  7. 越老越值钱,除了程序员!
  8. 都2021年了,c/c++开发竟然还能继续吃香??
  9. java连接cdh集群_有一台电脑需要通过beeline的方式连接到CDHclouderahadoop集群,提示报错。...
  10. Vue3过渡动画实现