基础架构
推荐系统要解决什么问题?
- 在信息过载的情况下,用户如何高效获取感知的信息,即学习\(score(user,item,context)\)
推荐系统的技术架构
-
数据
- 数据入口:客户端服务器端实时数据,流处理平台准实时数据,大数据平台离线数据
- 数据出口:算法模型数据,模型 Serving 特征数据,系统监控统计数据。
-
模型
- 模型种类:召回+排序+策略
- 模型训练:离线,在线
- 模型测试:离线评估,线上 A/B 测试
特征工程
什么是特征工程?
- 利用工程手段从用户信息,物品信息,场景信息提取出特征的过程。
推荐系统中常用特征
-
用户行为数据:显示反馈,隐性反馈
-
用户关系数据:强关系,弱关系
-
属性,标签类数据:用户,物品等都具有
-
内容类数据:描述性数据
-
场景信息:范围极广,如时间,地点等
Spark处理特征
-
由 Manager 调度,Worker 计算,返回给 Driver
-
Stage内部高效并行,边界处进行消耗资源的 Shuffle、Reduce 操作
数据编码方式
- 类别、ID 特征:One-Hot,Multi-Hot
- 数值特征:
- 归一化:特征数值范围取值不一
- 分桶:数据分布过于集中、分散
- 其他改变分布方式的操作:如开方,平方等
Embedding
用数值向量表示一个对象的方法。
-
用处
- 处理稀疏特征:大量使用 One-Hot 导致特征向量极度稀疏,不利于深度推荐模型(收敛慢,参数多)
- 融合其他信息,生成高阶特征向量:主要来自于 Graph Embedding 的广泛使用
-
主流方法
- Word2Vec:模型结构,目标函数,负采样
- Item2Vec:Word2Vec 在任意序列上的推广
- Graph Embedding:DeepWalk,Node2Vec
-
应用
- 直接应用:计算相似性,典型功能如相似物品推荐,猜你喜欢,召回等
- 预训练应用:作为特征向量一部分,与其他特征拼接参与推荐模型训练
- End2End:也即 Embedding 层,直接训练
线上服务
高并发推荐服务器
- 负载均衡
- 缓存
- 服务降级
分级存储
-
Redis 特性
- 数据以 Key-Value 对存储
- 数据全部存储在内存中,硬盘只在持久化或恢复数据时起作用
召回层
- 单策略召回:利用评分、标签、新鲜度等单一策略召回
- Pros:速度快,实现简单
- Cons:无法覆盖不同需求,召回率不高
- 多路召回:采用不同策略,分别召回部分候选集混合在一起
- Pros:可以覆盖不同需求
- Cons:每一路评分不可比,需要大量人工调参
- Embedding 召回:将多种策略融合到 Embedding 中实现召回
- Pros:实现简单,评分可比,可以融合多种信息
- Cons:线上计算复杂
局部敏感 Hash
常数时间内快速找到与一个 Embedding 最相似的 Embedding。
- 出发点
- 欧式空间中,将高维空间的点映射到低维空间,原本接近的点在低维空间肯定依然接近,但原本远离的点有一定概率变成接近的点。
- 经验性建议
- 点越多,桶数目越多,反之亦然。
- 维度越大,hash 函数要越多,尽量采用且作为多桶策略,反之亦然。
Serving&Inference
- 预存推荐结果
- 完全解耦,延迟极低
- 组合数目爆炸,无法引入线上 context 特征
- 预存Embedding 结果
- 推断简单快速
- 无法引入线上 context 特征,无法进行复杂网络结构模型的推断
- 预训练 Embedding+轻量线上模型
- 隔离了离线模型的复杂性与线上推断的效率要求
- 不能完全支持复杂模型
- Tensorflow Serving
- End2End 部署
- 线上服务效率低,需要大量优化