为什么做视频网站违法,双语网站模板,做网站建设推广好做吗,建设网站需要展示什么【推荐】排序模型的调优 排序模型的选择 排序模型常见的训练方式 样本类别不均衡处理尝试 欠拟合 过拟合 其他问题 排序模型的选择 LR#xff0c;GBDT#xff0c;LRGBDT#xff0c;FM/FFM#xff0c; 深度模型#xff08;wide deep#xff0c;DeepFM#x… 【推荐】排序模型的调优 排序模型的选择 排序模型常见的训练方式 样本类别不均衡处理尝试 欠拟合 过拟合 其他问题 排序模型的选择 LRGBDTLRGBDTFM/FFM 深度模型wide deepDeepFMDCN等等 排序模型常见的训练方式
方法方法1T1训练固定时间滑窗内的全量数据来训练方法2每天增量训练方法3综合方法1和方法2 即当天内做增量训练比如小时级别的增量训练当天结束的时候做T1全量训练。 样本类别不均衡处理尝试 对于搜推广领域的排序任务数据集正负样本严重的类别不均衡也就是说负样本数量经常是正样本数量的几百倍或者几千倍。对于这么严重的样本类别不均衡如果不采取任何方案来缓解这个问题对于模型学习知识是很困难的。对于排序任务来说常见的缓解类别不均衡的方法如下 · 对负样本降采样 目的是通过某种方法从海量的负样本中采样一些负样本出来从而让负样本的比例减少。对负样本进行采样后在计算广告领域的排序任务中需要在最后计算排序公式的时候进行校准校准发生在线上推理的时候离线训练的时候不用考虑校准。对于个性化搜索和推荐系统来说他们只关注打分概率的相对顺序而采样前后的打分概率的相对顺序不会改变所以不需要校准。 对负样本进行采样会浪费掉很多负样本。 · 对正样本过采样 目的是通过某种方法把正样本的数量变多。如果把正样本过采样到和负样本差不多的量级会导致总体训练样本量太大训练时间相对于正样本过采样前的时间变长很多。对正样本如果进行了采样在计算广告的排序任务中也需要对打分概率做校准而个性化搜索和推荐系统中的排序任务不需要对打分概率做校准。 通过简单复制正样本把正样本数量变成与负样本差不多的样本量模型的离线效果还不错就是训练时间相对长比如一个epoch单机跑都要45个小时。正因为这个原因我们最终没有使用这个方案。 · 每个epoch对负样本采样出和正样本11的数量 这样就不浪费负样本epoch的数量可以根据负样本数量和训练时间来权衡。 做法是这样的使用tf.keras tf.data.experimental.sample_from_datasets API 从大量的负样本采样并与正样本拼接为最终的训练集结果发现每个epoch后的验证集的AUC不变化。如果说模型已经充分收敛也就是loss基本不变了从而模型参数基本不变化这个时候验证集的AUC不变化是有可能的但是模型在刚开始的那些epoch都应该能看到不同的负样本应该会继续学习而不会收敛因此在开始的几个epoch验证集AUC应该是变化的。推断可能是Tensorflow/TF的坑可能每个epoch都拟合了一样的负样本并且基本上在第一个epoch以后模型就基本收敛了。 · 使用class weight或者sample weight 目的是通过设置权重来让模型更关注正样本。这个方法在很多项目中都会使用实际效果也是很不错。 · 使用Focal loss Focal loss可以做困难样本学习和缓解类别样本不均衡。由于时间关系这个项目没有尝试这个方案。 欠拟合 对于欠拟合简单来说就是模型学习的不够充分。常见的处理方法如下 用更多和更好的特征 连续特征的特征缩放处理深度模型对于连续特征的幅度变化很敏感所以用深度模型建模的话一定要对连续特征做特征缩放处理。特征缩放的方法有很多常见的比如Z-score标准化MinMax归一化取log平滑方法比如贝叶斯平滑等等。对于历史ctr这样的比率特征在排序任务中经常会考虑对该特征做平滑目的是为了让那些历史ctr相等但是曝光次数多且点击次数也多的item经过平滑后得到的值与那些长尾的item区别开来比如7天内点击1次曝光2次的item与7天内点击50次曝光100次的item虽然他们的点击率相同但是他们的受欢迎度差别很大因此这个时候直接用7天内的ctr作为特征对他们来说没有辨识度这个时候做ctr平滑就很有意义。 还可以根据业务语义逐渐加入更多的设备侧和广告侧的交叉特征。在项目中我们也尝试了这个方法欠拟合得到进一步的缓解。 增加模型复杂度/容量 在当前使用的wide deep排序模型的情况下增加模型容量可以通过下面两种方式方法1是把全连接层层数变多或者每层的神经元数量变多方法2是把embedding向量的长度变大。业界一般做排序模型用到的全连接层常见都是3层这个项目也是用的3层我们尝试了把每层的神经元变多。另外看到很多文章对于排序模型中用到的itemid/usrid embedding table的embedding向量的维度一般都是设置为8或者10算是一个经验值。 除了上面提到的这些缓解欠拟合的方法调整学习率和batch size大小以及样本类别不均衡的处理方法都可能缓解欠拟合。因此可以看到缓解欠拟合的组合因素有很多。建议的方式是每次调试只是改变一个因素来进行训练后效果对比。特征缩放肯定是要先做的除了学习率batch size以及样本类别不均衡处理这三个因素外我们可以循序渐进的尝试下面的方法来缓解欠拟合挖掘一些好的特征不包含交叉特征比如一些历史统计特征接着增加模型复杂度主要是增加层数或者神经元个数最后逐渐增加有意义的交叉特征。 过拟合 过拟合指的是模型在训练集上的效果/表现不错但是在验证集上的表现与训练集上的差距很大。在实际生产项目中我们更关心模型在训练集上效果不错在验证集上的效果也不错在这样的情况下即使过拟合我们也不关心比如训练集上的AUC是0.95验证集上的AUC是0.8那这种情况是属于过拟合了但是验证集的AUC也足够高了所以这个情况我们能接受如果是训练集上的AUC是0.95验证集上的AUC是0.6这种过拟合就是我们需要关心的了。欠拟合到过拟合有时候就是一瞬间的事情比如特征一下子加多了就容易从欠拟合变成过拟合。对于使用深度模型做排序任务的场景过拟合常见的处理方式如下 收集更多的数据 目的是让模型能更多的见到不同的数据分布从而学习到不同的知识。比如T1训练中的T常见的是7天的数据作为训练集当然这个T取多少和训练集中的正样本量有多少有很大关系在我们这个项目中T取的是30天的数据因此能获得更多的样本尤其是正样本。 减少模型复杂度/容量 也就是使用小一点的神经网络包括小一点的embedding table目的是让神经网络和embedding table的容量变小。在实际的项目中见到过把itemid/userid embedding table的embedding向量的长度设置为几百几千的不建议这样太容易过拟合了就像前面提到的设置为8左右就是一个不错的起点。注意这里的embedding指的是input embedding而关于output embedding以及文本embedding向量长度的选择可以参考我的github中的文章推荐系统概览。 使用BatchNormalization 简称BN本质是对神经元的激活值进行整形它在Deep Learning中非常有用建议尽量用使用BN的话batch size不能太小而batch size的调整一般伴随着同方向的learning rate的调整也就是把batch size调大的话learning rate可以适当调大一点点。虽然BN主要是在CNN卷积层用的比较多但是MLP层也可以用RNN的话要用LayerNormalization简称LN。在当前项目中使用BN后的离线效果提升很明显。 使用Early stopping早停 监控模型在验证集的metric并early stopping早停。Early stopping并不是必须的如果设定模型固定跑的epoch数量之后选择一个表现最好的epoch的checkpoint也是可以的这个情况下就不需要early stopping。 正则化方法 在深度学习中常用的正则化方法是DropoutL1/L2正则Label标签平滑等。当前项目使用了dropout和L1/L2正则。Dropout的比率以及L1/L2正则的超参数在调试的时候都要小步调整大幅调整很容易一下子就从过拟合到了欠拟合了。 使用更少的特征 在这个项目中一下子增加了几种交叉特征后模型从欠拟合到了过拟合。然后在去掉了几个交叉特征之后过拟合得到缓解。因此加入新的特征要一点点加小步走。 在使用深度模型发生过拟合的时候首先要检查验证集的数据分布比如每个连续特征的统计分布每个离散特征的覆盖度和训练集中的数据分布做一下对比。如果训练集和验证集的数据分布相差很多考虑如何重新构造训练集和验证集否则建议尝试按照如下的顺序来缓解每做完一步就训练看效果如果验证集的效果能接受了就先打住否则继续下一步使用BN基本上是标配——使用更少的特征如果特征本身就不多可以跳过主要关注交叉特征是否很多——收集更多的数据如果正样本量已经足够多可以跳过这步——使用正则化方法——减少模型复杂度/容量尤其要注意embedding table中embedding向量的长度 其他问题 数据集变了模型的离线评估AUC变化很大 数据集变大可能会导致容量小的模型效果变差发生欠拟合。对于CTR/CVR任务训练流程跑通以后用固定滑窗的数据集来训练调试模型而一般固定滑窗内的数据集的量级差不多。数据集的清洗和预处理每天都要保证一致性的行为否则出问题调试很花时间。 要尽量保证特征的线上线下一致性。 同样的数据集和同样的模型两个实验对比发现对验证集的评估指标AUC有差别 ML带入的随机性很多所以最好在上下文尽量一致的情况下对比包括超参数的设置训练任务的相关参数和随机种子fix这个非常重要包括python random seed和tensorflow.random rseed都需要fix。 经常发现在分布式训练中模型的评估指标比单机训练的评估指标要差 这个是很常见的。使用分布式训练甚至只是单机多卡的时候学习率可能不适合还用单机单卡训练的学习率适当需要调整。对于horovod分布式训练方式一般来说把学习率变大一点就好不能完全按照horovod官网建议的那样即用worker数量乘以之前单机单卡的学习率作为调整后的学习率这个可能会得到很大的学习率从而导致模型学习效果不好。对于parameter server分布式训练的异步梯度更新方式可能需要把学习率调小为了让最慢那个stale model replica的更新对整体的影响小一些。 特征的覆盖度问题 如果某些离散特征的特征值的样本出现频率很低比如少于10次那么可以考虑特征向上合并或者把那些小类别统一归并为”Other”。