20 | DeepFM:如何让你的模型更好地处理特征交叉?
20 | DeepFM:如何让你的模型更好地处理特征交叉?
讲述:王喆
时长12:42大小11.60M
为什么深度学习模型需要加强处理特征交叉的能力?
善于处理特征交叉的机器学习模型 FM
(出自论文 DeepFM: A Factorization-Machine based Neural Network for CTR Prediction)
深度学习模型和 FM 模型的结合 DeepFM
(出自论文 DeepFM: A Factorization-Machine based Neural Network for CTR Prediction)
特征交叉新方法:元素积操作
(出自论文Neural Factorization Machines for Sparse Predictive Analytics)
DeepFM 的 TensorFlow 实战
小结
课后思考
赞 20
提建议
精选留言(35)
- 张弛 Conor2020-11-26关于DeepFM,想请教一下老师:DeepFM的图示中,输入均是类别型特征的one-hot或embedding,请问是因为特征交叉仅适用于类别型特征的交叉吗?数值型特征之间,数值型与类别型特征之间能否进行交叉呢?另外,在DeepFM的wide部分中一阶交叉项是否可以包含未参与特征交叉的数值型特征呢?
作者回复: 这是个好问题。按照DeepFM原论文,数值型特征是不参与特征交叉的,因为特征交叉的操作是在两个embedding向量间进行的。 但是如果可以把通过分桶操作把连续型特征处理成离散型特征,然后再加Embedding层,就可以让数值型特征也参与特征交叉。这是一个可行的方案。
56 - 张弛 Conor2020-11-26老师您好,请教一个关于FM的问题。原FM中二阶交叉项中隐向量的内积仅作为权重,但从这篇课程的图示和代码来看,他们的内积直接作为了交叉项的结果,而没有了初始特征的交叉,想请问一下,这样做是因为教程里所选的特征是one-hot格式,所以维度可能不一致,从而无法进行初始特征的交叉吗?那对于数值型的特征,他们的初始特征交叉是否应该和隐向量内积相乘再作为二阶交叉项的输出呢?
作者回复: 是这样,原FM中内积作为权重,然后还要乘以特征本身的值。 但在DeepFM中,所有的参与交叉的特征都先转换成了embedding,而且由于是one-hot,所以特征的值就是1,参不参与交叉都无所谓。所以直接使用embedding的内积作为交叉后的值就可以了。 至于数值型特征的问题在于,如何把他们转换成embedding向量,我觉得分桶后加embedding层是一个方法,但其实分桶后加embedding层也是不用加原特征值的,因为分桶后的结果还是一个one-hot向量。
共 4 条评论17 - 那时刻2020-11-25关于课后思考题,处理两个 Embedding 向量间的特征交叉的方法。 1.是否可以把这两个embedding向量组合之后再做一次embedding。 2.对于两个Embedding向量做一次pooling层,采用average/max pooling。 另外,开个脑洞,不是有木有把点积和元素积一起使用的模型呢?
作者回复: 这两个想法都没有问题,其实深度学习中没有什么不可以的,有的只是提出思路,改进模型,和验证效果。 把点积和元素积在一起使用,交给模型自动学习权重当然也是可行的。 除此之外,还有元素减,外积等交叉操作,除此之外还有一些自定义的复杂交叉操作,比如google cross&deep模型中自定义的一些cross操作。
12 - 那时刻2020-11-25请问老师,文中提到FM 和 DeepFM 中进行特征交叉的方式,都是进行 Embedding 向量的点积操作。FM层中还有个加操作,它的作用是什么?
作者回复: 加操作是不进行特征交叉,直接把原先的特征接入输出层,相当于wide&deep模型中的wide层。
共 3 条评论12 - xll2020-12-01老师您好,按FM的交叉方式,不同特征的embedding 向量维度要相同,但实际不同离散特征的维度可能相差很大,如果想用不同的embedding 维度,那应该怎样做交叉,业界有没有这样的处理方式?
作者回复: 几乎不可以。如果一定要做的话,也要在不同embedding层上再加上一层fc layer或者embedding layer,把他们变成一致的,然后交叉。
11 - 厚积薄发2021-02-28内积和元素积的区别是什么?都是对应元素相乘然后求和吧
作者回复: 元素积不求和,对位操作后生成一个向量。
10 - Sebastian2020-11-25对特征embedding做concat、average pooling、sum pooling 都可以
作者回复: 这些确实都可以,但针对性不强,还是一些专门针对两个embedding特征交叉设计的操作效果好一些。比如我们提到的dot product, element-wise product 和element-wise minus. outer product等等。
9 - 浣熊当家2020-11-25这一讲里是关于不同特征之间的交叉,但对于之前提到过Youtube有对单一特征进行平方,开方这样的操作得出新的特征的做法,对于这种单一特征的变换操作有没有什么深度模型可以做到?还是一般都是根据经验和理性进行人工手动的尝试?
作者回复: 一般是通过人工经验进行一些预处理。当然,预处理层也可以看作深度学习模型的一部分,需要一些人工的尝试。
6 - 王志文2021-06-18老师好,代码中FM的交叉好像是手工指定了几种交叉,还不是全部特征的两两交叉?进一步,如果是全部特征的两两交叉,会出现user id和 user gener的交叉,这两项都是用户侧特征,不涉及物品侧特征,感觉交叉了也不会对指标提升有作用,这样考虑对吗?如果全部两两交叉不会有作用的话,是不是又得手动做交叉特征的筛选呢?谢谢老师!
作者回复: 代码中只是一个例子,仅供参考,具体哪种效果好当然是靠自己探索。 你的思路很对,一般来说物品侧和用户侧的特征交叉的作用更大,在实际应用中,还是最好有一些手动调参,和先验知识会更好一些。
5 - 遨游2021-02-24老师您好,如果不使用FM模型,单纯使用多层神经网络能否做到两两特征交叉或高阶特征交叉呢?如果可以该怎么处理?谢谢!
作者回复: MLP当然会处理特征交叉,只不过效率低一些,不那么直接,这也是学界提出deepfm的原因。 这些想法应该课程中有阐述到,建议再好好体会一下。
3 - Geek_ddf8b12020-12-03老师 您好!我准备做推荐项目场景为类似抖音这种的短视频信息流推荐 想请教一下:1、实际生产环境中tensorflow训练这些深度学习模型一般是分布式训练吧?如果是分布式训练的话,您sparrowrec项目中的代码需要做哪些改动?或者能否整体说明一下如果这个项目代码在生产环境使用的话有哪些需要注意应该要修改的地方。2、我看您代码中特征是存在reids中。想请教一下几百万用户(dau几十万)和几十万的视频 用户和物品特征一共300个字段左右 这种规模的数据量适合把用户和视频的特征都存在redis中吗?展开
作者回复: 1. 不一定,也有大量公司采用单机多卡的形式训练。如果是分布式的环境,改变会比较大,需要深入研究parameter server相关的配置和实践,属于非常偏工程前沿的内容了,需要大家自己去踩坑填坑。 2. 这个问题不用我回答,你自己estimate一下就可以了,redis的容量有多大,你的数据量有多大。然后做一个poc去先插入少量数据看一下实际的内存使用量就可以了。 如果redis容量不够怎么办,参考之前存储模块的那讲。
4 - 浣熊当家2020-11-25想请问下老师, 能简单介绍下因子分解机模型(Factorization Machine)和矩阵分解(matrix decomposition)之间的联系和差别吗?(我对于矩阵的很多模型算法都很懵,比如还有奇异值分解(singular value decomposition,NMF(Non-Negative Matrix Factorization),没有搜好的图示解释他们之间的渊源, 也请教老师和大家有什么好的学习资料)
作者回复: 结构上来说,因子分解机会引入除了user id和item id的其他特征,而且FM是有一阶部分的,不只是做特征交叉。 MF就是一个只利用user id和item Id的双塔模型。 当然像你说的,MF还有多种的求解方式,推荐找找相关资料,自己认真推理一下。
4 - 范闲2020-12-021.两个embedding concat以后pooling (max average)都行 2.内积、外积
作者回复: 是的
2 - kenan2020-11-26王老师,您好,我们的课程后续会讲召回后选集排序么?
作者回复: 这篇讲的深度学习模型就会应用到SparrowRecsys的排序层。 你讲的“选集”指的是?
共 3 条评论2 - onepencil2020-11-26老师你好,你的代码应该只是一个示例代码吧。FM部分只用到了四个特征,并不是原型FM的全部交叉,而且也没有一阶非交叉的特征,这应该只算是deep网络和手工交叉的组合,不能算是deepfm的实现吧
作者回复: 是的,只是一个示例。但通过加入一阶项修改成标准的deepfm应该很容易就可以实现。 可以帮我修改一下,之后提个pull request吗?
3 - 罗辑2021-10-07依次看了这几个模型,有种想把 Wide&Deep+NerualCF+DeepFM+NFM 融合进一个大模型的想法,取各自的优点,然后把各自的结果拼接在一起,送给最后那个神经元来训练权重。 具体可以理解为: Wide&Deep负责记忆部分,并抽取一些单个特征的高维特性 NerualCF:负责一些有明显关联关系的协同信息提取 DeepFM:负责交叉特征提取,甚至交叉以后的新特征再次进行二阶交叉。 NFM:负责所有特征的融合 把四个模型的输入都给一个神经元,让神经元来训练分配各自权重。 不知道理论上可行吗?请老师指教。展开
作者回复: 当然可以,本质上是一种bagging的做法
1 - yangming2021-09-10老师,对于first_order_cat_feature,它其实是一个indicator_column(不是dense column),相当于onehot,onehot编码为什么能做特征交叉得到新的特征?这个比较疑惑。老师教师节快乐!!1
- Geek_de83f62021-08-22老师 请教个问题,如果用了DeepFM模型后,输入到全连接层的是一个内积值,那还怎么使用反向梯度下降的方法更新FM下边一层的Embedding的值呢?
作者回复: 内积也是可以求偏导的啊,可以继续反向传播
1 - W2021-07-02代码中直接用embedding 的点乘结果(也就是一个值?)作为特征交叉结果,但是理论上点乘结果应该是交叉特征的权重值,而交叉特征是由两个one-hot特征做组合得到的,老师这样理解对吗?
作者回复: embedding特征交叉有太多不同的交叉方法,直接做点积只是其中的最简单直观的一种。你说的理论上也可以尝试。
1 - Alan2021-03-27答:DCN与DCNMix。参考了Deep Crossing模型引入了Cross network残差结构的思想,使得模型能够更深。 这里有我学习的DCN与DCMix学习笔记:https://zhuanlan.zhihu.com/p/352110578,欢迎大家来阅读!1