前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态权重之多任务不平衡论文 (一)

动态权重之多任务不平衡论文 (一)

作者头像
枫桦
发布2022-08-02 14:14:02
5890
发布2022-08-02 14:14:02
举报
文章被收录于专栏:AI算法札记

Attention

论文标题: Adaptively Weighted Multi-task Deep Network for Person Attribute Classification

论文会议: ACM MM'17

论文链接: https://github.com/espectre/Facial_Attributes_Papers/raw/master/01_mm2017_person_attribute.pdf

代码链接:

Caffe: https://github.com/qiexing/adaptive_weighted_attribute

PyTorch: https://github.com/espectre/Facial_Attributes_Adaptively_Weighted

论文机构: 复旦大学

论文分类: 多任务学习,自适应权重,人脸属性分析,行人属性分析

动态权重,或者称为自适应权重,可以广泛应用于多场景、多模态、多国家、多任务、多标签等各种任务的不平衡学习中。出于完整性,在《不平衡问题: 深度神经网络训练之殇》一文中,已对不平衡问题进行总结。本文主要对动态权重在多任务学习不平衡问题中的应用论文进行解读。

一、摘要

多任务学习旨在通过合理地在多个预测任务之间共享相关信息来提高多个预测任务的性能。然而,多任务学习总是受到负向迁移问题的困扰 (negative transfer problem),由于不同任务的学习难度和收敛速度不同,联合优化多个任务非常具有挑战性。为了解决这些问题,作者提出了一种加权多任务深度卷积神经网络用于人物属性分析。本文是第一次提出新颖的验证损失趋势算法,动态和自适应地更新权重以学习训练过程中的每个任务。在 CelebA、Market-1501 属性和 Duke 属性数据集上的广泛实验表明,本文获得了最先进的性能,这验证了作者提出的框架的有效性。

二、研究动机

本文是多任务属性识别问题,以人脸属性数据集CelebA为例,定义好40个人脸属性,比如是否戴帽子、是否在微笑、是否高鼻梁等,输入数据为单张人脸图片,其标签为40种人脸属性label的组合。目标是训练一个识别模型,输入一张人脸图像,能够有效地预测各属性在该人脸图像是否存在及对应的属性类别。

图2-1 不同属性学习难度比较

多任务分类问题,基本的方法是构建一个多任务网络,该网络在除最后一层的所有层中共享模型参数。虽然这很简单,但不幸的是,这样的共享策略可能会遇到负迁移问题,即当两个任务不相似时,不充分的暴力迁移可能会损害分类器的性能。缓解此问题的一种常见做法是增加顶层非共享部分的深度,这些顶层可以专门为每个单独的任务建模,这背后的直觉是网络可以强制底层共享低级信息,并在顶层学习特定任务的子网络。然而,配置多任务深度架构的搜索空间组合很大,并且设计的网络通常会因设计者对不同任务之间关系的感知而产生偏差。此外,最先进的多任务学习工作保持每个学习任务的权重固定,而不是动态和自适应地改变它们。学习人物属性的不同任务本质上具有不同的学习难度,以及不同的收敛速度。如图2-1所示,判断“是否戴帽子”属性比估计一张脸是否“微笑”要容易得多。

三、研究方法

本节提出了自适应加权多任务深度卷积神经网络,框架如图3-1所示。它由四种类型的层组成,即卷积层、全连接层、构建块层和加权损失层。基本的网络结构包括卷积层、全连接层和构建块层,这个基本网络是共享的,用于所有属性预测任务。在这项工作中,ResNet-50被用作基本网络。加权损失层是本文新提出的,本文提出了一种新的训练算法——验证损失趋势算法,以同时联合学习多个属性预测任务。验证损失趋势算法在反向传播(BP)算法的反向传播中以端到端的方式训练深度网络。具体来说,前向传播通过网络将输入向量逐层向前传播,直到到达每个属性预测任务的输出层。通过损失函数将每个输出值与标签值进行比较,作为训练误差。我们的验证损失趋势算法不是平等对待每个预测任务,而是可以动态更新每个任务学习器的权重。在后向传播中,加权损失被传播以更新基本网络的参数。

图3-1 网络框架

3.1 Baseline模型

单任务模型: 为每个属性训练一个独立的二分类器,其中i表示第i张人脸图像,j表示第j个属性。

多任务基础模型: 联合优化所有的属性预测任务,其中所有第预测任务共享相同的模型参数。

3.2 包含权重损失层的模型

单任务模型认为每个属性都是独立的,多任务基础模型认为每个属性预测任务对预期损失的贡献相同。相比之下,作者认为每个属性预测任务既不应该是作为单独模型的独立问题,也不应该与基本模型同等加权。具体来说,一个属性可能与另一个属性有一定的相关性,例如,浓妆和口红属性可能正相关,而和“小胡子”属性负相关,原因是浓妆和口红更大可能同是女性人脸的属性,而小胡子更可能是男性人脸的属性。

图3-2 属性相关性

为进一步说明这一点,作者从 CelebA 数据集中随机选择 10 个不同的面部属性,通过使用真实属性注释来计算它们的相关性。图 3-2 中的可视化结果清楚地验证了本文的论点。例如,口红和化妆的相关性为 0.88,嘴巴张开与微笑的正相关性为 0.76。此外,学习属性的不同任务本质上具有不同的学习难度,以及不同的收敛速度。例如,学习识别“帽子”属性比估计一张脸是否“微笑”要容易得多。因此,本文不是强制模型以相同的权重学习所有任务,而是自适应地加权学习到的任务,如下式所示,

其中\lambda _{j}是第j个属性任务重要性的权重,其值用于构建图3-1中的动态权重损失层。

3.3 验证损失趋势算法

超参\lambda _{j}调优问题

3.2中,超参\lambda _{j}是模型的关键,一旦设置了每个任务的权重,参数集可以相应地更新。然而,调整权重参数非常困难,由于巨大的搜索空间和训练网络的高昂成本,交叉验证等传统方法在这里不适用。例如,CelebA 数据集上的 40 个属性意味着如果使用交叉验证,我们必须计算 40 个不同的超参。

验证损失趋势算法

为了自动计算超参数\lambda _{j},本文提出了一种高效且有效的方法来验证训练过程中的损失趋势,以便自动和自适应地协调学习每个属性任务的重要性。我们的验证损失趋势算法背后的直觉是,在同时学习多个任务时,应该给“重要”任务赋予高权重以增加相应任务的损失规模。

尽管如此,直接衡量一项任务的重要性也很重要。一种常见的做法是手动定义主要和辅助任务,主线任务是重中之重,始终要优先优化;这些辅助任务的优先级较低,如果这些任务损害了主要任务分类器的表现,则应停止这些任务。一般来说,在人脸属性分析任务,我们不可能预先指定每个任务的重要程度。作为替代方案,泛化能力被用作对一项任务“重要性”的客观衡量。具体来说,当学习多个任务时,一个泛化能力较低的任务的训练模型应该比其他任务的模型设置更高的权重。一个学习模型的泛化能力可以通过验证集来衡量,验证集在训练过程中是未知的。因此,作者设计了验证损失趋势算法来联合学习多个任务,如算法1所示,算法的主要优点是通过加权损失层自适应地学习所有任务的权重。

如图3-1 所示,在每个批次中,分别从训练集和验证集中对图像进行采样。例如,每批有 10 个训练图像和 10 个验证图像,只有训练图像可以用来更新网络参数,验证损失由 10 个验证图像在每次训练迭代中计算;权重向量由 update_weights ()每 k 次迭代更新一次,然后使用更新的权重来计算训练数据的损失并更新网络参数,更新方式如算法 2 。由于使用 10 个验证图像来计算验证损失,作者计算了 k 次迭代中验证损失的“一般”趋势,计算当前和先前 k 次迭代的平均验证损失,分别为 cur_mean 和 pre_mean,任务的验证损失趋势计算为 abs (cur _mean - pre_man)/cur _mean,趋势是一个 M 维向量。因此,权重向量应该由这两个关键因素决定——归一化趋势(norm_trend)和归一化验证损失(norm_loss)。

计算动态权重的核心代码

代码语言:javascript
复制
if count >= 2*kk and count % kk == 0:
    # pre_val_mean 前面100个batch的loss均值
    # cur_val_mean 当前100个batch的loss均值
    pre_val_mean = np.mean(val_loss[(count-2*kk):(count-kk)], axis=0)
    cur_val_mean = np.mean(val_loss[(count-kk):count], axis=0)
    # trend loss的变化趋势
    trend = np.abs(cur_val_mean - pre_val_mean) / cur_val_mean
    norm_trend = trend / np.mean(trend)
    norm_loss = cur_val_mean / np.mean(cur_val_mean)
    weight1 = norm_loss * norm_trend
    global weight
    weight = Variable(torch.from_numpy(weight1 / np.mean(weight1))).cuda()
    print(weight)

四、实验结果

图4-1可以发现,使用动态加权损失,模型收敛得更好。

表1和表2展示了在多个公开数据集上的效果对比。

图4-1 验证集Loss比较

五、总结

在本文中,作者提出了一种新颖的自适应加权多任务深度卷积神经网络来学习人物属性。与以前的多任务方法不同,作者利用验证损失作为指标来自适应地调整每个属性任务的权重。本文所提出的框架利用所有属性的相关性来帮助学习所有属性任务。作者展示了提出的方法在 CelebA、Market-1501 属性和 Duke 属性数据集上的效果,显示出对最先进方法的实质性改进。

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

本文分享自 AI算法札记 微信公众号,前往查看

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

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

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