深度子领域自适应的方法(DSAN)「迁移学习」「AI核心算法」

关注:决策智能与机器学习,深耕AI脱水干货

作者:朱勇椿  来源:王晋东不在家(ID:yourwjd)

转载请联系作者

本期我们将为大家介绍一种极为简单的「深度子领域自适应的方法(DSAN)」,在大多数方法都使用很多项loss相加、越来越复杂的大环境下,这篇文章仅使用一个分类loss和一个自适应loss,方法极为简单,但是效果却非常不错,几乎在所有的主流DA数据集(office-home, office31, Image-CLEF,VisDA-2017, digits)上均有不错的效果。

这篇文章近期发表在一区期刊IEEE Transactions on Neural Networks and Learning Systems (IEEE TNNLS)上,主要作者团队来自中科院计算所与微软亚洲研究院。文章相关链接:

IEEE链接:https://ieeexplore.ieee.org/document/9085896

PDF:http://jd92.wang/assets/files/a24tnnls20.pdf

代码:https://github.com/easezyc/deep-transfer-learning/tree/master/UDA/pytorch1.0/DSAN

背景介绍

近年来无监督领域自适应(unsupervised domain adaptation, UDA)吸引了众多研究者的注意。Deep UDA的方法通常将目标领域数据和源领域数据通过一个深度神经网络提取特征,然后在这个特征空间中对两个领域的特征进行对齐(alignment),希望通过特征对齐减少两个领域间的特征差异。特征对齐的方法通常有两大类,metric-based和adversarial-based。在早期的研究中,大多数方法都进行全局对齐(不考虑任何细粒度的信息,比如标签),最近几年,开始出现了很多更细粒度的方法,这些方法将标签信息纳入考虑。

这些细粒度的方法通常是adversarial-based,众所周知,基于对抗的方法通常面临收敛速度慢收敛难的问题,并且会使用一长串loss,非常复杂

这里介绍的这篇工作解决了上述一系列问题。首先,定义了「子领域」的概念,一个领域下可以依据一些条件,将相似的样本划分到一个子领域,比如使用类标签作为划分依据,同一类放到一个子领域(这篇文章采用类别作为划分依据)。接着不再进行全局对齐,而是分别对相关的子领域进行对齐。

子领域自适应的思想如图所示。

subdomain adaptation

基于子领域自适应的思想,这篇文章提出了一种极为简单的方法——「深度子领域自适应网络(Deep Subdomain Adaption Network, DSAN)」。DSAN方法使用一种**Local MDD(LMMD)**来对齐分布,取得了近几年metric-based方法中最好的效果。

方法介绍

DSAN方法非常之简单,如下图所示:只使用LMMD在不同的层进行对齐。

DSAN

我们使用类别划分来定义子领域,一个子领域就是一个类别,所以LMMD的定义如下:

注意,这里的w在这篇文章中是根据类别定义,实质上,w的定义是非常灵活的,这个部分很容易扩展,比如使用多个相近的类来定义子领域。权重w的定义如下:

这里源领域数据使用真实标签,而目标领域数据使用网络预测的概率分布。LMMD的展开式如下:

整个网络使用如下损失函数进行优化:

上述第一项使用交叉熵作为分类损失,第二项使用LMMD作为自适应损失。可以看到优化目标相比于大多数UDA的方法来说是非常简单的。

实验效果

这篇文章的思想非常简单,但是效果却超越了大多数复杂的方法,在5个数据集上效果如下。

ImageCLEF:

Office31:

OfficeHome:

VisDA-2017:

digits:

DSAN取得了当前metric-based UDA方法最好的效果。和比较著名的JAN进行了一些分析实验:

并且将DSAN和现有的细粒度对齐的方法进行了比较,可以看出DSAN不使用对抗,并且loss少,超参数少,运行时间更快,达到的效果也更好:

总结

近年来,越来越多的研究者为了解决DA问题,倾向于提出一些越来越复杂的方法。但是事实上,越简单的方法往往是越有效果的。因为它关注了DA的本质性问题,而不会被各种新颖的loss冲昏头脑不知道自己到底在干什么。DSAN是就是这样一种非常简单有效的细粒度方法。在未来,读者可以基于DSAN做很多扩展,也希望更多的研究者去做简单但抓住问题本质的方法,「回归研究的本质」,而不是一味地堆叠各种炫酷的模块来达到目的。

References

[1] Zhu Y, Zhuang F, Wang J, et al. Deep Subdomain Adaptation Network for Image Classification[J]. IEEE Transactions on Neural Networks and Learning Systems, 2020.

本文作者:朱勇椿,中国科学院计算技术研究所博士生,研究方向为数据挖掘和迁移学习。

历史精华好文

交流合作

请加微信号:yan_kylin_phenix注明姓名+单位+从业方向+地点,非诚勿扰。

  • 2
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于在PyTorch上实现基于DSAN的域自适应回归迁移学习,你可以按照以下步骤进行操作: 1. 导入所需的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader ``` 2. 定义DSAN模型: ```python class DSAN(nn.Module): def __init__(self): super(DSAN, self).__init__() # 定义模型结构 def forward(self, x): # 定义前向传播逻辑 return x ``` 3. 定义自适应损失函数: ```python class DSANLoss(nn.Module): def __init__(self): super(DSANLoss, self).__init__() # 定义损失函数 def forward(self, output, target): # 计算损失函数值 return loss ``` 4. 定义域自适应回归迁移学习的训练函数: ```python def train(model, dataloader, criterion, optimizer): model.train() # 迭代训练数据集 for i, (source_data, target_data) in enumerate(dataloader): # 前向传播计算输出 outputs = model(source_data) # 计算损失函数值 loss = criterion(outputs, target_data) # 反向传播更新参数 optimizer.zero_grad() loss.backward() optimizer.step() ``` 5. 定义数据加载器和优化器: ```python # 实例化数据加载器 source_dataloader = DataLoader(source_dataset, batch_size=batch_size, shuffle=True) target_dataloader = DataLoader(target_dataset, batch_size=batch_size, shuffle=True) # 实例化模型和损失函数 model = DSAN() criterion = DSANLoss() # 定义优化器 optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 6. 执行迁移学习的训练过程: ```python for epoch in range(num_epochs): train(model, source_dataloader, criterion, optimizer) ``` 这是一个基本的框架,你可以根据自己的需求进行修改和扩展。同时,你需要根据实际情况准备好源领域和目标领域的数据集,并根据自己的任务定义模型结构和损失函数。在训练过程中,通过适当调整超参数和优化策略,以获得最佳的迁移学习效果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值