学习参考:
- 动手学深度学习2.0
- Deep-Learning-with-TensorFlow-book
- pytorchlightning
①如有冒犯、请联系侵删。
②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。
③非常推荐上面(学习参考)的前两个教程,在网上是开源免费的,写的很棒,不管是开始学还是复习巩固都很不错的。
深度学习回顾,专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法,佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去,已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。
一句话概率概括分布偏移: 分布偏移(Distribution Shift)是指模型在训练和测试数据集之间的数据分布不匹配的情况。这种不匹配可能导致模型在测试集上的表现下降,因为模型在训练时学习到的特征在测试时可能不再适用。
在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。分布偏移可能由多种因素引起,包括数据采样方法的不同、环境变化、数据集的不平衡等。解决分布偏移的方法可以从数据层面和模型层面进行考虑。
数据层面解决方法:
领域自适应(Domain Adaptation)
:通过在源域和目标域之间学习特征映射来适应不同的数据分布。数据增强(Data Augmentation)
:在训练数据上引入一些变化,使模型更加鲁棒,能够适应不同的数据分布。重采样(Resampling)
:调整数据集中不同类别或样本的比例,以减轻数据分布不平衡带来的影响。
模型层面解决方法:
迁移学习(Transfer Learning)
:通过在一个任务上学习到的知识来改善在另一个相关任务上的泛化性能。集成学习(Ensemble Learning)
:结合多个模型的预测结果,以减少模型在测试时的方差,提高泛化能力。对抗训练(Adversarial Training)
:通过引入对抗样本来训练模型,使其对输入数据的微小扰动更加鲁棒。
一、分布偏移的类型
考虑数据分布可能发生变化的各种方式,以及为挽救模型性能可能采取的措施。 在一个经典的情景中,假设训练数据是从某个分布 𝑝𝑆(𝐱,𝑦) 中采样的, 但是测试数据将包含从不同分布 𝑝𝑇(𝐱,𝑦) 中抽取的未标记样本。 一个清醒的现实是:如果没有任何关于 𝑝𝑆 和 𝑝𝑇 之间相互关系的假设, 学习到一个分类器是不可能的。
考虑一个二元分类问题:区分狗和猫。 如果分布可以以任意方式偏移,那么情景允许病态的情况, 即输入的分布保持不变: 𝑝𝑆(𝐱)=𝑝𝑇(𝐱)
, 但标签全部翻转: 𝑝𝑆(𝑦|𝐱)=1−𝑝𝑇(𝑦|𝐱)
。 换言之,如果将来所有的“猫”现在都是狗,而以前所说的“狗”现在是猫。 而此时输入 𝑝(𝐱) 的分布没有任何改变, 那么我们就不可能将这种情景与分布完全没有变化的情景区分开。
有些算法可以检测这种偏移,甚至可以动态调整,提高原始分类器的精度。
1.协变量偏移
在不同分布偏移中,协变量偏移可能是最为广泛研究的。 这里假设:虽然输入的分布可能随时间而改变, 但标签函数(即条件分布 𝑃(𝑦∣𝐱) )
没有改变。 统计学家称之为协变量偏移(covariate shift),因为这个问题是由于协变量(特征)分布的变化而产生的。 虽然有时我们可以在不引用因果关系的情况下对分布偏移进行推断, 但在认为 𝐱 导致 𝑦的情况下,协变量偏移是一种自然假设。
考虑一下区分猫和狗的问题:
但是在测试时,被要求对卡通图片的猫狗进行分类:
训练集由真实照片组成,而测试集只包含卡通图片。 假设在一个与测试集(卡通图片)的特征有着本质不同的数据集(真实照片)上进行训练, 如果没有方法来适应新的领域(即卡通),可能会有麻烦,导致分类器无法区分开。
2.标签偏移
标签偏移(label shift)描述了与协变量偏移相反的问题。 这里假设标签边缘概率 𝑃(𝑦)可以改变, 但是类别条件分布 𝑃(𝐱∣𝑦)
在不同的领域之间保持不变。【意思就是标签改变,但是特征保持不变 的情况下】
当认为 𝑦导致 𝐱 时,标签偏移是一个合理的假设。 例如,预测患者的疾病,我们可能根据症状来判断, 即使疾病的相对流行率随着时间的推移而变化。 标签偏移在这里是恰当的假设,因为疾病会引起症状。
3.概念偏移
概念偏移(concept shift): 当标签的定义发生变化时,就会出现这种问题。 这听起来很奇怪——一只猫就是一只猫,不是吗? 然而,其他类别会随着不同时间的用法而发生变化。 精神疾病的诊断标准、所谓的时髦、以及工作头衔等等,都是概念偏移的日常映射。
二、分布偏移的案例
1.医学诊断
假设想设计一个检测癌症的算法,从健康人和病人那里收集数据,然后训练算法。 它工作得很好,有很高的精度,然后我们得出了已经准备好在医疗诊断上取得成功的结论。 请先别着急。
收集训练数据的分布和在实际中遇到的数据分布可能有很大的不同。 这件事在一个不幸的初创公司身上发生过,动手学这个课程中的一些作者几年前和他们合作过。 他们正在研究一种血液检测方法,主要针对一种影响老年男性的疾病, 并希望利用他们从病人身上采集的血液样本进行研究。 然而,从健康男性身上获取血样比从系统中已有的病人身上获取要困难得多。 作为补偿,这家初创公司向一所大学校园内的学生征集献血,作为开发测试的健康对照样本。 然后这家初创公司问动手学深度学习课程的作者们是否可以帮助他们建立一个用于检测疾病的分类器。
正如向他们解释的那样,用近乎完美的精度来区分健康和患病人群确实很容易。 然而,这可能是因为受试者在年龄、激素水平、体力活动、 饮食、饮酒以及其他许多与疾病无关的因素上存在差异。 这对检测疾病的分类器可能并不适用。 这些抽样可能会遇到极端的协变量偏移。 此外,这种情况不太可能通过常规方法加以纠正。
2.自动驾驶汽车
对于一家想利用机器学习来开发自动驾驶汽车的公司,一个关键部件是“路沿检测器”。 由于真实的注释数据获取成本很高,他们想出了一个“聪明”的想法: 将游戏渲染引擎中的合成数据用作额外的训练数据。 这对从渲染引擎中抽取的“测试数据”非常有效,但应用在一辆真正的汽车里真是一场灾难。 正如事实证明的那样,路沿被渲染成一种非常简单的纹理。 更重要的是,所有的路沿都被渲染成了相同的纹理,路沿检测器很快就学习到了这个“特征”。
当美军第一次试图在森林中探测坦克时,也发生了类似的事情。 他们在没有坦克的情况下拍摄了森林的航拍照片,然后把坦克开进森林,拍摄了另一组照片。 使用这两组数据训练的分类器似乎工作得很好。 不幸的是,分类器仅仅学会了如何区分有阴影的树和没有阴影的树: 第一组照片是在清晨拍摄的,而第二组是在中午拍摄的。
3.非平稳分布
当分布变化缓慢并且模型没有得到充分更新时,就会出现更微妙的情况: 非平稳分布(nonstationary distribution)。 以下是一些典型例子:
- 训练一个计算广告模型,但却没有经常更新(例如,一个2009年训练的模型不知道一个叫iPad的不知名新设备刚刚上市);
- 建立一个垃圾邮件过滤器,它能很好地检测到所有垃圾邮件。但是,垃圾邮件发送者们变得聪明起来,制造出新的信息,看起来不像我们以前见过的任何垃圾邮件;
- 建立一个产品推荐系统,它在整个冬天都有效,但圣诞节过后很久还会继续推荐圣诞帽。
4.更多其它案例
- 建立一个人脸检测器,它在所有基准测试中都能很好地工作,但是它在测试数据上失败了:有问题的例子是人脸充满了整个图像的特写镜头(训练集中没有这样的数据)。
- 为美国市场建立了一个网络搜索引擎,并希望将其部署到英国。
- 通过在一个大的数据集来训练图像分类器,其中每一个大类的数量在数据集近乎是平均的,比如1000个类别,每个类别由1000个图像表示。但是将该系统部署到真实世界中,照片的实际标签分布显然是不均匀的。
三、分布偏移纠正
在许多情况下训练和测试的分布 𝑃(𝐱,𝑦)是不同的。 在一些情况下,不管协变量、标签或概念如何发生偏移,模型都能正常工作。 在另一些情况下,可以通过运用策略
来应对这种偏移,从而做得更好。
1.经验风险与实际风险
在模型训练期间训练数据 {(𝐱1,𝑦1),…,(𝐱𝑛,𝑦𝑛)}
的特征和相关的标签经过迭代,在每一个小批量之后更新模型 𝑓 的参数。 为了简单起见,不考虑正则化,因此极大地降低了训练损失:
其中 𝑙 是损失函数,用来度量: 给定标签 𝑦𝑖 ,预测 𝑓(𝐱𝑖) 的“糟糕程度”,这一项损失𝑙
也称为为经验风险。
经验风险(empirical risk)是为了近似 真实风险(true risk), 整个训练数据上的平均损失,即从其真实分布 𝑝(𝐱,𝑦) 中 抽取的所有数据的总体损失的期望值:
在实践中,通常无法获得总体数据。 因此,经验风险最小化 是一种实用的机器学习策略,希望能近似最小化真实风险。
真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
2.协变量偏移纠正
假设对于带标签的数据 (𝐱𝑖,𝑦𝑖)
, 要评估 𝑃(𝑦∣𝐱)
。 然而观测值 𝐱𝑖 是从某些源分布 𝑞(𝐱) 中得出的, 而不是从目标分布 𝑝(𝐱) 中得出的。 幸运的是,依赖性假设意味着条件分布保持不变,即: 𝑝(𝑦∣𝐱)=𝑞(𝑦∣𝐱)
。 如果源分布 𝑞(𝐱) 是 “错误的” , 可以通过在真实风险的计算中,使用以下简单的恒等式来进行纠正:
也就是需要根据数据来自正确分布与来自错误分布的概率之比, 来重新衡量每个数据样本的权重:
将权重 𝛽𝑖
代入到每个数据样本 (𝐱𝑖,𝑦𝑖)
中, 可以使用 ”加权经验风险最小化“ 公式来训练模型:
由于不知道这个比率,需要估计它。 有许多方法都可以用, 试图直接使用最小范数或最大熵原理重新校准期望算子。 对于任意一种这样的方法,都需要从两个分布中抽取样本: “真实”的分布 𝑝,通过访问测试数据获取; 训练集 𝑞 ,通过人工合成的很容易获得。 请注意,只需要特征 𝐱∼𝑝(𝐱)
, 不需要访问标签 𝑦∼𝑝(𝑦)
。
有一种非常有效的方法可以得到几乎与原始方法一样好的结果: 对数几率回归(logistic regression)
。
学习一个分类器来区分从 𝑝(𝐱)抽取的数据 和从 𝑞(𝐱)抽取的数据。 如果无法区分这两个分布,则意味着相关的样本可能来自这两个分布中的任何一个。 另一方面,任何可以很好区分的样本都应该相应地显著增加或减少权重。为了简单起见,假设分别从 𝑝(𝐱)和 𝑞(𝐱)两个分布中抽取相同数量的样本。 现在用 𝑧 标签表示:从 𝑝 抽取的数据为 1 ,从 𝑞抽取的数据为 −1。 然后,混合数据集中的概率由下式给出:
因此,如果使用对数几率回归方法,其中就有:
则代入进行化简,有:
因此,需要解决两个问题: 第一个问题是关于区分来自两个分布的数据; 第二个问题是关于 加权经验风险最小化 公式的加权经验风险的最小化问题。
总结完整的协变量偏移纠正算法。 假设有一个训练集 {(𝐱1,𝑦1),…,(𝐱𝑛,𝑦𝑛)}
和一个未标记的测试集 {𝐮1,…,𝐮𝑚}
。 对于协变量偏移,假设 1≤𝑖≤𝑛
的 𝐱𝑖
来自某个源分布, 𝐮𝑖 来自目标分布。 以下是纠正协变量偏移的典型算法:
- 生成一个二元分类训练集:
{(𝐱1,−1),…,(𝐱𝑛,−1),(𝐮1,1),…,(𝐮𝑚,1)}
。 - 用对数几率回归训练二元分类器得到函数 ℎ 。
- 使用
𝛽𝑖=exp(ℎ(𝐱𝑖))
或更好的𝛽𝑖=min(exp(ℎ(𝐱𝑖)),𝑐) ( 𝑐 为常量)
对训练数据进行加权。 - 使用权重 𝛽𝑖 进行 加权经验风险最小化 公式中
{(𝐱1,𝑦1),…,(𝐱𝑛,𝑦𝑛)}
的训练。
注意,上述算法依赖于一个重要的假设: 需要目标分布(例如,测试分布)中的每个数据样本在训练时出现的概率非零。 如果找到 𝑝(𝐱)>0 但 𝑞(𝐱)=0 的点, 那么相应的重要性权重会是无穷大。
3.标签偏移纠正
假设处理的是 𝑘个类别的分类任务。𝑞 和 𝑝 中分别是源分布(例如训练时的分布)和目标分布(例如测试时的分布)。 假设标签的分布随时间变化: 𝑞(𝑦)≠𝑝(𝑦)
, 但类别条件分布保持不变:𝑞(𝐱∣𝑦)=𝑝(𝐱∣𝑦)
。 如果源分布 𝑞(𝑦) 是 “错误的”,那么可以用定义的真实风险中的恒等式进行更正:
在这里,重要性权重将对应于标签似然比率,而不是此前的样本似然比率,如下:
标签偏移的一个好处是,如果在源分布上有一个相当好的模型, 那么可以得到对这些权重的一致估计,而不需要处理周边的其他维度。 在深度学习中,输入往往是高维对象(如图像),而标签通常是低维(如类别)。
为了估计目标标签分布,首先采用性能相当好的现成的分类器(通常基于训练数据进行训练), 并使用验证集(也来自训练分布)计算其混淆矩阵。 混淆矩阵 𝐂
是一个 𝑘×𝑘
矩阵, 其中每列对应于标签类别,每行对应于模型的预测类别。 每个单元格的值 𝑐𝑖𝑗
是验证集中,真实标签为 𝑗 , 而模型预测为 𝑖 的样本数量所占的比例。
现在,不能直接计算目标数据上的混淆矩阵, 因为我们无法看到真实环境下的样本的标签。 然而,我们所能做的是将所有模型在测试时的预测取平均数, 得到平均模型输出 𝜇(𝐲̂ )∈ℝ𝑘
, 其中第 𝑖
个元素 𝜇(𝑦̂ 𝑖)
是模型预测测试集中 𝑖 的总预测分数。
结果表明,如果分类器一开始就相当准确, 并且目标数据只包含以前见过的类别, 以及如果标签偏移假设成立(这里最强的假设), 那么就可以通过求解一个简单的线性系统来估计测试集的标签分布。
如果分类器一开始就足够精确,那么混淆矩阵 𝐂将是可逆的, 进而可以得到一个解 𝑝(𝐲)=𝐂−1𝜇(𝐲̂ )
。
4.概念偏移纠正
概念偏移很难用原则性的方式解决,除了从零开始收集新标签和训练,别无妙方。
幸运的是,在实践中这种极端的偏移是罕见的。 相反,通常情况下,概念的变化总是缓慢的。 比如下面是一些例子:
- 在计算广告中,新产品推出后,旧产品变得不那么受欢迎了。这意味着广告的分布和受欢迎程度是逐渐变化的,任何点击率预测器都需要随之逐渐变化;
- 由于环境的磨损,交通摄像头的镜头会逐渐退化,影响摄像头的图像质量;
- 新闻内容逐渐变化(即新新闻的出现)。
在这种情况下,可以使用与训练网络相同的方法,使其适应数据的变化。 换言之,使用新数据更新现有的网络权重,而不是从头开始训练。也就是将之前训练过的模型作为预训练模型,使用新数据 对该预训练模型进行 模型微调
。
模型微调(Fine-tuning)是指在已经训练好的模型基础上,通过进一步在新的数据集上进行训练,以适应新任务或新数据集的过程。通常情况下,会使用一个在大规模数据集上预训练好的模型(如在 ImageNet 上训练好的卷积神经网络),然后在特定任务的数据集上微调该模型,以提高模型在新任务上的性能。
下面是进行模型微调的一般步骤:
- 选择预训练模型:选择一个在大规模数据集上训练好的模型,如常见的 ResNet、VGG、BERT 等。
- 冻结预训练模型的参数:在开始微调之前,通常会冻结预训练模型的参数,即不更新它们的权重。这样可以确保在初始阶段保留预训练模型学到的特征。
- 修改模型结构:根据新任务的需求,可能需要对预训练模型进行微调,比如修改输出层的结构以匹配新任务的类别数。
- 定义损失函数:根据新任务的特性,定义适当的损失函数,如交叉熵损失函数、均方误差等。
- 微调模型:在新的数据集上进行训练,通过反向传播算法更新模型参数。在这个阶段,通常会解冻一部分或全部的层,使其可以根据新数据进行调整。
- 调整学习率:微调过程中,通常会使用较小的学习率,以防止过度调整预训练模型的参数。
- 评估性能:在训练过程中,使用验证集来监控模型的性能,并在需要时调整超参数。
- 模型评估:最终,在测试集上评估微调后模型的性能,以确定模型在新任务上的泛化能力。
通过模型微调,可以利用预训练模型的特征表示能力,加速模型在新任务上的收敛,并提高模型在新任务上的性能。
四、学习问题的几种类型
1.批量学习
在批量学习(batch learning)中,可以访问一组训练特征和标签 {(𝐱1,𝑦1),…,(𝐱𝑛,𝑦𝑛)}
, 使用这些特性和标签训练 𝑓(𝐱) 。 然后,部署此模型来对来自同一分布的新数据 (𝐱,𝑦)进行评分。 例如,可以根据猫和狗的大量图片训练猫检测器。 一旦训练了它,就把它作为智能猫门计算视觉系统的一部分,来控制只允许猫进入。 然后这个系统会被安装在客户家中,基本再也不会更新。
2.在线学习
除了“批量”地学习,还可以单个 “在线” 学习数据 (𝐱𝑖,𝑦𝑖)
。 更具体地说,首先观测到 𝐱𝑖 , 然后得出一个估计值 𝑓(𝐱𝑖), 只有做到这一点后,才观测到 𝑦𝑖。 然后根据决定,会得到奖励或损失。 许多实际问题都属于这一类。
例如,需要预测明天的股票价格, 这样就可以根据这个预测进行交易。 在一天结束时,会评估我们的预测是否盈利。 换句话说,在线学习(online learning)中,有以下的循环。 在这个循环中,给定新的观测结果,我们会不断地改进我们的模型。
时序模型大多数都是此类模式。
3.老虎机
老虎机(bandits)是上述问题的一个特例。 虽然在大多数学习问题中,有一个连续参数化的函数 𝑓(例如,一个深度网络)。 但在一个老虎机问题中,只有有限数量的手臂可以拉动。 也就是说,可以采取的行动是有限的。 对于这个更简单的问题,可以获得更强的最优性理论保证,这并不令人惊讶。 之所以列出它,主要是因为这个问题经常被视为一个单独的学习问题的情景。
在机器学习领域,“老虎机”(Bandit)是指一类问题,通常被称为多臂赌博机(Multi-armed Bandit)问题。这类问题源于赌博机的概念,其中每个"臂"代表赌博机上的一个拉杆,每次拉动拉杆都会给予不同的奖励。在多臂赌博机问题中,玩家需要在多个拉杆中做出选择,以最大化他们的总奖励。
解决多臂赌博机问题的目标是找到一个策略,即在每次选择时,如何平衡探索未知的高奖励臂和利用已知的高奖励臂。常见的方法包括ε-greedy算法、Upper Confidence Bound(UCB)算法、Thompson Sampling等,这些算法通过不同的探索和利用策略来解决多臂赌博机问题。
4.控制
在很多情况下,环境会记住我们所做的事。
不一定是以一种对抗的方式,但它会记住,而且它的反应将取决于之前发生的事情。
例如,咖啡锅炉控制器将根据之前是否加热锅炉来观测到不同的温度。 在这种情况下,PID
(比例—积分—微分)控制器算法是一个流行的选择。
同样,一个用户在新闻网站上的行为将取决于之前向她展示的内容(例如,大多数新闻她只阅读一次)。 许多这样的算法形成了一个环境模型,在这个模型中,他们的行为使得他们的决策看起来不那么随机。 近年来,控制理论(如PID的变体)也被用于自动调整超参数, 以获得更好的解构和重建质量,提高生成文本的多样性和生成图像的重建质量。
5.强化学习
强化学习(reinforcement learning)强调如何基于环境而行动,以取得最大化的预期利益。 国际象棋、围棋、西洋双陆棋或星际争霸都是强化学习的应用实例。 再比如,为自动驾驶汽车制造一个控制器,或者以其他方式对自动驾驶汽车的驾驶方式做出反应 (例如,试图避开某物体,试图造成事故,或者试图与其合作)。