这篇论文:

  1. 提出了prob-and-allocate训练策略,在prob阶段获得样本损失,在allocate阶段分配样本权重。
  2. 以[2]的meta-weight-net为Baseline,取名为CurveNet,进行部分改动。

另外,这篇论文提供的源码结构混乱,复现难度较大。主要的工作也是基于meta-weight-net,创新的内容有限。但是,这篇文章在Introduction对long-tailed data + noisy labels问题的描述非常清晰。

Introduction

Background

分别单独处理long-tailed data和noisy labels的数据偏置时,re-weighting策略是常见且有效的办法:通过loss值分配相应的权重。但如果两类偏置同时出现,re-weighting效果就不佳了。

具体来说,对于包含noisy labels的训练数据,noisy labels的样本往往具有较大的训练损失,因此加权函数应该将大损失映射到小样本权重,以减轻标签噪声的影响。

对于类别不平衡的训练数据,尾类样本通常会因训练不足而遭受较大损失,因此加权函数应该为这些硬正样本分配较大的权重,使网络更加强调尾类以提高整体性能表现。

tailed类loss大,但从noisy labels角度看是噪声标签,需要小权重;从imbalance角度看,需要大权重。

处理两类偏置的关键问题:区分尾部类别的干净样本和标签损坏的样本。

Motivation

观察Figure 1右图。噪声样本的损失在训练开始时保持稳定,而干净样本的损失在开始时急剧上升,然后迅速下降。因此,训练损失曲线实际上包括了有价值的信息,并且可以提供有用的先验来区分尾类的干净样本和噪声样本。

虽然文中提出的CurveNet与meta-weight-net参数更新方法几乎一致,但meta-weight-net论文中,meta-weight-net的输入(也就是loss)随着训练而变化,无法代表样本的整体训练状态。

此外,meta-weight-net只能处理单一的数据偏置,两类偏置一起的情况原文中并未对其测试。而改进的CurveNet可以同时处理两类偏置。

Method

Meta-weight-net部分

在Method一节中,meta-weight-net的部分内容占了几乎半页。。。称之为“Revisiting Meta-Weight-Net”。

  • meta-weight-net基于MLP提出了分类网络\(\mathcal{F}\),其中参数记为\(\omega\)。
  • 带偏置的training-data: \(\mathcal{D}^{tra}=\{x_{i}^{tra},y_{i}^{tra}\}_{i=1}^{N}\),无偏置的meta-data: \(\mathcal{D}^{meta}=\{x_{i}^{meta},y_{i}^{met\hat{a}}\}_{i=1}^{M}\),N,M表示样本数,\(N\gg M\), \(X, Y\)分别表示数据和标签。

meta-data作为无偏置数据来自验证集,有点像Zero-shot的Transductive设置。这种设置我到现在还是觉得莫名其妙。

对于传统的训练,分类器的参数训练通过最小化损失:

\[\omega^*=\arg\min_\omega\mathcal{L}(Y^{tra},\mathcal{F}(X^{tra}|\omega)),\tag{1}
\]

\(\mathcal{F}\)一般是卷积神经网络。接下来为了简化,我们令\(\mathcal{L}_{tra}=\mathcal{L}(Y^{tra},\mathcal{F}(X^{tra}|\omega))\)。然而,数据存在偏置时,公式1可能不能很好地优化参数。这时需要采用re-weighting策略,对损失施加权重\(\mathcal{G}(\mathcal{L}_{tra}|\Theta)\),\(\mathcal{G}\)是输出权重的网络,\(\Theta\)为该网络参数。此时,公式1变为:

\[\omega^*=\arg\min_\omega\mathcal{G}(\mathcal{L}_{tra}|\Theta)\mathcal{L}_{tra}.\tag{2}
\]

具体来说\(\mathcal{G}\)为一个仅含1个隐藏层的MLP,含100个神经元节点,以Sigmoid为激活函数,输出区间为[0,1]。通过元学习进行参数优化:

\[\Theta^*=\underset{\Theta}{\operatorname*{\arg\min}}\mathcal{L}(Y^{meta},\mathcal{F}(X^{met\boldsymbol{a}}|\omega^*(\mathcal{G}(\Theta)))).\tag{3}
\]

总觉得这里和元学习没啥关系。

式3的损失函数用\(\mathcal{L}_{meta}\)表示。由于两种参数\(\omega, \Theta\)都需要更新,所以需要分开更新,更新一种参数时令另一种参数为已知量。

  1. 先更新\(\omega\),这里的\(\omega\)作为临时更新参数,t为当前epoch:
\[\hat{\omega}^t=\omega^t-\alpha\bigtriangledown_{\omega}\mathcal{G}(\mathcal{L}_{tra}^t|\Theta^t)\circ\mathcal{L}_{tra}^t|_{\omega^t},\tag{4}
\]
  1. 临时更新的\(\omega\)用来更新\(\Theta\),更新完就可以丢弃:
\[\Theta^{t+1}=\Theta^t-\beta\bigtriangledown_{\Theta}\mathcal{L}_{meta}^t(\hat{\omega}^t(\Theta^t))|_{\Theta^t}.\tag{5}
\]
  1. 再用更新后的\(\Theta\)更新真正的\(\omega\):
\[\omega^{t+1}=\omega^t-\alpha\bigtriangledown_{\omega}\mathcal{G}(\mathcal{L}_{tra}^t|\Theta^{t+1})\circ\mathcal{L}_{tra}^t|_{\omega^t}.\tag{6}
\]

以上都是作者照搬了meta-weight-net的内容,作者总结了meta-weight-net的缺陷:

  1. meta-weight-net采用当前损失值作为输入,该损失值在整个训练过程中发生巨大变化,并且无法代表样本的状态。
  2. 损失值在每个epoch都不同,并且在训练过程中变得越来越小,这不利于(用于分类的)网络收敛。
  3. 当噪声和tail class 样本呢同时存在时,权重可能很大也可能很小,导致分类器的性能不理想。

作者以此为motivation,提出了prob-and-allocate训练策略,不再随着权重赋值,而是先统一收集损失,在分配权重。

CurNet

把第i个样本,T个epoch内的损失收集起来:\(L_i=[l_{i,0},l_{i,1},\cdots,l_{i,T}]\),由于初始参数随机产生,可以移除前S个损失,结果变为:\(L_i=[l_{i,S},l_{i,S+1},\cdots,l_{i,T}]\)。

对于同一类,计算loss的均值:

\[\mu_{k,t}=\frac{\sum_j^N\mathbb{1}(k,y_j)l_{j,t}}{\sum_j^N\mathbb{1}(k,y_j)},\tag{7}
\]

接下来,对每个类的样本,减去类内的均值:

\[\bar{l}_{i,t}=l_{i,t}-\mu_{y_i,t}.\tag{8}
\]

这里\(k(1\le k\le K)\)表示class,\(\mathbb{1}\)表示Dirac delta函数,输入的两个变量相等时输出1,否则输出0。

归一化损失向量可以表示为 I,然后依次馈送到全连接层,每个层都耦合到 ReLU 激活层。 P为最后一个全连接层的输出神经元数量,这里通过实验设置为64。

作为进一步促进噪声识别的一种方法,我们采用类标签嵌入方法将类信息丰富到损失曲线特征中。这种嵌入方法在自然语言处理领域常用(Cao et al. 2021),这里的嵌入矩阵可以表示为:\(Y^{K\times P}=[Y_{1},\cdots,Y_{K}].\)。再把I 和 Y连接并输入到MLP中。

优化的时候忽略几层

为了加速\(\Theta\)优化,根据FaMUS (Xu et al. 2021)\(\triangledown_\Theta\mathcal{L}_{meta}^t|_{\Theta^t}\)重写为:

\[\bigtriangledown_\Theta\mathcal{L}_{meta}^t|_{\Theta^t} =\frac{\partial\mathcal{L}_{meta}^t}{\partial\hat{\omega}^t}\bullet\frac{\partial\hat{\omega}^t}{\partial\mathcal{G}(\Theta^t)}\bullet\frac{\partial\mathcal{G}(\Theta^t)}{\partial\Theta^t}
\propto\sum_i^Z\frac{\partial\mathcal{L}_{meta}^t}{\partial\hat{\omega}_i^t}\bullet\frac{\partial\hat{\omega}_i^t}{\partial\mathcal{G}(\Theta^t)}\bullet\frac{\partial\mathcal{G}(\Theta^t)}{\partial\Theta^t},
\tag{9}\]

Z表示分类器的层数。然后冻结SL层,再更新\(\Theta\),此时式9变为:

\[\bigtriangledown_\Theta\mathcal{L}_{meta}^t|_{\Theta^l}\propto\sum_{i=SL}^Z\frac{\partial\mathcal{L}_{meta}^t}{\partial\hat{\omega}_i^t}\bullet\frac{\partial\hat{\omega}_i^t}{\partial\mathcal{G}(\Theta^t)}\bullet\frac{\partial\mathcal{G}(\Theta^t)}{\partial\Theta^t} \tag{10}
\]

这种做法感觉没什么用,作者的消融实验也证实了这一点,此外,作者的没有比较整体的训练时间,因此这个消融实验的结果说服力欠佳。

改变了输入的式4和式6

\[\hat{\omega}^t=\omega^t-\alpha\bigtriangledown_{\omega}\mathcal{G}([I,Y^{tra}]|\Theta^t)\circ\mathcal{L}_{tra}^t|_{\omega^t}\tag{11}
\]
\[\omega^{t+1}=\omega^t-\bigtriangledown_{\omega}\alpha\mathcal{G}([I,Y^{tra}]|\Theta^{t+1})\circ\mathcal{L}_{tra}^t|_{\omega^t.}\tag{12}
\]

整体的训练框架如下:

当学习率改变时,不同类别样本的损失值曲线存在显着差异。因此,在探测阶段采用循环学习率(Smith 2017)来训练分类器\(\mathcal{F}(\omega)\),O2U-Net 也采用了这种方法(Huang et al. 2019)。此外,当分类器的学习率降低时,认为CurveNet已经优化得很好,不再更新CurveNet的参数以加快训练速度。

Experiments

实验部分没有什么亮点,作者主要与Baseline meta-weight-net进行对比。作者放了一张不同类的参数权重与epoch的关系:

可观察到:

  1. clear样本权重大于noisy样本;
  2. 尾部类的权重显著大于头部类

这种结果确实是理想的情况,证明了损失曲线有着有效信息。但观察尾部类的3张图,它们的权重还是靠的有点近,不确定作者的方法在尾部类的精度上如何。

参考文献

  1. Jiang, Shenwang, et al. "Delving into sample loss curve to embrace noisy and imbalanced data." Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 36. No. 6. 2022.
  2. Shu, Jun, et al. "Meta-weight-net: Learning an explicit mapping for sample weighting." Advances in neural information processing systems 32 (2019).

Delving into Sample Loss Curve to Embrace Noisy and Imbalanced Data的更多相关文章

  1. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  2. tensorflow实现svm多分类 iris 3分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)

    # Multi-class (Nonlinear) SVM Example # # This function wll illustrate how to # implement the gaussi ...

  3. tensorflow实现svm iris二分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)

    iris二分类 # Linear Support Vector Machine: Soft Margin # ---------------------------------- # # This f ...

  4. Caffe---Pycaffe 绘制loss和accuracy曲线

    Caffe---Pycaffe 绘制loss和accuracy曲线 <Caffe自带工具包---绘制loss和accuracy曲线>:可以看出使用caffe自带的工具包绘制loss曲线和a ...

  5. RFID 读写器 Reader Writer Cloner

    RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...

  6. Must Know Tips/Tricks in Deep Neural Networks

    Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)   Deep Neural Networks, especially C ...

  7. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)

    http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html Deep Neural Networks, especially Conv ...

  8. How to handle Imbalanced Classification Problems in machine learning?

    How to handle Imbalanced Classification Problems in machine learning? from:https://www.analyticsvidh ...

  9. The Model Complexity Myth

    The Model Complexity Myth (or, Yes You Can Fit Models With More Parameters Than Data Points) An oft- ...

  10. (转) Read-through: Wasserstein GAN

    Sorta Insightful Reviews Projects Archive Research About  In a world where everyone has opinions, on ...

随机推荐

  1. xHook 源码解析

    xHook 是爱奇艺开源的一个PLT Hook 框架 项目地址: https://github.com/iqiyi/xHook 该项目实现了 PTL/GOT Hook PTL hook 的本质是修改内 ...

  2. SpringBoot的自动装配原理及应用

    什么是SpringBoot自动装配 所谓的"SpringBoot自动装配"就是指:通过注解和一些简单的配置就能将某些组件载入Spring容器环境中,便于使用. 比如,很多sprin ...

  3. 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测cpu温度的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行(需要管理员权限):     国产麒麟操作上运 ...

  4. Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. com.fasterxml.jackson.databind.exc.InvalidDefinitionException

    @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响. 写法将此标签加在model 类的类名上 ,可以多个 ...

  6. 私有git服务器搭建-gitlib版

    目录 环境 centos6.5 这里有官网安装地址教程: 这里有机器配置安装需求 CPU Memory 安装步骤 安装配置依赖项 添加GitLab仓库,并安装到服务器上 启动GitLab 配置 git ...

  7. NodeJS内存泄露

    p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) } p.p2 { margin: 0; ...

  8. 【Azure K8S | AKS】在AKS中创建 StatefulSet 示例

    问题描述 [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例 [Azure K8S|AKS]进 ...

  9. Python实现ARP攻击

    目录 概述 ARP协议 IP转MAC 结构 ARP扫描 开始欺骗 中间人 其他 ARP老化 防御 windows linux 概述 高中的时候,学校有一个商店,会放开WIFI给偷偷带手机去学校的我们使 ...

  10. Metasploitable3 渗透测试

    1.信息手机阶段 信息收集经常使用的软件 功能也比较强大的Nmap Nmap nmap -p- -sS -sV -n -v --reason --open -oX demon.xml 192.168. ...