Deep Neural Network for YouTube Recommendationr
参考文章:
Deep Neural Network for YouTube Recommendation论文精读
重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
YouTube深度学习推荐系统的十大工程问题
The candidate generation network only provides broad personalization via collaborative filtering. The similarity between users is expressed in terms of coarse features such as IDs of video watches, search query tokens and demographics.
将推荐问题建模成一个“超大规模多分类”问题。即在时刻t,为用户U(上下文信息C)在视频库V中精准的预测出视频 i 的类别(每个具体的视频视为一个类别,i 即为一个类别),即:
P ( w t = i ∣ U , C ) = e v i u ∑ j ∈ V e v j u P\left(w_{t}=i \mid U, C\right)=\frac{e^{v_{i} u}}{\sum_{j \in V} e^{v_{j} u}} P(wt=i∣U,C)=∑j∈Vevjueviu
而这种超大规模分类问题上,至少要有几百万个类别,实际训练采用的是Negative Sampling。
整个模型架构是包含三个隐层的DNN结构。输入是用户浏览历史、搜索历史、人口统计学信息和其余上下文信息concat成的输入向量;输出分线上和离线训练两个部分。
离线训练阶段输出层为softmax层,而线上则直接利用user向量查询相关商品。我们利用类似局部敏感哈希(Locality Sensitive Hashing paper)的算法为用户提供最相关的N个视频。
主要特征:
(1)用户历史搜索query:把历史搜索的query分词后的token的embedding向量进行加权平均,能够反映用户的整体搜索历史状态
(2)用户观看视频:对用户历史观看的视频信息生成embedding向量进行加权平均(如文本|类目|品牌等),反映出视频的信息
(3)用户基本信息:年龄、性别、地域等,使用 x 2 x^2 x2等增加数值型特征的非线性
(4)其他上下文信息:设备、视频上架时间(example age)
A user’s watch history is represented by a variable-length sequence of sparse video IDs which is mapped to a dense vector representation via the embeddings. The network requires fixed-sized dense inputs and simply averaging the embeddings performed best among several strategies (sum, component-wise max, etc.)
We consistently observe that users prefer fresh content, though
not at the expense of relevance.
由于ML在训练阶段都是利用过去的行为预估未来,因此通常对过去的行为有个隐式的bias。视频网站视频的分布是高度非静态(non-stationary)的,但我们的推荐系统产生的视频集合的分布,基本上反映的是训练所取时间段的平均的观看喜好的视频。因此我们我们把样本的 “age” 作为一个feature加入模型训练中。从下图可以很清楚的看出,加入“example age” feature后和经验分布更为match。
Training examples are generated from all YouTube watches(even those embedded on other sites) rather than just watches on the recommendations we produce. Otherwise, it would be very difficult for new content to surface and the recommender would be overly biased towards exploitation.
Another key insight that improved live metrics was to generate a fixed number of training examples per user, effectively weighting our users equally in the loss function. This prevented a small cohort of highly active users from dominating the loss.
Unsurpisingly, reproducing the user’s last search page as homepage recommendations performs very poorly. By discarding sequence information and representing search queries with an unordered bag of tokens, the classifier is no
longer directly aware of the origin of the label.
注:sequence方法应用得当模型效果会更好,该点不推荐。
Ranking架构和Candidate generation保持高度一致,主要不同点在于特征和最后的输出层。
主要特征
特征工程中最难的是如何建模用户时序行为(temporal sequence of user actions),并且关联这些行为和item。
最重要的Signal是描述用户与商品本身或相似商品之间交互的Signal,这与Facebook在14年提出LR+GBDT模型的paper中得到的结论是一致的。比如我们要度量用户对视频的喜欢,可以考虑用户与视频所在频道间的关系:
We observe that the most important signals are those that describe a user’s previous interaction with the item itself and other similar items, matching others’ experience in ranking ads.
其次,可以将candidate generation阶段的信息传入ranking。
which sources nominated this video candidate? What scores did they assign?
另外,一些负反馈signal也同样重要,比如曝光未点击。
众所周知,NN对输入特征的尺度和分布都是非常敏感的,实际上基本上除了Tree-Based的模型(比如GBDT/RF),机器学习的大多算法都如此。
揭开YouTube深度推荐系统模型Serving之谜
为预测观看时长,训练阶段网络最后一层用的是 weighted logistic regression。将watch time作为正样本的weight,在线上serving中使用 e W x + b = o d d s e^{Wx+b}=odds eWx+b=odds做预测可以直接得到expected watch time的近似。
由于在视频推荐场景中,用户打开一个视频的概率p往往是一个很小的值,因此
O d d s ( i ) = w i p 1 − w i p ≈ w i p = T i p = E ( T i ) O d d s(i)=\frac{w_i p}{1-w_i p} \approx w_i p=T_i p=E\left(T_i\right) Odds(i)=1−wipwip≈wip=Tip=E(Ti)
一般来说,有两种办法训练Weighted LR:
Question:两种方法有何不同?还有其他方法吗?
文中把推荐问题转换成多分类问题,在next watch的场景下,每一个备选video都会是一个分类,因此总共的分类有数百万之巨,这在使用softmax训练时无疑是低效的,这个问题Youtube是如何解决的?
在candidate generation model的serving过程中,Youtube为什么不直接采用训练时的model进行预测,而是采用了一种最近邻搜索的方法?
Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?
在对训练集的预处理过程中,Youtube没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么?
Youtube为什么不采取类似RNN的Sequence model,而是完全摒弃了用户观看历史的时序特征,把用户最近的浏览历史等同看待,这不会损失有效信息吗?
在处理测试集的时候,Youtube为什么不采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集?
在确定优化目标的时候,Youtube为什么不采用经典的CTR,或者播放率(Play Rate),而是采用了每次曝光预期播放时间(expected watch time per impression)作为优化目标?
在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替?
针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型?
为什么ranking model不采用经典的logistic regression当作输出层,而是采用了weighted logistic regression?