Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics

  1. Motivation
  2. Homoscedastic uncertainty as task-dependent uncertainty 同方差不确定度作为任务依赖不确定度
  3. Multi-task likelihoods 多任务似然
  4. Core Code
  5. Reference

Motivation

1.提出 Multi-task likelihoods 多任务似然的多任务权重设置方法

Homoscedastic uncertainty as task-dependent uncertainty 同方差不确定度作为任务依赖不确定度

贝叶斯框架下, 有两类不确定性:
1.Epistemic uncertainty 认知不确定性.

Epistemic: relating to knowledge or to the degree of its validation.

没有数据, 也就没有认知, 因为没有认知所以面临不确定性; 我们如果没有数据就是毫无办法

2.Aleatoric uncertainty 随机不确定性/偶然不确定性

Aleatoric: depending on the throw of a dice or on chance; random

假设一个任务我们有完整的数据 (这样的任务真的存在吗?), 但是预估出来的结果还是会有不确定性; (可以反着理解什么叫随机不确定性, 如果有数据我们就能完美解决一切问题, 那就相当于我们的模型是无所不能的) Aleatoric 不确定性又分成了两个部分:
(a). 数据依赖的不确定性 (异方差不确定性); 依赖于输入数据的不确定性,体现在模型的输出上
(b). 任务依赖的不确定性 (同方差不确定性); 不取决于输入数据,而是取决于不同的任务

Multi-task likelihoods 多任务似然

将多任务学习的损失函数, 定义为最大化同方差不确定度下的高斯似然

神经网络参数为 $W$, 在输入 $x$ 下的输出是 $f^W(x)$

核心概率模型
对于回归任务, 高斯似然为均值为 $f^W(x)$ 方差为标量 $\sigma$ 的高斯分布

对于分类任务, 通过 softmax 函数定义概率向量

回顾下高斯分布的概率密度函数

对于回归任务, 将高斯分布的概率密度函数带入进去对数似然 $\log(y|f^{W}(x))$

对于分类任务, 我们在原有的 softmax 函数变换基础上先增加一个参数 $\sigma$ 变换输出的结果再进行 softmax, 这么操作也可以理解为带有参挤压参数 $\sigma$ 下的 softmax, $\sigma$ 可以解释为温度系数

然后计算分类的对数似然

因为是针对 task_dependent 下的不确定性设定, 将 $k$ 个任务, 理解为多任务似然

假如有一个模型 $W$, 有两个输出, $y_1$ 和 $y_2$ 分别对应 1 个回归任务和 1 个分类任务, 我们完整再推导下最终的结果

intuitively,
1.我们将原有的多任务学习的损失, 一顿操作, 转化成仅仅包含常规的损失函数, 以及关于 $\sigma$ 这个超参的式子, 这个 $\sigma$ 等价于我们要学习的自适应的参数
2.在推荐/广告系统中, 分类预估任务出现的频率更高, 比如点击率二分类任务和转化率二分类任务, 我们单独看下这类问题的 formulation: 假如有一个模型 $W$, 它有两个输出 $y_1$ 和 $y_2$, 分别对应 2 个分类任务, 对应把分类任务推导出的结果拿出来得到

这里对分母的方差项, 做一个变换, 避免除以 0 的问题; 此时 $s$ 替代了 $\sigma$ 成为了我们待学习的权重参数

用 $s$ 去替代式子中的所有带 $\sigma$ 的项, 得到如下的式子

还原多任务学习的一般问题, 将 $w_i$ 表示为待学习的任务 $i$ 的权重参数, 任务 $i$ 原本的分类损失为 $\mathcal L_i$, 得到

Core Code

def trainable_weight_loss(loss, name, is_cls_task=True):
  def build_variable(self, name, shape, init="random"):
    if   init == "random":
      initializer=tf.random_normal_initializer(stddev=1.0 / math.sqrt(float(shape[0])))
    elif init == "zero":
      initializer=tf.zeros_initializer
    elif init == "one":
      initializer=tf.ones_initializer
    else:
      assert False
    return tf.get_variable(name, shape, initializer=initializer, trainable=True)
  w = build_variable(name, [1], init="zero")
  if is_cls_task:
    return loss * tf.exp(-w) + 0.5 * w
  else:
    return 0.5 * loss * tf.exp(-w) + 0.5 * w

Reference

[1]. Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics.


转载请注明来源, from goldandrabbit.github.io

💰

×

Help us with donation