Multi Label Classification with Missing Labels(MLML)的几种loss设计

多标签学习这个方向问题比较多,可以参考多标签学习的新趋势(2021 Survey TPAMI)部分标签学习和缺失标签学习到底什么异同? 这两篇偏综述性质的解释。本文重点解释下面几个重点问题:

Multi Label Classification with Missing Labels(MLML)和Partial Multi-Label Learning(PML)的区别

  • MLML重点在Missing Labels,一张图标注员一般只打标少量实体,大量的实体miss掉了,产生了大量的False Negative cases。
  • PML重点在很多信息不明确,很难标。例如下面图,诸如Tree、Lavender这些标签相对是比较简单的。但是有些标签到底有没有,是比较难以确定的,对于某些标注者,可能出现:“这张图片看起来是在法国拍的,好像也可能是意大利?”,这种情况称之为Ambiguous。PML希望把所有的ambiguous都标出来,所以PML选择的是让标注者提供所有可能的标签,当然加了一个较强的假设:所有的标签都应该被包含在候选标签集中
    在这里插入图片描述

MLML的loss设计

刚提到MLML的问题在于大量正例标签miss掉了,有不少False Positive,从loss推导角度来分析下这个问题

Preliminary

MLML问题一般理解为针对每一个label进行one-vs.-rest的二分类:

  • 对于多分类,假设存在n类,那么对于每个样本经过神经网络会出n个logits,这n个logits过softmax得到和为1的值再过NLL的loss,就是CrossEntropy,详细可以参考信息熵 条件熵 交叉熵 联合熵 相对熵 KL散度 SCE MAE 互信息(信息增益)里的推导,所以 C E ( P , Q ) = − ∑ i ∈ [ 0 , n − 1 ] p i l o g q i CE(P,Q)=-\sum_{i \in [0,n-1]}p_ilogq_i CE(P,Q)=i[0,n1]pilogqi,一般 p i p_i pi是label, q i q_i qi是经过softmax后的结果。

  • 对于二分类,对于每个样本经过神经网络可以只出一个logit,那么这个logit只过sigmoid得到p就可以了,都没softmax啥事。但算CE loss需要另外一个logit归一化的结果,也就是1-p,也需要另外一个label就是1-y。所以到二分类里 C E ( P , Q ) = − ∑ i ∈ [ 0 , 1 ] p i l o g q i = − y l o g p − ( 1 − y ) l o g ( 1 − p ) CE(P,Q)=-\sum_{i \in [0,1]}p_ilogq_i=-ylogp-(1-y)log(1-p) CE(P,Q)=i[0,1]pilogqi=ylogp(1y)log(1p),y是label,p是经过sigmoid后的结果。

在Simple and Robust Loss Design for Multi-Label Learning with Missing Labels一文中,Loss被一般化地定义为下面表达式,值得注意的是K是表示有K个二分类,而不是K=2, y i y_i yi的取值是0或者1
L = − ∑ i = 1 K ( y i L i + + ( 1 − y i ) L i − ) L= -\sum_{i=1}^K(y_iL_i^++(1-y_i)L_i^-) L=i=1K(yiLi++(1yi)Li)
如果是BCE就是下面表达式, p i p_i pi表示的是第i个二分类经过sigmoid后只出了一个值 p i = σ ( x i ) = 1 1 + e − x i p_i=\sigma(x_i)=\frac{1}{1+e^{-x_i}} pi=σ(xi)=1+exi1,其中 x i x_i xi就是经过神经网络后第i个二分类只出了一个值
L = − ∑ i = 1 K ( y i L i + + ( 1 − y i ) L i − ) L i + = l o g p i L i − = l o g ( 1 − p i ) L= -\sum_{i=1}^K(y_iL_i^++(1-y_i)L_i^-) \\ L_i^+=logp_i \\ L_i^-=log(1-p_i) L=i=1K(yiLi++(1yi)Li)Li+=logpiLi=log(1pi)
有了这个表达式可以推导一下导数结果,因为 σ ′ ( x i ) = σ ( x i ) ( 1 − σ ( x i ) ) = p i ∗ ( 1 − p i ) \sigma^{'}(x_i)=\sigma(x_i)(1-\sigma(x_i))=p_i*(1-p_i) σ(xi)=σ(xi)(1σ(xi))=pi(1pi)
∂ L i − ∂ x i = 1 p i − 1 ∗ p i ∗ ( 1 − p i ) = − p i \frac{\partial L_i^-}{\partial x_i} = \frac{1}{p_i-1}*p_i*(1-p_i)=-p_i xiLi=pi11pi(1pi)=pi
所以Simple and Robust Loss Design for Multi-Label Learning with Missing Labels一文中Fig 3对应的BCE是一条直线,注意横轴是p,纵轴是 − ∂ L i − ∂ x i -\frac{\partial L_i^-}{\partial x_i} xiLi
在这里插入图片描述

如果是Focal Loss就是下面表达式, γ \gamma γ is a focus parameter, and α + \alpha_+ α+ and α − \alpha_- α are utilized to balance positives and negative
L = − ∑ i = 1 K ( y i L i + + ( 1 − y i ) L i − ) L i + = α + ( 1 − p i ) γ l o g p i L i − = α − p i γ l o g ( 1 − p i ) L= -\sum_{i=1}^K(y_iL_i^++(1-y_i)L_i^-) \\ L_i^+=\alpha_+(1-p_i)^\gamma logp_i \\ L_i^-=\alpha_-p_i^\gamma log(1-p_i) L=i=1K(yiLi++(1yi)Li)Li+=α+(1pi)γlogpiLi=αpiγlog(1pi)

ASL(Asymmetric Loss For Multi-Label Classification)

ASL Loss是一种对Focal Loss的修正,其中 p m = m a x ( p − m , 0 ) p_m=max(p-m,0) pm=max(pm,0), The
probability margin m ≥ 0 is a tunable hyper-parameter。 The ASL loss reduces the weight of easy negatives via using γ + < γ − \gamma+<\gamma- γ+<γ, and discards negatives with low predicted probability via
the m shifted probability
L = − ∑ i = 1 K ( y i L i + + ( 1 − y i ) L i − ) L i + = ( 1 − p m ) γ + l o g p m L i − = p m γ − l o g ( 1 − p m ) L= -\sum_{i=1}^K(y_iL_i^++(1-y_i)L_i^-) \\ L_i^+=(1-p_m)^{\gamma+} logp_m \\ L_i^-=p_m^{\gamma-} log(1-p_m) L=i=1K(yiLi++(1yi)Li)Li+=(1pm)γ+logpmLi=pmγlog(1pm)

Hill Loss和SPLC Loss

来自Simple and Robust Loss Design for Multi-Label Learning with Missing Labels,简单来说就是把上述BCE收到missing labels影响做了一些修正,详细看原文较好
在这里插入图片描述
部分摘录自:

  1. https://www.zhihu.com/question/418818026/answer/1454922545
  2. https://zhuanlan.zhihu.com/p/266749365
  3. Asymmetric Loss For Multi-Label Classification
  4. Simple and Robust Loss Design for Multi-Label Learning with Missing Labels
好的,以下是使用PyTorch实现 "Learning a Deep ConvNet for Multi-label Classification with Partial Labels" 论文的示例代码。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms from sklearn.metrics import f1_score from dataset import CustomDataset from model import ConvNet # 设置随机数种子,保证结果可重复 torch.manual_seed(2022) # 定义超参数 epochs = 50 batch_size = 128 learning_rate = 0.001 weight_decay = 0.0001 num_classes = 20 num_labels = 3 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载数据集 train_dataset = CustomDataset(root='./data', split='train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2) test_dataset = CustomDataset(root='./data', split='test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义模型 model = ConvNet(num_classes=num_classes, num_labels=num_labels) # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay) # 训练模型 for epoch in range(epochs): # 训练阶段 model.train() running_loss = 0.0 for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() train_loss = running_loss / len(train_loader) # 测试阶段 model.eval() y_true, y_pred = [], [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) predicted_labels = torch.round(torch.sigmoid(outputs)) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted_labels.cpu().numpy()) f1 = f1_score(y_true, y_pred, average='macro') print('[Epoch %d] Train Loss: %.3f, Test F1: %.3f' % (epoch + 1, train_loss, f1)) ``` `CustomDataset` 和 `ConvNet` 分别是数据集类和模型类,需要根据您的具体情况进行实现。在训练阶段,使用 `nn.BCEWithLogitsLoss()` 作为损失函数进行优化。在测试阶段,使用 `sklearn.metrics.f1_score()` 计算 F1 值作为模型评估指标。 希望以上示例代码对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值