一只菜鸟学机器学习的日记:入门分布偏移

本文以作者阅读《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} \\

相关推荐
哦哦~921几秒前
AI 赋能 CFD :从 Fluent 仿真到物理信息机器学习的智能流体工程实战
人工智能·机器学习·cfd·fluent
EQUINOX12 分钟前
【ch03】Coding-attention-mechanisms
人工智能·深度学习·机器学习
深度之眼36 分钟前
感觉2026年将是Agent Memory元年...
机器学习·agent
小糖学代码42 分钟前
机器学习:5.深度学习
人工智能·深度学习·机器学习
m沐沐2 小时前
【深度学习】PyTorch CNN 手写数字识别(卷积神经网络)
人工智能·pytorch·python·深度学习·机器学习·pycharm·cnn
王莎莎-MinerU2 小时前
从 OCR 到 Context Engineering:用 MinerU 搭一个可复现文档解析评测
人工智能·深度学习·机器学习·pdf·ocr·个人开发
ZHW_AI课题组2 小时前
基于KNN的帕尔默企鹅种类预测分类
人工智能·机器学习·分类·数据挖掘
xiaoxiaoxiaolll2 小时前
《Light: Sci & Appl》论文解读:基于q-BIC-CIT的热调硅膜超表面,突破静态光子学极限
机器学习
学习3人组2 小时前
Python 评论朴素贝叶斯文本情感分析示例
人工智能·python·机器学习
2401_885665192 小时前
从零搭建卷积神经网络:基于PyTorch实现MNIST手写数字分类
pytorch·python·神经网络·算法·机器学习·分类·cnn