转自:http://blog.csdn.net/mao_xiao_feng/article/details/54317852
一、什么是covariate shift?
在论文中经常碰到covariate shift这个词,网上相关的中文解释比较少。你可能会在介绍深度学习Batch Normalization方法的论文到中看到covariate shift这个词,并且所有看过这篇论文的或者实际做过工程的人,都知道BN这种归一化手段很好用,可以避免covariate shift
那么covariate shift到底是什么?不用想得太复杂,covariate shift最早只是机器学习中的一个问题。同时迁移学习会经常涉及到这个概念。
假设x是属于特征空间的某一样本点,y是标签。covariate这个词,其实就是指这里的x,那么covariate shift可以直接根据字面意思去理解:样本点x的变化。
这么简单?没错就是这么简单!
我们讲的规范一点:
假设q1(x)是测试集中一个样本点的概率密度,q0(x)是训练集中一个样本点的概率密度。最终我们估计一个条件概率密度p(y|x,θ),它由x和一组参数θ={θ1,θ2......θm}所决定。对于一组参数来说,对应loss(θ)函数评估性能的好坏
综上,当我们找出在q0(x)分布上最优的一组θ'时,能否保证q1(x)上测试时也最好呢?
传统机器学习假设训练集和测试集是独立同分布的,即q0(x)=q1(x),所以可以推出最优θ'依然可以保证q1(x)最优。但现实当中这个假设往往不成立,伴随新数据产生,老数据会过时,当q0(x)不再等于q1(x)时,就被称作covariate shift
二、怎么解决covariate shift?
以上已经知道一个样本点分别在训练集和测试集上的概率密度q0(x)和q1(x),实际当中的解决方案是附加一个由x决定的权值
使得在训练过程当中对于q1(x)很大或者q0(x)很小的样本视作“重要”样本,这样的样本是有益于测试集预测的,我们应该尽量把它分类正确。而对于q1(x)很小或者q0(x)很大的样本,它只是被时代遗弃的“老数据”,这些样本对于模型训练的意义也是无关紧要了
举一个形象的例子:
现在我们要通过多项式回归预测某一个函数。数据产生通过下式,并且用正态分布产生噪声加在上面
通过一个其中
产生q0(x)当作训练集,大小为n=100
假设模型的形式是,最终训练得到一根直线去尽可能拟合这些点。
实验结果如左图,最终得到一条线,对应图中OLS
根据其中
生成测试集q1(x),如右图
最理想的情况,我们直接拟合测试集的点,得到右图中的实线,和左边的线完全不一样,看出covariate shift发生了。
但是我们需要测试集的辅助来解决covariate shift问题(如果直接训练测试集就毫无意义了),求得
通过附加权值的方法,最终训练得到左图中虚线WLS
可以看出最终得到的模型,是可以很好的适应测试集的。
从迁移学习的角度看,这也是一种用source domain的标签数据,结合target domain的无标签数据,指导进行知识的迁移的方法。