负样本随机采样
1. 采样细节和auc
在构建YouTube的负样本的时候针对样本数据,我们采用对所有正样本覆盖到的视频随机采样的方式进行负样本的选取。
一条输入的样本数据对应下一个点击的视频vid作为正样本,63个随机挑选的vid作为负样本。
采用随机采样我们训练得到的模型auc如下:
epoch 0, auc: 0.975047328233897
epoch 1, auc: 0.9787315107784329
epoch 2, auc: 0.9768194927164626
epoch 3, auc: 0.975806570236023
epoch 4, auc: 0.9728442576988845
2. 用户向量
在训练好的模型中,通过YouTube DNN得到用户的实时向量。
在计算得到的用户向量总的维度为342
其中为激活值为0.0的结果为210
个。
在以ReLu为激活函数的神经网络中,激活值为0的神经元在模型训练的过程中,无法通过反向传播再更新参数。
这样的神经元称为死亡神经元:
在这种情况下YouTube DNN最后一层的神经元的死亡率为61.58%
曝光负样本采样
1. 采样细节和auc
除了使用随机负采样的方式,我们还通过选取对应用户曝光未点击的视频作为负样本,点击的视频作为正样本。
通过曝光负采样,在模型训练过程中测试集上得到的auc如下:
epoch :0, auc :0.8541589495078
epoch :1, auc :0.869886817686467
epoch :2, auc :0.877884247163766
epoch :3, auc:0.8823578210213583
epoch :4, auc :0.8811379979843749
对比分析线上的两组样本数据后,发现采用曝光负采样的过程中采样到的负样本视频大部分和对应的正样本具有相同的特征,不具备较大区分度。
2. 用户向量
在训练好的模型中,通过YouTube DNN得到用户的实时向量。
在计算得到的实时向量中总的维度为342
其中为激活值为0.0的结果为312
个。
这个时候神经元的死亡率为91.49%
增加负采样的数量
1.采样细节和auc
在这一部分的实验中,我们将在数据集上随机负采样的个数从63个扩大到255个。
那么在YouTube DNN 生成候选集阶段对应的所有正样本和负样本label向量大小从64维调整到256维。
在训练过程中,我们得到模型训练在测试集上的auc如下:
epoch 1, auc :0.970688
epoch 2, auc :0.97564
epoch 3, auc :0.977798
2. 用户向量
在上述模型的基础上,我们进一步扩展了negative sampling中负样本的个数之后,得到的用户向量依旧为342维。
这个时候,在342维的用户向量中激活值为0的维度为175维,ReLU激活神经元死亡率为:51.17%
根据上述情况的分析,在负样本个数增加的情况下直观上从离线数据上看,对模型效果的提升有一个正向的预期。
在真实的线上实验中,我们确实也得到了一个正向的效果提升。
4. 相关思考
-
在YouTube DNN的原始论文中采用Importance Sampling,这种采样方式我这里没有复现,说实话还是有点难度的。
-
在YouTube DNN的原始论文中排序阶段构建label负样本的时候使用的是曝光负采样。
问题1: 我要是复现使用Importance Sampling方式的话能不能效果是否会比随机负采样更好? 以及Importance Sampling和随机负采样的区别在哪里?
问题2: 为什么原始论文Ranking的负采样使用曝光负采样,Generate Candidate阶段的负采样使用Importance Sampling的方式?
问题3: 为什么我在Generate Candidate阶段采用曝光数据作为负样本AUC有了明显的下降?
问题4: 为什么最后激活值得到的用户向量有大量的0值? 为什么采用曝光作为负样本0值会更多?
欢迎大家在评论区留言讨论
也可以关注我的微信公众号:终南樵。解锁更多新姿势。