(CVPR2020)Model Adaptation: Unsupervised Domain Adaptation without Source Data总结
Model Adaptation: Unsupervised Domain Adaptation without Source Data
本文提出一个新的问题,没有源域数据的无监督领域自适应问题。
说是没有源域数据,其实指的是在Domain Adaptation的过程中不使用源域数据。以本文为例,它仍然使用了使用源域数据预训练出的分类模型。
模型结构
本文主要结构包括三个部分,生成器 G G G,特征提取器和分类器 C C C以及判别器 D D D
特征提取器和分类器 C C C首先使用使用源域数据进行预训练得到一个原始模型。
生成器 G G G使用的是类似 C G A N CGAN CGAN的条件生成网络,输入包括分类类别 y y y和噪声向量 z z z。( C G A N CGAN CGAN中,使用的噪声向量是从一个均值为0,方差为1的高斯分布中随机采样得到)
判别器 D D D与传统的 G A N GAN GAN中的相似,用来判别特征向量来自哪个域
损失函数
针对判别器 D D D的损失函数与传统的相同,即需要判别器可以区分出真实数据和生成数据
m a x θ D ( E x t ∼ D t [ l o g D ( x t ) ] + E y , z [ l o g ( 1 − D ( G ( y , z ) ) ) ] max_{\theta_D}(E_{x_t \sim D_t}[log \ D(x_t)]+E_{y,z}[log(1-D(G(y,z)))] maxθD(Ext∼Dt[log D(xt)]+Ey,z[log(1−D(G(y,z)))]
生成器 G G G与判别器 D D D形成对抗
l a d v ( G ) = E y , z [ l o g ( 1 − D ( G ( y , z ) ) ) ] l_{adv}(G)=E_{y,z}[log(1-D(G(y,z)))] ladv(G)=Ey,z[log(1−D(G(y,z)))]
(论文中这里写的是 l a d v ( G ) = E y , z [ l o g D ( 1 − G ( y , z ) ) ] l_{adv}(G)=E_{y,z}[log \ D(1-G(y,z))] ladv(G)=Ey,z[log D(1−G(y,z))],我感觉他这里写错了)
除此以外,本文还有个用于约束G的损失函数,目标是让生成器可以更好地生成第 y y y类的样本。方式是让生成的样本通过 C C C之后得到的分类结果中,第 y y y类的得分更高,使用交叉熵约束(类似于交叉熵分类损失)
l s e m ( G ) = E y , z [ − y ⋅ l o g ( p θ C ( G ( y , z ) ) ) ] l_{sem}(G)=E_{y,z}[-y \cdot log(p_{\theta_C}(G(y,z)))] lsem(G)=Ey,z[−y⋅log(pθC(G(y,z)))]
对于生成器 G G G,总的损失函数为
m i n θ G ( l a d v + λ s l s e m ) min_{\theta_G}(l_{adv}+\lambda_s l_{sem}) minθG(ladv+λslsem)
对于分类器 C C C,我们同样需要使用损失函数对其进行约束
首先是需要将G生成的样本正确分类,所以同样需要使用约束 G G G的损失函数 l s e m l_{sem} lsem进行约束x`
同时文章还使用了两个损失函数来约束 C C C
首先为了使 C C C的参数相对于使用源域数据训练出的模型参数不要过大,使用损失函数 l w R e g l_{wReg} lwReg约束。使用该损失函数的理由是我们训练仍然要在源域数据的基础上,否则很容易让模型不收敛,毕竟我们目标域的数据不含有标签。
l w R e g = ∣ ∣ θ C − θ C s ∣ ∣ 2 l_{wReg}=||\theta_C-\theta_{C_s}||^2 lwReg=∣∣θC−θCs∣∣2
第二个约束为,我们希望分类器对于数据有轻微扰动的时候,分类结果变化不大(这个我觉得挺新颖的)
就是对于一个输入 x t x_t xt,我们给它加上一个小于某个阈值的扰动 r r r,变成 x t + r x_t+r xt+r,其分类结果应该类似,用损失函数约束为
E x t ∼ D t [ m a x ∣ ∣ r ∣ ∣ ≤ ε ( K L ( p θ C ( x t ) ∣ ∣ p θ C ( x t + r ) ) ) ] E_{x_t \sim D_t}[max_{||r|| \leq \varepsilon}(KL(p_{\theta_C}(x_t)||p_{\theta_C}(x_t+r)))] Ext∼Dt[max∣∣r∣∣≤ε(KL(pθC(xt)∣∣pθC(xt+r)))]
本文使用的是KL散度来约束分类结果的相似度
这里我没有弄懂的点在于这个扰动应该如何去求解,让后面KL散度的值最大,先挖个坑。
之后同样使用了熵约束的方式,让分类器对于 x t x_t xt的分类结果尽量集中在某一个类上,即让分类的结果的某一个类别得分较高,而其他的都较低。(这个就是无标签数据分类的常用约束函数,与分类约束类似,只是因为目标域没有标签信息,无法使用交叉熵约束,只能使用这种约束)
E x t ∼ D t [ − p θ C ( x t ) l o g ( p θ C ( x t ) ) ] E_{x_t \sim D_t}[-p_{\theta_C}(x_t)log(p_{\theta_C}(x_t))] Ext∼Dt[−pθC(xt)log(pθC(xt))]
最后的损失函数为
l c l u R e g = E x t ∼ D t [ − p θ C ( x t ) l o g ( p θ C ( x t ) ) ] + E x t ∼ D t [ K L ( p θ C ( x t ) ∣ ∣ p θ C ( x t + r ~ ) ) ] l_{cluReg}=E_{x_t \sim D_t}[-p_{\theta_C}(x_t)log(p_{\theta_C}(x_t))]+E_{x_t \sim D_t}[KL(p_{\theta_C}(x_t)||p_{\theta_C}(x_t+\tilde{r}))] lcluReg=Ext∼Dt[−pθC(xt)log(pθC(xt))]+Ext∼Dt[KL(pθC(xt)∣∣pθC(xt+r~))]
r ~ \tilde{r} r~为求解出来的最佳的扰动(这里就是上面没弄懂的咋求出的),猜测是梯度下降求解得到,但这会使整个模型的收敛速度变慢很多
最终对于 C C C的损失函数为
m i n θ C λ g l g e n + λ w l w R e g λ c l u l c l u R e n min_{\theta_C}\lambda_gl_{gen}+\lambda_wl_{wReg}\lambda_{clu}l_{cluRen} minθCλglgen+λwlwRegλclulcluRen
伪代码
说实话,在伪代码中,我仍然没看懂这个扰动 r r r到底怎么求出来的…