背景介绍
推荐系统中特征一般分为三类:user(年龄、性别和省份等)、context(时间、搜索词、手机型号和来源页等)和item(具体推荐物品的特征)。
其他术语:
Items(documents):推荐系统推荐的实体,对于YouTube就是视频,对于Google应用商店就是app。
Query(context):推荐系统用query的信息进行推荐,query信息包括用户信息(用户id,用户交互特征)和上下文信息(时间,设备)。
Embedding:离散值到向量空间的隐射,大部分的推荐系统都是基于学到的item和query的向量表达来做推荐的。
模型结构
双塔模型结构如下图:
左边网络对{user , context }进行编码,右边网络对{item}进行编码,那么假定左边query和右边item分别对应的特征向量为:和,注意和为根据各种特征学习出的高纬度特征向量。目标是,给定一个query,召回items的子集。
用两个参数化的embedding函数来建模
embedding函数1:
embedding函数2:
模型的输出是两个embedding的内积:
目标是通过个样本的训练集:
学习模型参数,表示query 和item ,为用户反馈,例如点击过该视频或者观看该视频的时长。
召回问题可以看作是一个连续回复的多分类问题,分类问题中对于所有的正样本,label的值为1,而推荐中,可以分为多级,例如新闻推荐中,可以拿一篇新闻的阅读时间或者停留时间来做label,给定一个query: ,是否选择通常基于softmax函数:
进一步考虑,可以得到如下log loss损失函数:
当 太大的话,是不太可能计算该损失函数的,一种比较合理的方法是取子集,即batch-softmax的方法,对于一个batch:,对应的batch softmax 为:
如果直接采用此函数,会引入巨大的偏置,因为受欢迎的item会被过度的惩罚,因此修改等式为:
表示item j 被一个随机batch采到的概率, 那么可以得到修正后的batch softmax:
进一步得到loss function 为:
那么就可以通过梯度下降算法求解了:
整个算法实现流程如下:
流频率估计
考虑一组随机batch的item样本组成的一组流,我们的问题是估计每一个batch命中item 的概率。一个严格的设计标准是要求对分布式支持的,也就是对于每个training job都能准确估计。
在分布式训练的过程中,有个全局变量:global step,在多个workers和paramter server之间同步,我们可以把对某个item出现频率的估计转换为对于的估计,表示连续两次命中item平均要间隔多少step,例如每50steps命中一次,那么。global step的优势:1.多个workers在频率估计中通过global step同步 2.的估计可以通过滑动平均来实现,这样可以与分布的不断变化相适应。整个频率估计算法步骤如下:
哈希函数负责将item转换为转换为中的一个整数, 两个表和的大小均为,记录了最后一次采样的步数,而存的是的估计。如果出现在步中,那么更新:
更新完后,将赋值给。文中证明,该估计是无偏的。