文 | 水哥
源 | 知乎
Saying
1. xDeepFM和DCN-V2是真正的高阶交叉,和前面讲的High Order Factorization Machine(HOFM)又有着千丝万缕的联系。某种简化下,都能退化为HOFM的形式
2. 如图
![d24de3e8eecacdf611bdb4562131872c.png](https://i-blog.csdnimg.cn/blog_migrate/e57d2a0a3821f786364bd6cf3e0dd7dd.png)
3. 推荐模型迭代的时候要平衡涨点和复杂度的关系,不然你开开心心参加launch review,准备向老板汇报fancy的技术,老板直接问上了以后会不会迭代投入都要乘2是不是多的机器钱你来出就尬住了
4. 数学给我们的东西是所有阶交叉都加上会好,实践需要的是哪些特征交叉,交叉到几阶性价比最高。这一点目前看来业界很少有分享,但是又很缺
本讲是 【[从零单排推荐系统]】 的第13讲,这一讲的两个工作都是真正兑现了高阶交叉的。两个工作存在共同点:
(1)都是将交叉结果当做网络的feature map(看了下面的思路反编译你会明白是为什么);
(2)毫不吝啬的投入大量参数来赋予权重;
(3)同时结合了显式交叉的部分和隐式交叉的部分(DNN)。所以其实这两个工作都可以看成是以更容易操作的方式融合了HOFM。
但是在这一讲中我们也要强调两个实际问题:
(1)引入高阶交叉的同时,也需要付出很高复杂度的代价。
(2)高阶交叉本身是一个很有意思的方向,但是在实践中可能存在效果不显著,投入产出比不高的问题,操作时建议控制投入度。
xDeepFM[1]
根据DNN的非线性性质,我们可以认为DNN完成了一种隐式的交叉。而Deep&Cross Network是致力于在做显式的操作。但就像上一讲 水哥:推荐系统精排之锋(6):Deep&Cross Network——高阶交叉空许约 提到的,DCN的交叉最后剩下的是 乘以一个变换后的系数,这样的交叉并不像我们预期中那样,也无法变换出High Order FM的形式。
与DeepFM相比,xDeepFM还是保持了一部分是Deep一部分是Cross这样的结构,但重点对Cross这部分做了结构上的修改。对于输入特征,变为embedding之后可以全部拼接起来组成一个矩阵 ,其中, 是特征的个数, 是embedding的维度。第 层的feature map记为 ,但它的第一维现在不是 了,可以暂记为个,得到第层的操作可以表示为:
在这里写法上和python代码是类似的, 就表示取出这个矩阵的第 行。, , 分别是输入矩阵, 层feature map和第 层feature map的行号索引。那么新的feature map中的每一行,都是先让上一层的每一行,和每一个输入embedding做element-wise交叉,再用一套独有的 做变换后加起来融合的。
这篇文章的原图不是很容易看懂,这里重新做一张,解释上面的操作:
![fc7654a6fb5e4ffea2b58ae03977bbeb.png](https://i-blog.csdnimg.cn/blog_migrate/1087a87dcc608687a24eb40349e87ed3.png)
在图中,每一个圆都表示一个元素。红色方框框起来的部分是一个embedding。灰色是原始特征 ,蓝色和黄色分别是 和。我们把灰色和蓝色的每一行分别交叉后,乘以对应的 ,加起来得到最终 的第一行。
像这样操作之后,每一层都会得到一个矩阵 ,先对特征那个维度( 对应的维度,也就是上图中的水平方向)求和,得到一个向量(这一步是不是和内积很像?)。然后把每一层的这个向量都拼在一起,最后再用一层线性层+Sigmoid输出即可。这种每一层特征都用的方法,和DenseNet也有一定相似之处。
思路“反编译”
这个工作的思路我们可以这么理解(这是我“反编译”作者们如何思考得到这个工作的过程):现在我需要完成真正的交叉,那么首先想到的,就是要让两个embedding做element-wise的乘法操作,如果我先做了两阶的,把结果存下来,再找一个新的来做,就可以得到三阶四阶等等一直递推下去。因此我恰好把两阶段的结果当做网络中间层的feature map,然后每次交叉都从原始输入跳连过来,就可以做到这点。当然按照FM本身的定义,需要有一个各个交叉求和的过程这里也要保留。那各路交叉融合的时候,自然需要一个融合系数了,也就是方法中的 (如果稍作灵活处理的话,个人觉得也可以把 从矩阵改为向量,节省点复杂度)。按照这样的思路梳理下来,是否更能理解这个工作?
交叉的这部分网络按照原文的说明,称作Compressed Interaction Network,从以下几个方面,我们进一步加深对它的认识:
CIN有一个声明是,它属于vector-wise的交叉,而不是bit-wise的交叉。vector-wise的交叉指的是,在交叉的时候,整个vector都是一个整体,要么整个vector一起操作,要么不做任何操作。这一点是兑现了的,在上面的示意图中,每次一行的红色框都是同进退,要么一起做,要么不做。而与此相反的bit-wise操作就是vector内部可以拆开,有的元素和别的交叉了,有的还保持不变。如果把embedding当做输入给DNN,下面的操作就是bit-wise的,而像上一讲最后的DCN本质也是bit-wise的。
为什么要把每一层的feature map都直连到输出上?就是为了让高阶的交叉和低阶交叉都传递到输出上。最后输出环节就包含了各个阶的交叉信息。
名字中的compressed(压缩)主要体现在哪里?主要是在 这一层,与原始embedding作用后,通过加权求和,最终剩下有限个embedding拼接的矩阵。交叉的结果并不会无限膨胀。因此求和这里其实就是做了压缩。比如我们可以令每一层的 都相同,而且是一个比较小的数字。
CIN的操作其实靠近了HOFM的主旨思想,xDeepFM的模型中存在任意阶(在层数允许范围内)的交叉,而且是以类似HOFM的方式,我们尝试是否可以通过一些简化退化到HOFM上?
如何从CIN还原HOFM的形式?
在上面的公式中,如果我们把 做成一个恒等矩阵乘以系数的关系就可以退化到近似的HOFM上,即 这里改为 可以让最终的形式变为embedding连乘再乘上原特征的形式,因为xDeepFM中本来就有按元素求和,因此和HOFM的本意是一致的。但是要注意,中间层的embedding是存在压缩的,也就是上面的不能遍历所有特征,除非设定 。
DCN-V2:Improved Cross&Deep Network[2]
在WWW2021上,DCN的作者“卷土重来”,提出了一个船新版本V2。我们直接对比V1和V2的结构来理解DCN-V2。V1的结构如图:
![9c68052b5e7e5227fd7e472e5398ee28.png](https://i-blog.csdnimg.cn/blog_migrate/67115939626f1550b207dcb2eae22c7e.png)
它的核心表达式为:
而V2的结构为:
![f1a72084749f4a590d2061fd5f36ea73.png](https://i-blog.csdnimg.cn/blog_migrate/2ede4eb02dce9e142cf600939be3a13f.png)
它的表达式可以写为:
这里的定义和上一讲保持一致。可以看出,最大的变化是将原来的向量 变成了矩阵。而这一个改动就解决了前面最大的问题。一个矩阵 拥有足够多的参数来保留高阶交叉信息,或者挑选需要的交叉结果。在现在这个结构下,就可以还原出HOFM的形式了(这里留作思考题,读者可以自行推一下),因此这个工作也兑现了真正的高阶交叉。
要注意的一个DCN-V2和xDeepFM的很大区别是,DCN-V2仍然不是vector-wise的操作。根源在于,DCN-V2把所有特征的embedding拼起来一起输入网络,所以在 那里无法保持同一个特征的embedding同进退,同一段embedding自己内部也存在交叉。而模型的结构又要求 是个方形矩阵,这样参数量就会非常大。因此作者引入了低秩分解来处理,即把变成两个小矩阵的乘,即 , :
我们团队也尝试了DCN-V2,涨点是没问题的。但是如果你的模型一开始是一个MLP为基准的模型,另外半边就是凭空冒出来的,相当于MLP那边的复杂度要翻倍。考虑到AUC涨的幅度有限,在大幅增加的复杂度面前不是很划算,最后没有上线。
高阶交叉本身的必要性?
我们一直说怎么做高阶交叉,但是回过头来,没有讨论过的一个问题是在实践中,高阶交叉本身有多大的必要性?
一方面在文献,或者我们自己的实践中,没有说明某个具体的高阶,或者某种具体的形式是能够确定涨点的。 比如我们希望有人能够分享经验,说把用户,物料,环境信息三者交叉能涨点,或者这些大方面中的哪些具体特征交叉起来是最有利的。没有这些经验,高阶的探索变的很不确定,如果只是说就把所有的东西大杂烩放进去,那么里面可能有很多浪费的计算,而且操作很不经济。这是现在业界在实际操作中比较需要的地方。
另一方面,在实际迭代的过程中,不仅仅要说明有所提升,还要看复杂度,时延的变化情况,必须说明这些复杂度的提升,换来这些涨点是赚的。模型复杂了,并发能支持的请求更少,就得通过堆机器把这些并发补上。那这些机器租,买,维护也是要钱的。所以一般要算一个成本,如果时延显著增加了,需要看看钱用在这里是不是划算。现在业界很少听说DCN有部署的,就像上面说的,大多数场景上都是MLP一上来就上了,后面都是增量式迭代(因为有主场优势的存在,你想不增量可能会更难)。这时候加Cross Network还不敢动原来那部分,就导致复杂度急剧增大,对后续迭代,维护都是问题。
思考题
1.DCN-V2的操作不是vector-wise的,你认为这件事情的边界是绝对的吗?你认为对性能会有多大影响呢?
2.在DCN-V2里面可以做一些简化,让模型还原出HOFM的形式吗?如果是的话该如何操作?
提示:可以做一个分块对角矩阵,每一个分块都是单位矩阵的变形
下期预告
推荐系统精排之锋(8):工具人GBDT
往期回顾
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
后台回复关键词【顶会】
获取ACL、CIKM等各大顶会论文集!
![]()
[1] xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems,KDD,2018
https://arxiv.org/pdf/1803.05170.pdf[2] DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems,WWW,2021
https://arxiv.org/pdf/2008.13535.pdf