跳转至

DeepFM

DeepFM 把 FM 的低阶交叉和神经网络放在一起。

FM 部分擅长学习二阶特征交叉。Deep 部分拿同一批特征 embedding,继续学习更复杂的非线性组合。它适合处理那种不是单个特征能解释的信号,比如用户、电影类型、时间段一起影响结果。

在 MovieLens 上,DeepFM 可以使用用户 ID、电影 ID、genres 和时间段。目标可以是预测评分,也可以把评分大于等于 4.0 当成正样本做二分类。

第一版不要把特征堆太多。先用少量特征跑通,再一个一个加,并和 FM 对比。如果指标变好但推荐结果看起来奇怪,要先看样例,不要只信数字。

flowchart LR
  X[稀疏特征] --> E[Embedding]
  E --> FM[FM 部分<br/>低阶交叉]
  E --> DNN[DNN 部分<br/>高阶组合]
  FM --> Out[预测分数]
  DNN --> Out

DeepFM 的好处是不用手工指定哪些特征交叉。FM 分支负责比较稳定的二阶关系,DNN 分支负责更复杂的组合。

第一版可以做二分类:评分大于等于 4.0 当作喜欢,否则不作为正样本。跑完后和 FM 对比,看看深度分支是否真的带来提升。

运行

默认全量运行:

./03-feature-crossing/deepfm/run.sh --sample-ratings none --num-workers 8 --save-checkpoints --checkpoint-every 0

想先快速试跑:

./03-feature-crossing/deepfm/run.sh --sample-ratings 2000000 --num-workers 8 --save-checkpoints --checkpoint-every 0

默认命令只保存 checkpoints/best.pt。报告会写入验证指标、测试集预测样例和 checkpoint 大小。

常见坑是把特征一次性加太多。模型变复杂以后,指标涨了也不一定说明模型更懂用户,可能只是记住了训练集。