AAAI 2025 UC Berkeley、阿里提出NMT,四行代码解决搜推任务中的目标冲突问题

©PaperWeekly 原创 · 作者 | 咕咕

背景:工业界中的目标冲突问题

在工业界实际的搜广推系统中,一个模型通常需要兼顾多个目标。例如,在通用搜索场景中,需要兼顾 CTR、相关性、商业化效率等目标;在电商推荐中,需要同时兼顾成交效率、丰富性等目标。

在实践中,我们发现,绝大多数目标之间或多或少都存在目标冲突的问题,多个目标之间往往不能兼得。例如,在电商推荐系统中,如果希望最大化成交效率,通常在丰富性上会有较大的损失。一个更常见的例子是广告收入和自然流量效率之间的矛盾,两者的此消彼长几乎存在于所有广告系统中。

常见的解决方案是一个多目标学习策略(Multi-task Learning, MTL),即在损失函数中,同时加入多个目标的 loss,并使用 loss 的权重来调整不同目标对模型带来的影响。然而,权重调整是一个费心费力的工作,经常会出现“面多了加水,水多了加面”这样的重复劳动。

此外,多目标学习中,没有考虑到目标之间的优先级,如果存在一个高优先级、牢不可破的目标,那么加入的次优先级的目标几乎一定会破坏高优先级目标的学习。这样一来,就无法保证高优先级目标的不可破坏性。

举一个简单的例子,我们希望同时兼顾系统的相关性和广告收入。我们的目标是在用户体验(即相关性)不受影响的情况下,尽可能最大化广告收入。基于权重调整的方法就会尝试不同的广告收入对应的权重。

然而,这种权重的调整是极其困难的,通常会出现权重过大就影响了相关性、权重过小就不能最大化广告收入这一尴尬境地。并且,如果目标增多至三个、四个,这种权重调整的方法就会变得无比困难。

在这篇工作中,作者提出了一个被称为 NMT 的方法。该方法旨在解决多目标学习中,建模高优先级目标的方式。在 NMT 方法中,不需要调整参数,就可以实现在高优先级目标不受破坏的前提下,最大化次有目标的效果。代码实现只有四行,感兴趣的读者可以直接跳到附录部分。

论文标题:

No More Tuning: Prioritized Multi-Task Learning with Lagrangian Differential Multiplier Methods

论文链接:

https://arxiv.org/abs/2412.12092

建模:高优先级目标的强约束

不失一般性,我们先讨论只有两个目标的情况。我们定义两个目标:,其中 是高优先级目标, 是低优先级目标。业务上,我们需要对目标 做强保证,即在加入 目标的时候,模型在目标 上的表现不能被减弱。
对于两个目标,我们分别将其建模为机器学习中的两个损失函数 ,则我们的任务可以建模为:
其中, 的极小值点,可以通过优化 容易地得到。

得到了上述问题,我们就需要在神经网络的框架下来求解这个带约束的优化问题。于是,我们把带优先目标的多目标优化建模成了两个阶段:

阶段 1,只优化高优先目标 直到模型收敛,获得高优先目标的最优解
阶段 2,以高优先目标为约束,优化低优先目标

阶段 1 只需要使用标准的优化流程(如梯度下降)即可解决。但对于阶段 2,基于梯度的方法无法直接优化带约束的优化任务。在 2.2 中我们将重点讨论如何在目前基于梯度的优化框架下,优化带约束的最优化任务。

下图展示了 NMT 方法的优化过程。在第一阶段,NMT 方法首先专注于优化高优先级任务。在高优先级任务被优化到最优后,NMT 方法开始在高优先级任务的约束下,优化低优先级任务。在第二阶段中,低优先级任务的优化始终受到高优先级任务的约束,因此可以做到低优先级任务不对高优先级任务产生影响。

实现:基于梯度的拉格朗日最优化
本节中,我们讨论如何使用基于梯度的方法解优化问题:

解决带约束的优化问题,基本的思路就是把带约束的优化问题转化为无约束的优化问题。不难想到,我们可以用拉格朗日乘子法来解决这个问题。

上述问题的拉格朗日函数为:
其对应的 KKT 条件为:
KKT 条件要求我们找到拉格朗日函数 的驻点,即为优化问题的解。然而我们知道,梯度下降法只寻找函数的最小值,不能用来寻找函数的驻点,因此该目标不能直接使用梯度下降法求解。我们旨在找到一种能够和目前优化框架(梯度下降)完全兼容的优化手段。
基于这个思路,我们提出了 NMT 方法。我们提出,只需要在正常神经网络参数 做梯度下降的同时,对拉格朗日函数中的 做梯度上升,即可达到优化目标。不难看出,,因此 每次的更新公式为
我们在论文中对这部分内容作了详细的理论分析,有兴趣的同学请参阅论文《No More Tuning: Prioritized Multi-Task Learning with Lagrangian Differential Multiplier Methods》的 Theoretical Analysis 一节。本文将不再对理论部分做深入探讨。
因此,在第二阶段,我们的优化目标变成拉格朗日函数 ,在对 做梯度下降的同时,对 梯度上升即可。

重缩放技巧

在实验的过程中,我们发现当参数 较大时,损失函数的约束项 会变得非常大,从而导致在梯度下降中参数 发生大幅度的更新。这些过大幅度的更新可能会使学习过程不稳定。鉴于此,在更新 时,我们采用了重缩放的损失函数。在对 进行梯度下降时,损失函数形式为:

这种重缩放的形式确保了每个损失的组合是一个规范化的凸组合,从而防止了损失函数可能出现的爆炸现象。在我们的所有实验中,优化过程中均纳入此重缩放的损失函数形式。实验表明,重缩放技巧会显著提高训练过程的稳定性。

总结:方法流程
4.1 总体流程

基于上述讨论,我们总结了 NMT 的总体流程。NMT 分为两个主要阶段:

1. 优化主要任务首先,我们对第一个任务(主要任务)进行优化,以找到能够最小化目标函数 的参数 。这个阶段会持续进行,直到目标函数收敛为止。
2. 迭代优化剩余任务在主要任务优化完成后,我们会优化低优先级的任务。对于次要任务,我们将模型参数初始化为 ,并将拉格朗日乘数设置为初始值 。接着,利用梯度下降算法更新模型参数,同时用梯度上升算法更新拉格朗日乘数。这个过程会持续到收敛为止。
4.2 迈向更多目标:任意 个有序目标的联合优化
前文中,我们讨论了 NMT 应用在两个目标上的方法。上述框架可以自然地扩展到任意数量的任务,这些任务通过损失函数 表示,其中任务 1 具有最高优先级,而任务 具有最低优先级。问题可以表述为:

优化步骤如下:

1. 最小化 (最高优先级)以获得
2. 在 的约束条件下,最小化 (次优先级)以获得
3. 在 的约束条件下,最小化 (再次优先级)以获得

4.针对后续任务继续该过程。

对于每个任务 ,问题的表述为:
这种方法确保每个任务 按顺序被优化直到第 个任务,同时保留所有更高优先级任务的最优值。
算法:用于 个任务的 NMT 算法

输入:

  • :模型参数的学习率
  • :拉格朗日乘子的学习率
  • :任务 的目标函数 ()
  • :拉格朗日乘子的初始值
步骤:
步骤 1:优化主要任务(任务1)以最小化 ,直到收敛。将优化后的参数保存为
对于每个任务 从 2 到
  • 使用 初始化 ,使用 初始化 ,其中
  • 重复以下步骤直到收敛:

    1. 计算任务 的聚合损失:

    2. 使用梯度下降更新

    3. 使用梯度上升更新每个

  • 用优化后的 更新

Appendix: 代码实现

# clip for stability  
diff = tf.clip_by_value(primary_loss - optimal_primary_loss, clip_value_min=-1, clip_value_max=1)

# update lambda
# lagrange_lr is a hyper-parameter
lagrange_mul = tf.assign(lagrange_mul, tf.clip_by_value(tf.assign_add(lagrange_mul, training_config.lagrange_lr * diff),
clip_value_min=0,
clip_value_max=training_config.lagrange_clip))

lagrange_loss = self.lagrange_mul * (primary_loss - optimal_primary_loss)

# use re-scaling method
final_loss = (secondary_loss + lagrange_loss) * (1 / (1 + self.lagrange_mul))

(文:PaperWeekly)

发表评论