百万候选集==>召回阶段==>几百候选集==>Ranking阶段==>排在最前面的十几个;
召回阶段:
输入:用户行为过的video集合 + 用户行为过的搜索词集合 + 用户属性
输出:百万级的类别(每个video是一类)
输入的video和搜索词的embedding,是用word2vec预训练得到的;(video要不要和最后一层的w[i]进行权值共享更新?)
Ranking阶段:
输入:待评分的video, 用户画像,context;
输出:一个sigmoid后的p, 0~1的概率(分数)
具体输入特征:
- impression video ID embedding: 当前要计算的video的embedding
- watched video IDs average embedding: 用户观看过的最后N个视频embedding的average pooling
- language embedding: 用户语言的embedding和当前视频语言的embedding
- time since last watch: 自上次观看同channel视频的时间 (刚看过的channel有可能很快就再次看)
- #previous impressions: 该视频已经被曝光给该用户的次数 (增加新鲜度,不能老推已经推过的)
1. 召回阶段,训练时,最后面用的是negative sampling来做的;
2. 召回阶段,最后一层的输出u,点乘权重向量w[i],得到z[i],百万个z[i]过softmax得到p[i];预测阶段,就要要找最大的一百个z[i],所以把用户特征Forward得到u向量之后,找能点成后得到最大的z的w们,也就是把w[i]视为了video[i]的embedding! 近似等价于从百万个w[i]中,找到和u最相似的K个, 也就是KNN (借助faiss等最近邻工具)
3. 召回阶段,为了拟合用户对fresh content的bias,模型引入了“Example Age”这个feature (?)
4. 训练集构成:对每个用户提取等数量个样本;目的是减少活跃用户对模型的影响;
5. 没有使用RNN对用户历史观看记录做建模:如果用RNN,需要避免最后一个item影响过大;(youtube已经上线了以RNN为基础的推荐模型,有论文)
6. 测试集,没有采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集:只留最后一次观看行为做测试集主要是为了避免引入future information,产生与事实不符的数据穿越。
7. Ranking阶段,用观看时长做权重(我们也用了),进行了带权LR,好处:watch time更能反应用户的真实兴趣,从商业模型角度出发,因为watch time越长,YouTube获得的广告收益越多。而且增加用户的watch time也更符合一个视频网站的长期利益和用户粘性。
8、在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替:节省内存。稀疏video就是加上也不准!word2vec里一般用UNK这一个embedding来统一表示。
9. 针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型:引入了特征的非线性;
10. 使用带权LR;