深度学习推荐系统
- 互联网的增长引擎 —— 推荐系统
- 前深度学习时代 —— 推荐系统的进化之路
- 协同过滤
- 矩阵分解
- LR
- FM
- 极简的FM召回模型
- 融入上下文特征的FM召回模型
- FM模型替代多路召回
- FFM
- GBDT+LR
- LS-PLM(Large-Scale Piece-wise Linear Model)
- 浪潮之巅 —— 深度学习在推荐系统中的应用
- AutoRec - 单隐层神经网络推荐模型
- Deep Crossing模型
- NeuralCF 模型
- PNN 模型
- Wide&Deep 模型
- Deep&Cross模型(DCN)
- FM与深度学习模型的结合
- 注意力机制在推荐模型中的应用
- DIEN - 序列模型与推荐系统的结合
- 强化学习和推荐系统的结合
- Embedding 技术在推荐系统中的应用
- 什么是Embedding
- Word2Vec
- Item2Vec
- “广义”的Item2Vec
- Graph Embedding
- 多角度审视推荐系统
- 特征工程
- 召回层
- 推荐系统的实时性
- 确定推荐系统中的优化目标
- 推荐系统中比模型结构更重要的是什么
- 冷启动的解决方法
- 基于规则的冷启动过程
- 丰富冷启动过程中可获得的用户和物品特征
- 利用主动学习、迁移学习和“探索与利用”机制
- 知识蒸馏
- 深度学习推荐系统的工程实现
- 推荐系统的数据流
- 推荐模型离线训练之Spark MLLib
- 推荐模型离线训练之Parameter Server
- 推荐模型离线训练之Tensorflow
- 在线部分
- 近线部分
- 离线部分
- 推荐系统的评估
- 深度学习推荐系统的前沿实践
- Facebook
- GBDT+LR
- DLRM (Deep Learning Recommender Model)
- Airbnb
- Youtube
- 阿里
- 构建属于你的推荐系统知识框架
- 参考
互联网的增长引擎 —— 推荐系统
- 推荐系统要处理的是“人”和“信息”的关系,信息包括“用户信息”、“商品信息”、“场景信息”
- 推荐系统的数据按照实时性的强弱排序为:
- 客户端及服务器端实时数据处理
- 流处理平台准实时数据处理
- 大数据平台离线数据处理
- 得到原始数据之后,需要数据加工得到的数据有:
- 推荐模型所需的样本数据,用于算法模型的训练和评估
- 推荐模型服务(model serving)所需的“特征”,用于推荐系统的线上推断
- 系统监控、商业智能(Business Intelligence,BI)系统所需的统计型数据
- 模型训练分为:
- 离线训练:利用全量样本和特征,使模型逼近全局最优点
- 在线更新:准实时地“消化”新的数据样本,更快地反映新的数据变化趋势
前深度学习时代 —— 推荐系统的进化之路
传统推荐模型的优点:
传统推荐模型的演化关系图
协同过滤
缺点:
- 因为只引入了用户和商品之间的行为数据,导致头部内容更容易和其他内容相似,而长尾内容因为稀疏的行为向量,很难被推荐出去
- 数据单一、泛化能力差
UCF
用户相似度计算
- 余弦相似度:计算用户i和用户j之间的向量夹角大小,夹角越小,说明两个用户更相似
s i m ( i , j ) = c o s ( i , j ) = i ∗ j ∣ ∣ i ∣ ∣ ∗ ∣ ∣ j ∣ ∣ sim(i, j) = cos(i, j) = \frac{i * j}{||i|| * ||j||} sim(i,j)=cos(i,j)=∣∣i∣∣∗∣∣j∣∣i∗j
- 皮尔逊相关相似度:
- 使用用户平均分对评分进行修正,减小了用户偏置带来的影响
s i m ( i , j ) = ∑ p ∈ P ( R i , p − R i ˉ ) ( R j , p − R j ˉ ) ∑ p ∈ P ( R i , p − R i ˉ ) 2 ∑ p ∈ P ( R j , p − R j ˉ ) 2 sim(i, j) = \frac{\sum_{p\in P} (R_{i,p} - \bar{R_i}) (R_{j, p} - \bar{R_j})}{\sqrt{\sum_{p\in P} (R_{i,p} - \bar{R_i})^2} \sqrt{\sum_{p\in P} (R_{j,p} - \bar{R_j})^2}} sim(i,j)=∑p∈P(Ri,p−Riˉ)2 ∑p∈P(Rj,p−Rjˉ)2 ∑p∈P(Ri,p−Riˉ)(Rj,p−Rjˉ)
- 使用物品平均分对评分进行修正,减小了物品偏置对结果的影响
s i m ( i , j ) = ∑ p ∈ P ( R i , p − R p ˉ ) ( R j , p − R p ˉ ) ∑ p ∈ P ( R i , p − R p ˉ ) 2 ∑ p ∈ P ( R j , p − R p ˉ ) 2 sim(i, j) = \frac{\sum_{p\in P} (R_{i,p} - \bar{R_p}) (R_{j, p} - \bar{R_p})}{\sqrt{\sum_{p\in P} (R_{i,p} - \bar{R_p})^2} \sqrt{\sum_{p\in P} (R_{j,p} - \bar{R_p})^2}} sim(i,j)=∑p∈P(Ri,p−Rpˉ)2 ∑p∈P(Rj,p−Rpˉ)2 ∑p∈P(Ri,p−Rpˉ)(Rj,p−Rpˉ)
缺点
- 在互联网场景下,一般用户数远远大于物品的数量,因此用户相似度矩阵的存储开销会非常大
- 用户历史数据向量一般都比较稀疏,所以对于购买或者点击行为非常少的用户,寻找相似用户不是非常准确。不适用于低频购买的场景,例如airbnb、大额商品购买等等
ICF
物品相似度的计算方法同上
UCF和ICF的应用场景
- 新闻推荐场景:UCF
- 用户对新闻的兴趣点是分散的,新闻的时效性和热度往往是更重要的属性,UCF通过发现相似用户喜欢什么可以更好地发现热点和跟踪热点的趋势
- 电商和视频推荐场景:ICF
- 用户的兴趣点相对比较稳定,在一段时间内,更适合推荐相似的物品
矩阵分解
优点:
- 解决了协同过滤中处理稀疏共现矩阵的问题,增强模型的泛化性。原理:隐向量的生成基于全局的信息,不像CF,如果两个用户没有相同的购买行为,那么他俩的相似度为0
- 相比于CF,空间复杂度降低,从 n 2 n^2 n2降到了 ( n + m ) ∗ k (n+m)*k (n+m)∗k
缺点:
算法:
- 把用户和物品稀疏共现矩阵分解成用户和物品稠密矩阵的乘积,每一个用户/物品用一个k维的向量表示,k越小,向量包含的信息量越少,模型的泛化能力越强
LR
sigmoid函数 f ( x ) = 1 1 + e − ( w ∗ x + b ) f(x) = \frac{1}{1+e^{-(w*x+b)}} f(x)=1+e−(w∗x+b)1
优点:
缺点:
- 表达能力不强
- 需要人工做特征交叉、特征筛选,可能造成“辛普森悖论”的错误结论
辛普森悖论:在分组实验中(交叉特征)都占优势的一方,可能在总评中(单一特征)反而是失势的一方
FM
v i v_i vi, v j v_j vj是特征 x i x_i xi, x j x_j xj对应的embedding(每个特征值都学习到一个隐向量),特征组合 x i x j x_i x_j xixj对应的权重使用 < v i , v j > <vi,vj>表示。这样做的好处在于提高模型的泛化能力,即使特征组合 x i x j x_i x_j xixj没有出现过,只要 x i x_i xi, x j x_j xj对应的embedding学习到,在预测过程中,新的组合 x i x j x_i x_j xixj的权重也能得到。
时间复杂度:O(kn),k是embedding size,n是特征个数(时间复杂度和FM公式推导详见:https://zhuanlan.zhihu.com/p/58160982)
极简的FM召回模型
如上图,离线训练FM模型得到所有特征embedding。离线计算每个用户特征子集embedding向量相加,形成用户向量,存储在Redis。物品向量的计算方式和用户向量相似,可以离线计算或者近在线计算,存储在Faiss数据库中。线上召回阶段,用户embedding(U)和物品embedding(I)做内积计算得到评分,召回Top K物料作为召回结果。
融入上下文特征的FM召回模型
- 在线动态查询上下文特征,上下文特征向量相加形成上下文embedding C
- 计算用户特征和上下文特征的二阶特征组合得分,Score =
- 将U和C向量累加求和,使用(U+C)去Faiss通过内积方式召回Top K物品,同时考虑了U和I的组合特征、C和I的组合特征
- 步骤3中召回物品的score加上步骤2中的score,对物品进行重排
FM模型替代多路召回
把每一路召回通道中的特征加入到FM模型中,例如替换地域召回,可以在FM模型中加入用户感兴趣的地域和物品的地域进行学习召回;协同过滤召回,可以在FM模型中加入user id和item id进行学习,当id量巨大并且非常稀疏时,可以使用ID哈希等降维技巧进行解决。
线上替换时,保守方法是使用FM模型一路一路替换,并线上测试,也可以多路一起替换,小流量AB测试效果。
TODO:ID哈希等降维技巧
FFM
f ( x ) = w 0 + ∑ i = 1 n w i ∗ x i + ∑ j 1 = 1 n ∑ j 2 = j 1 + 1 n ( w j 1 , f 2 ∗ w j 2 , f 1 ) x j 1 x j 2 f(x) = w_0 + \sum_{i=1}^n w_i * x_i + \sum_{j_1 =1}^n \sum_{j_2=j_1 +1}^n (w_{j_1, f_2 }*w_{j_2, f_1)}x_{j_1}x_{j_2} f(x)=w0+i=1∑nwi∗xi+j1=1∑nj2=j1+1∑n(wj1,f2∗wj2,f1)xj1xj2
在FFM模型训练中,需要学习n个特征在f个特征域上的k维隐向量,复杂度为 k ∗ n 2 k*n^2 k∗n2,远大于FM的复杂度
GBDT+LR
- GBDT和LR的训练是分开的,GBDT自动形成特征组合,例如深度为4的决策树,经过3次分裂,最终形成3阶特征交叉
- 特征转换:GBDT训练出多棵子树,原始特征向量x经过GBDT,形成one-hot向量,落入的叶子结点为1,其余为0
LS-PLM(Large-Scale Piece-wise Linear Model)
阿里巴巴2012年开始应用在电商场景的推荐模型,结构与3层神经网络相似,又称MLR(Mixed Logistic Regression)
f ( x ) = ∑ i = 1 m π i ( x ) ∗ η i ( x ) = ∑ i = 1 m e μ i ∗ x ∑ j = 1 m e μ j ∗ x ∗ 1 1 + e − w i ∗ x f(x) = \sum_{i=1}^m \pi_i(x)*\eta_i(x) = \sum_{i=1}^m\frac{e^{\mu_i*x}}{\sum_{j=1}^me^{\mu_j*x}}*\frac{1}{1+e^{-w_i*x}} f(x)=i=1∑mπi(x)∗ηi(x)=i=1∑m∑j=1meμj∗xeμi∗x∗1+e−wi∗x1
思路: 样本应该被区分对待,例如,在给女性推送女装广告时不应该引入男性购买数码产品的样本,因此,先使用softmax对样本进行聚类。然后对于每一个类别的样本,分别使用LR进行预测。因此,最后的概率是softmax和sigmoid的乘积。
参数: “分片数” m=1时,MLR变成LR,m越大,模型的拟合能力越强,所需的参数也越多,因此需要的训练样本也越多,阿里的经验是m=12
优点:
- 端到端的非线性学习能力
- 模型的稀疏性强:引入L1和L2 regularization,使得模型具有很高的稀疏性,部署轻便,在线推断的效率也更高
浪潮之巅 —— 深度学习在推荐系统中的应用
- 优点:(1)表达能力更强,能挖掘出更多数据中潜藏的模式(2)模型结构更灵活,使模型和业务场景结合得更紧密
AutoRec - 单隐层神经网络推荐模型
- 时间:2015年
- 原理:利用协同过滤中的共现矩阵,完成物品和用户向量的自编码
- 自编码器:向量r作为输入,通过自编码器后(重建函数h),得到的输出向量尽量接近其本身 m i n ∑ r ∈ S ∣ ∣ r − h ( r ; θ ) ∣ ∣ 2 2 min \sum_{r\in S}||r-h(r;\theta)||_2 ^2 minr∈S∑∣∣r−h(r;θ)∣∣22
- 优点:(1)重建函数的参数数量远小于输入向量的维度数量,因此自编码器相当于完成了数据降维和压缩的工作(2)输出向量的“泛化”能力更强
- 数据:m个用户对n个物品的评分矩阵,缺失值用默认值或者平均分值表示
- 模型结构:一层隐藏层,使用L2 Regularization
- 推荐过程:
- U-AutoRec:输入为用户的评分向量,输出为预估的这个用户对所有物品的评分
- I-AutoRec:输入为物品的评分向量,输出为预估的用户对这个物品的评分,所以需要遍历所有的物品向量才能得到
- I-AutoRec的缺点是每次给用户作推荐时需要遍历所有的物品,用U-AutoRec可以一次得到所有预估的评分,但是输入较稀疏会影响模型效果。
Deep Crossing模型
- 时间:2016年
- 应用场景:微软搜索引擎Bing的搜索广告推荐
- 模型结构
- Embedding层:使用全连接层把稀疏向量(Feature#1 one-hot编码后的稀疏特征向量)稠密化,形成embedding vector
- Stacking层:categorical feature和numerical feature都concat到一个向量
- Multiple Residual Units层:使用多层residual network对特征向量的各个维度进行特征交叉
- Residual Unit(残差单元):(1)输入经过两层以ReLU为激活函数的FC层后,生成输出向量;(2)输入可以通过一个短路(shortcut)通路直接与输出向量进行element-wise plus操作,生成最终的输出向量
- Scoring层:sigmoid
NeuralCF 模型
时间:2017年
应用场景:
模型结构:
- 输入是用户-物品共现矩阵,没有引入side information
- element-wise product:两个相同维度向量的对应维相乘得到另一向量
- MF vector和MLP vector可以分别训练,不需要共享
PNN 模型
时间:2016年
思想:特征交叉的几种设计思路
模型结构:
- 输入包括了用户信息、物品信息、和其他来源的数据
- 使用Product层取代了deep crossing里的Stacking层,获取特征交叉信息。
- inner product
- outer product:特征两两相乘后生成一个M*M的方形矩阵,为了降低维度,对每一个方形矩阵做average pooling。但这样做需要谨慎对待,因为average pooling一般应用于同类embedding上,比如多个item embeddings,而在这里,不同特征的向量可能并不在同一个向量空间中。
Wide&Deep 模型
时间:2016年
应用场景:Google Play商店
模型结构:
- Wide:使用逻辑回归使得模型具有“记忆能力”,表示模型直接学习并利用历史数据中物品或者特征的“共现频率”
- Deep:是有DNN使得模型具有“泛化能力”,表示模型传递特征的相关性,以及挖掘稀疏甚至从未出现过的特征与最终标签之间的相关性
Deep&Cross模型(DCN)
时间:2017年
应用场景:
模型结构:
- 基于wide&deep模型的改进
- cross网络:特征自动交叉, x l x_l xl是第l层的输出向量,那么第l+1层的输出向量为: x l + 1 = x 0 x l T w l + b l + x l x_{l+1} = x_0 x_l ^T w_l + b_l + x_l xl+1=x0xlTwl+bl+xl,其中 w l w_l wl为特征交叉的权重, b l b_l bl为偏置项
FM与深度学习模型的结合
FNN
时间:2016年
应用场景:
模型结构:
- Embedding 层:原先embedding层使用随机初始化,因为embedding的输入极端稀疏,因此收敛速度非常缓慢。FNN使用FM模型预训练各个特征的embedding,作为输入层到embedding层的初始连接权重。这里要注意的是,FM模型训练embedding的时候没有区分特征域,而FNN把特征分成了不同的特征域,因此每一个特征域有一个对应的embedding层。
DeepFM
时间:2017年
应用场景:
模型结构
- wide部分使用FM模型替代,加强了浅层网络部分特征组合的能力,FM对不同特征域的embedding作两两交叉
- wide和deep部分共享embedding层
NFM
时间:2017年
应用场景:
模型结构
- 替代FM模型中二阶部分的网络结构如上。在Embedding Layer和FC Layer之间加入Bi-interaction Pooling Layer,不同特征域的embedding进行两两element-wise product,再对每一个交叉特征求和输出到FC Layers
- 一阶部分已省略
注意力机制在推荐模型中的应用
AFM
时间:
应用场景:
模型结构
- NFM模型的延续,在pair-wise interaction layer和pooling layer之间加入attention network来学习交叉特征的权重 a i j ′ = h T R e L U ( W ( v i ⊙ v j ) x i x j + b ) a_{ij}' = h^T ReLU(W(v_i \odot v_j)x_i x_j + b) aij′=hTReLU(W(vi⊙vj)xixj+b) a i j = e x p ( a i j ′ ) ∑ ( i , j ) ∈ R x e x p ( a i j ′ ) a_{ij} = \frac{exp(a_{ij}')}{\sum_{(i,j)\in R_x}exp(a_{ij}')} aij=∑(i,j)∈Rxexp(aij′)exp(aij′)
DIN
时间:
应用场景:阿里巴巴的电商广告推荐
模型结构:
V u = f ( V a ) = ∑ i = 1 N w i ∗ V i = ∑ i = 1 N g ( V i , V a ) ∗ V i V_u = f(V_a) = \sum_{i=1}^N w_i * V_i = \sum_{i=1}^N g(V_i, V_a)*V_i Vu=f(Va)=i=1∑Nwi∗Vi=i=1∑Ng(Vi,Va)∗Vi, V u V_u Vu是用户embedding, V a V_a Va是候选广告商品的embedding, V i V_i Vi是用户u的第i次行为的embedding向量(=那次浏览的商品embedding或者商铺embedding),每个行为的权重就是attention(那一次行为和候选广告商品的相关性)
DIEN - 序列模型与推荐系统的结合
时间:2019年
应用场景:阿里巴巴的商品广告推荐
模型结构:
- 用序列模型模拟了用户兴趣的进化过程,具有强大的时间序列的表达能力
- 序列信息的重要性:(1)加强了最近行为对下次行为的影响;(2)序列模型能够学习到购买趋势的信息,例如在全局统计意义上,“篮球鞋”到“机械键盘”的转移概率够高,那么这么推荐比较合理,且说明二者的用户人群很有可能是一致的
- 兴趣进化网络
- 行为序列层(Behavior Layer):id类行为序列转换成embedding行为序列
- 兴趣抽取层(Interest Extractor Layer):通过模拟用户兴趣迁移过程,抽取用户兴趣
- 兴趣进化层(Interest Evolving Layer) :在兴趣抽取层的基础上加上attention,模拟与候选广告相关的兴趣进化过程
- 模型结构:AUGRU(GRU with Attentional Update gate)
强化学习和推荐系统的结合
- 定义:针对智能体(Agent)在不断变化的环境(environment)中决策和学习的过程进行建模
- 学习过程:在智能体的学习过程中,会完成收集外部反馈(Reward),改变自身状态(State),再根据自身状态对下一步的行动进行决策(Action)
DRN
- 推荐模型 - DQN
- 状态向量:用户特征、环境特征
- 行为向量 :用户-行为交叉特征、新闻特征
- 关键环节:
- PUSH:在每一个时刻,当用户发生请求时,Agent都根据当前的State推送K篇新闻,推荐结果是exploitation和exploration的结合
- FEEDBACK:用户对推荐结果的点击行为
- MINOR UPDATE:在每个时间点,根据用户的信息(State)、推荐的新闻(Action)和反馈(Reward),Agent会评估exploitation模型Q和exploration模型 Q ~ \tilde Q Q~的效果,如果Q效果更好,则模型保持不变,反之,Q的参数向 Q ~ \tilde Q Q~变化
- DRN的在线学习方法——竞争梯度下降算法(Dueling Bandit Gradient Descent Algorithm),模型参数W中加入较小的随机扰动生成新的模型参数 W ~ \tilde W W~,公式如下 Δ W = α ∗ r a n d ( − 1 , 1 ) ∗ W \Delta W = \alpha * rand(-1, 1) * W ΔW=α∗rand(−1,1)∗W
- MAJOR UPDATE :经过一段时间后,基于历史数据统一更新exploitation模型Q
Embedding 技术在推荐系统中的应用
进化过程:处理序列样本 -> 处理图样本 -> 处理异构的多特征样本
什么是Embedding
Embedding能够获取词之间的语义关系、词性关系、通用知识等
Word2Vec
- CBOW:使用周围的词预测中间的词
- Skip-Gram:使用中间的词预测周围的词,效果普遍更好
- 目标函数: 1 T ∑ t = 1 T ∑ − c ≤ j ≤ c , j ≠ 0 l o g p ( w t + j ∣ w t ) \frac{1}{T}\sum_{t=1}^T \sum_{-c\le j\le c, j \ne 0} log\ p(w_{t+j}|w_t) T1t=1∑T−c≤j≤c,j=0∑log p(wt+j∣wt)
- 概率公式: p ( W o ∣ W I ) = e x p ( V W O ′ T V W I ′ ) ∑ w = 1 W e x p ( V W ′ T V W I ) p(W_o|W_I) = \frac{exp(V_{W_O}'^TV_{W_I}') }{\sum_{w=1}^W exp(V_{W}'^TV_{W_I})} p(Wo∣WI)=∑w=1Wexp(VW′TVWI)exp(VWO′TVWI′),其中 V W o V_{W_o} VWo和 V W I V_{W_I} VWI分别是词w的输入和输出向量,不在一个向量空间内
- 负采样训练:随机采样一些负样本(通常小于10个),计算预测误差
Item2Vec
- 基本思想:学习序列中商品的embedding
- 与Word2Vec的不同:摈弃时间窗口,认为一个行为序列中任意两个物品都是关联的
“广义”的Item2Vec
- 双塔模型:用户DNN+物品DNN,物品DNN的输入为物品侧的所有特征,与Item2Vec只用了id类特征相比,包含了更多的信息,经过多层DNN后生成了物品embedding
- 缺点:只能用序列数据
Graph Embedding
- 基本思想:对图结构里的节点进行embedding编码,最终生成的embedding向量一般包含图的结构信息以及附近节点的局部相似性信息
DeepWalk
时间:2014年
模型结构:
- 基于用户的行为序列,形成由物品组成的图结构
- 如果是有向有权图,那么边的权重和节点a到节点b出现的次数成正比 p ( v j ∣ v i ) = M i j ∑ j ∈ N + ( v i ) M i j , i f v j ∈ N + ( v i ) , e l s e 0 p(v_j|v_i) = \frac{M_{ij}}{\sum_{j\in N_+(v_i)}M_{ij}}, if \ v_j \in N_+(v_i), else \ 0 p(vj∣vi)=∑j∈N+(vi)MijMij,if vj∈N+(vi),else 0,其中 N + ( v i ) N_+(v_i) N+(vi)是节点 v i v_i vi所有的出边集合
- 如果是无向无权图,那么 M i j = 1 M_{ij}=1 Mij=1, N + ( v i ) N_+(v_i) N+(vi)是所有边的集合
- 在(1)图结构上进行随机游走随机选择起始点,形成大量物品序列
- (2)中的物品序列作为word2vec的输入,训练得到物品embedding
Node2Vec
时间:2016年
基本思想:通过调整随机游走权重的方法使得graph embedding的结果更能体现网络的“同质性”和“结构性”
- 同质性:距离相近的节点的embedding应该相似
- 结构性:结构相似的节点的embedding应该相似
基于边的预测任务,DeepWalk是基于节点的预测任务
模型结构:
两种生成k个节点的邻居集合 N S ( u ) N_S(u) NS(u)的取样策略:
- DFS:向远处游走从而描绘出网络的宏观特征,学习网络的同质性
- BFS:在局部游走从而保留节点的社区信息,保留了节点在特征空间中的网络邻居信息,学习结构上的相似性
从节点v跳转到下一个节点x的概率 π v x = α p q ( t , x ) ∗ ω v x \pi_{vx} = \alpha_{pq}(t,x)*\omega_{vx} πvx=αpq(t,x)∗ωvx,其中 ω v x \omega_{vx} ωvx是边vx的权重, α p q ( t , x ) \alpha_{pq}(t,x) αpq(t,x)的定义如下:
α p q ( t , x ) = { 1 p i f d t x = 0 1 i f d t x = 1 1 q i f d t x = 2 \alpha_{pq}(t,x) = \left\{ \begin{array}{ll} \frac{1}{p} & \quad if\ d_{tx}=0 \\ 1 & \quad if\ d_{tx}=1 \\ \frac{1}{q} & \quad if\ d_{tx}=2 \end{array} \right. αpq(t,x)=⎩⎨⎧p11q1if dtx=0if dtx=1if dtx=2
- p为返回参数,当p>max(1,q)时,往回游走的概率相对较小,这样重新对已经访问过的节点进行访问的可能性会更小,这样的策略可以鼓励向外探索并且避免跳到已经访问过的节点造成冗余。当p
- q为进出参数,当q>1时,有助于获得源节点的局部视图,更像BFS。当 q<1时,随机游走会离之前访问过的点越来越远,这种向外探索的策略更像是DFS。
EGES
Enhanced Graph Embedding with Side Information
时间:
基本思想:利用side information增强graph embedding,解决了扩展性、稀疏性和冷启动问题
模型结构:
GES模型:skip-gram模型的输入为物品的网络结构和物品的side information,输出为item embedding和每一个特征的embedding,使用average pooling整合一个物品的所有embedding
EGES模型:学习embedding的权重,使用加权求和的方法整合一个物品的所有embedding
多角度审视推荐系统
特征工程
特征源
- 用户行为数据(显性&隐性):挖掘用户的潜在兴趣、用户对物品的真实反馈
- 用户关系数据
- 强关系:互相关注、好友关系等
- 弱关系:互相点赞、同在一个社区等
- 用途:(1)一种召回方式 (2)使用graph embedding的方法生成user embedding和item embedding(3)引入好友的属性作为用户的新特征
- 属性、标签类数据(用户&物品)
- 内容类数据(文字、图片、视频)
- 上下文信息(时间、地点、季节、月份、是否节假日、天气等)
- 统计类特征(历史CTR、历史CVR、热门程度、流行程度等):统计类特征往往和目标有强关联
- 组合类特征
特征处理方法
- 连续型特征
- 归一化
- 离散化:防止模型过拟合和数据分布不均的问题
- 非线性函数:原始特征和非线性转换后的特征加入模型中增强模型的非线性能力
- x a , l o g ( a ) , l o g ( x 1 − x ) x^a, log(a), log(\frac{x}{1-x}) xa,log(a),log(1−xx)
- 类别型特征
- one-hot(multi-hot) encoding:当特征向量过大很稀疏时,模型容易欠拟合,并且当模型参数过多时,模型收敛速度慢,所以使用embedding学习表示作为模型输入
召回层
- 多路召回的各通道策略和业务强关联。每一路的召回个数K是个超参数,可以通过线上A/B test确定
- 使用基于Embedding的召回方法,取代传统的多路召回,把多路召回每一路的特征作为side information加入到embedding学习模型中
推荐系统的实时性
特征的“实时性”
- “实时”地收集和更新推荐模型的输入
- 影响特征“实时性”的三个阶段
- 客户端实时特征:可以收集到时间、地点、推荐场景等上下文特征,在新闻推荐这种需要快速获取用户实时兴趣的场景中,可以在客户端缓存用户session内行为数据,并和上下文信息一起传给推荐服务器,就可以实时更新模型,基于用户session内阅读的新闻作推荐。
- 流计算平台的准实时特征处理:使用Storm、Spark Streaming、Flink等流计算平台对日志进行批处理,比如计算一个时间窗口内的点击次数、曝光次数等,然后存入特征数据库中,这会造成分钟级别的延迟,但能够保证推荐模型引入用户的近期行为特征作推荐。
- 分布式批处理平台的全量特征处理:(1)拼接不同数据源供模型离线训练和评估(2)用于之后线上模型预测。有小时级别的延迟。
模型的“实时性”
- 希望更快地抓住全局层面的数据模式,发现新的趋势和相关性
- 3种训练方式
- 全量更新:利用某时间段内的所有训练样本进行训练,训练所需时间较长
- 增量更新:在原有样本的基础上,继续输入样本进行梯度下降。缺点是无法找到全局最优点,因此采样增量更新和全局更新相结合的方式,在业务量较小的时间窗口进行全局更新,纠正模型在增量更新过程中积累的误差。
- 在线学习:获得一个新的样本时就进行模型训练更新,因为是在线上环境进行模型训练和参数存储,所以对工程要求相对较高。
- 如果使用SGD(而不是batch)更新梯度,造成模型很多特征学习到很小的权重而非0,这就造成模型的稀疏度不够,模型体积大,因此业界使用谷歌的FTRL和微软的FOBOS来训练保证模型的稀疏度。
- 强化学习DRN也是一种好的思路
- 局部更新:降低训练效率低的模型部分的更新频率,提高训练效率高的模型部分的更新频率
- GBDT+LR,GBDT每天更新用于学习特征组合,LR实时更新快速捕捉数据的整体变化
- Embedding+MLP,因为Embedding层参数庞大,训练慢,所以使用预训练的方法学习,上层的模型部分可以高频更新。
- 客户端模型实时更新:更新模型部分参数和特征
- 因为用户embedding是基于最近的行为序列中学习到的,可以在客户端实时更新生成新的embedding,在下一次推荐时,把embedding传到服务器端作推荐,这样生成的推荐物品反应了用户的最近兴趣
- 物品embedding的更新基于全局数据,所以只能在服务器端作更新
TODO:FTRL、FOBOS
确定推荐系统中的优化目标
- 考虑真正的商业目标和业务场景,力图在训练模型的阶段“仿真”预测阶段的场景和目标。
推荐系统中比模型结构更重要的是什么
- 理解业务场景,熟悉自己的数据特点,基于用户行为构造适合的模型结构
- 例子
- Netflix使用EE模型,基于用户的兴趣推荐不同的影片封面,CTR提升了10%
- smartTV在解决新用户点击行为稀疏的问题上,使用其他的行为数据(用户右滑表明对电视类目的兴趣)为模型添加新信息
冷启动的解决方法
- 冷启动分类
- 用户冷启动:针对刚注册的新用户的个性化推荐
- 物品冷启动:没有历史行为数据的新物品的推荐
- 系统冷启动:缺乏所有历史行为数据的推荐
基于规则的冷启动过程
- 使用“热门排行榜”、“最近流行趋势”、“最高评分”等榜单作为默认推荐列表
- 制定规则时,需要依赖业务领域知识
- 用户冷启动:利用点击率等目标构建基于用户属性的决策树,然后在相应的决策树节点建立冷启动榜单
- 物品冷启动:利用物品相似度作推荐
- Airbnb:基于物品属性作聚类,同一类别内的物品有相同的推荐规则。使用的物品属性:(1)同样的价格范围(2)相似的房屋属性(面积、房间数等)(3)距目标房源的距离在10公里以内
丰富冷启动过程中可获得的用户和物品特征
- 在推荐模型中不止使用历史数据特征,加入用户和物品的属性特征帮助模型冷启动
利用主动学习、迁移学习和“探索与利用”机制
探索与利用
- 传统的探索与利用方法:MAB(Multi-armed Bandit Problem),针对老虎机的优化问题,不是个性化推荐
- ϵ \epsilon ϵ-Greedy算法:以 ϵ \epsilon ϵ的概率随机选取一个老虎机进行探索,以1- ϵ \epsilon ϵ的概率选择当前平均收益率最高的一个老虎机,每次选取后,更新老虎机的回报期望
- 缺点:经过一段时间后,应该减小 ϵ \epsilon ϵ来降低探索的频率。另外,对于收集足够信息的老虎机,应该减少探索的概率,而应该增加探索不常被选择的老虎机。
- Thompson Sampling算法:假设每个老虎机能够赢钱的概率为p~beta(win, lose),在每次摇臂前,根据beta分布对每一个老虎机生成一个随机数b,选取b最大的老虎机进行探索,然后更新beta分布。
- 优点:当尝试次数很多时,beta分布的离散程度越小,生成的随机数在收益期望附近,所以老虎机要么有很大的概率被选中或者有很大的概率不被选中。而当尝试次数不够多时,分布的离散程度很大,就会有更大的概率被探索,给新物品更多的机会被曝光。
- UCB(Upper Confidence Bound): x ˉ j \bar x_j xˉj是物品j的平均回报率(点击率、阅读时长、转化率、播放率等),n是所有物品的曝光次数之和, n j n_j nj是物品j的曝光次数。从公式中可以看出,UCB算法倾向于效果好( x ˉ j \bar x_j xˉj)或者冷启动( n j n_j nj小)物品。
U C B ( j ) = x ˉ j + 2 l n ( n ) n j UCB(j) = \bar x_j + \sqrt \frac{2ln(n)}{n_j} UCB(j)=xˉj+nj2ln(n)
- 个性化的探索与利用方法:在传统EE算法中加入上下文信息,又称contextual-bandit algorithm
- LinUCB算法(yahoo)
- 缺点:假设推荐模型是线性的,难以应用到深度学习模型上
- 基于模型的探索与利用方法:DRN
知识蒸馏
召回
MOBIUS,百度凤巢
上图左边是凤巢之前做广告推荐得了流程,右边是MOBIUS多目标模型结构。
- 之前的问题:召回层召回query-ad关联度高的pair,排序层预测CPM(=CTR*BID),会发现ad和query关联度高但是CPM低,不能投放,这就是召回和排序目标不一致导致的问题。
- 改进:召回层使用多目标,query-ad relevance和CPM o b j e c t i v e = m a x ∑ i = 1 n C T R ( u s e r i , a d i , q u e r y i ) ∗ b i d i s . t . 1 n ∑ i = 1 n r e l e v a n c e ( q u e r y i , a d i ) ≤ t h r e s h o l d objective = max \sum_{i=1}^n CTR(user_i, ad_i, query_i)*bid_i \\ s.t. \frac{1}{n} \sum_{i=1}^n relevance(query_i, ad_i)\leq threshold objective=maxi=1∑nCTR(useri,adi,queryi)∗bidis.t.n1i=1∑nrelevance(queryi,adi)≤threshold
- Active Learning训练过程
召回模型作为teacher,排序模型作为student,排序模型需要在扩充的数据集上重新训练,因为使用之前在高频query-ad训练集上训练出的排序模型,对于高频出现的ad,即使和它相关度很低的query,ctr也很高,导致推荐的ad低关联度。所以需要训练出一个能够推荐高关联度高CTR的模型。
训练过程:
- data augmentation:取一批历史记录里的query-ad pairs,假设有m个query,n个ad,可以组成m*n pairs,计算这些pairs的关联度,设置一个threshold,使得低关联度的数据也能进ctr模型进行训练。
- learning ctr model:1中的数据喂进ctr模型后,把低关联度高ctr的数据标注为“bad case”,使ctr模型重新训练,然后load下一批训练数据重复第一步,直到ctr模型可以区分出低关联度的样本。
排序
深度学习推荐系统的工程实现
推荐系统的数据流
- 批处理数据架构:Google GFS、Apache HDFS
- 只能处理已经落盘的静态数据,延迟在小时级别
- 适合做数据合法性检查、数据回放、全量数据分析
- 流计算大数据架构:Storm、Spark Streaming、Flink
- 在“滑动窗口”内,对数据做短暂缓存和数据处理,包括多种数据源的join操作等等。延迟和“滑动窗口”相关,一般在分钟级别
- 适合做数据监控、推荐系统特征实时更新、推荐模型实时训练
- Lambda架构:从最开始的数据收集阶段裂变为实时流和离线处理
- 流处理使用数据增量的方法计算,离线处理对全量数据进行计算分析。在统计数据入库之前,Lambda架构会使用离线层数据对实时流数据进行校验和纠错
- 缺点:大量冗余代码、流计算和离线计算的逻辑重复
- Kappa架构:为了解决Lambda架构的缺点
- 离线处理其实就是流计算里“滑动窗口”增大,为了离线处理,需要加入两个新的通路“原始数据存储”和“数据重播”
- 原始数据存储:原始日志存入HDFS中
- 数据重播:按照时间顺序进行重播,用同样的流处理框架进行处理
推荐模型离线训练之Spark MLLib
- Spark原理:多个worker nodes进行并行计算,worker nodes不共享内存,数据传输靠网络通信。在worker node上
- Spark MLLib中计算梯度下降的方法:(1)把权重broadcast到各个partition,broadcast操作占非常多资源;(2)在每个数据partition上计算梯度,然后使用treeAggregate汇总梯度,更新权重,这会导致更新速度的瓶颈取决于计算最慢的那个partition。因此,Spark MLLib不适合复杂的机器学习、深度学习网络训练
推荐模型离线训练之Parameter Server
- 模型训练过程:(1)Server Group:server nodes汇总各worker push来的梯度,更新模型参数;(2)Worker Group:每个worker node存储一份数据,从server group那里pull模型的参数,计算完梯度后push回server group。使用“异步非阻断"的方式进行模型参数更新,在worker node在iter 10计算完梯度后,如果server node还没有更新参数,worker node会在原有的参数上继续计算梯度,这会导致模型更新的不一致性,可以通过”最大延迟“等参数进行控制,比如worker node在迭代3轮后,还没有得到更新后的模型参数,就需要停下等待参数更新,再继续迭代。
推荐模型离线训练之Tensorflow
在线部分
召回
把推荐给用户的物品降到千以下规模
目标:使用少量特征和简单模型,把用户可能感兴趣的物品都找到,保证泛化能力
粗排(可选)
如果召回后物品还是太多,使用简单排序模型进行进一步筛选
排序
使用复杂模型对物品进行精准排序
目标:使用大量特征和复杂模型,保证模型预测的精准性
业务策略
去已读,推荐多样化,加入广告
近线部分
实时收集用户反馈,选择训练实例,实时抽取拼接特征,近乎实时地更新在线推荐模型,好处在于实时把握用户的最新兴趣
离线部分
整理离线训练数据,周期性地更新推荐模型。
推荐系统的评估
离线
召回
- MaP
- NDCG
- MRR(Mean Reciprocal Rank):多个查询语句的排名倒数的均值
M R R = 1 ∣ Q ∣ ∑ i = 1 ∣ Q ∣ 1 r a n k i MRR = \frac{1}{|Q|} \sum_{i=1}^{|Q|}\frac{1}{rank_i} MRR=∣Q∣1i=1∑∣Q∣ranki1, r a n k i rank_i ranki表示第i个查询语句的第一个正确答案的排名
例子:
Ref: https://www.cnblogs.com/shenxiaolin/p/9309749.html
排序
线上 - AB实验
- 样本量缩小n倍,标准差(随机误差)扩大 n \sqrt n n 倍
- 从一个非正态总体抽取样本,只要样本单位足够大,样本指标可能接近或者服从正太分布,其中样本均值为 μ \mu μ,标准差为 σ n \frac{\sigma}{\sqrt n} n σ
- 检验功效指标,在既定显著水平下,样本标准差(方差)越小,检验功效越强。
- 置信度:第一类错误的概率< α \alpha α。第一类错误为错误地拒绝原假设
- 检验功效(Power) = 1-P(第二类错误),Power越大越好。第二类错误为错误地接受原假设
深度学习推荐系统的前沿实践
Facebook
GBDT+LR
- GBDT部分几天更新一次,LR部分准实时更新
- 异常检测机制:当实时样本溜的数据分布发生变化时,立即切断在线学习的过程,防止预测模型受到影响
- 降采样
- uniform subsampling:所有样本均匀采样
- negative down sampling:保留所有正样本,负样本降采样。负采样导致CTR预估值的漂移,在广告点击率预估时,为了进行准确的竞价及ROI预估,对CTR进行校正, q = p p + ( 1 − p ) / w q = \frac{p}{p+(1-p)/w} q=p+(1−p)/wp,其中p是模型预估的CTR,w是负采样频率。
DLRM (Deep Learning Recommender Model)
- Embedding部分使用模型并行,每一个节点只更新自己节点上的部分Embedding层参数
- MLP部分使用数据并行,每一个设备上已经有了全部模型参数,并利用部分数据进行梯度更新,最后使用AllReduce的方法汇总所有梯度进行参数更新
Airbnb
- Embedding
- 用户短期兴趣使用listing id embedding表示,用于房源的相似推荐,以及session内的实时个性化推荐
- 一个房源序列是指,用户的一次搜索过程中所有的点击房源,但是不包括停留时间少于30秒的房源,并且如果用户超过30分钟没有操作,则认为session终止
- 房源序列分为预定会话和探索型会话,预定会话是指最终有预定行为,没有的则为探索型会话
- 使用skip-gram model和负采样学习listing embedding,并且在每个预定会话中,把预定行为引入目标函数,相当于引入了一个全局上下文(global context)到目标函数中,另外,因为用户倾向于探索同一市场下的房源,所以在目标函数中加入同一市场内的负采样
a r g m a x θ ∑ ( l , c ) ∈ D p l o g 1 1 + e − V c ′ V l + ∑ ( l , c ) ∈ D n l o g 1 1 + e − V c ′ V l + l o g 1 1 + e − V l b ′ V l + ∑ ( l , m n ) ∈ D m n l o g 1 1 + e − V m n ′ V l argmax_\theta \sum_{(l,c)\in D_p} log \frac{1}{1+e^{-V_c'V_l}} +\sum_{(l,c)\in D_n} log \frac{1}{1+e^{-V_c'V_l}} + log \frac{1}{1+e^{-V_{l_b}'V_l}} + \sum_{(l,m_n)\in D_{m_n}} log \frac{1}{1+e^{-V_{m_n}'V_l}} argmaxθ(l,c)∈Dp∑log1+e−Vc′Vl1+(l,c)∈Dn∑log1+e−Vc′Vl1+log1+e−Vlb′Vl1+(l,mn)∈Dmn∑log1+e−Vmn′Vl1
- 新房源的冷启动,使用附近3个同样类型、相似价格的房源向量进行平均得到新房源的embedding
- 校验embedding,使用k-means,检验房源location是否合理聚类,使用cosine similarity,校验房源在type和price range维度是否相似
- 用户长期兴趣embedding,加入用户之前的预定偏好
- 因为用户预定的房源个数和房源被预定次数都非常少,很难使用word2vec模型学习到稳定的embedding,因此,先对用户和房源基于属性进行聚类,生成不同user type和listing type。这样,一个user id的预定历史组成了一个预定序列{( ( u t y p e 1 ) (u_{type1}) (utype1), ( l t y p e 1 ) (l_{type1}) (ltype1)), ( ( u t y p e 2 ) (u_{type2}) (utype2), ( l t y p e 2 ) (l_{type2}) (ltype2)), …, ( ( u t y p e M ) (u_{typeM}) (utypeM), ( l t y p e M ) (l_{typeM}) (ltypeM))},其中,随着时间的变化,同一个user id 的user type也会发生变化。
- 使用word2vec模型和负采样进行学习,因为用户在不同的时间会预定不同市场的房源,因此在这里,不需要在同一市场内进行负采样。但是如果用户得到explicit rejection,会引入到目标函数中。
- Query Embedding,与user embedding类似,把query和listing在同一向量空间进行embedding,以此来学习query的语义信息
- 实时搜索排序模型
- 使用user embedding和listing embedding之间的相似度得到各维度特征,例如候选房源类型和用户类型相似度(长期)、候选房源与用户点击房源相似度(短期)等等
- 排序模型使用的是支持pairwise lambda rank的GBDT模型
- 物品冷启动
- 因为新物品缺乏user engagement features,像历史点击率、预定率等等,并且排序模型强依赖这些特征,预测user engagement features就变得很重要。
- 方法:对于一个新的listing,寻找这个listing地点附近、较短时间窗口内拥有相同guest capacity的listings,使用已知listings的engagement features的平均数作为新listing的特征
Youtube
召回
- 输入:用户历史观看视频embedding、搜索词embedding、地理位置embedding、年龄、性别等,这里的embedding有两种方法进行训练,一种是在模型中加入embedding层进行端到端训练,另一种是使用Airbnb的方法进行embedding预训练。
- 离线训练中,因为输入均为用户侧特征,MLP层的最后输出为用户embedding,softmax的列向量为物品embedding,存储到Redis中供线上检索召回Top K物品
排序
- 输入引入更多的特征,并且可以对特征进行开方和平方来引入特征的非线性
- 因为Youtube的业务目标是优化观看时长,所以在离线训练时,使用加权逻辑回归weighted logistic( T i P T_i P TiP)作为模型输出层,其中 T i T_i Ti为观看时长。在线上服务阶段,使用 e W x + b e^{Wx+b} eWx+b(odds)进行预测
训练技巧
- 在召回阶段中,因为视频库非常庞大,使用负采样减少每次预测的分类
- 训练集中,每个用户都提取相同数量的训练样本,这样做的目的是减少活跃用户对模型的过多影响
- 使用用户最后一次观看的视频作为测试集,这样做的目的是防止特征穿越
- 引入example age特征(训练样本产生的时刻距离当前时刻的时间),在做模型服务时,example age都设置为0
阿里
ESMM
- 优化:pCTCVR = pCTR * pCVR
- 模型结构:
- embedding层:CTR和CVR共享。因为CVR数据稀疏, 所以需要CTR模型训练更准确的用户和物品的特征表达。
- 主任务:优化pCVR,辅助任务:优化pCTR,最终计算pCTCVR
构建属于你的推荐系统知识框架
参考
- Improving Deep Learning For Airbnb Search, 2020-02