这道题其实问的是多目标权衡的冷启动问题。就是说,在还没有用户反馈数据的时候,怎么给相关性、时效性、热门度这些因素一个合理的初始权重,让排序先跑起来,再慢慢优化。
最直接的方法就是人工先验法,业务专家根据场景拍一个权重。比如新闻搜索,时效性权重肯定要高,我可能先设成 0.5*rel + 0.3*time + 0.2*hot;但如果是电商搜索,热门度和相关性就更重要,时效性几乎可以忽略。这个方法的优点是快,一周内就能上线,而且可解释性强,出了问题业务一眼能看出是哪个因素偏了。但缺点也很明显,主观,拍脑袋的权重不一定准。所以我会把它当作起点,而不是终点。
然后,如果有一些历史点击日志,可以用统计启发法来校准。比如算一下每个特征和CTR的相关系数,作为权重的参考。这里有个坑:特征量纲不一样,相关性、时效性、热门度数值范围可能差好几个数量级,所以必须先做归一化,比如min-max或者z-score,不然权重就没意义了。
再进阶一点,可以用参数搜索法。在验证集上,用网格搜索或者贝叶斯优化去遍历权重组合,找NDCG最高的那组。网格搜索简单但维度一高就爆炸,所以我更倾向贝叶斯优化,它用高斯过程建模权重和NDCG的关系,采样效率高很多,几十轮就能找到一个不错的解。
等数据积累到一定量,比如几千条标注数据,就可以上轻量模型了。直接训练一个线性模型或者GBDT,把特征重要性作为权重。或者更彻底一点,训练一个Pointwise或者Pairwise的Learning to Rank模型,让模型自己去学权重。这样就从规则过渡到了模型,效果通常更好。
说白了,实际落地从来不是只用一种方法。我一般的做法是:先用人工先验快速上线,同时用统计启发和参数搜索离线调优,等数据够了再切到轻量模型。而且这个过程是迭代的,权重不是设完就不动了,线上我会加滑动平均来平滑,避免短期波动导致排序剧烈变化。
这里有个风险要特别注意:特征之间可能冲突。比如某个新闻很热但时效性已经过了,如果权重没处理好,可能还排在前面。所以我会设计融合规则,比如时效性用指数衰减函数,让过期的新闻自然降权。另外,位置偏置也会干扰权重学习,用户点击可能只是因为排得靠前,而不是真的相关。所以离线评估时,我会用 NDCG 或者 MRR 去偏,线上用小流量A/B测试验证。
其实还有一个更前沿的方向,就是用强化学习做权重动态调整,根据实时反馈让排序策略自适应。不过这个对数据量和工程要求都很高,一般业务场景先不用急着上。
所以,我的核心观点是:初始权重不是拍一次就完事的,它是一个从人工到统计到模型的渐进过程,关键是快速验证、持续迭代。我会把人工先验看作 MVP,把模型学习看作终态,中间用统计和搜索做桥梁。