3. YouTubeDNN排序模型细节剖析( 三 )


这样,也就很容易的理解,模型训练好了之后,用户向量和item向量到底哪里去了把 。--用户向量,其实就是全连接的DNN网络的输出向量,其实即使没有全连接,原始的用户各个特征拼接起来的那个长向量也能用,不过维度可能太大了,所以DNN再这里的作用一个是特征交叉,另一个还有降维的功效 。--item向量,这个其实和skip-gram那个一样,每个item其实是有两个embedding向量的,比如skip-gram那里就有一个作为中心词时候的embedding矩阵W和作为上下文词时候胡的embedding矩阵W',一般去的时候会取前面那个W作为每个词的词向量 。这里其实一个道理,只不过这里最前面的那个item向量矩阵是通过了w2v的方式训练好了直接作为DNN的输入,如果不事先计算好,对应的是embedding层得到的那个矩阵 。后面的item向量矩阵,就是这里得到用户向量之后,后面进行softmax之前的这个矩阵,YouTubeDNN最终是从这个矩阵里面拿item向量(这句话 重要 重要 重要) 。
这就是知识串联的魅力,其实熟悉了,这个召回模型理解就非常简单 。
这其实就是这个模型训练阶段最原始的剖析,实际训练的时候,依然是采用了优化方法,这个和也是一样,采用了负采样的方式,因为视频的数量太大,每次做多分类,最终那个概率分母上的加和就非常可怕了,所以就把多分类问题转成了多个二分类问题 。也就是不用全部的视频,而是随机选择了一些没点的视频,标记为0,点了的视频标记为1,这样就成了二分类问题 。
召回模型训练部分的基本操作就整理完了 。但是再训练召回模型过程中,还有一些经验性的知识也是非常重要 。
2.2 训练数据的选取和生成
模型训练的时候,为了计算更加高效,采用了负采样方法,但正负样本的选取,以及训练样本的来源,还有一些注意事项 。
首先,训练样本来源于全部的观看记录,而不仅仅是被推荐的观看记录 。否则对于新视频会难以被曝光,会使得最终推荐结果有偏;同时系列也会采集用户从其他渠道观看的视频,从而可以快速应用到协同过滤中;
其次,是训练数据来源于用户的隐式数据,且用户看完了的视频作为正样本,注意这里式看完了,有一定的时长限制,而不仅仅曝光点击,有可能式误点的 。而负样本,是从视频库里面随机选取,或者在曝光过的里面随机选取用户没看过的作为负样本 。
这里的一个经验是训练数据中对于每个用户选取相同的样本数,保证用户在损失函数等权重,因为这样可以减少高度活跃用户对于loss的影响 。可以改进线上A/B测试的效果 。
这里的另一个经验是避免让模型知道不该知道的信息 。这里作者举例一个例子如果模型知道用户最后的行为是搜索了" swift",那么模型可能会倾向于推荐搜索页面搜" swift"时搜索的视频,这个不是推荐模型期望的行为 。解决方法时扔掉时序信息(把用户的历史行为等同看待),历史搜索随机打乱,使用无序的搜索来表示搜索( )
还有一个信息泄露的问题,本文模型的测试集,用的是用户最近一次观看行为,后面的实验中,把用户最后一次点击放到了测试集里面,这样可以防止信息穿越 。
2.3Age 特征
这个特征是和场景比较相关的特征,也是作者的经验传授,有必要来认识一下 。我们知道,视频有明显的生命周期,例如刚上传的视频比之后更受欢迎,也就是用户往往喜欢看最新的东西,而不管它是不是和用户相关,所以视频的流行度随着时间的分布是高度非稳态变化的(下图中的绿色曲线)
但是我们模型训练的时候,是基于历史数据训练的(历史观看记录的平均),所以模型对播放某个视频预测值的期望会倾向于其在训练时间内的平均播放概率(平均热度),上图中蓝色线 。但如上面绿色线,实际上该视频在训练数据时间窗口内热度很可能不均与,用户本身就喜欢新上传的内容 。所以,为了让模型学习到用户这种对新颖内容的bias,,作者引入了" age"这个特征来捕捉视频的生命周期 。