0%

environment_and_distribution_shift_problem

背景

在深度学习训练好模型后,模型可能在测试集表现的非常好,但是实际部署到生产环境中后,由于数据分布的突然变化,导致模型实际效果很差。而且,有些时候恰恰就是因为模型的部署才导致了数据分布的变化。例如一个判断是否要给贷款人贷款的场景中,一般来说穿皮鞋的贷款人要比穿运动鞋来贷款的人有更低的违约风险,于是训练了一个根据人的鞋来判断是否要给人贷款的模型。当这个模型部署后,人们就可能发现这个模型的判断模式,以此在来贷款的时候故意都穿上皮鞋。

Distribute Shift类型

Covariate Shift

Covariate Shift是由于样本输入特征概率分布变化导致的,但是$P(y | x)$条件概率不变。例如在一个判断图片是猫还是狗的二分类学习任务中,在训练时,输入的样本都是真实世界的图片,但是训练集中的图片却是卡通图片。

Label Shift

Label Shift和Covariate Shift相反,Label Shift是由于输入样本的标签概率分布导致的,同时$P(x|y)$条件概率不变。Label Shift在输出标签会影响输入特征的情况下是很常见的。例如在根据病人症状来判断病人患病的场景下,患的病是会影响病人症状的。

Concept Shift

Concept Shift是由于样本标签的定义变化导致的。例如有些标签的定义会随着国家或者地域的变化而不同。

Distribution Shift的解决方法

经验误差与真实误差

回顾一下我们训练模型时的步骤,我们在训练集${(x_1, \space y_1)\, \dots, (x_n, \space y_n)}$上不断迭代,调整模型$f$的参数,为了简化,我们不考虑正则化项,我们的目标是最小化在训练集上的误差:

上面的式子可以看作是模型的经验误差。而真实的误差是模型在真实分布为$p(x, \space y)$的所有样本中的损失函数的期望值。

但在实际情况下我们无法获取所有样本,所以通常我们用经验误差去拟合实际误差。

Covariate Shift 解决方法

假设我们的训练样本的特征的概率分布是$q(x)$,但是我们实际部署模型,预测目标的特征的概率分布是$p(x)$。由于Covariate Shift的特点是$p(y \space | \space x) = q(y \space | \space x)$,因此,由$(2)$式可得:

其中,$\frac{p(x)}{q(x)}$可以看作一个样本来自于真实分布的概率和样本来自于错误分布的概率的比值,通过这个比值我们可以重新对每个样本数据进行权重划分,在$(1)$式中,所有样本的权重值都是1,即所有原本都看作同等重要的,经过重新划分之后样本的权重设为$\frac{p(x)}{q(x)}$,即如果样本来自于真实分布的概率越大,那么样本的权重值越高。那么可以使用经过修正后的loss function:

但是,我们如何知道$\frac{p(x)}{q(x)}$的比值是多少呢?为了获取这个比值,我们需要从错误分布的样本和从正确分布中获取的样本。另外,我们可以先利用这些数据先学习一个二分类器,用于区分样本是来自于错误分布还是来自于正确分布。假设我们用$z=1$表示样本来自正确分布$p(x)$,用$z=0$表示样本来自错误分布$q(x)$,那么有:

其中$P(z = 1 \space | \space x)$表示训练的分类器在输入样本为$x$的情况下,判断样本来自正确分布的概率。如果二分类器使用logistic regression,那么$P(z = 1 \space | \space x) = \frac{1}{1+e^(-h(x))}$($h$为线性回归函数),那么也有$\frac{p(x)}{q(x)} = e^(h(x))$。

因此,由上面的推导,我们可以得出解决Covariate Shift的方法:

假设我们有用于原来机器学习任务的训练集:${(x_1, \space y_1), \space \dots , \space (x_n, \space y_n)}$以及用于测试用的测试${(u_1, \space v_1), \space \dots , \space (u_m, \space v_m)}$

1、生成用于二分类学习用的训练集:${(x_1, \space 0), \space \dots , \space (x_n, \space 0), \space (u_1, \space 1), \space \dots , \space (u_m, \space 1)}$

2、用第一步生成的训练集学习一个logistic regression的二分类器来得到其中的线形回归函数$h$

3、将$e^(h(x_i))$或者更好的$min(e^(h(x_1)), \space c)$($c$是一个常量)作为权重,用于原始训练集${(x_1, \space y_1), \space \dots , \space (x_n, \space y_n)}$上

注意,这个算法依赖于一个前提,那就是$q(x_i)$不能为0。

Label Shift 纠正方法

//TODO: lable shift 纠正的思路和Covariate Shift一样,只是解决方法有点不好理解。后续再补上

Consept Shift纠正方法

对于concept shift的纠正方法,我们一般直接在之前训练出来的神经网络的参数上,使用新的训练集进行重新训练即可。