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