2022年cvpr, 一作香港大学。声称sota,但是代码未公开。
Domain Adaptation 指知道训练数据的源域,也知道目标域,仅仅是缺少目标域的样本标签。
Domain generalization 指知道训练数据的源域 但是不知道目标域是什么,给猫狗数据集但是不知道后面是在具体什么数据集上测试。这样如果训练数据有多个源域的话,可以认为我们知道每个具体样本所属的域。但是实际场景中可能我们从不同源收集到一大堆数据但是收集过程中域进行了混合,最后不知道每个具体样本对于的域是什么了。 举例,某个域猫猫对于是类别1,狗狗对应类别2;另一个域鸡对于1,鸭对于2;本身通过域标签我们可以区分这些样本,但是当混合在一起后,猫猫和鸡就是一种类别,狗狗和鸭也是一类。
*一个问题:论文中说DG是指训练好模型后不再在target domain上微调和再训练,这和元学习就不太一样了,省略了这种inner loop后元学习甚至没法用。(但是只有数据的无监督似乎可以?对比学习是否可以?)
本文主要就是解决这么一种compound domain generalization问题。可以看出域标签其实是很重要的,所以其思路也是先获得域标签信息(概率分布),后续再进行预测。其中作者比较强调的是,现有域不变特征学习,gradient-based meta-learning, augmentation-based generalization等方法都是强调单一域和目标域之间的联系,而没有像作者用图表征多个域之间的互相联系。
主要分为三个组件:1. 将域标签信息考虑进batch norm 2. 类似GNN 3.contrastive learning
第一个是SD-Norm组件:首先抽取风格特征(按channel维)获取均值和标准差。紧接着引入域标签预测器(F_d)
实际上可以看出,上述损失函数是交叉熵用预测标签代替真实标签,所以优化方向是锐化模型让输出值趋向0或者1.
SD-Norm 就是一个考虑样本域信息的正则层,相对于batch norm仅仅将同一个batch的数据0均值化,和方差缩小化。SD-Norm针对不同隐域使用加权系数得到不同均值和方差缩小系数。而这里的权重就是由域类别预测器计算得到的每个样本属于特定域的概率分布。
SD-Norm主要像batch norm一样插入到CNN为基础的模型中。
第二个和第三个模块则是为了构建不同category(不同域的不同类别)间的语义联系:ProtoGR & ProtoCCL。 这里借鉴了few-shot learning中的原型思想 prototype,利用一向量来表征某个category从而可以对不同category间的联系建模。这里ProtoGR类似GNN收集临近的其他category信息聚合成自己的embedding,而ProtoCCL则是利用对比学习(自监督),增加样本数量。
那么具体而言如何构建图并设计模块呢?
我们假定有m个隐域, 每个域对于k个类别(class),那么最终我们就有m*k个category,将每个category视为一个节点,并用维度d的张量进行表征。不同节点间的距离利用余弦相似度来计算,并设计最低阈值,低于阈值则视为无联系(值为0)。构建完网络后,设计两层的图注意力网络构成protoGR模块。注意,这里protoGR输入的是在backbone特征提取器输出的embedding形成的本地prototype(由前面预测的域和标签构成)。
W可以视为embedding矩阵,权重\alpha_{ij}用于描述不同邻近节点对该点的影响程度。
最终得到的预测标签为,protoGR的输出+FC预测层。
另一部分protoCCL,则是利用prototype设置正例反例进行额外loss训练。
尽可能使得相似模块embedding相近,其余远离,是一种合理的正则化手段。
总结,该论文实验部分主要是多个benchmark上性能对比,消融实验,t-SNE可视化以及一个可有可无的混淆矩阵图。思路prototype思路上感觉好像不是很新颖前面工作也有很多考虑的,但是构建图然后引入边参数倒是创新的,然而带来实际效果影响还需实践。