检索
假设你有一个embeding模型,给定一个用户,你怎么决定推荐哪一个物品给他?
在服务时,给定一个query,你会开始做下面的一种
- 如果是一个矩阵因子分解模型,query或者user的embedding是固定知道的,系统可以很轻易的在user embedding矩阵中检索到。
- 如果是一个深度神经网络模型,系统需要在服务时,对特征向量x运行神经网络来计算query embedding φ(x)
一旦你有了query embedding q,你就可以在embedding空间中查找和q接近的物品embedding V(j)。这是一个最近邻的问题,例如,你能根据相似度评分s(q,V(j))来返回top k个物品。
你也可以使用相同方法来得到关联物品的推荐。例如,当用户在youtube上观看一个视频,系统首先查找这个视频的embedding,然后在embedding 空间中查找跟这个embedding接近的物品的embeddings。
为了在embedding空间中计算最近的邻居,系统可以穷尽的计算每一个潜在候选者的评分。但是在大型组织中穷尽计算的代价比较高,你可以使用下面策略中的一种使得模型计算更高效
- 如果query embedding是固定的,系统可以线下执行穷尽评分,预先计算并为每一个query保存一个top的候选者列表。这是相关物品推荐中常用的方法。
- 使用近似近邻(approximate nearest neighbors)
评分
在生产候选者后,另一个模型就会对选取到的一组候选物品进行评分、排名然后展示。推荐系统可能有不同来源的多个候选者生成器,如下:
- 来自矩阵因子分解的相关物品
- 解释个性的用户特征
- “本地” vs “遥远”的物品,要考虑地理位置信息
- 流行或趋势好的物品
- 一个社交网络图,朋友喜欢的或推荐的物品
系统把不同来源的合并为一个通用的候选者物品池,然后用一个模型来对池中的物品进行评分,然后根据评分进行排名。例如,只要给定下面两个信息,系统就可以训练一个模型来预测youtube上一个用户观看一个视频的可能性,这2个信息是:
- query特征(例如,用户观看历史,语言。国家,时间)
- 视频特征(例如,标题、标签、视频embedding)
系统就能根据模型预测的候选者池中的视频进行排名。
为什么不让候选者生成器来评分
虽然候选者生成器计算了一个评分(例如在embedding空间中计算相似度量),你可以临时的使用这个评分来进行排序。但是,实践中,你应该避免这么做,因为:
- 一些系统依赖于多个候选者生成器,可能不同生成器的评分是不可比较的。
- 在一个小的候选者池中,系统可以提供更多的特征和更复杂的模型来更好的捕捉上下文
给评分选择一个目标函数
你也许会记得机器学习问题的介绍,机器学习能扮演为一个淘气的精灵:很乐意去学习你提供的目标,但是你得非常小心你的期望。这个淘气的特性也同样应用于推荐系统,评分函数的选择能极大的影响物品的排名,最后影响推荐系统的质量。
例如,使用不同的目标带来不同的结果:
最大化点击率
如果一个评分函数为了优化点击,系统就会推荐点击诱饵的视频,这个评分函数能带来点击,但是没有带来一个好的用户体检。用户的性能会衰减很快。
最大化观看时间
如果评分函数是为了优化观看时间,系统可能会推荐时间很长的视频,这也会导致一个不好的用户体检。注意很多短的视频和那些长的视频一样好。
增加多样性并最大化会话观看时间
推荐更短的视频,但是这些视频能让用户保持被吸引。
评分中的位置偏差

出现在屏幕下方的物品比出现在屏幕上方的物品的点击率要低。通常系统在对物品进行评分时不知道物品会出现在屏幕的什么位置。但是在模型中查询所有位置的代价又太大。假使对多个位置查询是可行的,系统也很难在跨多评分排名中找到一致性的排名。
解决方案
- 生成位置独立的排名
- 把所有的候选物品看做是在第一个位置来进行排名
重排名
在推荐系统的最后阶段,系统能考虑到额外的条件和约束对候选物品进行重排序。一个重排名的方法是通过过滤来删除一些候选物品。
例如:你能通过一下操作来实现视频推荐上的重排名
- 你可以训练单独的模型来检查一个视频是否是点击诱饵
- 在候选物品列表上执行这个模型
- 删除模型分类为点击诱饵的视频
另一个重排名方法是对排名器返回的评分进行手动转换
例如:通过下面的函数改变评分来对视频重排名
- 视频年龄(可能提升新鲜的内容)
- 视频长度
这个部分我们简要的介绍新鲜度、多样性、公平性。这些因子能帮助改善你的推荐系统。这其中的因子需要修改处理过程中的不同阶段。下面每个部分提供了你可以单独或组合使用的解决办法。
新鲜度
很多推荐系统都会使用当前用户的历史、最新的物品这些最新的可用信息。保持模型的新鲜度来帮助模型做出更好的推荐。
解决方案Solutions
- 尽可能的经常在最新的训练数据上重新训练模型,我们推荐热启动来训练,这样就能避免模型胡乱的全部重新学习。热启动能显著的减少训练时间。例如,在矩阵因子分解中,热启动那些在上一个模型实例中已存在的物品embeddings。
- 在矩阵因子分解模型中创建一个“平均”用户来代表新用户。你不需要每个用户相同的embedding,只需要基于用户的特征来创建用户集群。
- 使用softmax深度神经网络或双塔神经网络,因为模型使用特征向量作为输入,所以它也能运行一个在训练时没有出现过的query或者item。
- 增加文档年龄这一个特征。例如,youtube能把视频的年龄和上一次观看的时间当做特征增加到模型中。
多样性

如果系统总是推荐和query embedding最接近的视频,候选物品之间会非常相似。这种缺乏多样性会导致坏的或令人厌烦的用户体检。例如,如果youtube只推荐和用户当前观看的视频相类似的视频,除了猫头鹰视频没有其它的了(就像上图展示的那样),用户很快就会失去兴趣。
解决方案
- 使用不同的来源训练多个候选生成器
- 使用不同的目标函数训练多个排名
- 基于分类或其它元数据重新对物品排名来确保多样性
公平性
你的模型应该平等的对待所有的用户。因此,确保你的模型不会从训练数据集中学习到非有意识的偏见。
解决方案
- 在设计和开发时包含多个方面特征
- 在全面的数据集上训练机器学习模型。当你的数据很稀疏时增加辅助的数据(例如,当特定的类型人数不足时)。
- 对每一个人口统计类型上跟踪度量(例如准确性和绝对误差)来观察偏差(biase)。
- 为服务不周到的群体使用单独的模型。
本文翻译自谷歌开发者推荐系统的检索评分重排名

...
...
This is copyright.