深度学习的多个loss如何平衡?

来源:https://www.zhihu.com/question/375794498

编辑:深度学习与计算机视觉

声明:仅做学术分享,侵删

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

作者:郑泽嘉
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。

希望大家训练愉快。

作者:Hanson
https://www.zhihu.com/question/375794498/answer/1077922077

对于多任务学习而言,它每一组loss之间的数量级和学习难度并不一样,寻找平衡点是个很难的事情。我举两个我在实际应用中碰到的问题。

第一个是多任务学习算法MTCNN,这算是人脸检测领域最经典的算法之一,被各家厂商魔改,其性能也是很不错的,也有很多版本的开源实现(如果不了解的话,传送门)。但是我在测试各种实现的过程中,发现竟然没有一套实现是超越了原版的。下图中是不同版本的实现,打了码的是我复现的结果。

不同版本mtcnn在FDDB上roc曲线

这是一件很困扰的事情,参数、网络结构大家设置都大差不差。但效果确实是迥异。

clsloss表示置信度score的loss,boxloss表示预测框位置box的loss,landmarksloss表示关键点位置landmarks的loss。

那么 这几个权值,究竟应该设置为什么样的才能得到一个不错的结果呢?

其实有个比较不错的注意,就是只保留必要的那两组权值,把另外一组设置为0,比如 。为什么这么做?第一是因为关键点的回归在人脸检测过程中不是必要的,去了这部分依旧没什么大问题,也只有在这个假设的前提下才能进行接下来的实验。

就比如这个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

第二个是我之前做过一点OCR方面的工作,这个是我对于表格框格式化方面做的工作,基本算原创工作。https://github.com/hanson-young/ocr-table-ssd

改进版本的SSD表格检测

算法是基于SSD改的,与原有SSD相比增加了一个预测heatmap的分支,算是一种attention机制的表现吧。改进后训练达到相同的精度和loss,SSD用时10小时,改进后的方法耗时仅需10-20min。在训练过程中如果两个分支一起训练,很难发挥网络的真正意义,并且收敛到不是很理想的地方,所以训练过程也挺重要的,在实验中,将原来的optimizer从SGD(不易收敛,可能和学习率有关)换到RMSProp:

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

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

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

原图

预测结果

heatmap

因为表格尺度的影响,不加入heatmap分支会导致图像被过分拉升,导致无法检测到表格框。

加入heatmap后还有个好处就是为表格的对其提供了可能。

如果直接检测,对于一个矩形框来说,恐怕是会非常吃力的。如果

heatmap -> 阈值分割 -> Sobel -> HoughLineP -> angle

求出表格的倾斜角angle后,可以将原图和heatmap旋转统一的angle后concatenation,这样再接着跑SSD,对齐后的效果比较明显,解决了倾斜角度过大,带来bbox框过大的影响,详细见下图。

然后进行对齐工作

是不是能好很多

作者:hantian.pang https://www.zhihu.com/question/375794498/answer/1047670214

一般到了这一步,多个loss就是不可兼得了。。。

我一般做法是先看这几个loss输出的值,差不多调到一个几个loss平衡的状态。然后开始根据业务需求和训练验证的曲线,调整一下相对的权重。

作者:学鶸 https://www.zhihu.com/question/375794498/answer/1050241529

这个系数的选择可以认为是一种先验,认为重要的loss项可以加大系数。

更多时候需要验证集来调整超参数,不妨让 a+b+c=1 ,使用 grid search 来查看验证集的 loss 在什么情况下最小。

作者:薛定谔的翱拜
https://www.zhihu.com/question/375794498/answer/1050649467

最直接的就是GridSearch网格化搜索,实际上就是遍历搜索,即给定一定范围内的参数范围值,然后在参数范围内遍历选择多个参数。

这个问题实际上是自动机器学习研究范畴,以微软的NNI为例,流程图如下


作者:Eric https://www.zhihu.com/question/375794498/answer/1047748284

我的做法是看几个loss的数量级是否相同,有一次我加的平滑loss一直没有效果,打印出后发现loss1与loss2之间差了三个数量级,遂改变了系数,然后在同等数量级上面根据结果微调。

作者:Evan
https://www.zhihu.com/question/375794498/answer/1052779937

其实这是目前深度学习领域被某种程度上忽视了的一个重要问题,在近几年大火的multi-task learning,generative adversarial networks, 等等很多机器学习任务和方法里面都会遇到,很多paper的做法都是暴力调参结果玄学……这里偷偷跟大家分享两个很有趣的研究视角

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

2.构建所有loss的Pareto,以一次训练的超低代价得到多种超参组合对应的结果。有代表性的工作参见Intel在2018年NeurIPS(对,就是那个刚改了名字的机器学习顶会)发表的Multi-Task Learning as Multi-Objective Optimization (https://urlify.cn/6nuqI3)因为跟文章的作者都是老熟人,这里就不尬吹了,大家有兴趣的可以仔细读一读,干货满满。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值