推荐系统基础回顾:协同过滤、矩阵分解、逻辑回归、FM模型、深度学习推荐模型(DIN、DIEN)简介
各位同学,咱们今天聊点实在的。多目标优化听起来高大上,但地基不牢,楼盖得再高也得塌。我个人习惯,每次带新人做推荐系统,第一件事就是让他们把这几块基础模型吃透。说白了,现在那些花里胡哨的深度模型,很多思路都是从这些老前辈身上长出来的。
1. 协同过滤:最朴素的“人以群分”
协同过滤,我愿称之为推荐系统的“初心”。它的核心假设特别简单:跟你喜好相似的人,喜欢的你也可能喜欢。或者换个角度:你之前喜欢的东西A,跟东西B很像,那你可能也喜欢B。
嗯,这里要注意,它分两种:
- User-based CF:找相似用户。比如张三和李四都爱看科幻片,那张三新看了一部冷门科幻,我就推给李四。
- Item-based CF:找相似物品。比如你买了手机,系统发现买手机的人90%都买了手机壳,那就给你推手机壳。
我在项目中遇到过一个问题:用户量一上来,User-based CF的相似度矩阵计算量爆炸。你想想看,几千万用户两两算相似度,服务器直接冒烟。所以工业界后来更偏爱Item-based CF,因为物品数量相对稳定,计算成本可控。
避坑指南:我曾经天真地以为协同过滤是万能的。结果在冷启动场景下,新用户或新物品没有任何交互记录,协同过滤直接“罢工”。这时候就需要其他模型来兜底了。
2. 矩阵分解:把“人”和“物”塞进向量空间
协同过滤的痛点在于稀疏性。用户-物品交互矩阵里,99%都是空白。矩阵分解就是来解决这个问题的。
它的思路很巧妙:把一个大矩阵,拆成两个小矩阵的乘积。一个代表用户的隐向量,一个代表物品的隐向量。说白了,就是给每个用户和每个物品,都学一个低维的“特征向量”。
最经典的当属SVD(奇异值分解)和 FunkSVD。我建议你重点理解 FunkSVD,它只对已知的评分做拟合,不填充缺失值,效率高得多。
# 伪代码示意:FunkSVD 的核心更新公式
for each rating (u, i, r):
error = r - dot(user_vec[u], item_vec[i])
user_vec[u] += lr * (error * item_vec[i] - reg * user_vec[u])
item_vec[i] += lr * (error * user_vec[u] - reg * item_vec[i])
你看,代码就这么几行。但就是这几行,在Netflix Prize大赛上大杀四方。我个人觉得,矩阵分解是推荐系统从“规则驱动”走向“数据驱动”的关键一步。
小技巧:实际工程中,别忘了加偏置项(bias)。用户有自己的打分习惯,有人手松给5分,有人手紧给3分。物品也有自己的“平均分”。把这些偏置去掉,剩下的才是真正的“匹配度”。
3. 逻辑回归:推荐系统的“守门员”
逻辑回归,说白了就是一个线性模型套了个sigmoid函数。它本身不复杂,但它在推荐系统里的地位,怎么说呢——就像足球里的守门员,看着不起眼,但没它不行。
为什么用它做推荐?因为它能输出一个0到1之间的概率,天然适合做CTR(点击率)预估。而且它可解释性强,每个特征的权重一目了然。
我记得有一次做广告推荐,业务方问:“为什么给这个用户推了A而不是B?”我直接把逻辑回归的权重表甩出来:“你看,用户对‘价格敏感’这个特征的权重是0.8,A比B便宜20%,所以模型选了A。”对方立刻懂了。
注意:逻辑回归的短板也很明显——它学不到特征之间的交叉关系。比如“男性+体育类”和“女性+美妆类”这种组合模式,逻辑回归只能靠人工加特征工程。这也是为什么后来FM模型会火起来。
4. FM模型:自动学习特征交叉
FM(Factorization Machine)模型,你可以把它理解为“逻辑回归 + 矩阵分解的杂交体”。它既保留了逻辑回归的线性部分,又通过隐向量的内积,自动学习特征之间的二阶交叉。
为什么它比逻辑回归强?你想想看,逻辑回归需要人工做特征交叉,比如“性别=男 & 年龄=18-25”这种组合特征。但FM不需要,它自己就能学出来。而且对于稀疏特征,FM的泛化能力远好于逻辑回归。
# FM模型的二阶交叉部分公式
# y = w0 + sum(wi * xi) + sum(sum( <vi, vj> * xi * xj ))
# 其中 vi 是特征 i 的隐向量
我在项目中遇到过一个问题:特征维度特别高(比如上亿),FM的训练速度会变慢。这时候可以用FFM(Field-aware FM),给每个特征分个“场”,进一步细化交叉权重。不过FFM参数量大,容易过拟合,需要调参。
个人经验:FM模型在中小规模数据集上效果惊艳,但在超大规模数据下,它的表达能力还是不够。这时候就该深度学习上场了。
5. 深度学习推荐模型:DIN 与 DIEN
深度学习来了,推荐系统进入“炼丹”时代。这里我重点讲两个阿里系的开山之作:DIN 和 DIEN。
5.1 DIN:注意力机制在推荐中的首次亮相
DIN(Deep Interest Network)的核心思想是:用户的兴趣是多样的,而且不同场景下,用户关注的点不一样。
举个例子,一个用户既喜欢电子产品又喜欢运动鞋。当他浏览手机时,你应该更关注他之前对电子产品的行为,而不是运动鞋。DIN通过一个注意力机制,动态地计算用户历史行为中,哪些与当前候选物品更相关。
# DIN 注意力计算示意
def attention(query, keys, values):
# query: 候选物品的embedding
# keys: 用户历史行为物品的embedding
scores = softmax(dot(query, keys))
output = sum(scores * values)
return output
我建议你注意一点:DIN的注意力权重是局部激活的,不是全局的。它只针对当前候选物品,计算用户历史行为中哪些更重要。这比传统的“用户兴趣向量”固定不变的做法,灵活太多了。
5.2 DIEN:兴趣是动态演化的
DIEN(Deep Interest Evolution Network)在DIN的基础上,又进了一步。它认为用户的兴趣不是静态的,而是随时间演化的。比如你去年喜欢户外运动,今年可能就迷上了露营。
DIEN引入了一个兴趣抽取层(Interest Extractor)和兴趣演化层(Interest Evolving Layer)。前者从用户行为序列中抽取出兴趣状态,后者用GRU(门控循环单元)模拟兴趣的演化过程。
避坑指南:我曾经在DIEN的训练中踩过一个坑——序列长度不一致。有的用户历史行为有1000条,有的只有10条。如果不做截断或padding,模型训练会非常不稳定。我的做法是:固定序列长度为100,超过的截断,不足的补零,同时记录有效长度。
说白了,DIN和DIEN的出现,标志着推荐系统从“特征工程”时代,正式迈入“模型结构设计”时代。它们让模型学会了“关注什么”和“如何演化”,而不是靠人工去猜。
小结一下
好了,咱们快速过了一遍推荐系统的“家底”:
| 模型 | 核心思想 | 我的评价 |
|---|---|---|
| 协同过滤 | 相似用户/物品 | 朴素但有效,冷启动是硬伤 |
| 矩阵分解 | 隐向量表征 | 稀疏场景的利器 |
| 逻辑回归 | 线性+概率输出 | 可解释性强,但缺交叉 |
| FM | 自动特征交叉 | 中小规模数据的神器 |
| DIN/DIEN | 注意力+兴趣演化 | 深度学习时代的标杆 |
这些模型,每一个都是前人智慧的结晶。我个人觉得,搞多目标优化之前,先把这些单目标模型吃透,后面你才能理解“为什么多个目标会打架”、“怎么让它们握手言和”。
下一章,咱们正式进入多目标优化的世界。到时候你会发现,很多思路其实就藏在这些基础模型里。