如何采用FM进行召回

前言

FM算法大家应该比较熟悉吧,如果不熟悉的话可以看看张俊林大佬的这篇文章:https://zhuanlan.zhihu.com/p/58160982(不知道为啥,想到FM我就想到微博推荐)。看完了那我们就可以复习一下:

F M : y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j FM:y=w_0+\sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j>x_ix_j FMy=w0+i=1nwixi+i=1nj=i+1n<vi,vj>xixj

但是由于我们在线上使用的时候都是使用的ID类特征,或者可以说是0-1特征。(如用户是否是男,用户是否有机器学习画像这类的0-1特征,特征维度会非常大)因此对于上面的公式我们可以修改为:

F M : y = w 0 + ∑ i = 1 n w i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > FM:y=w_0+\sum_{i=1}^{n}w_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j> FMy=w0+i=1nwi+i=1nj=i+1n<vi,vj>
(计算的时候只会取特征为1的特征进行以上的操作)

引入

我之前一直略微了解FM算法,但是并没有实践过,在网上听说FM是召回排序全能的算法一直比较好奇,排序我懂,但是怎么进行召回呢?目前业内的模型召回都是双塔类的召回,使用生成的embedding进行向量化召回。比如常见的U2i召回,我们将所有候选物料的embedding计算出来离线建立索引,线上我们实时计算出user的embedding,然后使用user的embedding在索引内进行查找(一般我们使用Annoy索引),百万级的候选物料在微秒级内就可以查找出结果,但是FM怎么看都可不可能。不过最近仔细地学习了一点FM的相关知识才发现自己年轻。

FM中的特征一般分为四类:
1:user类特征,比如用户的画像,消费历史,用户的基本信息
2:item类的特征,一般指物品的内容理解特征,以及一些消费数据特征
3:上下文信息(时间发生的时间,地点,或者等等)
4:交叉类特征:这类交叉特征与FM中的交叉不一样,比如用户和item都有机器学习特征,我们可以做一个交叉特征是:是否含有相同的tag类特征。该类特的值为1,在用户侧和物品侧也分别会有一个特征是:是否含有机器学习tag,值为1。这种交叉类在精排模型中会有显著的效果,但是同样是不能出现在召回模型中的。

推理

此外,由于我们是人选物品,因此我们的上下文特征也可以放置在用户侧,那么我们就有:

v i { i = 0...... n } = [ v u { i = 1..... m } , v k { k = m + 1.... n } ] v_i\{i=0......n\}=[v_u\{i=1.....m\},v_k\{k=m+1....n\}] vi{i=0......n}=[vu{i=1.....m},vk{k=m+1....n}]
我们将上述FM公式的特征拆分为两部分一部分为用户侧特征,另外一部分为物品侧特征。因此上述的公式可以变为:

F M : y = w 0 + ∑ i = 1 n w i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > FM:y=w_0+\sum_{i=1}^{n}w_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j> FMy=w0+i=1nwi+i=1nj=i+1n<vi,vj>
= > y = w 0 + ∑ u = 1 u = m w u + ∑ k = m + 1 k = n w k + ∑ i = 1 m ∑ j = i + 1 m < v i , v j > + ∑ i = m + 1 n ∑ j = i + 1 m < v i , v j > + + ∑ u = 1 m ∑ k = m + 1 n < v u , v k > =>y=w_0+\sum_{u=1}^{u=m}w_u+\sum_{k=m+1}^{k=n}w_k+\sum_{i=1}^{ m}\sum_{j=i+1}^{m}<v_i,v_j>+\sum_{i=m+1}^{n}\sum_{j=i+1}^{m}<v_i,v_j>++\sum_{u=1}^{m}\sum_{k=m+1}^{n}<v_u,v_k> =>y=w0+u=1u=mwu+k=m+1k=nwk+i=1mj=i+1m<vi,vj>+i=m+1nj=i+1m<vi,vj>++u=1mk=m+1n<vu,vk>

将用户侧特征和item侧特征拆分放入公式得到以上的结果,既然可以拆分开来,那么我们不妨令用户侧特征为 u i u_i ui,物品侧的特征为 v i v_i vi,同时将权重 w w w拆分 w 1 w1 w1, w 2 w2 w2
那么上面的公式为:

F M : y = w 0 + ∑ w 1 + ∑ w 2 + ∑ ∑ < u i , u j > + ∑ ∑ < v i , v j > + ∑ ∑ < u i , v j > FM:y=w_0+\sum w1+\sum w2+\sum\sum<u_i,u_j>+\sum\sum<v_i,v_j>+\sum\sum<u_i,v_j> FMy=w0+w1+w2+<ui,uj>+<vi,vj>+<ui,vj>

w 0 w_0 w0外上面各项代表用户特征权重,item特征权重,用户内特征交互,item内特征交互,以及用户特征与item特征的交互

线上召回

召回的场景是在线上根据用户召回item,因此对于所有的item来说,用户特征权重和 w 0 w_0 w0以及用户内的特征交互都是相同的。因此我们需要比较的是:

用户item匹配得分=item的一阶权重+item特征的内交互+item与用户交互

注意:上面的公式 ∑ ∑ < u i , v j > \sum\sum<u_i,v_j> <ui,vj>其实就是 < ∑ u i , ∑ v j > <\sum u_i, \sum v_j> <ui,vj>,等于用户侧所有特征向量的累加于item侧所有特征向量的累加做一个dot乘积。

现在就比较清楚了:我们的用户item匹配得分为:

i t e m 一 阶 权 重 + i t e m 特 征 交 互 + d o t < i t e m 向 量 和 , 用 户 向 量 和 > item一阶权重+item特征交互+dot<item向量和,用户向量和> item+item+dot<item,>
简化一下有:
匹 配 得 分 = i t e m 侧 得 分 + d o t < i t e m 向 量 和 , 用 户 向 量 和 > 匹配得分=item侧得分+dot<item向量和,用户向量和> =item+dot<item,>
这样与我们的常见的embedding匹配就很接近了,我们可以:
E u s e r = [ 1 , 用 户 向 量 和 ] E_{user}=[1,用户向量和] Euser=[1,]
E i t e m = [ i t e m 侧 得 分 , i t e m 向 量 和 ] E_{item}=[item侧得分,item向量和] Eitem=[itemitem]

根据上述的公式,在离线计算所有item的embedding,并且建立索引,线上计算出用户的embedding就可以直接进行向量索引召回了。

以上就是FM进行embedding召回的方法了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值