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