2020.04.30
这是我自己的一份梳理,还未完成,分享出来大家一起学习进步、讨论拍砖。
有的地方为了省事可能就直接截图了(我自己git上私人仓库)。
# 正文
本文件夹大致地介绍一下目前的推荐系统框架,主要是算法相关。
推荐系统一般主要包括召回、排序两个部分。在召回之前,需要有数据和特征;在排序之后,通常有重排序、多样性之类的后续处理;在召回和排序之间,可以加一个粗排。
召回,功能在于从超级巨大的候选池中选出排序性能可接受的小一些的候选集。通常,一个推荐系统会有多路召回,将多路召回的小候选集合并喂给排序。
排序,就是从小的候选池(召回给的)中选出更少的要展现给用户的item。比如抖音一次推荐给你的7个视频,比如知乎推给你的问题等等。
粗排和重排序,严格来说也可以算作是多级排序里的一小步;多样性控制之类则往往是为了提升用户体验。
## 召回
一般情况下,召回这一部分允许你试验各种奇思妙想,因为它跟用户之间还隔着排序,所以对性能之类的问题要求没有“那么”高。当然也是同样的原因,召回方面的优化对指标的提升往往不如排序明显。
召回可以分个性化和非个性化。所谓**非个性化**,比如热门召回,就是把最近最热门的东西推给用户,这对每个用户都是一样的。**个性化**呢,就是给每个用户是不同的,一种是基于用户画像的(基于倒排的),一种是基于用户embedding的。什么是画像呢,就是说我们对每个用户都保存他的兴趣,这个兴趣可以是某个item,也可以是某个tag,他的兴趣有个得分,这个得分跟他对item或tag的反馈有关,也跟行为时间有关(随时间衰减)。什么是倒排呢,就是若干个trigger(也就是兴趣),每个的后面跟着item的list和得分。当用户来了,我们就从他的画像里找(例如说前10个)兴趣的得分,然后找这些兴趣后面的list,计算得分(自由设计公式,最简单直接相乘),择优录取。基于画像的召回最出名的应该是协同过滤了,这个后面单独说,基于embedding的召回一般被称为‘ANN召回’。ANN召回,Approximate Nearest Neighbor,主要是用faiss库实现的,通常在couchbase或者aerospike里存储User emb,在文件中存储item emb (使用faiss训练好的index),一般item emb有新旧两个版本供查找。ANN召回里最有名的应该是youtube的dnn召回模型[随便记录下](https://www.jianshu.com/p/4f2bfc567f02),后面应该也会单独说。
## 排序
排序这里最通用的应该是wide&deep算法了。后面应该会单独说吧,如果我不懒的话。[随便记录2](https://www.jianshu.com/p/36760cb4afe6)
## 随便写点
对于总体而言,一个推荐系统应该关注什么指标呢?(括号里的英文都不一定对)
1. DAU(daily active user,天级活跃用户) 应该是很重要的指标,一个产品做没做起来,这就是硬道理;
2. 留存 也是很重要的指标,尤其对于已经做起来的产品,DAU可能提不上去了,就需要在留存上下功夫;第一天来过的用户,有一部分第二天还来了,这部分用户占第一天的比例,这叫次日留存;
3. 一些其他指标(对于视频来说吧):
- ppui(playtime per user impression, 展示人均播放时长) = 总时长 / 展示UV,字面理解就是用“展示人”来平均“播放时长”,其中展示UV其实就是DAU;同理可以明白点击人均播放时长、展均播放时长等;
- CTR(click through rate,点击率) = 点击/展示; UCTR(user ctr) = 点击uv/展示uv,其中uv应该是user view的意思?可以理解为用户数;
- 一些多样性(信息熵、基尼系数之类)、时效性(新视频分发占比、展示平均年龄之类)方面的指标,主要是关注用户体验了。
如何确定一个模型或策略好不好呢?通常做个ab实验就好,有没有不做ab实验的方法?离线测试当然也可以,但效果并不一定与线上一致。