Unbiased Pairwise Consistency Regularization for SemiSu
作者:禅与计算机程序设计艺术
1.简介
Semi-supervised learning(SSL)方法已被广泛应用于图像识别、自然语言处理以及语音识别等领域,并在视频分析等方面也展现出显著的应用潜力。然而,在现有技术条件下提升Semi-supervised learning方法的鲁棒性与效率仍面临诸多挑战。例如,在真实数据中常出现的特定目标不平衡分布问题难以被合理解决(如分类任务中某些类别样本数量严重不足),这可能导致模型在实际应用中出现性能瓶颈。此外,在训练过程中需大量标注数据以提高模型性能,并由此带来的计算负担进一步加剧了问题难度。因此,在现有技术条件下提升Semi-supervised learning方法的鲁棒性与效率仍面临诸多挑战
本文旨在阐述一种新型基于pairwise consistency原则的无监督学习方法——Unbiased Pairwise Consistency Regularization (UPCR)。该方法利用先验知识中的标签信息,在训练数据对之间构建标签关系模型,并使同类样本间的差异趋于平滑化处理。这种策略不仅平衡了训练集中的类别分布问题,并且有效降低了不同类别的标签关联性;其结果不仅超越了现有的基准模型(baseline),还展现出更为优异的实际应用性能。
该方法通过均匀化处理每个类别内的样本分布,并降低不同类别间的标签关联性。
本文主要基于以下观点:
现有的SSL技术多采用基于全局特征的策略进行分类学习,并未充分考虑各类别间的相似性这一特点;结果是同一类别内的样本间标签一致性难以维持。
该有效策略通过平衡标签间的相似度与数据采样区域之间的权衡来提升对相似类别标签的一致性关注度。
一种常用的性能指标是FPR,在机器学习中用来衡量分类器的表现。具体而言,它表示将真实为负类的样本误判为正类的比例。当该比例较底时,则表明该方法增强了模型的鲁棒性。
4)UPCR方法具备了相较于baseline方法更高的性能指标,并且相比其他_SSL. 方法而言更加高效,在实际应用场景中能够显著提升训练效率
2.基本概念术语说明
2.1 双重标签(Pairwise labeling)
在自监督学习(SSL)框架中,默认情况下提供的训练集X包含样本特征x及其对应的标签y。传统的SSL方法往往假设每个样本既拥有真实的类别标记y又拥有一个由其生成的虚拟标记u。通过这种双重标记机制的设计,在实际应用中模型可以有效区分出真实的类别标记y与生成的虚拟标记u之间的差异。值得注意的是,在这种双标记设计下可能会引入额外的噪声。当训练数据集中仅有少部分样本的真实类别信息尚未被标注时,在这种情况下基于双label的学习策略可能无法充分反映实际的数据分布特性。为了更好地学习真实数据分布的情况,则需要探索单label或多label等更加鲁棒的学习策略,并采取适当的约束手段来规避双label带来的负面影响
UPCR作为一种基于单标签的学习样本外推(SS)技术,在这种情况下,“UPCR认为其仅提供了一种辅助性的类别标记信息”。然而在这一假设下与之前的观点不同,“UPCR假设存在一种潜在隐变量z用于表征各实例间的相互关系”。给定某实例x及其对应的目标标记y,“UPCR构建了一个映射函数h”。该函数可以根据当前输入x预测出相应的目标标记y。“然而由于其本身并不具备任何类别标记的信息因此无需考虑样本间的相互关联性”。换言之“其主要假设是仅利用某种潜在隐变量z来表征各实例之间的相互关系”。在这种情况下,“模型的训练目标就是最大化训练误差而非最小化传统的分类误差度量”。这一策略使得UPCR得以避免受到双重标记噪声的影响并在一定程度上消除不同类别间的相关性
2.2 有监督学习
UPCR方法归类于有监督学习范畴,在实际运用中需要依赖标注数据来进行训练与测试过程。设有训练数据集X = {(x_i, y_i)}(i=1,2,...N),其中每个样本特征由x_i代表,在UPCR框架下我们假设标签y_i仅用于类别识别,并将u_i和v_i设为虚拟类别标记。在模型构建阶段,基于从未见过的验证集V={(x_j, v_j)}或测试集T={(x_k, u_k)}(k=1,2,...M)推导出参数h以最小化在训练数据上的损失函数值。当模型处理新的输入样本x_{new}时,在输出层得到预测结果u_{pred}=h(x_{new})
2.3 先验知识(Prior Knowledge)
先验知识指的是模型在训练前已知的一些标签间关联信息。例如,在医疗诊断领域中,先验知识能够帮助模型预测患者患上肾结石、骨质疏松症或乳腺癌的可能性。同时,在图像分割任务中,这些预先掌握的知识同样有助于模型处理边缘标记对象间的相似性,并基于这些预先掌握的知识进行建模过程以提高鲁棒性。由此可见,在这种情况下构建基于这些预先掌握的知识进行建模的过程是必要的。
3.核心算法原理和具体操作步骤以及数学公式讲解
3.1 模型结构
UPCR方法的整体模型结构如下图所示:
如上图所示,该系统由两个主要组件构成:一个是特征提取模块,另一个是相似性计算模块。其中特征提取模块的作用是获取输入样本的关键信息;而相似性计算模块则通过构建样本间的关联关系来实现分类目标。进一步细化分析可知,在这一系统中包含了三层基本功能单元:首先是基于深度学习算法实现的数据处理能力;其次是基于统计学原理设计的分类评价标准;最后则是基于机器学习算法优化的目标函数设计。
3.1.1 特征抽取器
特征抽取器负责从输入样本中提取其特定的特征,并将这些特征传递给标签匹配层进行识别。该系统架构包含多个卷积层和池化层组合,在此结构下能够有效地输出固定尺寸的特征图。
3.1.2 标签相似性矩阵
基于标签间的相似度矩阵...被用来度量任意两个样本之间的标淮关联程度。标淮关联程度被用来评估两个样本之间的标淮相关性,其定义如下:
L(i, j) = |y^u_i - y^u_j| + sum_{k=1}^K [p_ik log(p_jk / p_ik)]
其中,K代表了标签种类的数量,yu_i与yu_j分别代表第i个样本的真实标签与其被赋予的虚假标签,p_ik与p_jk则分别代表第i个样本与其相关联的第j个样本所归属的标签的概率分布。在公式中使用的"+"符号表明该相似度矩阵具有对称性特性,即L(i,j)=L(j,i)成立。在此定义下,相似性矩阵采用马氏距离作为衡量两个标签之间差异程度的标准。
3.1.3 标签匹配层
基于特征图与标签相似性矩阵的信息输入进行处理后,在该层级中生成一个矩阵A。其中每个元素值Aij具体表示第i个实例与第j个实例间的关联程度。这些值构成了衡量各个实例之间相似程度的关键指标,并通过该层级进行计算得到最终结果。
C(i, j) = exp(-gamma * Aij) / (sum_{m!=n} exp(-gamma * Amn))
在其中的γ被视为一个超参数,在其重要性程度上越大,则其对整体模型的影响更为显著。A_{i,j}代表了第i个样本与其第j个样本之间的标签匹配程度。指数函数用于计算这一过程中的关键值。通过一个称为"标签匹配层"的机制,在其基础之上进行软性最大化的计算以确定最终的置信度值。
3.1.4 标签聚合层
该层次通过分析各类别间的置信度信息实现多分类目标预测;它接收来自特征提取模块生成的特征图以及基于类别相似性构建的矩阵,并结合匹配层输出结果作为输入数据;进而生成一个融合矩阵C;其中每个元素Cij代表第i号样本与第j号样本之间的融合关系;该模块采用基于类别相似性的策略进行信息整合,在同类别样本之间会体现出更为紧密的相关性。
3.2 训练阶段
UCPR方法划分为两个主要阶段来进行系统构建:基础构建期与强化优化期。在基础构建期内,系统通过数据学习完成初始参数设置;强化优化期内,则通过动态调整机制提升系统的稳定性与适应性。其中,在基础构建期内的具体步骤包括以下几点
起主要作用的是UPCR模型通过构建标签相似性矩阵实现分类目标这一过程。这种技术基础主要建立在标签自编码器框架下形成,并且还可以结合最近邻标签学习的方法进一步优化其性能
第二,UPCR模型基于标签相似性矩阵构建了标签匹配层。其训练过程等同于寻找该矩阵的最佳参数之一。
第三步中, UCPR 模型经过预处理后完成前馈过程, 其目标是优化标签转换器的参数设置. 在这一过程中, 标签转换器需要综合运用样本提供的真实标签信息, 人工引入的虚拟标记, 以及基于聚合层和匹配层输出结果的数据来进行损失函数计算.
在模型完成完好的训练后,在线阶段可以通过标签转换器对新样本进行分类任务中的目标属性推断。此外,在线推理阶段同样能够利用该工具实现目标属性的快速判定。
3.3 测试阶段
该方法在测试阶段分为两个环节:数据标注和性能评估。
数据标注用于估计模型在真实分布下的性能表现,并由此评价该方法的效果。
该阶段的性能分析旨在比较当前模型与常规模型之间的差距。
通过FPR定义可以计算出前期训练阶段的表现差异。
False Positive Rate FPR 等于符号 False Positive 数量加 True Negative 数量除以 False Positive 数量加 True Negative 数量再加 False Positive 数量加 True Negative 数量
其中,#(.)表示样本总数;true_negative、false_positive分别表示正确识别为负例、错误识别为负例的样本数目;false_positive + true_negative 表示将负例误判为正例的样本数目。若FPR较低则表示UPCR方法在训练过程的鲁棒性较好。
3.4 参数设置
UPCR方法的主要超参数包括γ、用于表示先验知识影响程度的α以及用于表示标签相似性矩阵影响程度的β。其中γ参数调节了标签匹配层权重衰减的程度,在γ值增大的情况下对应的权重衰减程度也会随之增大;α参数决定了先验知识在模型中的重要性,在α数值上升的过程中所体现的影响也会更加显著;β参数调节了标签相似性矩阵在模型中的影响程度,在β值增大的情况下,在模型中所体现的影响也会更加显著。建议首先采用默认设置进行初步训练,并根据不同的超参组合进行优化调整以提升算法性能
4.具体代码实例和解释说明
4.1 数据准备
本研究采用的基准数据集是CIFAR-100。假设仅1%的训练样本被人工标注。其余99%的数据及其对应的标签均遵循相同的分布特性。
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor
train_dataset = datasets.CIFAR100(root='./data', train=True, transform=ToTensor(), download=True)
labeled_indices, unlabeled_indices = split_labeled_unlabeled(len(train_dataset), labeled_percent=1.0, num_classes=100)
train_loader = DataLoader(Subset(train_dataset, labeled_indices), batch_size=batch_size, shuffle=True, drop_last=True)
test_loader = DataLoader(datasets.CIFAR100(root='./data', train=False, transform=ToTensor()), batch_size=batch_size, shuffle=False, drop_last=False)
代码解读
4.2 模型定义
该研究采用ResNet-18模型作为特征提取工具,并附加一个全连接层用于标签转换目的。同时,在该方法中引入了残差连接以优化特征提取效果。其输出结果包含特征图、标签相似度矩阵以及相应的置信度评估矩阵。
class ResNetEncoder(nn.Module):
def __init__(self):
super().__init__()
self.resnet = models.resnet18(pretrained=False)
num_filters = self.resnet.fc.in_features
self.resnet.fc = nn.Sequential()
def forward(self, x):
return self.resnet(x)
class ProjectionMLP(nn.Module):
def __init__(self, input_dim, output_dim, hidden_dims):
super().__init__()
layers = []
prev_dim = input_dim
for dim in hidden_dims:
layers.append(nn.Linear(prev_dim, dim))
layers.append(nn.ReLU())
prev_dim = dim
layers.append(nn.Linear(prev_dim, output_dim))
self.layers = nn.Sequential(*layers)
def forward(self, x):
return self.layers(x)
class LabelTransformer(nn.Module):
def __init__(self, encoder, projection_mlps):
super().__init__()
self.encoder = encoder
self.projections = nn.ModuleList([ProjectionMLP(**kwargs) for kwargs in projection_mlps])
def forward(self, inputs):
features = self.encoder(inputs['image'])
logits = [proj(features).squeeze(-1) for proj in self.projections]
pairwise_similarities = compute_pairwise_similarities(logits[0], labels=None, gamma=0., alpha=0., beta=0.)
confidences = softmax(-pairwise_similarities)
outputs = {'logits': logits, 'confidences': confidences}
return outputs
def get_device():
if torch.cuda.is_available():
device = 'cuda'
else:
device = 'cpu'
return device
device = get_device()
model = LabelTransformer(ResNetEncoder().to(device), [{'input_dim': encoder_output_dim*width*height, 'hidden_dims': [256]*4, 'output_dim': num_classes}]).to(device)
optimizer = optim.AdamW(model.parameters(), lr=lr, weight_decay=weight_decay)
代码解读
4.3 训练与验证
本文采用了分两阶段进行的方式进行模型优化:第一阶段和第二阶段分别对应着不同的任务目标。其中第一阶段旨在...
for epoch in range(num_epochs):
model.train()
loss_epoch = 0.0
correct = 0.0
total = 0.0
progress_bar = tqdm(enumerate(train_loader), desc=f"Epoch {epoch}", total=len(train_loader))
for batch_idx, data in progress_bar:
images, targets = data['image'].to(device), data['label'].to(device)
optimizer.zero_grad()
with autocast():
outputs = model({'image': images}, is_training=True)
pseudo_labels = outputs['pseudo_labels']
loss = criterion(outputs['logits'][0].float(), pseudo_labels.long())
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
_, predicted = torch.max(outputs['logits'], 1)
total += targets.size(0)
correct += (predicted == targets).sum().item()
accuracy = float(correct)/total
loss_epoch += loss.item()
avg_loss = round(loss_epoch/(batch_idx+1), 4)
progress_bar.set_postfix({"accuracy": f"{accuracy:.4f}", "loss": f"{avg_loss:.4f}"})
scheduler.step()
# if best_acc < acc:
# best_acc = acc
# print('Best Acc:%.4f'%best_acc)
print("Train Accuracy:", round((100.*correct)/total, 4))
print("\n")
# Evaluation on the test set
model.eval()
with torch.no_grad():
correct = 0
total = 0
for i, data in enumerate(test_loader):
img, target = data
img, target = img.to(device), target.to(device)
outputs = model({'image': img}, is_training=False)
predicted = outputs['logits'][0].argmax(1)
total += img.shape[0]
correct += int((predicted == target).sum().item())
print("Test Accuracy of the model: {} %".format(100 * correct / total))
代码解读
