对于DAN方法的解读-Learning Transferable Features with Deep Adaptation Networks

https://blog.csdn.net/weixin_40526176/article/details/79065861

下面分为五个部分来讲解:

 

一.研究背景

二.本论文所解决的问题

三.DAN方法

四.实验部分

五.结合自己的论文

 

 

一.研究背景

 

 精简的说,研究表明:深度神经网络可以学习可迁移特征,这些特征用于域适应时在新的任务上表现出很好的泛化能力。然而由于深度特征随着网络层数的增加由一般到特殊转变,特征的可迁移能力在网络高层急剧下降,极大地增加了域之间的差异性。

 神经网络通常在前面几层都学习到的是通用的特征(general feature),随着网络的加深,后面的网络更偏重于学习特定的特征(specific feature)。

其中有两篇经典论文可以作为背景来介绍。

第一篇是《how transferable are features in deep neural networks?》

该论文可以说是迁移学习非常有里程碑意义的一篇了,其中画出的这个图很能说明问题。我们基础的神经网络可以单独看作B,在此基础上,把网络A进行迁移,其中n代表了迁移,比如BnB+就是把B的前n层迁移到B,+表示微调,意味着更加符合后面网络的形状。我们可以重点来看AnB和AnB+两者,当单纯的把A网络迁移到B上时,可观察到,随着网络层数的增加,前三层变化不大,从第四层开始精确度下降,这也说明了对于AlexNet模型来说,前三层学习到的是通用特征,后面学习到的是specific feature。

第二篇是《Deepdomainconfusion: maximizing for domain invariance》

 该论文提出了一种DDC方法,针对于预训练的AlexNet(8层)网络,在第7层(也就是feature层,softmax的上一层)加入了MMD距离来减小source和target之间的差异。这个方法简称为DDC。

二.本论文所解决的问题

 DAN解决的是迁移学习和机器学习中经典的domain adaptation问题,只不过是以深度网络为载体来进行适配迁移。主要应用在分类和回归问题上。

域适应方法一般要求源域的数据是有标签的,目标域上的数据是无标签的,即实现目标域能够和源域相似的分类。

 域适应强调的是解决有来自两个相关域但分布不同的数据问题。比如汽车图像问题。域差异是不同域之间适应预测模型的主要障碍。

 

三.本文提出的方法:DAN

 DAN是在DDC的基础上发展起来的,它很好地解决了DDC的两个问题:

 一、DDC只适配了一层网络,可能还是不够,因为之前的工作中已经明确指出不同层都是可以迁移的。所以DAN就多适配几层

 二、DDC是用了单一核的MMD,单一固定的核可能不是最优的核。DAN用了多核的MMD(MK-MMD),效果比DDC更好。

 DAN主要思想:通过明确地减少域差异来增强深度学习神经网络的具体任务层的特征迁移性。

 (域差异可以通过使用平均嵌入匹配的最佳多核选择方法来被进一步减小。)

 为了实现这一目标,所有具体任务层的隐藏表示被嵌入到ReproducingkernelHilbertspace,在希尔伯特空间中不同的域分布的平均嵌入可以被明确分配。由于平均嵌入对内核的选择非常敏感,所以设计最优多内核选择过程,这可以进一步减少域差异。

创新点一:多层适配

 DAN也基于AlexNet网络,适配最后三层(6~8层)。为什么是这三层?在前面的图中可以看出,网络的迁移能力在这三层开始就会特别地task-specific,所以要着重适配这三层。至于别的网络(比如GoogLeNet、VGG)等是不是这三层那就不知道了,那得一层一层地计算相似度。DAN只关注使用AlexNet。

  结合自己的实验时,需要考虑适配哪几层

创新点二:MK-MMD(Multi-kernel MMD)

 传统学习方法有一个假设:training sample和test sample都是从同一个分布抽样得到,即训练集和测试集是独立同分布的,这个假设使得离线的学习方法得以运行。在迁移学习环境下training sample和test sample分别取样自分布p和q,两个样本不同但相关,现在我们要通过测试样本改善模型性能。求解这个问题的思路比较多,这里只列一个目前流行的思路:

 利用深度神经网络的特征变换能力,来做特征空间的transformation,直到变换后的特征分布相匹配,这个过程可以是source domain一直变换直到匹配target domain,也可以是source domain和target domain一起变换直到匹配(例如下图)

 (还有其他方法,KLd等)

 

【对该图的理解:源域和目标域的数据都放在一起,通过AlexNet来训练,前三层frozen,第四层第五层fine-tuning,当到后面几层时,source data和target data分开,然后通过MK-MMD方法来计算两个域的距离,并且通过损失函数来进行优化,最后当损失函数优化到设定的阈值时,就可进行最终的分类】

 

概率分布p和q之间的MK-MMDdk(p,q)被定义为p和q的平均嵌入之间的RKHS距离。对于两个概率分布,它们的MK-MMD距离平方就是:

这个多个核一起定义的kernel就是:

 

 

 MMD的书面表达是source sample:x和target sample:y经过函数f:χ→R随机投影后,期望值的差值上确界。

 对于核,原来我们的k就是一个固定的核函数,现在我们把它用m个不同kernel进行加权,权重就是β_μ

总的方法(DAN):

它的优化目标由两部分组成:损失函数和分布距离。损失函数用来度量预测值和真实值的差异。分布距离就是我们上面提到的MK-MMD距离。于是,DAN的优化目标就是

公式里面的字母具体含义都在论文里,可以翻阅查看一下。

其中,λ可以控制MMD的限制程度。如下图,该损失函数不仅能使模型对训练集进行很好地分类,并能让训练集和测试集的分布尽可能地相近。

 

图 算法对两个数据集的处理结果

损失函数的两部分就是干了这样的一件事情,一个优化带有标签的source域的分类结果,另一个通过MK-MMD来让Target域尽可能的和source域适配,减少域差异。

四.实验部分:

 用的都是标准的数据集,可以直接看论文结果即可。

Office-31这个数据集是一个用于域适应的标准数据集。由31个类别的4652张图片组成。这些图片收集于三个不同的域:

 Amazon(A)

 Webcam(W)

  DSLR(D)

 

 

 对于这些实验我们可以进行以下的总结:

 (1)基于深度学习的方法比传统的浅层迁移方法效果提升地非常大

 (2)在以上方法里,半监督式学习LapCNN相对于CNN并没有提高,说明域差异问题不能通过半监督学习来解决。

 (3)DAN7和DAN8都优于DDC,说明多核的MMD比单核的MMD在减轻域差异问题上表现的更好。

 (4)DAN_SK效果比DDC更好,说明深度神经网络对分布适应能力更强,即有多个全连接层,他们具有不同抽象级别的隐藏特征,每层都能提取出独特的隐藏特征,这可以增强深度学习的效率。

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用TensorFlow实现DAN(Domain-Adversarial Neural Networks)的代码示例: 首先,我们需要导入相关的库和模块: ```python import tensorflow as tf import numpy as np ``` 接下来,我们定义一个数据集类,用于加载我们的数据: ```python class DAN_Dataset: def __init__(self, X, y, domain): self.X = X self.y = y self.domain = domain def __len__(self): return len(self.X) def __getitem__(self, index): return self.X[index], self.y[index], self.domain[index] ``` 然后,我们定义一个MLP作为我们的特征提取器: ```python class MLP: def __init__(self, input_dim, hidden_dim, output_dim): self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim self.W1 = tf.Variable(tf.random_normal([self.input_dim, self.hidden_dim])) self.b1 = tf.Variable(tf.zeros([self.hidden_dim])) self.W2 = tf.Variable(tf.random_normal([self.hidden_dim, self.output_dim])) self.b2 = tf.Variable(tf.zeros([self.output_dim])) def forward(self, x): hidden = tf.nn.relu(tf.matmul(x, self.W1) + self.b1) output = tf.matmul(hidden, self.W2) + self.b2 return output ``` 接下来,我们定义一个域分类器(domain classifier): ```python class Domain_Classifier: def __init__(self, input_dim, hidden_dim): self.input_dim = input_dim self.hidden_dim = hidden_dim self.W1 = tf.Variable(tf.random_normal([self.input_dim, self.hidden_dim])) self.b1 = tf.Variable(tf.zeros([self.hidden_dim])) self.W2 = tf.Variable(tf.random_normal([self.hidden_dim, 1])) self.b2 = tf.Variable(tf.zeros([1])) def forward(self, x): hidden = tf.nn.relu(tf.matmul(x, self.W1) + self.b1) output = tf.matmul(hidden, self.W2) + self.b2 return output ``` 接下来,我们定义一个DAN模型: ```python class DAN: def __init__(self, input_dim, hidden_dim, output_dim): self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim self.feature_extractor = MLP(self.input_dim, self.hidden_dim, self.output_dim) self.domain_classifier = Domain_Classifier(self.output_dim, self.hidden_dim) def forward(self, x, alpha): features = self.feature_extractor.forward(x) reverse_features = self.reverse_gradient(features, alpha) domain_output = self.domain_classifier.forward(reverse_features) return features, domain_output def reverse_gradient(self, X, alpha): gradient_reversed_tensor = ReverseGradient(alpha) return gradient_reversed_tensor(X) class ReverseGradient(tf.keras.layers.Layer): def __init__(self, alpha): super(ReverseGradient, self).__init__() self.alpha = alpha def call(self, inputs, **kwargs): return ReverseGradientFunc(self.alpha)(inputs) class ReverseGradientFunc(tf.keras.backend.Function): def __init__(self, alpha): super(ReverseGradientFunc, self).__init__() self.alpha = alpha def call(self, inputs, **kwargs): return inputs def gradient(self, gradients): return -self.alpha * gradients ``` 现在,我们可以使用上述定义的类和模型来训练我们的DAN模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值