训练相关

This is my blog.

所谓的调参侠。虽然我现在基本都将超参数设置为1

Loss weight

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

Make the observation that the performance of such systems is strongly dependent on the relative weighting between each task’s loss. 这篇文章主要讲述在多任务回归和分类中,多任务联合学习可以提升各任务的学习效果,因为多任务可以共享数据集、共享低层特征、减少计算,但是loss中如何分配相对权重也是重要的问题之一。

文中指出最优权重是和测量尺度以及任务噪声相关,提出了基于任务的不确定性系数homoscedastic uncertainty of each task来调整损失函数中的加权超参,使得每个任务中的损失函数具有相似的尺度

文中实验采用的是:语义分割、实例分割、深度估计三个任务。


Uncertainty:

  • Epistemic uncertainty偶然不确定性: lack of training data
  • Aleatoric uncertainty认知不确定性: all explanatory variables with increasing precision.
    • Data-dependent or Heteroscedastic uncertainty: depends on the input data输入数据没有在训练数据中见过
    • Task-dependent or Homoscedastic uncertainty

设在权重W,输入x的网络的输出为,噪声量,则回归结果可能性向量和分类结果可能性向量分别为:

根据最大似然估计,我们最大化log形式,这样对于回归部分:

注:

高斯分布:

在回归问题中,u为, x为y,

现假设两个独立回归任务:

我们可以转换为求最小差值

如果输出y的噪声越大,第一项的权重就越小,整体就小;但不可过大,否则第三项就过大了。

对于分类模型,我们增加一个正的规模(缩放?)超参数,则有

这部分可以看作Boltzmann 玻尔兹曼分布。它的似然估计就为:

Softmax:

现假设两个独立的任务,一个是分类一个是回归,则:

其中

趋向于1时,三式取等号。

对于多任务的输出有:

按上述方法就可以扩展到线性、离散的线性组合之中;最终我们学习的是,而不是,前者更加稳定。

Learning rate

通常:

1
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)

但是不同任务可能最优的lr不同,选择较大的,会导致dying relu;选择较小的,收敛慢;于是提出采用不同的lr。【分为三个部分:共享的、仅有A、仅有B】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
all_variables = shared_vars + a_vars + b_vars
all_gradients = tf.gradients(loss, all_variables)
shared_subnet_gradients = all_gradients[:len(shared_vars)]
a_gradients = all_gradients[len(shared_vars):len(shared_vars + a_vars)]
b_gradients = all_gradients[len(shared_vars + a_vars):]
shared_subnet_optimizer = tf.train.AdamOptimizer(shared_learning_rate)
a_optimizer = tf.train.AdamOptimizer(a_learning_rate)
b_optimizer = tf.train.AdamOptimizer(b_learning_rate)
train_shared_op = shared_subnet_optimizer.apply_gradients(zip(shared_subnet_gradients, shared_vars))
train_a_op = a_optimizer.apply_gradients(zip(a_gradients, a_vars))
train_b_op = b_optimizer.apply_gradients(zip(b_gradients, b_vars))
train_op = tf.group(train_shared_op, train_a_op, train_b_op)

Gradient

当训练一个GAN模型时,我们不需要将梯度后向传播到对抗样本的生成过程中,就可以将stop_gradients设置为对应的tensor变量。

1
all_gradients = tf.gradients(loss, all_variables, stop_gradients=stop_tensors)

转载请注明出处,谢谢。

愿 我是你的小太阳

买糖果去喽