【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读

code:https://github.com/isl-org/MultiObjectiveOptimization
论文:Multi-Task Learning as Multi-Objective Optimization

目录

    • 1. 论文简单解读
    • 2. 实验
    • 3. 代码浅读

1. 论文简单解读

将任何满足这些条件的解都称为帕累托平稳点。尽管每个帕累托最优点都是帕累托平稳的,但反之并不一定成立。考虑优化问题。
【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第1张图片

简单来说,帕累托平稳点是指在多目标优化问题中,满足一定条件的解。这些条件通常是指Karush-Kuhn-Tucker (KKT) 条件。如果一个解满足这些条件,那么它就是一个帕累托平稳点。然而,并不是所有的帕累托平稳点都是帕累托最优的。这意味着,在多目标优化问题中,我们需要找到一个帕累托最优解,而不仅仅是一个帕累托平稳点。

在多目标优化问题中,如何找到最小范数点。它提到了这个问题在计算几何中是自然出现的,并且已经被广泛研究过。然而,文中提到的许多算法并不适用于我们的设置,因为它们所做的假设并不成立。在计算几何文献中提出的算法解决了在低维空间(通常是2或3维)中大量点的凸包中寻找最小范数点的问题。但在我们的设置中,点的数量是任务的数量,通常很少;相反,维数是共享参数的数量,可能达到数百万。因此,我们使用基于凸优化的不同方法,因为上面的问题是一个具有线性约束的凸二次问题。
【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第2张图片
该算法适用于任何基于梯度下降优化的问题。我们的实验也表明,Frank-Wolfe求解器是高效且准确的,因为它通常在适度的迭代次数内收敛,对训练时间的影响可以忽略不计。然而,我们描述的算法需要为每个任务t计算∇θsh Lˆt(θsh, θt),这需要对每个任务的共享参数进行一次反向传播。因此,所得到的梯度计算将是前向传播后跟T次反向传播。考虑到反向传播的计算通常比前向传播更昂贵,这会导致训练时间线性增长,对于具有多个任务的问题可能会成为禁止因素。

我们现在提出了一种高效的方法,它优化了目标的上界,并且只需要一次反向传播。我们进一步证明,在现实假设下,优化这个上界会产生一个帕累托最优解。我们所涉及的架构将共享表示函数与任务特定决策函数结合起来。这类架构涵盖了大多数现有的深度MTL模型,并且可以通过约束假设类来正式定义

完全看不懂

2. 实验

celebA分类实验
【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第3张图片
【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第4张图片

cityscape上的语义/实例/视差
【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第5张图片

【多任务】——Multi-Task Learning as Multi-Objective Optimization代码阅读_第6张图片
效果还是有的。

3. 代码浅读

其核心还是动态的调整每个损失的权重系数。核心就是如何动态的求解每个损失的权重系数。

权重系数的求解:

  1. 共享结构部分不需要梯度前向。得到共用特征
  2. 分别求每个loss对共用特征的损失梯度
  3. 根据各个分支的梯度,使用求一个权重系数。具体没看了。
  4. 再整个网络按正常的前向一步,并不同的loss乘以前面求的scale
optimizer.zero_grad()
# First compute representations (z)
images_volatile = Variable(images.data, volatile=True)
rep, mask = model['rep'](images_volatile, mask)
# As an approximate solution we only need gradients for input
if isinstance(rep, list):
    # This is a hack to handle psp-net
    rep = rep[0]
    rep_variable = [Variable(rep.data.clone(), requires_grad=True)]
    list_rep = True
else:
    rep_variable = Variable(rep.data.clone(), requires_grad=True)
    list_rep = False

# Compute gradients of each loss function wrt z
for t in tasks:
    optimizer.zero_grad()
    out_t, masks[t] = model[t](rep_variable, None)
    loss = loss_fn[t](out_t, labels[t])
    loss_data[t] = loss.data[0]
    loss.backward()
    grads[t] = []
    if list_rep:
        grads[t].append(Variable(rep_variable[0].grad.data.clone(), requires_grad=False))
        rep_variable[0].grad.data.zero_()
    else:
        grads[t].append(Variable(rep_variable.grad.data.clone(), requires_grad=False))
        rep_variable.grad.data.zero_()

你可能感兴趣的:(深度学习,机器学习,算法,人工智能)