处理标注错误的样本(learning with noisy labels)

1. Co-teaching

image_1eeaarp70ip61scr13dkneglis9.png-59.4kB

上图是三种训练范式的error流转方向。Co-teaching会同时训练两个网络,在每个mini-batch上,在每个网络选择 R ( T ) R(T) 百分比的loss比较小的部分sample看作有用知识(useful knowledge),然后把有用知识送到另一个网络中继续训练。而其他两种是自我演化的方式。

具体算法如下: image_1eeag6lou1n4o1jbugq2an47n716.png-118.2kB

假设这两个网络是 f f (参数为 w f w_f )和 g g (参数为 w g w_g ) 构造mini-batch, 迭代训练 N m a x N_{max} 次。 从mini-batch中选取loss最小的 R ( T ) R(T) 百分比的sample,记为 D ˉ f \bar{D}_f D ˉ w \bar{D}_w ,步骤4,5。 然后交换用 D ˉ f \bar{D}_f 来训练和更新 g g ,用 D ˉ w \bar{D}_w 来训练和更新 f f ,步骤6,7。 R ( T ) R(T) 是随着训练step递减的,就是说他是动态的,每次选择的有用知识会越来越少。

上面算法中,有两个重要的问题需要解释:

  1. 为什么根据一个动态的 R ( T ) R(T) 来采样低loss的样本可以帮助我们找到干净的样本?
  2. 为什么需要两个网络并交叉更新参数?

对第一个问题的解释: 首先,当标签是正确的,loss小的样本是更可能是有正确标签的。所以如果我们只采样低loss的样本来训练分类器,那么这样应该可以抵抗噪声标签的。但是,这就要求分类器足够可靠才能保证损失小的样本确实是干净的。 通常深度网络具有“记忆“性,也就是,即使在有noisy的数据集上,网络会在起初的epochs时学习干净简单的模式,所以模型有能力在训练起初阶段过滤噪音数据。但是,随着训练增加,模型会渐渐拟合这些噪音数据。所以,为了利用这个规律,上面的算法在初始mini-batch中选择更多的有效数据,随着训练的进行,逐渐减少。 对于第二个问题: 试想一下,当学生检查自己的试卷时,很难找到错误,因为他们对自己的答案是有个人偏见的,但是,当求助同伴来帮忙检查自己的试卷,这样就更容易找到错误。 通常,不同的分类器可以学习到不同的决策边界,有不同的学习能力。因此,当我们在噪音数据上训练模型时,我们也期望他们有不同的能力来过滤噪音。这启发我们交换损失小的样本,即用从 g g (或 f f )中选择的小批量样本更新 f f (或 g g )中的参数。此过程类似于co-training,如果所选样本有噪声,则这两个网络将自适应地校正另一个网络的训练错误。 总而言之,来自一个网络的错误不会直接转回本身,相比较自我演化的方式,我们期望Co-teaching方法可以处理更大噪声的数据。

【参考:】 paper


2. 置信学习

置信学习三个步骤:

  1. Count,估计噪声标签与真实标签的联合分布
  2. Clean,清理错误样本。
  3. Re-Training,清理之后,调整样本类别权重,使用Co-teaching重新训练。

图1

上图是置信学习的框架,下面详细介绍这3个步骤:

1.Count

定义噪声标签为 y ^ \hat{y} ,即经过初始标注(也许是人工标注)、但可能存在错误的样本。定义真实标签为 y y^* ,但事实上我们并不会获得真实标签,通常可通过交叉验证1对真实标签进行估计。样本总数为 n n ,类别总数为 m m

估计联合分布步骤如下:

我们的目的是估计联合概率分布 Q ^ y ^ , y \hat{Q}_{\hat{y},y^*} 来描绘类别噪音。通过在混淆矩阵中计算数量,然后校正,每一个标注标签数量,

  • step1,交叉验证
  1. 首先通过交叉验证,在数据集中计算第 i i 个样本在第 j j 个类别下的概率: P [ i ] [ j ] P[i][j]
  2. 计算每个人工标注类别 j j 下的平均概率 t [ j ] t[j] ,作为置信度阈值
  3. 最后确定样本 i i 的真实标签。,其真实标签 y y^* j j 个类别中的最大概率 a r g m a x j P [ i ] [ j ] argmax_jP[i][j] ,并且需要满足 P [ i ] [ j ] P[i][j] > t [ j ] t[j]
  • step2,计算计数矩阵 C y ^ , y C_{\hat{y},y^*} (类似于混淆矩阵)。如图1中, C y ^ = d o g , y = f o x = 40 C_{\hat{y}=dog,y^=fox*}=40 ,表示x人工标记为dog但实际为fox的样本为40个。算法如下:

image_1eeheps02s7rj471qononf7av9.png-252.3kB

  • step3, 计算矫正的计数矩阵,因为在上一步的计算中,有一个条件是需要大于t[j],所以计数矩阵 C y ^ , y C_{\hat{y},y^*} 和是小于样本总数的。所以这一步的目的就是为了让计数总和与人工标记的样本总数相同。其中, X y ^ = i X_{\hat{y}=i} 表示人工标注标签 y ^ = i \hat{y} = i 的样本总数。

image_1eehgp5i59431tljgr3ij91gd7m.png-7.4kB

  • step 4: 计算联合分布 Q y ^ , y Q_{\hat{y},y^*} ,就是用上面的结果除以样本总数:

image_1eehntrcc1prs1pskvtl17bs1dj923.png-7.1kB

2.Clean

在得到噪声标签和真实标签的联合分布 Q y ^ , y Q_{\hat{y},y^*} ,论文共提出了5种方法过滤错误样本:

  • M1 C c o n f u s i o n C_{confusion} ,选取 y ^ ! = a r g m a x i 1 , 2 , . . . m P [ i ] [ j ] \hat{y} != argmax_{i\in{1,2,...m}}{P[i][j]} 的样本过滤,即对于样本 i i ,如果人工标注标签与模型预测最大值标签不相同则过滤。
  • M2: 选取构造计数矩阵 C y ^ , y C_{\hat{y},y^*} 过程中,进入费对角单元的样本进行过滤。
  • M3: Prune by Class (PBC) ,对于每一个类别 i 1... m i\in{1...m} 选择 n . j 1.. m : j ! = i C y ^ = i , y = j [ i ] n.\sum_{j\in{1..m:j!=i}}{C_{\hat{y}=i,y^*=j}[i]} 个样本,其中n是样本总数,按照 P [ i ] [ j ] P[i][j] 排序,过滤到得分最低的。
  • M4:Prune by Noise Rate (PBNR) ,对于非对角单元,选取 n . Q y ^ = i , y = j n.Q_{\hat{y}=i,y^*=j} 个样本进行过滤,按照 P [ y ^ = i ] P[\hat{y}=i] - P [ y ^ = j ] P[\hat{y}=j] 排序,过滤到得分最低的。

3.Re-Training

在过滤掉错误样本后,根据联合分布 Q y ^ , y Q_{\hat{y},y^*} 将每个类别 i i 下的损失权重重新赋值为: 1 p ( y ^ = i y = i ) = Q y [ i ] Q y ^ , y [ i ] [ i ] \frac{1}{p(\hat{y} =i|y^*=i)} = \frac{Q_{y^*}[i]}{Q_{\hat{y},y^*}[i][i]}

其中: Q y [ i ] = j = i . . m Q y ^ , y [ j ] [ i ] Q_{y^*}[i]=\sum_{j=i..m}{Q_{\hat{y},y^*}[j][i]} 然后采取Co-Teaching框架进行重新训练。

【参考:】 cleanlab 参考1

3. Searching to Exploit Memorization Effect in Learning with Noisy Labels

(待续...)

猜你喜欢

转载自juejin.im/post/7018735349367046174