0%

论文阅读-经典推荐系统(一)谷歌双塔

论文链接:Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations

论文详情:2019年recsys的谷歌双塔推荐系统

论文收录在2019的recsys会议上

ps: RecSys是ACM主办的推荐系统领域最好的专门会议,另外KDD、WWW和ICML跟推荐系统相关的track也属A+级别。不过虽然比较齐全,但是质量参差不齐,并没有收录到ccf会议列表中

introduction

  1. 一般推荐系统分为两趴:检索和排序,谷歌双塔只处理前一个步骤—检索
  2. 类似于矩阵分解的方法:先将user和context信息抽取为一个特征,再将item抽取为一个特征,最后点乘或者别的方法糅杂两个特征得到一个分数
  3. 限制:
    • 数据量太大,很难处理
    • 数据量,特别是用户行为,非常sparse,带来长尾效应且对冷启动特别不友好
  4. 贡献:
    • 双塔模型
    • 由于使用batch softmax机制,结果依赖于负采样的随机性,使用item frequency进行有控制的负采样
    • 实际部署经验,包括在youtube上的部署经验和线下/线上的测试经验

method

image

  1. 输入一个三元组,表示用户特征的x,表示物品特征的y,和表示预测结果奖赏值(rewards)的r,r可以为二类别(如点击和不点击),也可以为多分类(如观看视频的时长),在多分类的场景下,对全局所有的x,y对做一个softmax预测概率值,概率的对数与奖赏值r相乘,这样,奖赏值r越大的,预测的概率就越大
  2. 当然,对全局做多分类softmax显然并不现实,用batch softmax代替,这样的好处是可以不需要额外的负采样操作
  3. 用batch softmax拟合全局softmax带来一定的差异,为解决这种差异,本文提出了一些公式来修改batch softmax公式
    • 首先计算概率:$P^c_B(y_i|x_i) = \frac{e^{s^c(x_i,y_i)}}{e^{s^c(x_i,y_i)} + \Sigma_{j \in B,j\neq i}e^{s^c(x_i,y_j)}}$,这一步就是利用所有batch中作为负样本进行softmax分类
    • 计算logit $s^c$:$s^c(x_i,y_j) = s(x_i,y_j)-log(p_j)$,其中p代表物品j出现的frequency,这一步主要是为了扣除一个长尾效应
    • 最后使用计算的概率值来计算损失函数:$L_B=-\frac{1}{B}\Sigma_{i\in B}r_i \cdot log(P_B^C(y_i|x|i))$,这一步就是简单利用奖赏值r训练模型
  4. 推断步骤:
    • 计算用户特征(包含context特征)
    • 使用用户特征和预计算的物品特征进行最近邻搜索
    • 可以用量化和哈希的方法完成加速(或是基于规则预定义搜索桶)
  5. 正则化:实验表明,对特征进行正则化更有利于训练,还加了一些其他用于scale的超参数
  6. 关于物品frequency p的预测:
    • 每次sample到物品就计算一下出现的概率值,使用哈希记录出现次数,具体的如下
    • image,其中,A用于保存最近一次sample到物品的步数,B用来保存(并计算)预测的频率值
    • 根据论文里的推断,这样的估计值是频率的无偏估计
    • A、B和总步长需要做分布式的处理,有一个专门的参数服务器
    • 此外还有一个multiple哈希的扩展版,使用m个A、B矩阵,最后取最大值平均,可以得到更准确的结果(因为碰撞的存在,所以得到的预测结果是一个频率出现次数的下届)

部署实例—YouTube视频推荐系统

image

  1. 训练标签:点击做为1/0的正负样本标签,同时加上奖赏值r代表观看时长
  2. 视频特征:categorical特征+dense特征,前者需要embedding,但是总有些不长出现的类别(sparse),用哈希的方式进行处理(out of vocabulary)
  3. 用户特征:用词袋模型+平均值池化的方式处理用户历史行为
  4. 序列训练:一天一训,每天都是从最早的历史数据开始训练

个人想法

  1. 类似于现在比较火的对比学习,不过提出了batch softmax并做了很工业的改进,确实很不错,对频率的预测是个不错的工具
  2. 自己还是一样,没有实际经验和需求,因此也没有去关注他的实验部分,之后可以简单看看吧