新手第一次接触multi-task,记录一下自己的学习解决过程。文中引用较多,感谢各位大神的讲解。

在一个端到端训练的网络中,如果最终的loss = aloss1+bloss2+c*loss3…,对于a,b,c这些超参的选择,有没有什么方法?

链接:https://www.zhihu.com/question/375794498

为什么把多个相关的任务放在一起学习,可以提高学习的效果?

ref:
https://www.codenong.com/cs106148671/

(1) 多人相关任务放在一起学习,有相关的部分,但也有不相关的部分。当学习一个任务(Main task)时,与该任务不相关的部分,在学习过程中相当于是噪声,因此,引入噪声可以提高学习的泛化(generalization)效果。

(2) 单任务学习时,梯度的反向传播倾向于陷入局部极小值。多任务学习中不同任务的局部极小值处于不同的位置,通过相互作用,可以帮助隐含层逃离局部极小值。

(3) 添加的任务可以改变权值更新的动态特性,可能使网络更适合多任务学习。比如,多任务并行学习,提升了浅层共享层(shared representation)的学习速率,可能,较大的学习速率提升了学习效果。

(4) 多个任务在浅层共享表示,可能削弱了网络的能力,降低网络过拟合,提升了泛化效果。

还有很多潜在的解释,为什么多任务并行学习可以提升学习效果(performance)。多任务学习有效,是因为它是建立在多个相关的,具有共享表示(shared representation)的任务基础之上的,因此,需要定义一下,什么样的任务之间是相关的。

一、

从预测不确定性的角度引入Bayesian框架,根据各个loss分量当前的大小自动设定其权重。有代表性的工作参见Alex Kendall等人的CVPR2018文章 Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics,https://arxiv.org/abs/1705.07115。文章的二作Yarin Gal是Zoubin Ghahramani的高徒,近几年结合Bayesian思想和深度学习做了很多solid的工作。

大佬分型的一些有趣的研究视角,文章还未深读,但是评论区似乎都说不太work.

二、看作多目标优化问题

将多任务学习看做多目标优化,将问题转化为求取Pareto最优解(从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,使得至少一个人变得更好,这就是帕累托改进或帕累托最优化)。
构建所有loss的Pareto,以一次训练的超低代价得到多种超参组合对应的结果。有代表性的工作参见Intel在2018年NeurIPS(对,就是那个刚改了名字的机器学习顶会)发表的Multi-Task Learning as Multi-Objective Optimization,https://papers.nips.cc/paper/7334-multi-task-learning-as-multi-objective-optimization。
可参考https://blog.csdn.net/icylling/article/details/86249462

三、用不确定性对损失加权

参考链接:https://blog.csdn.net/cv_family_z/article/details/78749992

多任务学习中每个任务的最优权值依赖于调节尺度、任务的噪声幅值。

  • 这篇用的人比较多,准备加到我的任务中试一下

四、基于梯度更新

参考链接:
https://arxiv.org/abs/1711.02257v4

多任务学习中的不平衡实际上是各任务训练梯度的不平衡,因此论文关注各损失函数权重的梯度,利用梯度更新公式动态更新权重ω。即ω(t+1)=ω(t)+λβ(t)。由于目的是平衡各任务的训练梯度,所以式中β(t)是各任务梯度对ω的导数,λ沿用全局神经网络的学习率,为此设计了一种梯度损失(Grad Loss)

五、focal loss自动调节参数

  • 感觉目的是同时将多个任务学习好,但是我两个任务学习的都还行。但是acc和只只学一个的表现相近,似乎不太适合我的问题。但这个方法看起来也是比较好的。

参考链接:
https://www.zhihu.com/question/375794498/answer/1056695768

Focal loss 会根据每个task的表现帮你自动调整这些参数的。我们的做法一般是先分几个stage 训练。stage 0 : task 0, stage 1: task 0 and 1. 以此类推。 在stage 1以后都用的是focal loss。
具体来说:
首先对于每个 Task,你有个 Loss Function,以及一个映射到 [0, 1] 的 KPI (key performance indicator) 。比如对于分类任务, Loss function 可以是 cross entropy loss,KPI 可以是 Accuracy 或者 Average Precision。对于 regression 来说需要将 IOU 之类的归一化到 [0, 1] 之间。KPI 越高表示这个任务表现越好。对于每个进来的 batch,每个Task_i 有个 loss_i。 每个Task i 还有个不同的 KPI: k_i。那根据 Focal loss 的定义,FL(k_i, gamma_i) = -((1 - k_i)^gamma_i) * log(k_i)。一般来说我们gamma 取 2。于是对于这个 batch 来说,整个 loss = sum(FL(k_i, gamma_i) * loss_i) 在直观上说,这个 FL,当一个任务的 KPI 接近 0 的时候会趋于无限大,使得你的 loss 完全被那个表现不好的 task 给 dominate。这样你的back prop 就会让所有的权重根据那个kpi 不好的任务调整。当一个任务表现特别好 KPI 接近 1 的时候,FL 就会是0,在整个 loss 里的比重也会变得很小。当然根据学习的速率不同有可能一开始学的不好的task后面反超其他task。 http://svl.stanford.edu/assets/papers/guo2018focus.pdf 这篇文章里讲了如何像momentum 一样的逐渐更新 KPI。由于整个 loss 里现在也要对 KPI 求导,所以文章里还有一些对于 KPI 求导的推导。当然我们也说了,KPI 接近 0 时,Loss 会变得很大,所以一开始训练的时候不要用focal loss,要确保网络的权重更新到一定时候再加入 focal loss。

六、别人做的一些实验

  • 1.网络结构是否需要调整

参考链接:https://www.zhihu.com/question/375794498/answer/1077922077

如这个MTCNN中的ONet,它回归了包括score、bbox、landmarks,我在用pytorch复现的时候,出现一些有意思的情况,就是将landmarks这条任务冻结后(即 ),发现ONet的性能得到了巨大的提升。能超越原始版本的性能。但是加上landmarks任务后( )就会对cls_loss造成影响,这就是一个矛盾的现象。而且和a、b、c对应的大小有很大关系。当设置成( )的时候关键点的精度真的是惨不忍睹,几乎没法用。当设置成( )的时候,loss到了同样一个数量级,landmarks的精度确实是上去了,但是score却不怎么让人满意。如果产生了这种现象,就证明了这个网络结构在设计的时候出现了一些缺陷,需要去修改backbone之后的multi-task分支,让两者的相关性尽量减小。或者是ONet就不去做关键点,而是选择单独的一个网络去做关键点的预测(比如追加一个LNet)。box的回归并不是特别受关键点影响,大部分情况box和landmarks是正向促进的,影响程度可以看做和score是一致的,box的精度即便下降了5%,它还是能框得住目标,因此不用太在意。上面这个实验意在说明,要存在就好的loss权重组合,那么你的网络结构就必须设计的足够好。不然你可能还需要通过上述的实验就验证你的网络结构。从多种策略的设计上去解决这中loss不均衡造成的困扰。

推荐阅读https://arxiv.org/abs/1810.04002

  • 2.训练过程

  • 先冻结SSD网络,然后训练segmentation分支,到收敛

  • 再冻结segmentation分支进行SSD部分的训练,到收敛

  • 再将整个网络解冻训练到收敛,能达到比较好的效果

  • Task1与Task2交替训练

七、比较简单暴力的方法

  1. 调整为同一量级,然后根据结果微调。
  2. 这个系数的选择可以认为是一种先验,认为重要的loss项可以加大系数。
    更多时候需要验证集来调整超参数,不妨让 a+b+c=1 ,使用 grid search 来查看验证集的 loss 在什么情况下最小。

八 一些训练的tips

参考:
https://www.jiqizhixin.com/articles/2019-02-16

1.调整学习率
学习率是最重要的超参数之一。
对于某一个任务 A 而言,存在一个特别适合的学习速率,而对于另一个任务 B,则有不同的适合学习速率。如果选择较高的学习速率,可能在某个任务上出现神经元死亡(由于大的负梯度,导致 Relu 函数永久关闭,即 dying ReLU),而使用较低的学习速率,则会导致其他任务收敛缓慢。应该怎么做呢?我们可以在各个「头部」(见上图,即各任务的子网络)分别调节各自的学习速率,而在共享网络部分,使用另一个学习速率。

在tensorflow中:

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)
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)

2。将估计作为特征(冻结)
某一个任务的估计(estimate)作为另一个任务的特征

multi-task相关推荐

  1. Multi task learning多任务学习背景简介

    2020-06-16 23:22:33 本篇文章将介绍在机器学习中效果比较好的一种模式,多任务学习(Multi task Learning,MTL).已经有一篇机器之心翻译的很好的博文介绍多任务学习了 ...

  2. multi task训练torch_采用single task模型蒸馏到Multi-Task Networks

    论文地址. 这篇论文主要研究利用各个single task model来分别作为teacher model,用knowledge distillation的方法指导一个multi task model ...

  3. 多智能体强化学习Multi agent,多任务强化学习Multi task以及多智能体多任务强化学习Multi agent Multi task概述

    概述 在我之前的工作中,我自己总结了一些多智能体强化学习的算法和通俗的理解. 首先,关于题目中提到的这三个家伙,大家首先想到的就是强化学习的五件套: 状态:s 奖励:r 动作值:Q 状态值:V 策略: ...

  4. multi task训练torch_Multi-task Learning的三个小知识

    本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky 在过去几年里,Multi-Task Learning (MTL ...

  5. Multi Task Learning在工业界如何更胜一筹

    摘要: 本文主要介绍多任务学习和单任务学习的对比优势以及在工业界的一些使用.如何从单任务学习转变为多任务学习?怎样使AUC和预估的准确率达到最佳?如何对实时性要求较高的在线应用更加友好?本文将以淘宝实 ...

  6. multi task训练torch_Pytorch多机多卡分布式训练

    被这东西刁难两天了,终于想办法解决掉了,来造福下人民群众. 关于Pytorch分布训练的话,大家一开始接触的往往是DataParallel,这个wrapper能够很方便的使用多张卡,而且将进程控制在一 ...

  7. multi task训练torch_手把手教你使用PyTorch(2)-requires_gradamp;computation graph

    import torch 1. Requires_grad 但是,模型毕竟不是人,它的智力水平还不足够去自主辨识那些量的梯度需要计算,既然如此,就需要手动对其进行标记. 在PyTorch中,通用的数据 ...

  8. 【C++】多线程与互斥锁【二】

    文章目录 1. 并发是什么 1.1 并发与并行 1.2 硬件并发与任务切换 1.3 多线程并发与多进程并发 2. 为什么使用并发 2.1 为什么使用并发 2.2 并发和多线程 3. 并发需要注意的问题 ...

  9. 2021年浅谈多任务学习

    作者 | 多多笔记 来源 |AI部落联盟 头图 | 下载于视觉中国 写此文的动机: 最近接触到的几个大厂推荐系统排序模型都无一例外的在使用多任务学习,比如腾讯PCG在推荐系统顶会RecSys 2020 ...

  10. 算法工程师必须要知道的面试技能雷达图

    本文作者王喆,硅谷高级机器学习工程师. 转载自知乎专栏: https://zhuanlan.zhihu.com/p/52169807 这里是 王喆的机器学习笔记 的第五篇文章,今天我们不聊paper, ...

最新文章

  1. c语言使能,什么是锁存使能输入
  2. Ubuntu安装TensorFlow
  3. 常见的物联网通信协议
  4. nginx 如何显示真实ip
  5. golang ide 环境搭建_Golang 入门 : 打造开发环境
  6. 从零开始学Java编程!java集合类详解和使用
  7. 如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0
  8. 【目标检测】Focal Loss详解
  9. [高级软件调试方法] SoftProbe调试方法及实现
  10. Spring MVC基础环境搭建
  11. Spring操作数据库几十次后就JDBC begin transaction failed
  12. 图书馆图书借阅登记微信小程序开发制作管理软件系统
  13. 用Python把PDF文件转换成Word文档
  14. linux鼠标切换窗口的快捷键设置,Xshell中如何设置鼠标快捷键
  15. 两个PDF怎么合成在一起
  16. PCB邮票孔的作用及详细设计指南
  17. Ubuntu16.04+智能车+YOLO
  18. @keyup.enter失效问题
  19. APP自动化测试框架搭建(五)--Python+Appium+pytest-html
  20. Python里的%s和%d是什么意思

热门文章

  1. Principles for Microservice Design: Think IDEALS SOLID
  2. win10 映射WebDAV
  3. 【通证网】一建考试太难是因为你没有好的学习方法
  4. 【已解决】IDEA自动补全功能失效解决方法
  5. execlp函数详解
  6. copy entire line and replace every letter to tilde or equal sign
  7. 什么类型的企业适合在代理记账公司记账
  8. Spring Cloud Alibaba 实战(四)Oauth2篇【单点登录】
  9. 【飞桨成都黑客松】急速开发之矿石分类及安卓部署
  10. linux查看驱动设备,linux查看硬件信息及驱动设备相关整理(留存验证)