type
Page
status
Invisible
date
Apr 9, 2026
slug
Machine_Learning/deep-learning-study-notes/4_9
summary
动手深度学习v2课程
tags
机器学习
深度学习
category
icon
password
前面我们已经看了很多机器学习在实际中的应用,但在真正使用模型时,还有两个很重要却常常被忽视的问题:数据最初是怎么来的,以及模型上线之后会怎样影响它所处的环境。很多开发者拿到数据后,往往会直接开始训练模型,而不会继续追问这些更基础的问题。可事实上,很多机器学习系统在真实场景中效果变差,甚至部署失败,原因恰恰就在这里。模型在测试集上表现很好,并不意味着它在现实环境中也一定能保持同样的效果,因为现实中的数据分布是会变化的,一旦分布发生偏移,模型原本学到的规律就可能失效。
更复杂的是,模型不仅会受到环境影响,有时还会反过来改变环境本身。也就是说,模型的预测结果可能会影响人们的行为,而人们行为一变,数据也会随之改变,最后导致模型失去原来的判断依据。比如,一个贷款违约预测模型在历史数据中发现,穿牛津鞋的申请人更容易按时还款,而穿运动鞋的申请人更容易违约。虽然这种相关性很可能只是偶然现象,并不是真正有意义的因果关系,但模型依然可能把它当成有效特征。于是,当这个模型被真正用于审批贷款时,它可能会更倾向于给穿牛津鞋的人放款,而拒绝穿运动鞋的人。顾客发现这一点后,就会主动改变自己的穿着,让自己看起来更容易通过审核。这样一来,大家都开始穿牛津鞋申请贷款,但这并不意味着他们的信用水平真的提高了,模型原本依赖的规律反而被打乱了。
因此,机器学习在真实应用中面临的一个关键问题就是:模型一旦进入现实环境,就可能改变现实环境,而环境一变,模型本身也可能被破坏。这说明我们不能只关注模型在训练集和测试集上的准确率,还必须考虑模型与外部世界之间的相互作用。虽然不可能在一节内容里讨论完所有相关问题,但至少要意识到,这类问题在机器学习中非常常见。有些问题可以通过收集更准确、更合适的数据来缓解,有些问题在技术上更加困难,需要设计能够持续适应变化的系统,还有一些问题甚至已经超出了单纯的技术范围,涉及公平性、反馈效应以及算法伦理等更深层次的思考。
4.9.1. 分布偏移的类型
首先要关注数据分布变化的形式,以及模型在分布变化下的应对办法。常见情况是:训练数据来自,测试数据来自,而且测试集通常没有标签。如果不对这两个分布之间的关系作出任何假设,就不可能学到一个能够稳定泛化到测试分布的分类器。
以“区分狗和猫”的二分类问题为例。假设数据分布可以任意变化,那么就会出现一种极端情况:输入数据的分布完全没变,也就是看到的图片还是那些猫和狗的样子,但标签的对应关系却全部反过来了。原来标“猫”的现在都成了“狗”,原来标“狗”的现在都成了“猫”。这时,虽然输入分布没变,但类别含义已经变了,因此我们根本无法仅凭输入本身判断这到底是“分布发生了偏移”,还是“任务定义被直接改掉了”。
不过在实际问题里,数据变化通常不会毫无限制。只要我们对未来可能出现的偏移作出一些合理假设,就可以设计出相应的方法来识别这种变化,甚至动态调整模型,从而尽量保持分类器的性能。
4.9.1.1. 协变量偏移
协变量偏移是分布偏移中最常见、也最常被研究的一种情况。它的基本假设是:输入特征的分布会发生变化,但标签和输入之间的对应关系并没有变,也就是说,变的是,而保持不变。之所以叫“协变量偏移”,就是因为问题出在协变量,也就是输入特征的分布发生了变化,而不是分类规则本身变了。很多时候,在我们默认由决定的前提下,这种假设是比较自然的,因此也常被当作分析分布偏移的出发点。
考虑一下区分猫和狗的问题:训练数据包括下图中的图像:

而在测试时,要求对下图图像进行分类:

训练集由真实照片组成,而测试集只包含卡通图片。假设在一个与测试集的特征有着本质不同的数据集上进行训练,如果没有方法来适应新的领域,可能会有麻烦。
4.9.1.2. 标签偏移
标签偏移和协变量偏移正好相反。它假设变化的是标签的分布,而在给定标签的条件下,输入特征的分布基本保持不变。也就是说,变的是各类别出现的比例,没变的是每一类本身的特征表现。这个假设在很多场景下都很合理。比如做疾病预测时,不同时期某种疾病的流行率可能会变化,但同一种疾病对应的症状表现通常不会突然完全改变。在一些问题里,标签偏移和协变量偏移甚至可能同时成立。相比之下,基于标签偏移的方法往往更容易处理,因为它关注的是标签分布,而标签通常比输入特征维度更低,分析和调整起来也更简单。
4.9.1.3. 概念偏移
我们还会遇到一种叫概念偏移的问题。它指的不是输入数据变了,也不只是类别比例变了,而是标签本身的含义或判定标准发生了变化,也就是变了。
乍一听这有点奇怪,因为像“猫就是猫”这种类别似乎不会变,但现实中很多概念其实会随着时间、地区和社会习惯的变化而改变。比如精神疾病的诊断标准、什么算“时髦”,甚至某些职业的定义,都可能在不同时期不一样,这些都属于概念偏移。
书里举的一个例子是美国不同地区对“软饮”的叫法不同。同样一种东西,在有些地方叫 soda,有些地方叫 pop,还有些地方叫 coke。也就是说,输入对象差不多,但标签的使用方式和含义却因地区而改变了,这就是典型的概念偏移。

这种问题在实际应用中往往更隐蔽。比如做机器翻译时,同一句话可能会因为使用地区不同而对应不同的表达方式,因此也会随地点变化。正因为概念偏移不容易直接发现,所以在建模时,最好结合时间或空间上的变化规律来理解和处理这类偏移。
4.9.2. 分布偏移示例
在深入研究形式体系和算法之前,我们可以讨论一些协变量偏移或概念偏移可能并不明显的具体情况。
4.9.2.1. 医学诊断
假设我们想开发一个癌症检测模型:先从健康人和患者身上收集数据,再用这些数据训练算法。模型在测试中表现很好,准确率也很高,于是我们很容易以为它已经可以用于真实医疗诊断了。但事情并没有这么简单。
问题在于,训练数据的分布和真实应用中的数据分布,往往可能并不一样。曾有一家初创公司研究一种面向老年男性疾病的血液检测方法。他们从患者身上采集样本相对容易,但健康对照样本却很难获取,于是就找大学校园里的学生来献血,作为“健康人”样本。之后,他们希望据此训练一个疾病分类器。
表面上看,这个分类器几乎可以完美地区分健康人和患者,但这并不一定说明模型真正学会了“疾病特征”。它也可能只是学会了区分两类人群在年龄、激素水平、体力活动、饮食习惯等方面的差异,而这些因素未必与目标疾病本身直接相关。也就是说,模型遇到的其实是很严重的协变量偏移。在这种情况下,模型看似准确,实际上很可能并不适合真实诊断,而且这种问题往往也很难靠常规方法补救。最终,投入的大量成本可能都会被浪费掉。
4.9.2.2. 自动驾驶汽车
对于做自动驾驶的公司来说,路沿检测是一个很重要的任务。因为真实标注数据太贵,有些团队会想到用游戏引擎生成的合成数据来训练模型。这样做在模拟环境里可能效果很好,但放到真实汽车上却未必可靠。原因是渲染出来的路沿往往过于简单,而且纹理风格高度一致,模型很容易学到这些“假特征”,而不是真正与路沿有关的关键信息。
类似的问题也出现在早期的坦克识别实验中。研究人员拍了两组森林照片,一组有坦克,一组没有,然后用这些数据训练分类器。模型看起来效果很好,但后来才发现,它学到的并不是“坦克”本身,而只是照片里的光照差异:有坦克的照片多半在阴天拍摄,没有坦克的照片多半在晴天拍摄。也就是说,模型实际上是在根据背景条件做判断,而不是根据目标本身做判断。
4.9.2.3. 非平稳分布
当分布变化缓慢并且模型没有得到充分更新时,就会出现更微妙的情况:非平稳分布(nonstationary distribution)。以下是一些典型例子:
- 训练一个计算广告模型,但却没有经常更新(例如,一个2009年训练的模型不知道一个叫iPad的不知名新设备刚刚上市);
- 建立一个垃圾邮件过滤器,它能很好地检测到所有垃圾邮件。但是,垃圾邮件发送者们变得聪明起来,制造出新的信息,看起来不像我们以前见过的任何垃圾邮件;
- 建立一个产品推荐系统,它在整个冬天都有效,但圣诞节过后很久还会继续推荐圣诞帽。
4.9.2.4. 更多轶事
- 建立一个人脸检测器,它在所有基准测试中都能很好地工作,但是它在测试数据上失败了:有问题的例子是人脸充满了整个图像的特写镜头(训练集中没有这样的数据)。
- 为美国市场建立了一个网络搜索引擎,并希望将其部署到英国。
- 通过在一个大的数据集来训练图像分类器,其中每一个大类的数量在数据集近乎是平均的,比如1000个类别,每个类别由1000个图像表示。但是将该系统部署到真实世界中,照片的实际标签分布显然是不均匀的。
4.9.3. 分布偏移纠正
正如前面所说,训练数据和测试数据的联合分布往往并不完全相同。有时这种偏移对模型影响不大,模型仍然可以正常工作;但有时偏移会明显降低模型效果,这就需要我们采取相应的方法来应对。接下来的内容,主要就是讨论如何识别并处理这些分布偏移问题。
4.9.3.1. 经验风险与实际风险
首先我们思考一下在模型训练期间到底发生了什么?训练数据的特征和相关的标签经过迭代,在每一个小批量之后更新模型的参数。为了简单起见,我们不考虑正则化,因此极大地降低了训练损失:只关注一件事:让训练集上的平均损失尽可能小。这就是式(4.9.1)的含义,也就是在所有可能的模型中,找到一个能让训练数据平均损失最小的模型。
其中是损失函数,用来衡量模型预测的有多差。比如,真实标签是,模型输出是,那么就表示这一次预测的误差大小。把所有训练样本的损失加起来再取平均,就得到了训练集上的平均损失。统计学里把这个量叫作经验风险,因为它是根据我们手头这批样本“经验性”算出来的风险。
但我们真正关心的,并不是这批训练样本上的表现,而是模型在整个真实数据分布上的平均表现。这个量叫作真实风险,也就是如果数据都是从真实分布中抽出来的,那么模型平均会产生多大的损失。式(4.9.2)表达的就是这个意思:它不再只看训练集中的有限样本,而是看整个数据分布下损失的期望。
问题在于,真实分布通常是未知的,我们不可能把所有可能出现的数据都拿到。因此,在实际机器学习里,我们往往做不到直接最小化真实风险,只能退一步,先去最小化经验风险,希望训练集上的平均损失足够能代表真实情况。这个思路就叫作经验风险最小化。简单说,就是:先把样本上的平均误差降下来,再希望它也能在真实世界里表现好。
4.9.3.2. 协变量偏移纠正
假设我们手里有带标签的数据,想用它来学习。但问题是,这些样本里的并不是来自我们真正关心的目标分布,而是来自另一个源分布。在协变量偏移的假设下,虽然输入分布变了,但条件分布不变,也就是。这意味着:真正出问题的不是“给定该预测什么”,而是“我们看到的出现得不对”。既然如此,我们就可以通过重新给样本加权,来修正这种分布不一致带来的影响。使用一下恒等式来进行纠正:
具体来说,每个样本都应该乘上一个权重,用来表示它在目标分布中出现的可能性,相对于它在源分布中出现的可能性有多大。这个权重就是。如果某个样本在目标分布里更常见,那它的权重就应该更大;如果它主要只在源分布里常见,那它的权重就应该更小。这样一来,训练时就不再是简单地对所有样本一视同仁,而是做“加权的经验风险最小化”,让模型更贴近目标分布下的真实情况。
将权重代入到每个数据样本中,我们可以使用”加权经验风险最小化“来训练模型:
困难在于,这个比值通常并不知道,所以需要额外估计。好在这里并不一定需要目标域的标签,我们只需要拿到目标分布中的特征样本,再结合训练时已有的源分布样本,就可以尝试估计这个权重。直观上说,我们其实是在判断一个样本到底更像来自目标分布,还是更像来自源分布。
在这种思路下,一个很有效的方法是训练一个二分类器,比如逻辑回归,专门去区分“这个样本是来自还是来自”。如果一个样本很难被区分属于哪边,说明它在两个分布里都比较常见,权重就不需要调整太多;如果一个样本很容易被判断主要来自某一个分布,那它的权重就应该相应增大或减小。这样,我们就能把原本来自“错误分布”的训练数据,尽量修正成更接近目标分布的样子。
为了简单起见,假设我们分别从和两个分布中抽取相同数量的样本。 现在用标签表示:从抽取的数据为1,从抽取的数据为-1。然后,混合数据集中的概率由下式给出:
因此,如果我们使用对数几率回归方法(逻辑回归),其中(是一个参数化函数),则很自然有:
现在,我们来看一下完整的协变量偏移纠正算法。 假设我们有一个训集和一个未标记的测试集。对于协变量偏移,我们假设的来自某个源分布,来自目标分布。以下是纠正协变量偏移的典型算法:
- 生成一个二元分类训练集:。
- 用对数几率回归训练二元分类器得到函数。
- 使用或者更好的对训练数据进行加权。
- 使用权重进行公式4.9.5中的训练。
请注意上述算法依赖于一个重要的假设:需要目标分布(例如,测试分布)中的每个数据样本在训练时出现的概率非零。如果我们找到但的点,那么相应的重要性权重会是无穷大。
4.9.3.3. 标签偏移纠正
假设我们处理的是个类别的分类任务。使用4.9.3.2节中的相同符号,和中分别是源分布和目标分布。假设标签的分布随时间变化:,但类别条件分布保持不变:。如果源分布是“错误的”,可以根据公式4.9.2中定义的真实风险中的恒等式进行更正:
这里,重要性权重将对应于标签似然比率:
标签偏移好处理,是因为它只需要调整“类别比例”,而不需要直接处理高维输入分布;只要源模型足够好,就能借助它去估计这些类别权重。
为了估计目标标签分布,我们首先采用性能相当好的现成的分类器(通常基于训练数据进行训练),并使用验证集(也来自训练分布)计算其混淆矩阵。混淆矩阵是一个矩阵,其中每列对应于标签类别,每行对应于模型的预测类别。每个单元格的值是的意思就是:在验证集中,真实标签为的样本里,被模型预测成了的比例。这个矩阵反映了分类器的预测偏差,也就是模型的混淆情况。利用它,再结合目标数据上的预测结果,就可以进一步估计目标域中的真实标签分布。
现在,我们不能直接计算目标数据上的混淆矩阵, 因为我们无法看到真实环境下的样本的标签, 除非我们再搭建一个复杂的实时标注流程。 然而,我们所能做的是将所有模型在测试时的预测取平均数, 得到平均模型输出,其中第个元素是我们模型预测测试集中的总预测分数。结果表明,如果我们的分类器一开始就相当准确, 并且目标数据只包含我们以前见过的类别, 以及如果标签偏移假设成立(这里最强的假设), 我们就可以通过求解一个简单的线性系统来估计测试集的标签分布:
因为作为一个估计,对所有成立,其中是维标签分布向量的第元素。如果我们的分类器一开始就足够精确,那么混淆矩阵将是可逆的,进而我们可以得到一个解。
因为我们观测源数据上的标签,所以很容易估计分布。那么对于标签为的任何训练样本,我们可以使用我们估计的比率来计算权重,并将其带入公式4.9.5中的加权经验风险最小化中。
4.9.3.4. 概念偏移纠正
概念偏移很难用原则性的方式解决。例如,在一个问题突然从“区分猫和狗”偏移为“区分白色和黑色动物”的情况下,除了从零开始收集新标签和训练,别无妙方。幸运的是,在实践中这种极端的偏移是罕见的。相反,通常情况下,概念的变化总是缓慢的。比如下面是一些例子:
- 在计算广告中,新产品推出后,旧产品变得不那么受欢迎了。这意味着广告的分布和受欢迎程度是逐渐变化的,任何点击率预测器都需要随之逐渐变化;
- 由于环境的磨损,交通摄像头的镜头会逐渐退化,影响摄像头的图像质量;
- 新闻内容逐渐变化(即新新闻的出现)。
在这种情况下,我们可以使用与训练网络相同的方法,使其适应数据的变化。换言之,我们使用新数据更新现有的网络权重,而不是从头开始训练。
4.9.4. 学习问题的分类法
4.9.4.1. 批量学习
在批量学习(batch learning)中,我们可以访问一组训练特征和标签。使用这些特性和标签训练。然后,部署此模型来对来自同一分布的新数据进行评分。例如,我们可以根据猫和狗的大量图片训练猫检测器。一旦我们训练了它,我们就把它作为智能猫门计算视觉系统的一部分,来控制只允许猫进入。然后这个系统会被安装在客户家中,基本再也不会更新。
4.9.4.2. 在线学习
除了“批量”地学习,我们还可以单个“在线”学习数据。更具体的说,我们首先观测到,然后得出一个估计值,只有当我们做到这一点后,我们才观测到。然后根据我们的决定,我们会得到奖励或损失。许多实际问题都属于这一类。例如,我们需要预测明天的股票价格,这样我们就可以根据这个预测进行交易。在一天结束时,我们会评估我们的预测是否盈利。换句话说,在在线学习(online learning)中,我们有以下的循环。在这个循环中,给定新的观测结果,我们会不断地改进我们的模型。
4.9.4.3. 老虎机
老虎机(bandits)是上述问题的一个特例。虽然在大多数学习问题中,我们有一个连续参数化的函数(例如,一个深度网络)。但在一个老虎机问题中,我们只有有限数量的手臂可以拉动。也就是说,我们可以采取的行动是有限的。对于这个更简单的问题,可以获得更强的最优性理论保证,这并不令人惊讶。我们之所以列出它,主要是因为这个问题经常被视为一个单独的学习问题的情景。
4.9.4.4. 控制
在很多情况下,环境会记住我们所做的事。不一定是以一种对抗的方式,但它会记住,而且它的反应将取决于之前发生的事情。 例如,咖啡锅炉控制器将根据之前是否加热锅炉来观测到不同的温度。 在这种情况下,PID(比例—积分—微分)控制器算法是一个流行的选择。同样,一个用户在新闻网站上的行为将取决于之前向她展示的内容(例如,大多数新闻她只阅读一次)。许多这样的算法形成了一个环境模型,在这个模型中,他们的行为使得他们的决策看起来不那么随机。近年来,控制理论(如PID的变体)也被用于自动调整超参数,以获得更好的解构和重建质量,提高生成文本的多样性和生成图像的重建质量。
4.9.4.5. 强化学习
强化学习(reinforcement learning)强调如何基于环境而行动,以取得最大化的预期利益。 国际象棋、围棋、西洋双陆棋或星际争霸都是强化学习的应用实例。再比如,为自动驾驶汽车制造一个控制器,或者以其他方式对自动驾驶汽车的驾驶方式做出反应(例如,试图避开某物体,试图造成事故,或者试图与其合作)。
4.9.4.6. 考虑到环境
上述不同情况之间的一个关键区别是:在静止环境中可能一直有效的相同策略,在环境能够改变的情况下可能不会始终有效。例如,一个交易者发现的套利机会很可能在他开始利用它时就消失了。环境变化的速度和方式在很大程度上决定了我们可以采用的算法类型。例如,如果我们知道事情只会缓慢地变化, 就可以迫使任何估计也只能缓慢地发生改变。如果我们知道环境可能会瞬间发生变化,但这种变化非常罕见,我们就可以在使用算法时考虑到这一点。当一个数据科学家试图解决的问题会随着时间的推移而发生变化时,这些类型的知识至关重要。
4.9.5. 机器学习中的公平、责任和透明度
最后,重要的是,当我们部署机器学习系统时,不仅仅是在优化一个预测模型,而通常是在提供一个会被用来(部分或完全)进行自动化决策的工具。这些技术系统可能会通过其进行的决定而影响到每个人的生活。
从考虑预测到决策的飞跃不仅提出了新的技术问题,而且还提出了一系列必须仔细考虑的伦理问题。如果我们正在部署一个医疗诊断系统,我们需要知道它可能适用于哪些人群,哪些人群可能无效。忽视对一个亚群体的幸福的可预见风险可能会导致我们执行劣质的护理水平。此外,一旦我们规划整个决策系统,我们必须退后一步,重新考虑如何评估我们的技术。在这个视野变化所导致的结果中,我们会发现精度很少成为合适的衡量标准。例如,当我们将预测转化为行动时,我们通常会考虑到各种方式犯错的潜在成本敏感性。举个例子:将图像错误地分到某一类别可能被视为种族歧视,而错误地分到另一个类别是无害的,那么我们可能需要相应地调整我们的阈值,在设计决策方式时考虑到这些社会价值。 我们还需要注意预测系统如何导致反馈循环。例如,考虑预测性警务系统,它将巡逻人员分配到预测犯罪率较高的地区。很容易看出一种令人担忧的模式是如何出现的:
- 犯罪率高的社区会得到更多的巡逻;
- 因此,在这些社区中会发现更多的犯罪行为,输入可用于未来迭代的训练数据;
- 面对更多的积极因素,该模型预测这些社区还会有更多的犯罪;
- 下一次迭代中,更新后的模型会更加倾向于针对同一个地区,这会导致更多的犯罪行为被发现等等。
通常,在建模纠正过程中,模型的预测与训练数据耦合的各种机制都没有得到解释,研究人员称之为“失控反馈循环”的现象。此外,我们首先要注意我们是否解决了正确的问题。比如,预测算法现在在信息传播中起着巨大的中介作用,个人看到的新闻应该由他们喜欢的Facebook页面决定吗?这些只是在机器学习职业生涯中可能遇到的令人感到“压力山大”的道德困境中的一小部分。
4.9.6. 小结
- 在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。
- 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
- 在相应的假设条件下,可以在测试时检测并纠正协变量偏移和标签偏移。在测试时,不考虑这种偏移可能会成为问题。
- 在某些情况下,环境可能会记住自动操作并以令人惊讶的方式做出响应。在构建模型时,我们必须考虑到这种可能性,并继续监控实时系统,并对我们的模型和环境以意想不到的方式纠缠在一起的可能性持开放态度。
