0%

『论文笔记』Larger Norm More Transferable - An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation

Information

  • Title: Larger Norm More Transferable: An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation
  • Author: Ruijia Xu, Guanbin Li, Jihan Yang, Liang Lin
  • Institution: 中山大学
  • Year: 2019
  • Journal: ICCV
  • Source: arxiv, open access, PDF, official code
  • Idea: 将源域和目标域的特征范数对齐到一个大的标量来提高模型的迁移性
1
2
3
4
5
6
7
@InProceedings{Xu_2019_ICCV,
author = {Xu, Ruijia and Li, Guanbin and Yang, Jihan and Lin, Liang},
title = {Larger Norm More Transferable: An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation},
booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
month = {October},
year = {2019}
}

Abstract

揭示了分类器在目标域不稳定的原因是其特征范数比对应源域要小。提出了一种无参数的自适应特征范数方法。证明了大范数对于与提高迁移性能有显著效果。

来自中大官网[1]

数据科学与计算机学院2017级硕士生许瑞嘉发表的论文《Larger Norm More Transferable: An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation》被录用为大会口头报告论文,并荣获大会最佳论文提名奖,也是唯一一篇来自中国的最佳提名论文。该论文的指导老师为我院李冠彬副教授和林倞教授,论文的全部作者均来自中山大学数据科学与计算机学院。

论文提出了一种基于特征范数适配的无监督领域自适应方法,该方法将目标域特征范数逐渐增大,结合源域的分类损失,实现了从源域到目标域的无监督迁移。该方法揭示了特征范数适配操作可以避免显式的领域特征对齐,同时针对源域和目标域中的不相交类别具有更强的鲁棒性,相比一类启发式加权算法在性能上有了显著提升。此外,该方法在大规模和领域间差异较显著的迁移任务中也获得了很好的性能。

Introduction

所谓域适应就是在有标签的数据集上训练的模型中的知识迁移到无标签的目标域中,已有的方法主要是限制分类器不单单学习任务相关的特征,还要学习带不变的特征,对抗域适应是一种常用的方法,通过对抗的方式来使得模型学习到域不变的特征。

虽然很早就发现了模型在目标域的性能会下降,但很少有深入研究这种现象产生的原因,下图展示了目标样本倾向于小范数(小半径)区域使得决策边界的轻微的角度变化并导致不稳定的分类。

norm

visda_crop

对于这种情况有两种可能的解释:

  1. 特征范数未对齐假说:源域和目标域的域偏移依赖错误对齐的特征范数。将两个域的平均特征范数对齐到一个共有的值使得具有相似的转移收益。
  2. 小特征范数假说:域偏移依赖目标任务的少量信息带来的小的范数,即使不完全对齐,但将目标特征远离小的特征区域可能导致安全的迁移。

考虑这两个假说,作者提出了 AFN 方法,首先,提出了一种统计距离表征跨域平均特征范数差异的方法,其次设计了 Hard AFN 通过限制两个域的期望特征范数为一个共同的值来小于域偏差。结果表明范数对齐的特征能具有有效的迁移性能,同时结果显示范数提升为一个较大的标量。随后作者又提出了 stepwise AFN 以稳定的方法逐步提高特征范数到一个足够大的值,该方法的关键是在严格对齐的条件下逐渐的将特征范数向大范数的区域转移。

作者认为特征范数的大小与参数的重要性和蕴含的信息是相关的,通过增大特征的范数能提高特征所包含的信息以及使特征更具有迁移性。

作者的贡献如下:

  1. 经验的解释了一般模型性能在目标域性能不好的原因是太小的特征范数导致分类器不稳定
  2. 提出了用于无监督域泛化的方法 AFN 逐步将两个域的特征范数调整到一个较大范围的标量,该方法简单但有效。
  3. 特征范数自适应能有效防御负迁移(即一些无关样本或离群样本导致的迁移性能下降)
  4. 实验证明方法是有效的

自己测试了一下作者提出的 motivation:

Source FER2013+ RAF ExpW AFEW
FER2013+ 5.12 0.65 0.62 0.62
AFEW 8.18 1.00 1.01 0.84
ExpW 4.74 0.64 0.59 0.56

Method

\(\mathcal{D}_s = \{(x_i^s,y_i^s)\}_{i=1}^{n_s}\) 表示源域,其包含 \(n_s\) 类,记为 \(|\mathcal{C}_s|\) ,用 \(\mathcal{D}_t = \{x_i^t\}_{i=1}^{n_t}\) 表示目标域,其中包含 \(n_t\) 个无标签类,记为 \(|\mathcal{C}_t|\)

  • 一般设置:源域和目标域共享标签空间,即 \(\mathcal{C}_s = \mathcal{C}_t\).
  • 部分设置:源域包含目标域 \(\mathcal{C}_s \supset \mathcal{C}_t\),有部分源域类别 \(\mathcal{C}_s \backslash \mathcal{C}_t\) 与目标域无关。

L2-preserved Dropout

作者将证明标准的 dropout 操作是 \(L_1\)-保留的,而作者提出的方法是基于 \(L_2\)-保留的 dropout 操作。

标准的 Dropout 操作是将给定的 \(d\) 维向量 \(\textbf{x}\) 以概率 \(p\) 随机采样一些点 \(x_k,k = 1,2,\ldots,d\) 即采样 \(a_k \sim P\) 满足伯努利分布: \[ P(a_k)= \begin{cases} \quad p, & a_k=0\\ 1-p, & a_k=1 \end{cases} \] 在验证阶段为了计算恒等函数,输出用 \(\dfrac{1}{1-p}\) 进行放大,即: \[ \hat{x}_{k}=a_k\frac{1}{1-p}x_k \] 这意味着在训练和验证阶段 \(x_k\) and \(a_k\)\(L_1\) 范数是独立的: \[ \mathbb{E}[|\hat{x}_k|]=\mathbb{E}[|a_k\frac{1}{1-p}x_k|]= \frac{1}{1-p}\mathbb{E}[a_k]\mathbb{E}[|x_k|]=\mathbb{E}[|x_k|] \] 但作者追求的是自适应的 \(L_2\) 特征范数,所以用 \(\dfrac{1}{\sqrt{1-p}}\) 代替原来的放大因子,得到: \[ \hat{x}_k=a_k\frac{1}{\sqrt{1-p}}x_k \] 这满足: \[ \mathbb{E}[|\hat{x}_k|^2]=\mathbb{E}[|a_k\frac{1}{\sqrt{1-p}}x_k|^2]=\frac{1}{1-p}\mathbb{E}[a_k^2]\mathbb{E}[|x_k|^2]=\mathbb{E}[|x_k|^2] \]

Framework

net_framework

如图所示,作者提出的框架有骨架网络 \(G\) 和分类器 \(F\) 组成。现有发现说明网络中越深层的特征越不具备泛化性越与特定任务相关,其迁移性也显著降低。\(G\) 是常用的特征提取网络例如 ResNet. 而 \(F\) 是任务相关的分类器,一般是一个 \(l\) 层的全连接层。记 \(l-1\) 层为 \(F_f\),产生的特征记为 \(\textbf{f}\),由 \(F_f\) 计算得到的特征值针对特定域任务的,不具备良好的迁移性。因此独立最后一层 \(F_y\) 计算分类概率。\(G\), \(F_f\), \(F_y\) 对于的参数为 \(\theta_g\), \(\theta_f\), \(\theta_y\). 作者的目标是使特征 \(\textbf{f}\) 具备域迁移性。

Hard AFN

基于未对齐特征范数假说,作者提出了最大平均特征范数差异(MMFND)来表示两个分布之间的平均特征范数距离并验证连接统计域间隙是否可以获得显著迁移性。MMFND由下式定义,其中函数类 \(\mathcal{H}\) 是有 \(L_2\) 范数操作与深度表达模块组合的所有可能函数的组合。例如 \(h(x) = (\left \| \cdot \right \|_2 \circ F_f \circ G)(x)\). \[ \begin{aligned} \text{MMFND}[\mathcal{H},\mathcal{D}_s,\mathcal{D}_t] := \sup_{h \in \mathcal{H}}(\frac{1}{n_s}\sum_{x_i\in \mathcal{D}_s}h(x_i) - \frac{1}{n_t}\sum_{x_i\in \mathcal{D}_t}h(x_i))\,. \end{aligned} \] \(\mathcal{H}\) 如果没有限制上界可能远远大于0,为了避免这种情况,作者设置了约束尺度 \(R\) 来匹配对应的平均特征范数。通过对两个域平均特征范数限制并达到平衡状态,MMFND表示的域间隙就会消失。作者通过 Hard Adaptive Feature Norm(HAFN) 算法实现,如下面的公式所示 \[ \begin{aligned} C_1(\theta_g,\theta_f,\theta_y)=\frac{1}{n_s}\sum_{(x_i,y_i) \in D_s}L_y(x_i, y_i) + \lambda(L_d(\frac{1}{n_s}\sum_{x_i \in D_s} h(x_i), R) + L_d(\frac{1}{n_t}\sum_{x_i \in D_t} h(x_i), R)) \end{aligned} \] 优化器包含两项:源分类损失 \(L_y\) 用于在源域最小化交叉熵损失得到任务相关的特征: \[ L_y(x_i^s,y_i^s;\theta_g,\theta_f,\theta_y)=-\sum_{k=1}^{|\mathcal{C}_s|}\mathbb{1}_{[k=y_i^s]}\log p_k \] 其中 \(p=\left[ p_1, \ldots, p_{|\mathcal{C}_s|} \right]\) 是 softmax 对分类的预测 \(p=softmax(F(G(x)))\),而特征范数惩罚目的是通过最小化两个域直接的特征范数差异来获得具有域迁移性能的特征。\(L_d(\cdot, \cdot)\)\(L_2\) 距离, \(\lambda\) 是超参数。

MMFND是一个简单有效的表征了域偏移,然后通过 HAFN 的方法连接了源域的特征范数差异,最后得到了同时具备特征相关和域迁移的特征。

但是理论上很合理,但 \(R\) 的设置是一个问题,根据假说里面推荐的,将两个域的特征范数期望对齐能提高域迁移性能,但实验结果表示即使将两个域的特征范数限制为一个很小的值依然能在目标域中取得较好的效果,所以值得考虑将特征范数期望对齐为一个大值是否是有必要的。事实上 HAFN 是失败很可能 会导致梯度爆炸。

Stepwise AFN

为了解决上面的问题,作者提出了一种改进方法 SAFN,为了鼓励模型以渐进的方式学习具有更大范数的任务相关的特征,SAFN 如下: \[ C_2(\theta_g,\theta_f,\theta_y)=\frac{1}{n_s}\sum_{(x_i, y_i) \in D_s}L_y(x_i, y_i) + \frac{\lambda}{n_s+n_t}\sum_{x_i \in D_s \cup D_t} L_d(h(x_i;\theta_0)+\Delta r, h(x_i; \theta)) \] 其中 \(\theta = \theta_g \cup \theta_f\). \(\theta_0\)\(\theta\) 表示前一轮和当前迭代的模型参数。\(\Delta r\) 表示正的残差尺度用于控制特征范数变大。在每次迭代期间,SAFN 中的第二个惩罚项鼓励相对于单个样本的 \(\Delta r\) 步骤大小的特征标记扩大,这是基于其在上次迭代中过去模型参数计算得出的特征范数。相比指定一个大的值,SAFN使得优化器更稳定标签易于在两个目标直接平衡。SAFN 不会严格减小平均特征范数差异,但可以选择性的设置终点 \(R\) 以现在无限制的增大,如下式所示 \[ L_d(\max(h(x_i;\theta_0)+\Delta r, R), h(x_i; \theta)) \] 就如小特征范数假说所说,只有将特征样本移到大的范数区域,那么严格的范数对齐就不是必要的了。

Model Robustness Evaluation

作者针对 迁移源域的知识到目标域可能会有负面影响 提出了一些测试指标,首先有三个定义:

  • \(A_{\mathcal{T}_{|\mathcal{C}_t|}}^{l\%}\): 使用 \(l\%\) 的目标标签数据下的准确率
  • \(A_{\mathcal{S}_{|\mathcal{C}_t|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}\): 分类完全对应的迁移
  • \(A_{\mathcal{S}_{|\mathcal{C}_s|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}\): 分类不完全对应的迁移

随后定义了一些测试指标

  • CNG(Closed Negative Gap): \(A_{\mathcal{T}_{|\mathcal{C}_t|}}^{l\%} - A_{\mathcal{S}_{|\mathcal{C}_t|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}\),表示算法的迁移效果与负面影响的收益
  • ONG(Outlier Negative Gap): \(A_{\mathcal{S}_{|\mathcal{C}_t|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}- A_{\mathcal{S}_{|\mathcal{C}_s|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}\) ,表示源域中那些在目标域中没有的分类带来的负面影响
  • PNG(Partial Negative Gap): \(A_{\mathcal{T}_{|\mathcal{C}_t|}}^{l\%} - A_{\mathcal{S}_{|\mathcal{C}_s|} \rightarrow \mathcal{T}_{|\mathcal{C}_t|}}\) 揭示算法从具有CNG和ONG潜在风险的可用大型域中访问和转移是否有价值。我们说,一旦差距值为正,负面影响就超过了正增长,反之亦然。较大的绝对值表明,更迫切的负面影响或更具鼓励的积极收益。

Detail

实验参数:

  • Offoice-Home, Office-31, ImageCLEF-DA: \(\lambda = 0.05, R = 25, \Delta r = 1.0\).
  • VisDA2017: \(\lambda = 0.01, \Delta r = 0.3\).
  • 学习率 \(1.0 \times 10 ^ {-3}\).

Experiment

可以看看论文,表格很多这里就不展示了,就展示一个结果图吧:

image-20220923164209473

Conclusion

展示了在无监督域适应的发现,主要是模型在目标域性能下降的主要是因为范数比源域要小。作者证明了大范数对于与提高迁移性能有显著效果。提出了一种无参数的自适应特征范数方法

Others

流程图

根据开源代码简单画的网络流程图

pipeline

代码分析

HAFN

模型部分:简单来说就是直接把 resnet50 的特征提取(即处理最后的全连接层)和分类器分成两个部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from torchvision import models
class ResBase50(nn.Module):
def __init__(self):
super(ResBase50, self).__init__()
model_resnet50 = models.resnet50(pretrained=True)
self.conv1 = model_resnet50.conv1
self.bn1 = model_resnet50.bn1
self.relu = model_resnet50.relu
self.maxpool = model_resnet50.maxpool
self.layer1 = model_resnet50.layer1
self.layer2 = model_resnet50.layer2
self.layer3 = model_resnet50.layer3
self.layer4 = model_resnet50.layer4
self.avgpool = model_resnet50.avgpool

def forward(self, x):
...


class ResClassifier(nn.Module):
def __init__(self, class_num=65, extract=True, dropout_p=0.5):
super(ResClassifier, self).__init__()
self.fc1 = nn.Sequential(
nn.Linear(2048, 1000),
nn.BatchNorm1d(1000, affine=True),
nn.ReLU(inplace=True),
nn.Dropout(p=dropout_p)
)
self.fc2 = nn.Linear(1000, class_num)
self.extract = extract
self.dropout_p = dropout_p

def forward(self, x):
fc1_emb = self.fc1(x)
if self.training:
fc1_emb.mul_(math.sqrt(1 - self.dropout_p))
logit = self.fc2(fc1_emb)

if self.extract:
return fc1_emb, logit
return logit
netG = ResBase50().cuda()
netF = ResClassifier(class_num=args.class_num, extract=args.extract, dropout_p=args.dropout_p).cuda()

HAFN损失函数:实际上分类损失就是交叉熵损失,而后面的是将输入的范数均值与所给值的差的平方,即让特征范数靠近指定值。

1
2
3
4
5
6
7
def get_cls_loss(pred, gt):
cls_loss = F.nll_loss(F.log_softmax(pred), gt)
return cls_loss

def get_L2norm_loss_self_driven(x):
l = (x.norm(p=2, dim=1).mean() - args.radius) ** 2
return args.weight_L2norm * l

SAFN损失函数

1
2
3
4
5
6
7
8
9
10
def get_cls_loss(pred, gt):
cls_loss = F.nll_loss(F.log_softmax(pred), gt)
return cls_loss

def get_L2norm_loss_self_driven(x):
radius = x.norm(p=2, dim=1).detach()
assert radius.requires_grad == False
radius = radius + 1.0
l = ((x.norm(p=2, dim=1) - radius) ** 2).mean()
return args.weight_L2norm * l

所谓自适应就是让目标永远在前面比原来的大 1,所以第二个损失其实是固定值,但又能约束特征范数变大

训练流程的一些关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
opt_g = optim.SGD(netG.parameters(), lr=args.lr, weight_decay=0.0005)
opt_f = optim.SGD(netF.parameters(), lr=args.lr, momentum=0.9, weight_decay=0.0005)
for epoch in range(1, args.pre_epoches + 1):
for i, (s_imgs, s_labels) in tqdm.tqdm(enumerate(source_loader)):
...

s_bottleneck = netG(s_imgs)
s_fc2_emb, s_logit = netF(s_bottleneck)

s_fc2_ring_loss = get_L2norm_loss_self_driven(s_fc2_emb)
s_cls_loss = get_cls_loss(s_logit, s_labels)

loss = s_cls_loss + s_fc2_ring_loss
loss.backward()

...

for epoch in range(1, args.epoch + 1):
...

for i, (t_imgs, _) in tqdm.tqdm(enumerate(target_loader_iter)):
s_imgs, s_labels = source_loader_iter.next()

...

s_bottleneck = netG(s_imgs)
t_bottleneck = netG(t_imgs)
s_fc2_emb, s_logit = netF(s_bottleneck)
t_fc2_emb, t_logit = netF(t_bottleneck)

s_cls_loss = get_cls_loss(s_logit, s_labels)
s_fc2_L2norm_loss = get_L2norm_loss_self_driven(s_fc2_emb)
t_fc2_L2norm_loss = get_L2norm_loss_self_driven(t_fc2_emb)

loss = s_cls_loss + s_fc2_L2norm_loss + t_fc2_L2norm_loss
loss.backward()

opt_g.step()
opt_f.step()

简单来看训练分成了两部分,第一部分只在源域训练,最后 fc 的前一层的范数计算 loss 然后计算分类loss

改进

老师和师兄给出的一些建议是:

  • 范数变大了以后虽然类间距变大了,分类更容易了,但类内距离也变大了,从实验结果的来看确实如此,所以可以考虑约束让类内距离也减小
  • 让范数变成可学习的参数
  • 不是对于所有的样本都一视同仁的将范数调大,对于困难样本,我们将其调整大一下,使其具有更高的激活值,对于简单样本,我们将其抑制。

结果复现

Office-Home

基于 ResNet50 的复现结果,括号中标注了 paper 的为论文中的结果

Method Ar\(\rightarrow\)Cl Ar\(\rightarrow\)Pr Ar\(\rightarrow\)Rw Cl\(\rightarrow\)Ar Cl\(\rightarrow\)Pr Cl\(\rightarrow\)Rw Pr\(\rightarrow\)Ar Pr\(\rightarrow\)Cl Pr\(\rightarrow\)Rw Rw\(\rightarrow\)Ar Rw\(\rightarrow\)Cl Rw\(\rightarrow\)Pr Avg
ResNet50 43.14 59.32 69.80 44.17 57.94 58.30 40.38 36.40 65.48 59.33 47.24 76.23 54.81
ResNet50(paper) 34.9 50.0 58.0 37.4 41.9 46.2 38.5 31.2 60.4 53.9 41.2 59.9 46.1
HAFN(paper) 50.2 70.1 76.6 61.1 68.0 70.7 59.5 48.4 77.3 69.4 53.0 80.2 65.4
SAFN(paper) 52.0 71.1 76.3 64.2 69.9 71.9 63.7 51.4 77.1 70.9 57.1 81.5 67.3

Office-31

基于 ResNet50 的复现结果,括号中标注了 paper 的为论文中的结果

Method A\(\rightarrow\)D A\(\rightarrow\)W D\(\rightarrow\)A D\(\rightarrow\)W W\(\rightarrow\)A W\(\rightarrow\)D Avg
ResNet-50 72.49 67.80 54.60 95.97 52.72 100.00 73.93
ResNet-50(paper) 68.9 68.4 62.5 96.7 60.7 99.3 76.1
HAFN 84.94 84.15 69.47 98.36 68.51 99.59 84.17
HAFN(paper) 84.4 83.4 69.4 98.3 68.5 99.7 83.9
SAFN 88.76 88.05 71.03 97.98 69.89 99.79 85.91
SAFN(paper) 87.7 88.8 69.8 98.4 69.7 99.8 85.7

VisDA2017

基于 ResNet50 的复现结果(但论文中使用的是 ResNet101, 所以结果稍差一些),括号中标注了 paper 的为论文中的结果

Method plane bcycl bus car horse knife mcycl person plant sktbrd train truck Per-class
ResNet(paper) 55.1 53.3 61.9 59.1 80.6 17.9 79.7 31.2 81.0 26.5 73.5 8.5 52.4
HAFN 89.06 50.16 80.36 66.35 90.02 40.86 91.36 70.42 86.22 51.99 88.62 18.24 68.64
HAFN(paper) 92.7 55.4 82.4 70.9 93.2 71.2 90.8 78.2 89.1 50.2 88.9 24.5 73.9
SAFN 87.98 54.39 79.08 66.90 90.83 39.13 91.10 71.58 89.99 53.66 89.57 16.73 69.24
SAFN(paper) 93.6 61.3 84.1 70.6 94.1 79.0 91.8 79.6 89.9 55.6 89.0 24.4 76.1

References


如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客 查看更多笔记

--- ♥ end ♥ ---

欢迎关注我呀~