跨域混淆或错误对齐
这篇文章于2018年发表在AAAI,作者是清华大学龙明盛老师的学生。作者提到,域适应存在两个技术挑战:
在这些挑战的激励下,作者提出一种多对抗域自适应(MADA)方法,它捕获多模式结构,以支持基于多个域鉴别器的不同数据分布的细粒度对齐。与以前的方法相比,一个关键的改进是能够同时促进相关数据的正迁移和减轻不相关数据的负迁移。利用线性时间内的反向传播计算梯度,通过随机梯度下降实现自适应。
我们可以看到上面的蓝色线条,这就是局部域分类器。
对抗学习过程是一个双人博弈
本文提出的多对抗域自适应网络实现了细粒度自适应,每个数据点 x i x_i xi?仅由相关的域鉴别器根据其概率 y i y_i yi?进行匹配。这种细粒度的适应可能带来三个好处。
# 前向传播方法
def forward(self, x):
# 计算 lambda(lbda)
lbda = self.get_lambda_p(self.get_p()) if self.mode == 'Train' else 0
# 提取特征
features = self.backbone(x) # 通过特征提取器获取特征
features = features.reshape(features.size(0), -1) # 重塑特征形状为二维
# 类别分类器得到类别预测结果
class_logits = self.class_classifier(features)
class_predictions = F.softmax(class_logits, dim=1) # 对类别 logits 进行 softmax 得到概率
# 对特征进行反转(领域自适应)
reverse_features = GRL.apply(features, lbda)
# 对每个类别使用独立的领域分类器进行域分类
domain_logits = []
for class_idx in range(self.num_classes):
weighted_reverse_features = class_predictions[:, class_idx].unsqueeze(1) * reverse_features
# 域分类器对加权的反转特征进行域分类
domain_logits.append(
self.domain_classifiers[class_idx](weighted_reverse_features).cuda()
)
return class_logits, domain_logits # 返回类别 logits 和域 logits
前向传播(forward):
多个域分类器: 对每个类别都有一个独立的领域分类器,以便更好地适应不同类别在不同域中的分布情况。
本文提出了一种新的多对抗域自适应方法来实现有效的深度迁移学习。与以往的领域对抗自适应方法只匹配域间的特征分布而不利用复杂的多模结构不同,该方法进一步利用判别结构,在多对抗自适应框架中实现细粒度分布对齐,同时促进正迁移和规避负迁移。