Distant Domain Transfer Learning远域迁移学习--通过人脸识别飞机!

论文地址:
http://www.ntu.edu.sg/home/sinnopan/publications/[AAAI17]Distant Domain Transfer Learning.pdf

从标题就可以看出,这是一个很有想法的论文。现今很多迁移学习方法都是假设源域和目标域之间存在某些相似性,这样才能够进行迁移,而这篇文章提出了一种方法,叫做:Selective Learning Algorithm,这种方法即使源域和目标域毫无关系,比如源域使用人脸图像,目标域中是飞机图像,都可以完成迁移。Amazing!这怎么可能呢?不过换一种思路的话是可行的,论文基于一种传递和推断的思想,怎么个传递和推断呢?我们假设源域和目标域分别是两个不同的点,要从源域走到目标域,怎么走呢?虽然源域和目标域完全不同,隔得很远,但是我们可以通过中间的点,一步一步走到源域,而这中间的点,又被叫做中间域(媒介域)。
 
好了,大体的思想我们知道了,是通过传递来实现的,现在我们回到迁移中来,要从源域通过多个中间域,最终对目标域进行任务判别,那么需要从中间域中找出与源域相似的特征,又与目标域相似的特征,这样才可以将三者结合起来。因为源域可能与目标域差的实在太远了,而中间域里可能包含了很多对目标域有用的数据,我们要用到的中间域可能很多,所以中间域(这里把所以的中间域看成一个集合,就叫中间域,里面包含了很多域的数据)中的特征也很多,那怎么选择满足要求的特征呢?同时,如果我们找到了这些特征,但是这些特征仅是与源域、目标域相似而已,而我们最终的目的是通过这些特征能够对目标任务进行判定,那么我们还需要从特征中选择出具有边信息(side information)的特征用于判别目标任务,其中边信息可以理解为具有指向性的信息。是的,这样看起来就初步完善了,论文的主要的两大步骤也是这两点:

  • 样本(特征)选择
  • 合并边信息

样本自动选择

在论文中,作者假设源域是有标签的,目标域有一小部分有标签,而中间域是没有标签的。然后,SLA的框架如下:

Distant Domain Transfer Learning远域迁移学习--通过人脸识别飞机!_第1张图片

那怎么从中间域中选出对目标域有用、同时又与源域相关(源域和中间域的区别就在于源域有标签可用)的数据或特征呢?这里,作者用到了自编码器(无监督–联想到中间域是无标签的),自编码器分为编码器和反编码器(其中反编码过程又叫做重构过程),输入数据通过编码映射为隐藏特征: h = f e ( x ) h=f_e(x) h=fe(x),然后反编码器通过重构误差,又将 h h h尽可能的解码: x ′ = f d ( h ) x'=f_d(h) x=fd(h),让x’接近原始数据x。经过这么一个过程,中间的特征h就可以认为是原始数据x的一种特征提取,并且是具有鲁棒性的高层级特征。

好,自编码器我们大概知道个是什么鸟回事了,那这和样本自动选择有什么关系呢?是这样的,作者认为,如果同一个自编码器在源域和目标域数据上都取得较小的重构误差,那么这个源域数据就类似于目标域数据,或者是对目标域来说是有用的,也可以这么理解,在重构误差都较小的情况下,源域通过编码器(一对参数)得到的特征h与目标域通过同一个编码器(一样的参数)得到的特征可以看为是相近的。另外中间域和目标域也是那么个回事。OK,通过这样就可以选出源域中对目标域有用的数据了—通过重构误差判断,然后通过在源域、目标域、中间域上同时最小化损失函数来完成这一过程,其中损失函数又由上面提到的重构误差组成:

J 1 ( f e , f d , v S , v T ) = 1 n S ∑ i = 1 n S v S i ∣ ∣ ( x S ′ ) i − x S i ∣ ∣ 2 2 + 1 n I ∑ i = 1 n I v I i ∣ ∣ ( x I ′ ) i − x I i ∣ ∣ 2 2 + 1 n T ∑ i = 1 n T v T i ∣ ∣ ( x T ′ ) i − x T i ∣ ∣ 2 2 + R ( v S , v I ) \mathcal{J}_1(f_e,f_d,v_S,v_T)= \frac{1}{n_S}\sum_{i=1}^{n_S} v_S^i||(x'_S)^i-x_S^i||_2^2 + \frac{1}{n_I}\sum_{i=1}^{n_I} v_I^i||(x'_I)^i-x_I^i||_2^2 + \frac{1}{n_T}\sum_{i=1}^{n_T} v_T^i||(x'_T)^i-x_T^i||_2^2 + R(v_S,v_I) J1(fe,fd,vS,vT)=nS1i=1nSvSi(xS)ixSi22+nI1i=1nIvIi(xI)ixIi22+nT1i=1nTvTi(xT)ixTi22+R(vS,vI)

其中 f e 、 f d f_e、f_d fefd对应于自编码器的编码器(encoder)参数和反编码器(decoder)参数, v S 、 v I v_S、v_I vSvI分别为源域和中间域的选择指示向量,表示第几个样本为选中,选中的用1表示,不选的用0表示。而 R ( v S , v I ) R(v_S,v_I) R(vS,vI)是关于 v S 、 v I v_S、v_I vSvI的一个正则化项,用于避免 v S 、 v I v_S、v_I vSvI中全部为0的情况,其中 R ( v S , v I ) R(v_S,v_I) R(vS,vI)如下:

R ( v S , v I ) = − λ S n S ∑ i = 1 n S v S i − − λ I n I ∑ i = 1 n I v I i R(v_S,v_I) = - \frac{\lambda_S}{n_S}\sum_{i=1}^{n_S} v_S^i - -\frac{\lambda_I}{n_I}\sum_{i=1}^{n_I} v_I^i R(vS,vI)=nSλSi=1nSvSinIλIi=1nIvIi

通过最小化 R ( v S , v I ) R(v_S,v_I) R(vS,vI)促使网络从源域和中间域中选择更多的向量。

合并边信息

除了找出相关样本和特征之外,我们还要选出那些对目标任务分类有帮助的样本,那怎么知道一个样本是否对目标任务有帮助呢?最简单的一个方法就是直接把它扔去分类,看分类效果就知道了,这一部分对应的上面框架图中preditive model on the labeled data部分,分类器直接将自编码器的中间特征h作为输入进行分类,但是要知道分类的效果好还是不好需要根据标签来进行衡量呀,同时分类器还需要标签和损失函数进行优化才行。上面我们提到,源域是有标签的,目标域中也是有标签的,只是目标域中有标签数据较少,我们也就只使用那一部分很少的目标域数据作为训练,但是问题是中间域是没有标签的啊!怎么办呢?迁移学习中常用的一种办法就是构造伪标签,而这里则是通过中间域的熵信息作为伪标签,也就是: g ( f c ( h I i ) ) g(f_c(h_I^i)) g(fc(hIi)),其中 f c f_c fc为分类器参数,g()为熵函数:

g ( x ) = − x l n x − ( 1 − x ) l n ( 1 − x ) g(x) = -xlnx - (1-x)ln(1-x) g(x)=xlnx(1x)ln(1x)

而选择熵的意义在于,熵可以用于衡量预测的置信度。好了,现在给中间域也打上了一个伪标签,那就可以得出给分类器的损失函数了:

J 2 ( f c , f e , f d ) = 1 n S ∑ i = 1 n S v S i l ( y S i , f c ( h S i ) ) + 1 n I ∑ i = 1 n I v I i l ( y T i , f c ( h T i ) ) + 1 n T ∑ i = 1 n T v T i g ( f c ( h I i ) ) \mathcal{J}_2(f_c,f_e,f_d)= \frac{1}{n_S}\sum_{i=1}^{n_S} v_S^i \mathcal{l}(y_S^i,f_c(h_S^i)) + \frac{1}{n_I}\sum_{i=1}^{n_I} v_I^i \mathcal{l}(y_T^i,f_c(h_T^i)) + \frac{1}{n_T}\sum_{i=1}^{n_T} v_T^ig(f_c(h_I^i)) J2(fc,fe,fd)=nS1i=1nSvSil(ySi,fc(hSi))+nI1i=1nIvIil(yTi,fc(hTi))+nT1i=1nTvTig(fc(hIi))

然后将上面的损失函数一起合并起来,优化目标就是:
m i n J = J 1 + J 2 min \mathcal{J} = \mathcal{J}_1 + \mathcal{J}_2 minJ=J1+J2

这样就可以对上面看到的整个网络进行优化了,但是注意哦,在这里需要优化不只是网络参数哦,有两个:1.网络参数(包括自编码器和分类器参数) 2.优化 v S 、 v I v_S、v_I vSvI(即选出既对目标域有用的样本又对分类起的到帮助的样本)。

因为要对两个东西进行优化,而 v S 、 v I v_S、v_I vSvI又不是网络中正常的参数型的东西,怎么办呢?这里用到了一种叫做block coordinate decedent的方法进行优化,听起来很厉害,实际上就是优化一个的时候固定另外一个,这里就是优化网络参数的时候,固定 v S 、 v I v_S、v_I vSvI,优化 v S 、 v I v_S、v_I vSvI的时候,固定网络参数。

好,我们知道大概的优化流程了,而其中网络参数可以根据上面的损失函数通过正常的后向传播即可优化,那么 v S 、 v I v_S、v_I vSvI怎么优化呢?我们期望选出既对目标域有用的样本又对分类起的到帮助的样本,所以就把对目标域有用、对分类起的到帮助作为优化的参考标准吧!而这些条件我们都有,那就是:

Distant Domain Transfer Learning远域迁移学习--通过人脸识别飞机!_第2张图片

其中 ∣ ∣ ( x S ′ ) i − x S i ∣ ∣ ||(x'_S)^i-x_S^i|| (xS)ixSi形式的就是上面样本选择中说的通过重构误差来选出对目标域有用的东西,而 l ( y S i , f c ( f e ( x S i ) ) \mathcal{l}(y_S^i,f_c(f_e(x_S^i)) l(ySi,fc(fe(xSi))和g(f_c(f_e(x_I^i))衡量就是对分类起到帮助。然后 λ S 、 λ I \lambda_S、\lambda_I λSλI是一个超参,作为阈值衡量。

最后网络通过迭代优化参数和不断选出对对目标域有用的样本又对分类起的到帮助的样本来完成迁移。最后总结一下算法:

Distant Domain Transfer Learning远域迁移学习--通过人脸识别飞机!_第3张图片

通过与上面的框架图对应看,输入为源域、目标域、中间域的数据,并且给出参数 λ S 、 λ I \lambda_S、\lambda_I λSλI,然后设定迭代次数。初始化参数,并初始化选择指示向量,其中源域选择指示向量全部初始化为1(因为有标签),而中间域选择指示向量初始化为0。迭代的更新网络参数和选择指示向量,直到优化了T次。

至此,算法基本完成了,关于实验部分感兴趣的可以查看原文。

参考

B Tan, Y Zhang, SJ Pan, Q Yang. Distant Domain Transfer Learning. 2017.

你可能感兴趣的:(深度学习,迁移学习)