首先:本文来自于王喆老师的《深度学习推荐系统》一书,很不错,推荐大家去看看
一:推荐系统的应用场景
作为全球最大的视频分享网站,youtube平台中几乎所有的视频都来自于ugc,这样的内容产生模式有两个特点。 (1)商业模式不同,netfix和国内的爱奇艺等流媒体他们的大部分内容都是采购或者自制的电影,剧集等头部内容,youtobe内容的头部效应没这么严重 (2)youtube的用户基数巨大,用户很难发现喜欢的内容 YouTube视频内容的特点使得推荐系统的作用比其他流媒体重要得多,除此之外,YouTube的利润主要来源于广告,而广告的曝光机会与用户的观看视频时长正相关,因此,YouTube的推荐模型是其商业模式的基础。 基于YouTube的商业模式和内容特点,其推荐团队构建了两个深度学习网络,分别考虑召回率和准确率的要求,并构建了以用户观看时长为优化目标的排序模型,最大化用户观看时长,进而产生更多的广告曝光机会,下面详细介绍。
二:YouTube的推荐系统架构
YouTube的视频基数巨大,要求能在百万级别的视频规模下进行个性化推荐。考虑到在线系统的延迟问题,不宜用复杂的网路直接对海量候选集进行排序,所以YouTube采用两级深度学习模型完成整个推荐过程。 第一层用候选集生成模型(candidate generation mode)来完成候选视频的快速筛选,这一步将候选集从百万维降低到百维,也就是传统的推荐系统模型中的召回层。 第二层用排序模型(ranking model )来完成几百个候选视频的精排,这一步相当于传统推荐系统模型中的排序层。
三:候选集生成模型(candidate generation model )
输入:最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量,作者是用word2vec方法对video和search token做了embedding之后再作为输入的。 特征向量里面还包括了用户的地理位置的embedding,年龄,性别等。然后把所有这些特征concatenate起来,喂给上层的ReLU神经网络。 三层神经网络过后,我们看到了softmax函数。这里Youtube的同学们把这个问题看作为用户推荐next watch的问题,所以输出应该是一个在所有candidate video上的概率分布,自然是一个多分类问题,所以这里用softmax 作为最终的输出层。 总体来讲,YouTube推荐系统的候选集生成模型是一个典型的embedding预训练特征的深度神经网路模型。
四:候选集生成模型独特的线上服务方法
在架构图中我们可以明显看到模型的服务方法与模型的训练方法完全不同,在候选集生成网络的线上服务过程中,YouTube并没有采用训练时的模型来进行预测,而是采用了最邻近搜索算法,这是一个经典的工程和理论做权衡的结果。 具体来讲,在模型的服务过程中,如果每次推荐请求都端到端的运行一次候选集生成模型,那么由于网络结构复杂,且输入层参数较大,此过程消耗的时间和计算开销是非常巨大的。因此通过候选集生成模型产生user embedding 和vedio embedding 之后,通过embedding最近邻搜索算法进行模型的服务效率会高很多,如果采用局部敏感哈希等最近邻搜索算法,那么甚至可以将模型服务的计算复杂度降低至常数级别。采用最近邻所搜算法的好处不仅在于模型服务的效率会提升,这样甚至不用把模型推断的逻辑搬上服务器,直接将user embedding 和vedio embedding 搬到redis 数据库或者服务器的缓存中就可以了。 架构图中softmax 向模型服务模块画了一个箭头,代表vedio embedding向量的生成。如何生成的呢,由于该softmax 层本质上是一个mxn的矩阵,m 为relu的输出维度,n 为指的是分类的总数,也就是YouTube所有视频的总数为n,那么vedio mebedding 就是这个mxn 维矩阵的各列向量。这个原理就是word2vec的原理。 除此之外,用户的embedding向量的生成就很好理解了,因为输入的特征向量全部都是用户相关的特征,所以在使用用户u的特征向量作为模型输入时,最后一层relu的输出向量可以当做该用户的embedding向量,在模型训练完毕之后,逐个输入所有用户的特征向量到模型中,就可以得到所有用户的embedding向量,之后导入线上embedding数据库。在预测某用户的视频候选集时,先得到该用户的embedding向量,再在视频embedding向量空间中利用局部局部哈希等方法搜索该用户embedding向量的topk近邻,就可以快读得到k个候选视频集合。
五:排序模型(ranking model)
通过候选集生成模型得到几百个候选视频集合,然后再用排序模型做精排序。如上图。 从结构上看,排序模型的结构和候选集生成模型的结构并没有太大的差异,但需要注意的是输入层和输出层,即模型的特征工程和优化目标。 具体一点,输入层从左至右的特征依次是:
(1)当前候选视频的 Embedding(impression video ID embedding)。
(2)用户观看过的最后 N 个视频 Embedding 的平均值(watched video IDs average embedding)。
(3)用户语言的 Embedding 和当前候选视频语言的 Embedding(language embedding)。
(4)该用户自上次观看同频道视频的时间(time since last watch)。
(5)该视频已经被曝光给该用户的次数(#previous impressions)。 第 4 个特征 time since last watch 表达的是用户观看同类视频的间隔时间。从用户的角度出发,假如某用户刚看过“DOTA 比赛经典回顾”这个频道的视频,那么用户大概率会继续看这个频道的视频,该特征很好地捕捉到了这一用户行为。
第 5 个特征 #previous impressions 则在一定程度上引入了探索和利用机制,避免同一个视频对同一用户进行持续的无效曝光,尽量增加用户看到新视频的可能性。
需要注意的是,排序模型不仅针对第 4 个和第 5 个特征引入了原特征值,还进行了平方和开方的处理。作为新的特征输入模型,这一操作引入了特征的非线性,提升了模型对特征的表达能力。
经过三层 ReLU 网络之后,排序模型的输出层与候选集生成模型又有所不同。候选集生成模型选择 softmax 作为其输出层,而排序模型选择 weighted logistic regression(加权逻辑回归)作为模型输出层。与此同时,模型服务阶段的输出层选择的是 e^(Wx+b) 函数。YouTube 为什么分别在训练和服务阶段选择了不同的输出层函数呢? 从 YouTube 的商业模式出发,增加用户观看时长才是其推荐系统最主要的优化目标,所以在训练排序模型时,每次曝光期望观看时长(expected watch time per impression)应该作为更合理的优化目标。因此,为了能直接预估观看时长,YouTube 将正样本的观看时长作为其样本权重,用加权逻辑回归进行训练,就可以让模型学到用户观看时长的信息。
假设一件事情发生的概率是 p,这里引入一个新的概念——Odds(机会比),它指一件事情发生和不发生的比值。
对逻辑回归来说,一件事情发生的概率 p 由 sigmoid 函数得到,如(公式 1)所示: 这里定义变量 Odds 如(公式 2)所示,并代入(公式 1)可得。 显而易见,YouTube 正是把变量 Odds 当作了模型服务过程中的输出。为什么 YouTube 要预测变量 Odds 呢?Odds 又有什么物理意义呢?
这里需要结合加权逻辑回归的原理进行进一步说明。由于加权逻辑回归引入了正样本权重的信息,在 YouTube 场景下,正样本 i 的观看时长 Ti 就是其样本权重,因此正样本发生的概率变成原来的 Ti 倍(这里也是做了一个近似,实际上需要通过贝叶斯公式来解释),那么正样本 i 的 Odds 变成(公式 3)所示: 在视频推荐场景中,用户打开一个视频的概率 p 往往是一个很小的值(通常在 1% 左右),因此(公式 3)可以继续简化: 可以看出,变量 Odds 本质上的物理意义就是 每次曝光期望观看时长,这正是排序模型希望优化的目标!因此,利用加权逻辑回归进行模型训练,利用 e^(Wx+b) 进行模型服务是最符合优化目标的技术实现。
六:训练和测试样本的处理
(1)候选集生成模型把推荐问题转换成多分类问题,在预测下一次观看(next watch)的场景下,每一个备选视频都会是一个分类,因此总共的分类有数百万之巨,使用 softmax 对其进行训练无疑是低效的,这个问题 YouTube 是如何解决的呢?
YouTube 采用了 Word2vec 中常用的负采样训练方法减少了每次预测的分类数量,从而加快了整个模型的收敛速度,具体的方法在 4.1 节已经有所介绍。此外,YouTube 也尝试了 Word2vec 另一种常用的训练方法 hierarchical softmax(分层 softmax),但并没有取得很好的效果,因此在实践中选择了更为简便的负采样方法。
(2)在对训练集的预处理过程中,YouTube 没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么呢?
YouTube 这样做的目的是减少高度活跃用户对模型损失的过度影响,使模型过于偏向活跃用户的行为模式,而忽略数量更广大的长尾用户的体验。
(3)在处理测试集的时候,YouTube 为什么不采用经典的随机留一法(random holdout),而是一定要以用户最近一次观看的行为作为测试集呢?
只留最后一次观看行为做测试集主要是为了避免引入未来信息(future information),产生与事实不符的数据穿越问题。
可以看出,YouTube 对于训练集和测试集的处理过程也是基于对业务数据的观察理解的,这是非常好的工程经验。
七:如何处理用户对新视频的偏好
对 UGC 平台来说,用户对新内容的偏好很明显。对绝大多数内容来说,刚上线的那段时间是其流量高峰,然后快速衰减,之后趋于平稳(如图 4 中绿色曲线所示)。YouTube 的内容当然也不例外,因此,能否处理好用户对新视频的偏好直接影响了预测的准确率。该模块可多考虑牛顿冷却定律。 为了拟合用户对新内容的偏好,YouTube 推荐系统引入了 Example Age 这个特征,该特征的定义是训练样本产生的时刻距离当前时刻的时间。例如,24 小时前产生的训练样本,Example Age 的特征值就是 24。在做模型服务的时候,不管候选视频是哪个,可以直接将这个特征值设成 0,甚至是一个很小的负值,因为这次的训练样本将在不久的未来产生这次推荐结果的时候实际生成。
YouTube 选择这样一个时间特征来反映内容新鲜程度的逻辑并不容易理解,读者可以仔细思考这个做法的细节和动机。
笔者对这个特征的理解是:该特征起到了时间戳的作用,当该特征在深度神经网络中与其他特征做交叉时,保存了其他特征随时间变化的权重,也就让最终的预测包含了时间趋势的信息。
YouTube 通过试验验证了 Example Age 特征的重要性,图 4 中蓝色曲线是引入 Example Age 前的模型预估值,可以看出与时间没有显著关系,而引入 Example Age 后的模型预估十分接近经验分布。
通常“新鲜程度”这一特征会定义为视频距离上传时间的天数( Days since Upload),比如虽然是 24 小时前产生的样本,但样本的视频已经上传了 90 小时,该特征值就应是 90。那么在做线上预估时,这个特征的值就不会是 0,而是当前时间与每个视频上传时间的间隔。这无疑是一种保存时间信息的方法,但 YouTube 显然没有采用这种方法,笔者推测该方法效果不好的原因是这种做法会导致 Example Age 的分布过于分散,在训练过程中会包含刚上传的视频,也会包含上传已经 1 年,甚至 5 年的视频,这会导致 Example Age 无法集中描述近期的变化趋势。当然,推荐读者同时实现这两种做法,并通过效果评估得出最终的结论。
|