前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >深度学习模型的多Loss调参技巧

深度学习模型的多Loss调参技巧

作者头像
炼丹笔记
发布2022-04-06 19:12:21
发布2022-04-06 19:12:21
2K00
代码可运行
举报
文章被收录于专栏:炼丹笔记炼丹笔记
运行总次数:0
代码可运行

在多目标多任务训练的网络中,如果最终的loss为有时为多个loss的加权和,例如 loss = a*loss_x+b*loss_y+c*loss_y+... ,这个问题在微信视频号推荐比赛里也存在。任务需要对视频号的某个视频的收藏、点击头像、转发、点赞、评论、查看评论等进行多任务建模,也就产生了多个loss。

这里介绍在这次实践过程中测试过的几个方法。

1.GradNorm

GradNorm:ω(t+1)=ω(t)+λβ(t),该方法主要在对各损失函数权重的梯度进行处理,利用梯度更新公式动态更新权重ω。

2.Multi-Task Learning as Multi-Objective Optimization

在处理多个loss时,引入Pareto用一次训练的方式将问题转化为求取Pareto最优解。有兴趣的可以看看原文:https://arxiv.org/pdf/1810.04650.pdf

3.Multi-task likelihoods

最简单的多任务Loss的线性加权:

对于分类任务,经常通过softmax函数产生概率向量中抽取样本来构造多任务的最大似然函数。

代码语言:javascript
代码运行次数:0
复制
class MultiLossLayer(nn.Module):
    """
        计算自适应损失权重
        implementation of "Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics"
    """
    def __init__(self, num_loss):
        super(MultiLossLayer, self).__init__()
        self.sigmas_dota = nn.Parameter(nn.init.uniform_(torch.empty(num_loss), a=0.2, b=1.0), requires_grad=True)

    def get_loss(self, loss_set):
        factor = torch.div(1.0, torch.mul(2.0, self.sigmas_dota))
        loss_part = torch.sum(torch.mul(factor, loss_set))
        regular_part = torch.sum(torch.log(self.sigmas_dota))
        loss = loss_part + regular_part
        return loss

4.玄学调参

上面说了太多方法调参,来点手动的经验吧。最简单的方法如下:

  • 例如 loss = a*loss_x+b*loss_y+c*loss_y ,可以在a+b+c=1前提下,固定a,b,调整c,分别在2x、4x、6x等倍数去做尝试,最后相加为1;
  • 权重缩放,固定其中一个为1,利用power(m,n)去调整尝试;
  • Weight Uncertainty 利用 Gaussian approximation 方式直接修改loss ,并同时以梯度传播的方式来更新里面的两个参数。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 炼丹笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档