回答思路
概念:youtube是世界上最大的生产、分享、发现视频内容的平台。2016年,YouTube用深度神经网络完成了工业级的视频推荐系统,帮助了 用户从不断增大的视频集中发现个性化的视频内容。
解决了什么问题:
大规模,在其他问题表现比较好的算法模型拿过来无法使用,因为youtube用户基数和语料库特别大,需要分布式算法和高效的线上服务系统来解决;
新鲜度,youtube语料库中每秒中都会有较长的视频更新进来,那么推荐系统应该能够基于新上传的视频和用户最新的行为来推荐,因此需要平衡新上传内容和之前已经入库的视频;
数据噪声,视频标签难以获取,youtube上的历史用户行为本来就是难以预测的,因为用户行为具有稀疏性和很多观察不到的外部因子,很难得到用户满意度的ground truth,只能去建模具有噪音的用户隐式反馈信号。
上图是youtube视频推荐的系统架构图,首先对大规模物料库使用简单算法召回、策略召回、深度模型召回等方式,得到一定数量的候选集,然后排序模型对候选集中每个物料进行打分,最终返回top N展现给用户。
召回模型:
召回模型:
为了生成候选集,需要从视频语料库中选出与用户相关的视频,可以将其看成一个极多分类问题。基于特定的用户U和上下文C,在时刻t将指定的视频W_t准确的划分到第i类中,其中V表示视频语料库,如下式所示:
其中,用户向量u是由用户观看和搜索视频记录进行embedding,再和上下文以及用户的其他特征组合而成的一个向量。vju表示第j个视频的embedding向量,这里每个视频都embedding成一个向量。假设存在百万个类别,训练这样的极多分类问题会非常困难,需要对softmax多分类问题进行优化加速,采用了负采样方法,通过采样找到数千个负类,将多分类问题转变为二分类问题。
(2)网络结构
在Word2vec语言模型中,将各个词embedding编码到一个向量,并将词的embedding向量喂给前馈神经网络进行学习,基于此,youtube召回模型将每个视频都映射到一个向量,并且将视频的embedding向量喂给神经网络,其中神经网络的输入需要为固定大小的向量。另外,视频的embedding向量也可以通过正常的梯度下降反向传播更新与所有其他模型参数一起学习。网络结构如下图所示:
输入数据都是一些异构数据,包括用户观看视频序列ID:对视频ID的embedding向量进行累计并求平均值,得到观看向量(watch vector);用户搜索视频序列ID:对视频ID的embedding向量进行累计并求平均值,得到搜索向量;用户地理特征和用户设备特征:均为一些离散特征,可以采用embedding方法或者one-hot方法,得到用户的地理向量和设备向量;人口属性特征:可以进行归一化处理,提供丰富的先验信息,实现比较好的对新用户的推荐效果。
中间层(两层神经网络,每一层的激活函数为relu)
输出层:维度和视频ID的embedding维度一致,最终得到用户向量u。
通过该网络结构的学习,最终可以得到所有视频的Embedding向量V,其维度为pool_size×k,其中pool_size为训练集视频资源池大小,k为Embedding的维度。还可以得到所有用户的输出向量u,其中每个用户向量的维度是k维,和物品的Embedding维度一致。
在线服务阶段,通过视频向量V和用户向量u,进行相似度计算,采用最近邻查询,取得Top相似视频作为召回候选集。
(3)特征处理:
视频ID向量化:基于此向量,可以得到用户的曝光视频向量、观看视频向量、搜索视频向量等(得到用户的各种视频行为向量)。
用户画像特征归一化处理:如地理位置、设备、性别、年龄、登录状态等连续或离散特征都被归一化为[0, 1],并和用户视频行为向量做连接(concat)。
视频生命周期特征:该特征表示视频被上传之后的时间,在youtube上,每秒都有大量视频被上传,推荐这些最新样本对于youtube非常重要,通过持续观察,可以知道用户更倾向于被推荐那些尽管相关度不高却最新的视频。模型策略为将视频生命周期特征作为一个特征拼接到DNN的输入向量,在训练时,时间窗口越靠后,该值越接近于0或者一个绝对值小的负数。
(4)样本选择
训练样本是从youtube的全部观看记录中产生的,而不仅包括推荐系统生成的观看记录,便于加入对新视频的测试,防止对推荐者的观看记录过度利用;同时用户通过其他途径的观看行为也容易被推荐系统采集到,从而可以通过CF快速传播用户行为。另外,对每一个用户所产生的观看记录生成固定数量的训练样本,使得每个用户在损失函数中的权重都是相等的,防止一小部分超级活跃用户影响损失函数的公平性。
(5)上下文选择
用户观看视频时,遵循的是一种非对称模式,即在初始的观看序列中,范围会比较广泛;在后期的观看序列中,范围会逐渐集中。按照顺序预测用户观看的下一个视频,会比随机挑选某一个视频并根据该视频的上下文来预测该视频本身的性能要好。大部分协同过滤算法在推荐时,往往利用的是用户的全量观看历史,从用户的观看历史序列中,随机选择一个视频作为label,将该视频的上下文作为输入,通过该上下文输入来预测label,但是这种情况会出现label提前泄漏的问题。相比之下,在输入时只选择label发生之前的视频,就可以避免这个问题。