Skip to content

Latest commit

 

History

History
248 lines (196 loc) · 13.1 KB

File metadata and controls

248 lines (196 loc) · 13.1 KB

损失函数

EasyRec支持两种损失函数配置方式:1)使用单个损失函数;2)使用多个损失函数。

使用单个损失函数

损失函数 说明
CLASSIFICATION 分类Loss,二分类为sigmoid_cross_entropy;多分类为softmax_cross_entropy
L2_LOSS 平方损失
SIGMOID_L2_LOSS 对sigmoid函数的结果计算平方损失
CROSS_ENTROPY_LOSS log loss 负对数损失
BINARY_CROSS_ENTROPY_LOSS 仅用在知识蒸馏中的BCE损失
KL_DIVERGENCE_LOSS 仅用在知识蒸馏中的KL散度损失
CIRCLE_LOSS CoMetricLearningI2I模型专用
MULTI_SIMILARITY_LOSS CoMetricLearningI2I模型专用
SOFTMAX_CROSS_ENTROPY_WITH_NEGATIVE_MINING 自动负采样版本的多分类softmax_cross_entropy,用在二分类任务中
BINARY_FOCAL_LOSS 支持困难样本挖掘和类别平衡的focal loss
PAIR_WISE_LOSS 以优化全局AUC为目标的rank loss
PAIRWISE_FOCAL_LOSS pair粒度的focal loss, 支持自定义pair分组
PAIRWISE_LOGISTIC_LOSS pair粒度的logistic loss, 支持自定义pair分组
PAIRWISE_HINGE_LOSS pair粒度的hinge loss, 支持自定义pair分组
JRC_LOSS 二分类 + listwise ranking loss
F1_REWEIGHTED_LOSS 可以调整二分类召回率和准确率相对权重的损失函数,可有效对抗正负样本不平衡问题
ORDER_CALIBRATE_LOSS 使用目标依赖关系校正预测结果的辅助损失函数,详见AITM模型
LISTWISE_RANK_LOSS listwise的排序损失
LISTWISE_DISTILL_LOSS 用来蒸馏给定list排序的损失函数,与listwise rank loss 比较类似
ZILN_LOSS LTV预测任务的损失函数(num_class必须设置为3)
  • ZILN_LOSS:使用时模型有3个可选的输出(在多目标任务重,输出名有一个目标相关的后缀)
    • probs: 预估的转化概率
    • y: 预估的LTV值
    • logits: Shape为[batch_size, 3]的tensor,第一列是probs,第二列和第三列是学习到的LogNormal分布的均值与方差
  • 说明:SOFTMAX_CROSS_ENTROPY_WITH_NEGATIVE_MINING

配置

通过loss_type配置项指定使用哪个具体的损失函数,默认值为CLASSIFICATION

  {
    loss_type: L2_LOSS
  }

使用多个损失函数

目前所有排序模型,包括多目标模型(ESMM模型除外),和部分召回模型(如DropoutNet)支持同时使用多个损失函数,并且可以为每个损失函数配置不同的权重。

配置

下面的配置可以同时使用F1_REWEIGHTED_LOSSPAIR_WISE_LOSS,总的loss为这两个损失函数的加权求和。

  losses {
    loss_type: F1_REWEIGHTED_LOSS
    weight: 1.0
    f1_reweighted_loss {
      f1_beta_square: 0.5625
    }
  }
  losses {
    loss_type: PAIR_WISE_LOSS
    weight: 1.0
  }
  • F1_REWEIGHTED_LOSS 的参数配置

    可以调节二分类模型recall/precision相对权重的损失函数,配置如下:

    {
      loss_type: F1_REWEIGHTED_LOSS
      f1_reweight_loss {
        f1_beta_square: 0.5625
      }
    }
    • f1_beta_square: 大于1的值会导致模型更关注recall,小于1的值会导致模型更关注precision
    • F1 分数,又称平衡F分数(balanced F Score),它被定义为精确率和召回率的调和平均数。
      • f1 score
    • 更一般的,我们定义 F_beta 分数为:
      • f_beta score
    • f1_beta_square 即为 上述公式中的 beta 系数的平方。
  • PAIRWISE_FOCAL_LOSS 的参数配置

    • gamma: focal loss的指数,默认值2.0
    • alpha: 调节样本权重的类别平衡参数,建议根据正负样本比例来配置alpha,即 alpha / (1-alpha) = #Neg / #Pos
    • session_name: pair分组的字段名,比如user_id
    • hinge_margin: 当pair的logit之差大于该参数值时,当前样本的loss为0,默认值为1.0
    • ohem_ratio: 困难样本的百分比,只有部分困难样本参与loss计算,默认值为1.0
    • temperature: 温度系数,logit除以该参数值后再参与计算,默认值为1.0
  • PAIRWISE_LOGISTIC_LOSS 的参数配置

    • session_name: pair分组的字段名,比如user_id
    • hinge_margin: 当pair的logit之差大于该参数值时,当前样本的loss为0,默认值为1.0
    • ohem_ratio: 困难样本的百分比,只有部分困难样本参与loss计算,默认值为1.0
    • temperature: 温度系数,logit除以该参数值后再参与计算,默认值为1.0
  • PAIRWISE_LOSS 的参数配置

    • session_name: pair分组的字段名,比如user_id
    • margin: 当pair的logit之差减去该参数值后再参与计算,即正负样本的logit之差至少要大于margin,默认值为0
    • temperature: 温度系数,logit除以该参数值后再参与计算,默认值为1.0
  • PAIRWISE_HINGE_LOSS 的参数配置

    • session_name: pair分组的字段名,比如user_id
    • temperature: 温度系数,logit除以该参数值后再参与计算,默认值为1.0
    • margin: 当pair的logit之差大于该参数值时,当前样本的loss为0,默认值为1.0
    • ohem_ratio: 困难样本的百分比,只有部分困难样本参与loss计算,默认值为1.0
    • label_is_logits: bool, 标记label是否为teacher模型的输出logits,默认为true
    • use_label_margin: bool, 是否使用输入pair的label的diff作为margin,设置为true时margin参数不生效,默认为true
    • use_exponent: bool, 是否对模型的输出做pairwise的指数变化,默认为false

备注:上述 PAIRWISE_*_LOSS 都是在mini-batch内构建正负样本pair,目标是让正负样本pair的logit相差尽可能大

  • BINARY_FOCAL_LOSS 的参数配置

    • gamma: focal loss的指数,默认值2.0
    • alpha: 调节样本权重的类别平衡参数,建议根据正负样本比例来配置alpha,即 alpha / (1-alpha) = #Neg / #Pos
    • ohem_ratio: 困难样本的百分比,只有部分困难样本参与loss计算,默认值为1.0
    • label_smoothing: 标签平滑系数
  • JRC_LOSS 的参数配置

    • alpha: ranking loss 与 calibration loss 的相对权重系数;不设置该值时,触发权重自适应学习
    • session_name: list分组的字段名,比如user_id
    • 参考论文:《 Joint Optimization of Ranking and Calibration with Contextualized Hybrid Model
    • 使用示例: dbmtl_with_jrc_loss.config
    • 有几个注意点:
      1. JRC_Loss不要和普通二分类loss一起使用,因为它内部已经包含了二分类loss了,最好是先单独使用
      2. JRC_Loss依赖mini-batch类的同session样本对,因此样本不能全局随机打散; 要把样本按照session_id 分组,同一组的样本需要shuffle到一起;(考验sql功力,如果搞不定不分组也可以,但需要保证同一个session的样本尽量排在一起,即group by session_id)
      3. 模型训练时batch_size尽可能大,在内存能够支撑的前提下batch_size调到最大(比如,8192)之后,再调整其他参数(如果需要的话)
  • LISTWISE_RANK_LOSS 的参数配置

    • temperature: 温度系数,logit除以该参数值后再参与计算,默认值为1.0
    • session_name: list分组的字段名,比如user_id
    • label_is_logits: bool, 标记label是否为teacher模型的输出logits,默认为false
    • scale_logits: bool, 是否需要对模型的logits进行线性缩放,默认为false
  • ZILN_LOSS 的参数配置

    • mu_regularization: mu参数的正则化系数,默认值为0.01
    • sigma_regularization: sigma参数的正则化系数,默认值为0.01
    • max_sigma: sigma参数的最大值,默认值为5.0(sigma>5 就会让均值乘上 exp(0.5*25) ≈ 2.7e5 的因子,已经很激进)
    • max_log_clip_value: log(预测值)的最大值,默认值为20.0(最大预测值默认为exp(20))
    • return_log_pred_value: 是否返回log(预测值),默认值为false
    • classification_weight: 分类任务的权重,默认值为1.0
    • regression_weight: 回归任务的权重,默认值为1.0;零值越多,建议分类权重越小,回归权重越大
    • 配置示例如下
      losses {
        loss_type: ZILN_LOSS
        weight: 1.0
        loss_name: "LTV"
        ziln_loss {
          mu_regularization: 0.01
          sigma_regularization: 0.01
          max_log_clip_value: 20.0
          max_sigma: 5.0
          return_log_pred_value: false
          classification_weight: 1.0
          regression_weight: 1.0
        }
      }

排序模型同时使用多个损失函数的完整示例: cmbf_with_multi_loss.config

多目标排序模型同时使用多个损失函数的完整示例: dbmtl_with_multi_loss.config

Loss权重自适应

多目标学习任务中,人工指定多个损失函数的固定权重通常不能获得最好的效果。EasyRec支持损失函数权重自适应学习,示例如下:

  loss_weight_strategy: Uncertainty
  losses {
    loss_type: CLASSIFICATION
    learn_loss_weight: true
  }
  losses {
    loss_type: BINARY_FOCAL_LOSS
    learn_loss_weight: true
    binary_focal_loss {
      gamma: 2.0
      alpha: 0.85
    }
  }
  losses {
    loss_type: PAIRWISE_FOCAL_LOSS
    learn_loss_weight: true
    pairwise_focal_loss {
      session_name: "client_str"
      hinge_margin: 1.0
    }
  }

通过learn_loss_weight参数配置是否需要开启权重自适应学习,默认不开启。开启之后,weight参数不再生效。

  • loss_weight_strategy: Uncertainty
    • 表示通过不确定性来度量损失函数的权重;目前在learn_loss_weight: true时必须要设置该值
  • loss_weight_strategy: Random
    • 表示损失函数的权重设定为归一化的随机数

根据样本设定损失函数权重(Masked Loss)

多目标学习任务中,通常需要根据样本的属性来设定损失函数的权重。

根据样本属性设定损失函数权重

在某个目标的tower里配置task_space_indicator_nametask_space_indicator_value

  • task_space_indicator_name 是特征名
  • task_space_indicator_value 是特征值
  • in_task_space_weight 目标样本的loss权重,默认值为1.0
  • out_task_space_weight 非目标样本的loss权重,默认值为1.0

如果样本的特征值与你配置的task_space_indicator_value相等, loss 权重 * in_task_space_weight; 不相等则loss权重 * out_task_space_weight

out_task_space_weight的值改为0.0,则可实现Masked Loss

根据样本label来设定损失函数权重

在某个目标的tower里配置task_space_indicator_label这个字段,标记一个 label 的名字, 如果这个label的值大于0, 则 loss 权重 *in_task_space_weight; 否则 loss权重 * out_task_space_weight

out_task_space_weight的值改为0.0,则可实现Masked Loss

参考论文: