推荐系统中的损失函数梳理:从Pointwise到Listwise
引言:目标决定损失函数选择
推荐系统通常采用两阶段架构:召回(Recall)与精排(Ranking)。两个阶段的优化目标存在本质差异,这直接决定了损失函数的选择。
召回阶段从海量候选集(百万至亿级)中筛选出数百至数千个候选物品。这一阶段的核心目标是学习高质量的向量表示,使得相关物品在向量空间中与用户表示接近,无关物品远离。召回阶段关注的是向量空间的区分性与检索效率,而非精确的概率预测。评估指标通常为Recall@K或命中率,衡量的是相关物品是否被成功检索到候选集中。
精排阶段在有限候选集(数十至数百个)上进行精细打分与排序。这一阶段需要输出校准良好的概率或分数,直接决定最终展示顺序,与业务指标(CTR、CVR、GMV)强相关。精排阶段强调预测的准确性、概率的可解释性以及对细微差异的区分能力。
基于这一差异,召回阶段应采用能够学习区分性向量表示的损失函数(对比学习或局部Listwise方法),精排阶段应采用能够输出校准概率的损失函数(Pointwise方法为主,可结合Pairwise增强排序能力)。
第一部分:Pointwise损失函数——独立样本的绝对值预测
Pointwise方法将每个用户-物品交互样本视为独立单元,将推荐问题转化为分类或回归任务。模型为每个样本预测一个绝对值(点击概率、评分等),损失函数度量预测值与真实值之间的差异。
二元交叉熵(Binary Cross-Entropy)
二元交叉熵是精排阶段最常用的损失函数,适用于CTR和CVR预估。对于样本\(i\),真实标签为\(y_i \in \{0,1\}\),模型预测概率为\(p_i\),损失定义为:
\[L_{BCE} = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]\]
二元交叉熵的核心优势在于其输出具有明确的概率解释。在最大化似然估计框架下,最小化交叉熵等价于最大化数据的似然概率,因此训练后的模型输出可以直接解释为点击概率。这使得下游的概率校准、阈值决策和业务指标计算都具有坚实的理论基础。
二元交叉熵对正负样本不平衡敏感。在推荐场景中,点击样本(正样本)通常占比不足5%,导致模型倾向于预测所有样本为负,学习困难。此外,该损失函数对标注噪声敏感,错误标注的样本会产生较大梯度,影响模型收敛。
均方误差(Mean Squared Error)
均方误差用于显式反馈场景,例如用户评分预测。对于真实值\(y_i\)与预测值\(\hat{y}_i\),损失定义为:
\[L_{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2\]
均方误差的优势在于其凸性质和简单的梯度形式,优化过程稳定。但该损失对异常值极为敏感,单个偏离样本可能产生过大的损失值,导致模型被异常值主导。在CTR预估等二分类任务中,均方误差缺乏概率解释,不应作为首选。
Focal Loss
Focal Loss在二元交叉熵基础上引入难易样本调制机制,专门针对极度不平衡数据设计。对于真实标签\(y \in \{0,1\}\),预测概率\(p\),损失定义为:
\[L_{FL} = \begin{cases} -\alpha (1-p)^\gamma \log(p) & \text{if } y=1 \\ -(1-\alpha) p^\gamma \log(1-p) & \text{if } y=0 \end{cases}\]
其中\(\alpha\)为类别平衡因子,\(\gamma\)为聚焦参数。当\(\gamma=0\)时,Focal Loss退化为标准交叉熵。当\(\gamma>0\)时,易分类样本(高置信度预测正确)的损失被抑制,模型被迫关注难分类样本。
Focal Loss的关键在于\((1-p)^\gamma\)调制因子。对于正样本,当模型已经高置信预测为正类(\(p \to 1\))时,\((1-p)^\gamma \to 0\),该样本几乎不产生梯度。反之,对于难分类样本(\(p\)较小),调制因子接近1,保持正常的梯度强度。这种机制无需复杂的采样策略即可应对类别不平衡。
实践中,\(\gamma\)的典型取值范围为1到3,\(\alpha\)通常设置为正样本比例的倒数或通过验证集调优。需要注意的是,Focal Loss引入了两个超参数,调优成本相对较高。
Pointwise方法的适用场景
Pointwise损失函数适用于精排阶段,具体包括:需要输出校准概率用于后续决策(如广告出价、预算分配)的场景;业务指标直接依赖于绝对概率值(如eCPM计算)的场景;样本带有显式标注(评分、满意度等级)需要回归预测的场景。
Pointwise方法的核心优势是输出的可解释性与校准性。训练稳定,收敛快速,输出值可以直接用于概率校准或阈值决策。实现简单,易于工程化部署。
Pointwise方法的主要局限在于忽略了样本间的相对关系。两个样本的绝对概率可能都不准确,但只要相对顺序正确,排序效果就可以接受。Pointwise方法无法利用这种相对信息,可能导致排序指标与损失函数的优化方向不一致。
Pointwise方法的工程实践
在精排阶段,二元交叉熵应作为首选基线。如果正负样本比例低于1:20,应首先尝试Focal Loss(\(\gamma=2\),\(\alpha\)设置为正样本比例的倒数)或类别加权策略。训练完成后,必须对输出概率进行校准(temperature scaling或isotonic regression),以确保预测概率与真实点击率对齐。
如果业务既需要准确的概率又需要良好的排序效果,可以采用混合损失函数:主损失使用二元交叉熵,辅助损失使用Pairwise方法,通过权重系数(如0.9:0.1)平衡两者。这种策略在工业界已有成功应用案例。
第二部分 airwise损失函数——相对顺序的优化
Pairwise方法将推荐问题建模为样本对的相对排序任务。模型不再预测单个样本的绝对值,而是学习任意两个样本之间的相对顺序。训练时构造样本对(通常是一个正样本与一个负样本),要求模型给正样本的分数高于负样本。
BPR Loss(Bayesian Personalized Ranking)
BPR Loss是隐式反馈场景下最常用的Pairwise损失函数。对于用户\(u\)、正样本物品\(i\)(用户有交互)与负样本物品\(j\)(用户无交互),模型分别预测分数\(\hat{y}_{ui}\)和\(\hat{y}_{uj}\)。BPR假设用户偏好正样本多于负样本,建模其后验概率并最大化,对应的损失函数为:
\[L_{BPR} = -\sum_{(u,i,j) \in D} \ln \sigma(\hat{y}_{ui} - \hat{y}_{uj}) + \lambda \|\Theta\|^2\]
其中\(\sigma(x) = 1/(1+e^{-x})\)为sigmoid函数,\(\lambda\)为正则化系数。该损失函数等价于对分数差\(\hat{y}_{ui} - \hat{y}_{uj}\)应用逻辑回归,要求正样本分数显著高于负样本。
BPR Loss直接优化排序关系,与AUC指标高度相关。在隐式反馈数据上(仅有点击、购买等正向行为记录),BPR是标准的强基线方法。但该方法依赖于"未交互即负样本"的假设,这在实际场景中并不总是成立(用户可能因为未曝光而未交互,而非不感兴趣),因此负样本采样策略至关重要。
Hinge Loss
Hinge Loss源于支持向量机的最大间隔思想。对于正样本分数\(\hat{y}_{ui}\)与负样本分数\(\hat{y}_{uj}\),设定间隔\(m > 0\),损失定义为:
\[L_{Hinge} = \sum_{(u,i,j) \in D} \max(0, m - (\hat{y}_{ui} - \hat{y}_{uj}))\]
该损失函数仅在正负样本分数差小于\(m\)时产生惩罚。一旦分数差超过间隔,损失为零,对应样本不再产生梯度。这种设计鼓励模型在正负样本之间建立明确的安全边界,通常具有更好的泛化性能。
Hinge Loss的间隔参数\(m\)需要根据任务特性调优。间隔过小,模型区分能力不足;间隔过大,优化困难,收敛缓慢。另一个技术细节是Hinge Loss在边界点不可导,实践中通常使用次梯度方法或平滑近似版本。
RankNet Loss
RankNet Loss是微软提出的经典Pairwise方法,为后续的LambdaRank和LambdaMART奠定了基础。对于应当满足\(i\)排在\(j\)之前的样本对,RankNet首先计算模型认为\(i\)优于\(j\)的概率:
\[P_{ij} = \sigma(s_i - s_j) = \frac{1}{1 + e^{-(s_i - s_j)}}\]
其中\(s_i\)和\(s_j\)是模型对两个样本的打分。然后将该概率与真实目标概率\(\bar{P}_{ij}\)(若\(i\)确实应排在\(j\)前则为1,否则为0)计算交叉熵:
\[L_{RankNet} = -[\bar{P}_{ij} \ln P_{ij} + (1 - \bar{P}_{ij}) \ln(1 - P_{ij})]\]
当\(\bar{P}_{ij}=1\)时,该损失简化为\(-\ln \sigma(s_i - s_j)\),等价于BPR Loss的单对形式。RankNet的优势在于其损失函数处处可微,梯度形式简洁,便于基于梯度的优化算法。
RankNet与所有Pairwise方法共享的局限是训练复杂度。对于\(N\)个样本,理论上存在\(O(N^2)\)个样本对,实际训练中必须通过采样控制计算量。此外,Pairwise方法关注局部的两两比较,未直接建模列表级别的全局排序质量(如NDCG),可能存在优化目标与评估指标的偏差。
Pairwise方法的适用场景
Pairwise损失函数适用于以下场景:评估指标以AUC或排序相关指标为主的任务;隐式反馈数据(仅有点击、曝光记录,无显式评分)且希望直接优化"正例排在负例前"的相对关系;精排阶段需要增强排序能力而非仅关注概率校准的情况。
Pairwise方法直接建模相对排序,与AUC等排序指标在优化方向上更为一致。通过调整负样本采样策略,可以有效控制模型学习的难度边界,在合适的负样本分布下收敛速度快于Pointwise方法。
Pairwise方法的主要挑战是训练复杂度。每个正样本需要配对多个负样本,样本对数量随负样本数线性增长。更关键的是,方法效果高度依赖负样本质量。随机负采样多为简单负样本,对模型提升有限;困难负样本(模型当前容易混淆的负样本)训练效率高,但采样成本大且容易引入噪声导致过拟合。
Pairwise方法的工程实践
在隐式反馈场景下,BPR Loss应作为标准基线。初始配置为每个正样本随机采样1到5个负样本,学习率设置为\(10^{-4}\)到\(10^{-3}\),L2正则化系数为\(10^{-5}\)到\(10^{-4}\)。
负采样策略对效果影响显著。推荐采用混合策略:70%随机负采样(保证样本多样性)加30%困难负采样(基于当前模型分数排序,选择分数较高但实际为负的样本)。困难负采样应每隔若干个epoch更新一次采样池,避免过度拟合过时的困难样本。
为防止过拟合困难负样本,必须加强正则化。除L2正则外,可增加dropout(rate=0.1到0.3)或采用更保守的学习率。如果验证集AUC提升但线上效果下降,通常是过拟合困难负样本的信号,应减少困难负样本比例或增强正则化。
Pairwise方法的学习率通常需要小于Pointwise方法。这是因为Pairwise梯度来自样本对的差异,相比单样本梯度更加不稳定,过大的学习率容易导致训练震荡。
第三部分:Listwise损失函数——整体列表的全局优化
Listwise方法将整个候选列表作为优化对象,直接建模列表级别的排序质量。与Pairwise方法相比,Listwise不局限于两两比较,而是考虑所有候选物品之间的全局关系。在推荐系统中,Listwise方法主要应用于召回阶段,将问题建模为大规模多分类任务。
InfoNCE Loss与对比学习
InfoNCE(Noise Contrastive Estimation的一个变体)是当前召回阶段最主流的Listwise方法。该方法将召回问题视为在所有候选物品中识别正样本的多分类任务,通过对比学习框架训练用户和物品的向量表示。
对于用户\(u\)及其对应的正样本物品\(i^+\),在一个包含\(B\)个物品的批次中,InfoNCE损失定义为:
\[L_{InfoNCE} = -\log \frac{\exp(f(v_u, v_{i^+})/\tau)}{\sum_{j=1}^{B} \exp(f(v_u, v_j)/\tau)}\]
其中\(v_u\)为用户向量,\(v_{i^+}\)为正样本物品向量,\(f(\cdot, \cdot)\)为相似度函数(通常为内积或余弦相似度),\(\tau\)为温度参数。分母遍历批次内所有\(B\)个物品,其中包含1个正样本和\(B-1\)个负样本。
InfoNCE的核心机制是批内负采样(In-Batch Negative Sampling)。每个训练批次中,用户\(u\)的正样本为\(i^+\),而批次内其他用户的正样本自动成为用户\(u\)的负样本。这种设计极大提高了训练效率:在批大小为1024的情况下,每个样本实际上与1023个负样本进行了对比,而无需额外采样。
温度参数\(\tau\)控制分布的锐度。\(\tau\)越小,分布越尖锐,模型对相似度差异越敏感;\(\tau\)越大,分布越平滑,模型更宽容。典型取值范围为0.05到0.2,需要根据具体任务调优。温度参数与批大小存在耦合关系:批大小越大,负样本越多,通常需要更小的温度以维持训练稳定性。
InfoNCE要求用户向量和物品向量的相似度计算为内积或余弦相似度。实践中强烈建议对向量进行L2归一化,使用余弦相似度。归一化后,所有向量位于单位超球面上,避免了向量模长的影响,使得相似度计算更加稳定,同时与后续的ANN检索(如FAISS的内积索引)兼容性更好。
Sampled Softmax Loss
Sampled Softmax Loss是另一种近似全量多分类的Listwise方法。当候选物品数量达到百万甚至亿级时,无法计算完整的softmax分母(需要遍历所有物品)。Sampled Softmax通过采样近似,并对采样偏差进行校正。
对于正样本\(k\)和从噪声分布\(Q\)中采样的负样本集合\(S_{neg}\),Sampled Softmax损失定义为:
\[L_{SS} = -\log \frac{\exp(\hat{y}_k - \log Q_k)}{\exp(\hat{y}_k - \log Q_k) + \sum_{j \in S_{neg}} \exp(\hat{y}_j - \log Q_j)}\]
其中\(\hat{y}_i\)为模型对物品\(i\)的原始打分(logits),\(Q_i\)为物品\(i\)在噪声分布中的采样概率。减去\(\log Q_i\)的操作是关键:它对采样过程引入的偏差进行校正,使得该损失在数学上成为完整softmax损失的无偏估计。
Sampled Softmax的采样分布\(Q\)通常设置为物品的流行度分布(点击次数或曝光次数的归一化)。流行度采样相比均匀采样能提供更多信息量:热门物品作为负样本出现频率更高,迫使模型学习更细粒度的区分能力。典型的采样负样本数量为数百到数千个。
Sampled Softmax的理论性质优于简单的负采样方法(如不带校正的负采样),但实现复杂度也更高。需要维护物品的流行度统计,计算采样概率,并在损失计算中加入校正项。工程上需要确保采样过程的高效性,避免成为训练瓶颈。
Listwise方法的适用场景与优势
Listwise方法专门为召回阶段设计,适用于需要从大规模候选集中检索相关物品的场景。评估指标通常为Recall@K、Hit Rate@K或MRR(Mean Reciprocal Rank)。
Listwise方法的核心优势在于学习高质量的向量表示。通过对比学习或多分类框架,模型被迫在向量空间中将正样本拉近,负样本推远,形成良好的聚类结构。这种向量表示支持高效的ANN检索,可以在毫秒级延迟内从百万候选中检索Top-K。
相比Pointwise和Pairwise方法,Listwise方法能够同时利用多个负样本的信息。在InfoNCE中,一个批次的\(B-1\)个负样本共同参与梯度计算,提供了更丰富的对比信号。这使得Listwise方法在相同训练步数下,学习效率显著高于仅使用少量负样本的Pairwise方法。
Listwise方法的工程实践
InfoNCE应作为召回阶段的首选方法。关键配置参数包括:批大小应尽可能大,推荐1024以上。如果GPU显存受限,可以使用梯度累积技术,在多个小批次上累积梯度后再更新参数,模拟大批次效果。
如果单卡无法支撑大批次训练,可以采用Memory Bank或MoCo(Momentum Contrast)机制。Memory Bank维护一个缓存队列,存储历史批次的物品向量,当前批次可以使用队列中的向量作为额外的负样本。MoCo进一步引入动量编码器,使得队列中的向量表示保持一定的一致性。这些技术可以在有限显存下实现数千甚至数万负样本的对比学习。
温度参数\(\tau\)的调优至关重要。推荐的调优策略是:从0.1开始,观察训练曲线。如果损失下降过快且验证集指标不佳,说明温度过小,模型过度关注困难样本;如果损失下降缓慢,说明温度过大,可以适当减小。典型的最优温度在0.05到0.1之间。
向量必须进行L2归一化。归一化后使用内积计算相似度,等价于余弦相似度。这不仅稳定训练,还与FAISS等ANN库的内积索引无缝对接,简化部署流程。向量维度的选择需要平衡表达能力与检索效率,128到512维是常见的折中选择。
负采样策略应采用混合方式。批内负采样提供基础的多样性,但可以额外加入流行度负采样(按点击次数加权采样热门物品)或困难负采样(基于当前模型召回但未被点击的物品)。混合比例可以设置为批内负采样占80%,额外负采样占20%。困难负采样每隔5到10个epoch更新一次采样池。
第四部分:损失函数选型的决策框架
损失函数的选择必须基于明确的优化目标与约束条件。以下决策框架按照实际工程场景提供具体的选型指导。
场景一:召回阶段的向量检索系统
优化目标:从百万至亿级候选集中检索出Top-K相关物品,最大化Recall@K或Hit Rate@K。
约束条件:检索延迟要求毫秒级,必须支持ANN索引;模型需要输出用户和物品的固定维度向量表示。
推荐方案:InfoNCE作为首选,Sampled Softmax作为备选。
具体配置:使用批大小1024或更大的InfoNCE训练,温度参数从0.07开始调优(搜索范围0.05到0.15),向量维度256或512,对所有向量进行L2归一化后使用内积计算相似度。负采样采用批内负采样为主(占80%),混合流行度负采样(占20%)。如果显存受限,使用梯度累积或Memory Bank技术扩大有效批大小。训练时每隔5个epoch在验证集上评估Recall@100和Recall@500,选择验证集指标最优的模型。
实施要点:召回模型的训练目标与在线检索流程必须一致。如果训练时使用余弦相似度(L2归一化+内积),部署时必须使用FAISS的内积索引且对向量归一化。温度参数和批大小存在强耦合,必须联合调优。批大小翻倍时,温度通常需要减小10%到20%以维持训练稳定性。
场景二:隐式反馈的排序优化
优化目标:在用户点击数据(仅有正向交互记录)上训练排序模型,最大化AUC或NDCG@K。
约束条件:无显式负样本标注,需要通过采样构造训练样本对;评估指标关注相对排序而非绝对概率。
推荐方案:BPR Loss作为首选。
具体配置:每个正样本配对3到5个负样本,负样本采样采用混合策略(70%随机+30%困难负样本)。学习率设置为\(5 \times 10^{-4}\),L2正则化系数\(10^{-5}\),dropout rate为0.2。困难负样本每5个epoch重新采样,选择模型当前打分前20%但实际未交互的物品。训练时监控验证集AUC和NDCG@20,如果验证集AUC上升但线上A/B测试效果下降,说明过拟合困难负样本,应减少困难负样本比例至10%或增强正则化。
实施要点:BPR Loss对负采样策略极度敏感。纯随机负采样虽然稳定但提升有限(多为简单负样本),困难负采样训练效率高但容易过拟合。实践中必须采用混合策略并通过A/B测试验证。困难负样本的更新频率也很关键:更新过频导致训练不稳定,更新过慢导致采样分布陈旧。每5到10个epoch更新一次是经验性的平衡点。
场景三:精排阶段的CTR预估
优化目标:预测用户点击概率,输出需要校准良好,用于后续的排序决策或业务指标计算(如eCPM)。
约束条件:正负样本严重不平衡(点击率通常1%到5%),需要输出可解释的概率值。
推荐方案:二元交叉熵(BCE)作为首选,Focal Loss用于极度不平衡情况。
具体配置:如果正样本比例高于1%,直接使用标准BCE。如果正样本比例低于1%,使用Focal Loss,聚焦参数\(\gamma=2\),平衡因子\(\alpha\)设置为\(1/(1+负正比)\)(例如正负比1:99时\(\alpha=0.01\))。训练完成后,在验证集上使用temperature scaling进行概率校准:寻找最优温度系数\(T\)使得\(\sigma(\text{logits}/T)\)的输出概率与真实点击率的期望校准误差(ECE)最小。最终部署模型时,输出层的logits需要除以校准温度后再应用sigmoid。
实施要点:精排模型的概率校准至关重要。即使训练损失收敛良好,输出的原始概率往往存在系统性偏差(过高或过低)。必须在与训练集分布一致的验证集上进行校准,不能使用训练集(会导致过拟合校准参数)。校准后的模型应在线上持续监控预测CTR与真实CTR的一致性,如果发现偏差需要重新校准或更新模型。
场景四:精排阶段同时优化概率与排序
优化目标:既需要准确的点击概率(用于业务决策),又需要良好的排序效果(直接影响用户体验)。
约束条件:单一损失函数难以同时优化概率校准和排序指标。
推荐方案:混合损失函数,主损失使用BCE,辅助损失使用Pairwise方法(BPR或RankNet)。
具体配置:总损失为\(L = \lambda_1 L_{BCE} + \lambda_2 L_{Pairwise}\),权重系数从\(\lambda_1=0.9, \lambda_2=0.1\)开始调优。Pairwise损失中每个正样本配对1到3个负样本(相比纯Pairwise方法减少负样本数以控制计算量)。负采样策略为:在当前批次内,选择预测概率高于正样本但实际未点击的物品作为负样本(batch内困难负采样)。权重系数的调优应基于验证集的综合指标:同时监控AUC(排序指标)和Log Loss(概率指标),选择两者权衡最优的配置。
实施要点:混合损失的权重系数决定了模型在概率与排序之间的倾向。如果\(\lambda_2\)过大,模型会牺牲概率的准确性追求排序效果,输出的概率可能失去校准;如果\(\lambda_2\)过小,引入Pairwise损失的意义不大。推荐的调优策略是固定\(\lambda_1=1\),搜索\(\lambda_2 \in \{0.05, 0.1, 0.2, 0.5\}\),在验证集上选择AUC提升最大且Log Loss增加可接受(增幅小于5%)的配置。混合损失的训练通常需要更多epoch才能收敛,学习率可以适当减小(相比纯BCE减小20%到30%)。
场景五:冷启动与预训练场景
优化目标:在大规模未标注或弱标注数据上预训练通用表示,再迁移到下游任务微调。
约束条件:预训练数据可能仅有曝光或共现信息,无显式点击标签。
推荐方案:预训练阶段使用InfoNCE,微调阶段使用任务相关损失(召回用InfoNCE,精排用BCE)。
具体配置:预训练阶段以用户行为序列为正样本对(例如同一session内的物品或连续点击的物品),批内其他样本为负样本,使用InfoNCE训练物品向量。预训练完成后固定物品向量(或使用小学习率微调),在有标注的下游任务上训练用户塔和输出层。如果下游任务是召回,继续使用InfoNCE但增加下游任务特有的负样本(如真实曝光未点击的物品);如果下游任务是精排,替换为BCE损失并添加预测层。预训练与微调的学习率比例通常为10:1(预训练学习率\(10^{-3}\),微调学习率\(10^{-4}\))。
实施要点:预训练的目标是学习通用的物品表示,应使用多样化的正样本对构造方式(共现、序列、时序相邻等),避免过度偏向某种特定模式。微调时必须防止灾难性遗忘:固定预训练的embedding层或使用极小的学习率,仅更新任务相关的上层参数。预训练模型的质量可以通过物品向量的最近邻检索评估:手工选择若干测试物品,检索其Top-K最近邻,判断语义相关性。
场景六:多目标优化
优化目标:同时优化多个业务指标(如CTR和CVR),或在召回和精排阶段联合训练。
约束条件:不同目标可能存在冲突(例如高CTR低CVR的物品),需要平衡。
推荐方案:多任务学习框架,每个任务使用独立的损失函数,通过权重系数或动态平衡策略聚合。
具体配置:总损失为\(L = \lambda_{CTR} L_{CTR} + \lambda_{CVR} L_{CVR}\),其中\(L_{CTR}\)使用BCE,\(L_{CVR}\)使用BCE。两个任务共享底层embedding和特征提取网络,分别使用独立的输出层(tower结构)。权重系数可以设置为静态(如1:1或根据样本量倒数加权),或使用不确定性加权等动态方法。训练时交替采样CTR和CVR样本,或在每个batch内混合两种样本。验证时分别评估两个任务的指标(CTR的AUC,CVR的AUC),以及组合指标(如eCPM = pCTR × pCVR × bid)。
实施要点:多任务学习的核心挑战是任务间的干扰与平衡。如果某个任务的损失值远大于另一个任务(例如CVR的正样本更稀疏导致loss更大),梯度会被主导任务支配,次要任务学习不充分。必须对损失值进行归一化或使用自适应权重方法(如uncertainty weighting)。另一个常见问题是负迁移:共享表示反而降低了某个任务的性能。可以通过逐步增加共享层的深度或使用MMoE(Multi-gate Mixture-of-Experts)等架构缓解。
第五部分:混合策略与高级技术
在实际工程中,单一损失函数往往无法满足复杂的业务需求。以下混合策略在工业界已被验证有效。
预训练与微调的Pipeline策略
召回和精排两个阶段的优化目标存在本质差异:召回关注向量空间的区分性,精排关注概率的准确性。直接在精排数据上训练召回模型,或反之,都会导致次优结果。更有效的策略是分阶段训练:使用InfoNCE在大规模召回数据上预训练,学习高质量的向量表示;然后在精排数据上使用BCE微调,校准概率输出。
这一策略的核心逻辑是:预训练阶段利用海量的弱标注数据(曝光-点击对)学习物品的语义表示,微调阶段利用小规模的强标注数据(精准的点击标签)学习用户偏好的细粒度模式。预训练提供了良好的初始化,避免了从随机初始化开始的不稳定性和数据需求。
具体实施时,预训练阶段使用批大小2048的InfoNCE,温度0.07,训练100个epoch直到召回指标饱和。微调阶段固定物品embedding层(或使用\(10^{-5}\)的极小学习率),仅训练用户塔和输出层,使用BCE损失,学习率\(5 \times 10^{-4}\),训练20到30个epoch。这一方案在多个工业场景中被证明相比端到端训练提升3%到5%的线上CTR。
知识蒸馏的跨阶段迁移
精排模型通常使用复杂特征和深层网络,具有更强的拟合能力,但无法部署在召回阶段(计算量过大)。知识蒸馏可以将精排模型的知识迁移到召回模型,提升召回阶段的排序能力。
蒸馏的实施方式是:使用已训练好的精排模型(教师)对召回候选进行打分,得到软标签(soft label)。召回模型(学生)不仅学习原始的硬标签(点击/未点击),还学习拟合教师模型的输出分布。损失函数为硬标签的交叉熵与软标签的KL散度的加权和:
\[L = \alpha L_{hard} + (1-\alpha) L_{soft}\]
其中\(L_{hard} = -[y \log p + (1-y) \log(1-p)]\)为标准BCE,\(L_{soft} = \sum_i q_i \log(q_i / p_i)\)为教师分布\(q\)与学生分布\(p\)之间的KL散度,\(\alpha\)为平衡系数,通常取0.5到0.7。
蒸馏的关键在于教师模型的质量和蒸馏温度的设置。教师模型应在精排阶段达到最优性能后再用于蒸馏。蒸馏温度\(T\)(将logits除以\(T\)后再softmax)控制软标签的平滑程度,\(T=3\)到\(T=5\)是常见选择。温度过高会使软标签过于平滑,损失信息;温度过低退化为硬标签,蒸馏失去意义。
课程学习与负样本采样的渐进式训练
困难负样本能够显著提升模型的区分能力,但如果训练初期就使用大量困难负样本,模型容易陷入局部最优或过拟合噪声。课程学习(Curriculum Learning)提供了渐进式的解决方案:训练初期使用简单负样本(随机采样),中期逐步引入困难负样本,后期以困难负样本为主。
具体实施策略为:定义困难负样本为模型当前打分Top-K但实际未交互的物品。前30%训练步数使用100%随机负样本;中间40%训练步数线性增加困难负样本比例从0到50%;最后30%训练步数固定50%困难负样本+50%随机负样本。困难负样本池每5个epoch更新一次。
这一策略的理论基础是:训练初期模型判别能力弱,随机负样本已经提供足够的学习信号;训练中后期模型已学会基本的区分模式,需要困难样本推动边界扩展;但始终保留一定比例的随机负样本以防止过拟合和保持泛化能力。实验表明,课程学习相比固定比例的混合策略,能够提升1%到2%的AUC,且训练过程更稳定。
多任务联合训练与参数共享
在推荐系统中,用户的点击、转化、停留时长等多个行为信号往往同时可用。多任务学习通过共享底层表示同时优化多个目标,能够提升数据利用效率并学习更通用的特征。
经典的多任务架构是Shared-Bottom结构:底层的embedding层和若干隐藏层由所有任务共享,顶层为每个任务设置独立的tower和输出层。损失函数为各任务损失的加权和。这种架构的优势是参数共享程度高,训练高效;劣势是可能存在负迁移(某些任务的优化目标冲突,共享表示对某个任务不利)。
更先进的架构如MMoE(Multi-gate Mixture-of-Experts)和PLE(Progressive Layered Extraction)引入了专家网络和门控机制。每个任务通过门控网络动态选择不同专家的输出组合,允许任务间有选择地共享信息。这些架构在任务差异较大时表现优于Shared-Bottom,但参数量和计算量也相应增加。
实施多任务学习时,必须注意任务间的权重平衡。如果不同任务的样本量或损失值量级差异巨大(例如点击样本远多于转化样本),可以使用uncertainty weighting或GradNorm等自适应权重方法。另一个实践经验是:主任务(业务最关心的指标)的权重应始终最大,辅助任务的权重不宜过高(通常主任务权重占总权重的60%以上),避免主任务被稀释。
第六部分:工程实施的关键问题
假负样本问题与缓解策略
推荐系统中最大的标注噪声来源是假负样本(False Negatives):用户未交互的物品不一定是不感兴趣的,可能仅仅因为未曝光。这一问题在召回和精排阶段都存在,但表现形式不同。
在召回阶段,假负样本主要来自批内负采样和随机负采样。缓解策略包括:使用曝光日志进行label-aware采样,即仅从已曝光但未点击的物品中采样负样本,避免将未曝光的相关物品误判为负样本;引入倾向性评分(Propensity Score)对负样本加权,流行物品被曝光概率高,未点击的可信度也高,权重应大于长尾物品;使用多种行为信号(停留时长、收藏、评论)辅助判断用户兴趣,而非仅依赖点击。
在精排阶段,假负样本的影响更加直接。精排数据通常来自召回结果,已经过一轮粗筛,假负样本比例相对较低。但仍需注意:对于未点击但被用户深度浏览(停留时间长)的物品,应降低其负样本权重或使用半监督方法;定期更新训练数据,避免使用过时的负样本(用户兴趣会随时间变化)。
温度参数与批大小的耦合关系
在InfoNCE等对比学习方法中,温度参数\(\tau\)和批大小\(B\)存在强耦合关系,必须联合调优。这一耦合的根源在于:批大小决定了负样本数量,负样本数量影响分母的稳定性和梯度的方差;温度参数控制softmax分布的锐度,影响模型对相似度差异的敏感性。
当批大小增大时,负样本数量增加,分母中的指数项变多,即使正样本与用户的相似度较高,分母的值也可能很大(因为存在一些困难负样本与用户也有一定相似度)。为保持训练的稳定性和收敛速度,需要降低温度参数,增强对相似度差异的敏感性,使得正样本相对于负样本的优势更加明显。
经验法则是:批大小从512增加到1024时,温度应从0.1减小到0.07(减小约30%);批大小从1024增加到2048时,温度应从0.07减小到0.05。这些是起始点,实际最优值需要通过验证集指标搜索。调优策略为固定批大小,在\(\tau \in \{0.03, 0.05, 0.07, 0.1, 0.15, 0.2\}\)中搜索;或固定温度,在批大小\(\{512, 1024, 2048, 4096\}\)中搜索。
向量归一化与相似度计算的一致性
召回阶段学习的向量表示最终需要部署到ANN检索系统(如FAISS)。训练过程中使用的相似度计算方式必须与检索系统一致,否则会导致训练与推理的不匹配。
推荐的标准做法是:训练时对所有向量进行L2归一化,使用内积计算相似度(等价于余弦相似度);部署时使用FAISS的内积索引(IndexFlatIP或IndexIVFFlat with METRIC_INNER_PRODUCT),并确保所有待检索向量在入库前进行归一化。
具体实施时,在模型的embedding输出层后添加归一化操作:embedding = F.normalize(embedding, p=2, dim=-1)。相似度计算使用torch.matmul(user_emb, item_emb.T),无需额外的cosine函数。训练完成后导出向量时,再次确认归一化已应用。部署时在向量入库前检查向量模长(应全部为1.0),避免因疏忽导致的不一致。
一个常见错误是训练时使用余弦相似度但未归一化向量,部署时使用欧氏距离索引。这会导致检索结果与训练目标完全不符。另一个错误是训练时归一化但部署时忘记归一化,导致向量模长差异影响检索质量。必须建立严格的检查流程,确保训练与部署的一致性。
损失函数与评估指标的对齐
训练损失函数是优化的直接目标,但业务关心的是评估指标(线上CTR、GMV等)。两者之间的不一致是推荐系统中最常见的陷阱之一。
在召回阶段,InfoNCE损失优化的是对比学习目标,与Recall@K有较强的相关性,但并非完全一致。InfoNCE倾向于让正样本排在所有负样本之前,但不关心正样本的具体排名位置;而Recall@K只关心正样本是否在Top-K中。为缓解这一差异,可以在损失函数中引入排名感知的权重:对分母中排名靠前的困难负样本赋予更大权重,迫使模型更关注Top-K的准确性。
在精排阶段,BCE损失优化的是概率的准确性,但业务指标可能是CTR(排序相关)或GMV(需要综合CTR和CVR)。如果仅使用BCE,模型可能学会准确预测概率但排序能力不足。解决方案是引入Pairwise或Listwise损失作为辅助,或在评估时同时监控Log Loss和AUC,确保两者都在可接受范围内。
更根本的解决方案是在线A/B测试。离线指标的提升不一定转化为线上收益(可能存在位置偏差、选择偏差等)。任何损失函数的变更都应通过小流量A/B测试验证,观察线上CTR、停留时长、GMV等业务指标的真实变化。只有线上验证通过的改进才应全量上线。
过拟合困难负样本的识别与防范
困难负样本是提升模型区分能力的关键,但也是过拟合的重灾区。困难负样本通常是模型当前认为相关但实际未交互的物品,这其中混杂了真负样本(确实不相关)和假负样本(因曝光偏差等原因未交互)。如果模型过度拟合这些噪声样本,会损害泛化能力。
过拟合困难负样本的典型症状是:训练集损失持续下降,验证集损失开始上升或震荡;验证集AUC上升但线上CTR下降或持平;模型对困难负样本的预测分数过低,与真实用户行为不符(可通过人工检查困难负样本的质量验证)。
防范策略包括:限制困难负样本的比例,不超过总负样本的50%;增大L2正则化系数(从\(10^{-5}\)增至\(10^{-4}\))或增加dropout(从0.1增至0.3);使用早停(Early Stopping),在验证集指标开始下降时停止训练;定期更新困难负样本池(每5到10个epoch),避免过度拟合陈旧的困难样本;使用标签平滑(Label Smoothing),将硬标签0/1软化为0.1/0.9,降低对单个样本的过拟合。
在实施困难负采样时,应建立监控机制:每个epoch结束后,在验证集上评估模型对困难负样本的平均预测分数。如果该分数持续下降并远低于随机负样本的分数(例如困难负样本平均分数 |