本文以作者阅读《Dive into Deep Learning》为线索,融合串联了自身理解感悟、原始论文、优秀文章等。如有无意侵权,请联系本人删除。
作者也只算是初学者,分享自己的理解心得,如有错误、误导,烦您指正!感激不尽!
分布偏移
引入数据分布(环境)时,若基于模型自身的决策,可能会破坏模型。
如果训练集、测试集的差异很大,就是发生了 分布偏移 。
分布偏移分为 3 种:
- 协变量偏移:特征分布变化,但特征与标签映射(条件分布)不变。换句话说,输入数据的样貌改变,决定结果的规则未变。
如在判断猫、狗模型中,虽然决定判别的因素始终不变(脸型、胡须、尾巴),但来自写实与动漫这些因素有不同的分布特征。 - 标签偏移:标签分布发生变化, 但是条件分布不变。各类结果出现的频率、占比改变了,但是结果对应的特征不变。
比如春秋季节流感高发,但是如果用这数据预测夏季可能会导致大量假阳性。 - 概念偏移:条件分布,也就是映射改变了。
如现在扁平化、Flutter UI的美学设计风靡,而千禧年间的铬核美学色彩搭配设计逐渐过时。 - 数量偏移:不同信息来源提供的数据信息量差比巨大。就是各数据源的权重因数据量差别过大而不均匀。
我们先认识一下名词:
- 协变量:一个独立变量,不受实验者操控即不可控,但仍影响结果,如一个人的性别。
- 经验风险:模型对所有训练样本的拟合能力,是局部的、可求的。计算后会使用合适的优化方法(如梯度下降法)来最小化这个损失,从而获得具有某种最优的模型参数。
- 期望风险:模型对所有样本(训练样本+测试样本+等待预测的未知样本)的拟合能力,是全局的、不可求的。
- 真实分布:真实应用场景中的该协变量和标签的组合常见程度。
- 标签分布:每个标签在数据集中出现的概率。
先说说我们应该如何解决协变量偏移呢?
我们现在想要测量一下期望风险
这里的 \(p(\mathbf x,y)\) 是真实分布,然而,我们的观测值 \(\mathbf x_i\) 是从训练数据中得出的,并不是从目标分布中得出的。所以我们最开始使用 \(q(\mathbf x)\) ,即源分布。不过,我们可以在真实风险的计算中,随时更正这个概率:
也就是说我们可以用重要性采样重新衡量每个数据样本的权重:
这里 \(p(x_i)\) 是目标分布,来自真实生产环境;
\(q(x_i)\) 是源分布,来自我们当前实际拥有的,如公开数据集、采集的数据。
因此如果一个 \(x\) 在 \(p(x)\) 中很常见,但是在 \(q(x)\) 中很罕见, \(\beta_i\) 权重会很大。
将其作为加权,来训练模型,就是
但是很显然,我们无法直接计算得到前后分布的概率比率 \(\beta\) ,我们可以这样估计:
先从两个分布中抽取数量相同的样本,真实的分布\(p\),训练集\(q\),这里我们只需要特征\(\mathbf x\)。
我们这里使用对数几率回归,一种用于二元分类的Softmax回归的特例。
设置一个 \(flag\) ,用\(1\)表示\(p\)中的数据,用\(-1\)表示\(q\)中的数据。可以把现在的数据集想象为一个很大的unordered_map<sample, flag>。则混合数据集中的概率可表示为:
用 \(c\) 修正一下过大的权重,
当然,以上推导成立的条件是,目标分布中的样本不能从未在训练集中出现过,否则这个 \(\beta _k\) 将会趋近于正无穷。
我们应该如何解决标签偏移呢?
运用什么协同量偏移的例子,我们依旧可以得到:
我们首先创建一个 \(k \times k\) 的混淆矩阵 \(\mathbf{C}\) ,列为标签,行为模型预测,即 \(c_{i, j}\) 表示真实标签为 \(j\) 时被模型预测为 \(i\) 的样本数量所占的比例。
然后就可以得到计算模型在测试集上的平均预期分布 \(\mu(\hat y)\) 的公式:
例如,若分类器完美,\(\mathbf C\) 就是单位矩阵,平均预期分布=真实分布。
如上, \(p(y_j)\) 是真实标签分布,换句话说,我们完全可以反推真实分布 \(p(y_i)\):
然后自然而然就可以计算出权重比率 \(\beta\) 了。
这节很抽象,让我们简单举个例子吧:
我们有一个简单的二分类问题,诊断流感。
- 源域(春秋季):流感高发期。假设在训练数据中,流感病例占30%,非流感病例占70%。即:
- q(流感) = 0.3
- q(非流感) = 0.7
- 目标域(夏季):流感低发期。真实标签分布中,流感病例仅占5%,非流感占95%。即:
- p(流感) = 0.05
- p(非流感) = 0.95
假设我们在源域(春秋季)上训练一个流感分类器,并在一个带标签的验证集上评估它。验证集包含100个样本(30个流感,70个非流感),分类器的预测结果如下:
- 在30个流感病例中:
- 27个被正确预测为流感(真阳性) ····0.9
- 3个被错误预测为非流感(假阴性) ····0.1
- 在70个非流感病例中:
- 66个被正确预测为非流感(真阴性) ····0.943
- 4个被错误预测为流感(假阳性) ····0.057
在目标域(夏季),我们无法直接获得真实标签,但我们可以运行分类器得到预测分布。假设在夏季数据上,分类器的预测结果为:
- \(\mu(预测流感) = 0.15\)(即15%的样本被预测为流感)
- \(\mu(预测非流感) = 0.85\)(即85%被预测为非流感)
这个预测分布 \(\mu(\hat y)\) 并不等于真实分布\(p(y)\)。我们可以使用公式\(p(y) = C^{-1} \mu(\hat y)\)来估计真实分布,算出 \(p(流感) ≈ 0.11, p(非流感) ≈ 0.89\)
就可以算出: - 对于流感样本:\(\beta_{流感} = \frac{p(流感)}{q(流感)} = \frac{0.05}{0.3} ≈ 0.1667\)
- 对于非流感样本:\(\beta_{非流感} = \frac {p(非流感)}{q(非流感) }= \frac{0.95}{0.7} ≈ 1.3571\)
所以,我们应用 \(\beta\) 权重后的训练过程:
假设批量大小 \(B = 10\),按源域分布: - 流感样本:\(10 \times 0.3 = 3\) 个
- 非流感样本:\(10 \times 0.7 = 7\) 个
损失函数也会在加权后改变:
而根据 \(\beta\) 加权也改变了梯度贡献: