51c深度学习~合集8

我自己的原文哦~  https://blog.51cto.com/whaosoft/12491632

#patchmix

近期中南大学的几位研究者做了一项对比学习方面的工作——「Inter-Instance Similarity Modeling for Contrastive Learning」,主要用于解决现有对比学习方法在训练过程中忽略样本间相似关系,从而导致所学习无监督表征在不同样本之间的泛化能力下降问题。他们所提出的方法在 ImageNet-1K、CIFAR10 和 CIFAR100 上取得了显著的性能提升。

  • 论文地址:https://arxiv.org/pdf/2306.12243.pdf
  • GitHub地址:https://github.com/visresearch/patchmix

具体地,研究者做了以下工作:

  • 提出了 PatchMix,实现了样本间相似性关系构造,提高了表征在不同样本之间的泛化能力;
  • 提出了 mix-to-origin contrast、mix-to-mix contrast 以及origin-to-origin contrast 目标函数,实现了无监督表征对复杂样本间相似度关系构造;
  • 所学习无监督表征在 ImageNet-1K、CIFAR10 和 CIFAR100上取得了包括 finetuning accuracy、linear accuracy 和 kNN accuracy 3 项主要指标的显著提升。

对比学习中存在的问题

对比学习主要的思路是,首先利用数据增强技术,构造具有外观差异的正样本对(来自同一图像的不同 view),并将不同图像作为负样本对;然后利用对比学习损失(最常见的 InfoNCE loss),最大化正样本对之间的 cosine 相似度,并最小化负样本对之间的 cosine 相似度,以抽取外观无关的图像表征 (appearance-invariant representation),从而理解同一图像在不同数据增强下的语义一致性,实现无监督条件下的图像语义表征的抽取。

这种思路存在一个问题,即自然图像相互之间存在丰富的相似性,而非对比学习设定中正样本对之间的单一相似性,如图1 所示。

现有对比学习所采用的目标函数只关注了同一样本不同数据增强的相似性,忽略了图像间相似性,使得所学习表征并不能很好地反映图像在语义上的相似性,降低了表征在不同样本之间的泛化能力。

研究动机

针对上面对比学习中目标函数不准确的问题(inaccurate target issue),如何在无监督设定下构造具有样本间相似性关系的正样本对成为关键问题。其实在人类认知视觉物体的时候,也存在利用已有物体定义新物体概念的思路,例如鸭嘴兽、猫头鹰等。这些动物在部分结构上与已有常见动物具有相似性,如图所示。

在对比学习中,我们是否可以借鉴上面这个思路,人为构造一个新样本,使得新样本和多个样本之间存在相似性,从而引导深度模型学习样本之间的相似性关系。

Vision Transformer(ViT)将图像作为图像块的序列进行图像建模,为计算机视觉发展提供了一个全新的思路。同时,掩码图像建模(MIM, Masked Image Modeling)无监督学习方法(如 BEiT、SimMIM、MAE)的成功,也表明只用少量的 patch(如整图 25% 的 patch)也能够有效表征原始图像的语义(这样我们就可以用包含多张图像 patch 的混合图像,表示多张图像的语义)。

受到上述观察的启发,通过混合多个图像的 Patch,形成新的混合图像,以人为构造混合图像和多个图像之间的相似性关系,实现无监督条件下的图像间复杂相似性关系的模拟。例如,混合包括狗、鸟 、飞机、汽车物体的 4 张图片,形成一张具有狗的头、鸟的翅膀、飞机的尾翼、汽车的轮子的混合图像,使得混合样本和上述 4 个样本之间具有确定的相似性关系,作为训练样本去引导深度模型无监督地学习样本之间的相似性关系。我们把这种方法称之为 PatchMix,如下图所示。

方法介绍

PatchMix

方法的完整数学描述略显复杂,如果只是想了解主要思想,可以只看上面 PatchMix的流程图即可(其实只是公式多,每个公式也不复杂,后续有机会做个演示动画,帮助大家理解。这个方法也可以用简单的 Mask 方法实现,但是本方法在大规模图像处理上效率是最高的),对该工作感兴趣的同行可以看一下,我尽量写得清楚一些。

结合 PatMix 的流程图,主要过程如下:

由于混合图像和混合图像之间,重叠比例的不同,mix-to-mix label 中每一项的权重分数是不同的,根据上图,可以得到权重系数可以表示为 

综上,所提出的 PatchMix 算法可以概括为 

算法具体的实现代码如下: 

实验结果 

 Image Classification on ImageNet-1K

 Image Classification on CIFAR10 and

 Inter-Instance Similarity Visualization

总结

  • PatchMix 通过混合不同图像的 Patch,构造了具有多图像实例相似性的对比学习代理任务,以引导模型在对比学习过程中关注不同图像之间潜在的相似性,提高所学习表征在不同图像上的跨实例泛化能力。
  • 在具体的目标函数上,采用 mix-to-origin contrast 构造混合图像和正常图像的相似关系,进一步引入 mix-to-mix contrast 构造更为复杂的样本间相似性关系,并利用 origin-to-origin contrast 消除混合图像在表征上的 gap,提高表征在正常图像上的适配性。
  • 实验上,PatchMix 大幅提升了无监督表征在 ImageNet-1K, CIFAR10, CIFAR100和 COCO 数据集下游任务上的性能,证明了其有效性。

#25种正则化方法

训练中的一个关键因素是网络的正则化,它可以防止模型在训练的过程中出现过拟合的现象。本文分析了过去几年发展起来的几种正则化方法,显示了不同CNN模型的显著改进。 

一些图像处理任务,如图像分类和目标检测,已经通过使用卷积神经网络(CNN)性能得到了显著的改进。像ResNet和EfficientNet一样,许多架构在创建时已经在至少一个数据集上取得了出色的结果。训练中的一个关键因素是网络的正则化,它可以防止模型在训练的过程中出现过拟合的现象。这项工作分析了过去几年发展起来的几种正则化方法,显示了不同CNN模型的显著改进。这些工作分为3个主要领域:

第一:是“数据正则化”,其中所有的方法都专注于对于输入数据的更改

第二:是“结构正则化”,主要是修改神经网络或核函数生成特征映射的过程

最后:是“标签正则化”,主要是对给定输入的标签进行转换和修正

1 简介

1.1 背景说明

卷积神经网络已经在一些与计算机视觉相关的任务上取得了相当不错的结果,如图像分类和目标检测。这种成功可以用卷积神经元的工作原理来解释:它根据图像的空间属性来突出给定的特征。浅层网络注意是归纳一些形状或者纹理特征;然而,更深层次的网络可以检测出更复杂更抽象的特征,比如整个物体或人脸。如今,从生物识别到疾病检测,很难找到其他没有CNN的计算机视觉技术。

关于CNN的一个关键问题是如何对卷积核进行堆叠?以在给定的任务上实现最佳的结果。在几个不同的任务上使用相同的基本架构是很普遍的,只需要改变输出。例如,EfficientNet是一种用于图像分类的神经网络,它也被用于EfficientDet体系结构来处理目标检测任务。

该体系结构可能是计算机视觉模型的核心部分;然而,在开始训练之前还有其他相关的要点。例如,优化技术可能会影响最终的性能。即使是kernel的初始化方法都有可能会影响模型最终的性能。

本研究集中讨论在这些可能影响最终性能因素的一个方面:正则化。

根据所使用的正则化策略,一些架构可以在最终结果上获得相关的增益。使用良好的正则化方法的一个重要方面是,它不会影响最终模型的性能。这意味着,独立于使用或不使用一个正则化方法,模型的推理计算成本是相同的。然而,在某些情况下,它可以影响训练阶段的性能,使用少量的计算开销或训练周期。无论如何,产出的结果通常是可以补偿这一成本的。

1.2 为什么正则化方法有效?

CNN通常用于计算机视觉任务,如图像分类和目标检测,以创建像人类视觉一样强大的视觉模型。如果考虑到可用的信息数量,很明显,训练任务需要更多数据可变性。考虑到一个健康的大脑和眼睛正常的人,不考虑睡觉的时间,平均每天保留大约16个小时的新信息。

即使考虑到像ImageNet这样的巨大数据集,与人类大脑通过眼睛接收到的数据数量相比,可用的图像数量也是最小的。这种新数据的不可用性可能会导致一种称为过拟合的情况,即模型学习如何很好地表示训练数据,但它不能有效地处理新信息,即测试数据。这种情况通常发生在模型在可用的训练信息中进行了详尽的训练时,而它不能很好地扩展到其他新信息中。

作为一个人工神经网络,神经网络的训练步骤可以描述为一个优化问题,目标是训练得到一个合适的权值;假定给一个输入和损失函数,可以转换期望的信息输出最低可能的误差。实现这一目标的一种方法是最小化以下功能:

图片

其中|.  为Frobenius norm,  为输入数据,  和  分别表示权重 矩阵和目标标签。Frobenius norm增加了  和  之间的相似性。

这种解释有一个主要优点:这个公式可以通过矩阵分解进行优化,产生X的结构化分解。然而,只有当W或  固定在优化两个矩阵时,将原始方程转换为非凸公式时,才能实现全局最小值。如果矩阵分解为矩阵近似,可以解决这个问题:

图片

其中,目标是估计矩阵A,最终得到一个凸优化,这意味着它有一个全局最小值,通过梯度下降算法可以找到。当使用正则化时,这个方程变为:

图片

其中,描述了基于A的正则化函数,而λ是设置正则化函数对目标函数的影响程度的标量因子。正则化方法的一个关键方面,独立于训练阶段的工作,是为了防止模型过拟合。它通过增加CNN不同阶段的数据的可变性来操作。当处理图像时,最直接的方法是随机改变图像,比如旋转和翻转。虽然这种类型的正则化工作得很好,但应该考虑到一些问题。例如,一些转换可能会将图像扭曲成分类中的另一个现有类。更直接的例子是MNIST数据集上的基线图像分类:如果旋转太多,输入“6”可能会转换为“9”,导致模型学习错误的信息。

1.3 正则化和标准化

机器学习中的一个普遍问题是调整给定模型的参数,使其对训练数据和新的数据能够有更好的鲁棒性。旨在减少不属于训练集的数据上的误差的算法的集合被称为正则化技术。

标准化和正则化技术的一个主要区别是,正则化在训练期后不再使用,而标准化保留在模型之中。例如,Cutout和MaxDropout在推理期间没有被执行,但是Batch Normalization在推理时需要执行。

1.4 正则化主要用在哪里?

尽管大多数作品都应用于输入,但也有很多研究致力于内部结构和标签层。图1描述了本次调查中科学工作的比例。

图片

图1

大约44%的工作依赖于对输入的正则,其中最著名的是数据增强策略。CNN输入中参数和结构的容易改变可以解释如此多的工作量。图像处理和计算机视觉驱动的应用程序在处理深度学习时仍然发挥着重要的作用。

第二种最常见的正则化方法是那些对模型的内部结构进行正则的方法。Dropout为这一研究领域的进展做出了很大的贡献。一些作品主要是基于Dropout进行的改进,当然其中也有一些是全新的方法。

1.5 正则化方法的缺点

第一个是标签不随输入或在神经网络的中层直观地改变。在这2个级别中执行变化是更自然的,因为在视觉上更容易理解在训练和推理过程中发生了什么。然而,要解释执行标签更改时会发生什么就比较困难了。尽管最初的研究认为它防止了过拟合问题,但它未能解释为什么会避免这种情况。

另一种解释是对大多数方法缺乏数学解释。幸运的是,一些技术,如Dropout和Mixup,对它们的内部机制提供了有趣的见解。

最后,最好要记住,开发机器学习领域最关键的步骤之一是创建标签可靠的数据集。虽然本文关注的是正则化策略,但值得记住,最终,与标签的组合方式上的突破可能会促进更强大的系统。因此,强调更多与标签正则化相关的工作值得研究。

2 正则化方法大集结

2.1 Cutout

Cutout是一种直接而强大的数据增强的技术。在训练过程中,它在输入神经网络之前随机去除图像的区域。Cutout作者详尽地分析了CIFAR-10和CIFAR-100数据集中被移除区域的理想大小。

图片

图3 Cutout

理想的大小根据每个类的实例的数量和给定数据集的类的数量而变化。例如,在CIFAR-10数据集上的最佳结果是通过删除一个大小为16×16的patch来完成的,而对于CIFAR-100,关于最佳结果的区域大小是8×8。对于SVHN数据集,通过使用网格搜索找到了最佳的crop大小为20×20。对于STL-10数据集,最佳结果的crop大小为32×32。

2.2 RandomErasing

RandomErasing是在Cutout技术的基础上进一步的发展。Cutout是对图像的随机裁剪,而RandomErasing关注的是在空白空间中去除并随机添加信息,例如噪声。与Cutout不同,RadomErasing并不是每次都删除图像的一部分。在这项工作中,作者在3种不同的分类数据集(CIFAR-10,CIFAR-100和Fashion-MNIST)上评估了该方法,用于目标检测的VOC2007数据集,以及用于ReID的三种不同的CNN架构(IDE, TriNet和SVDNet)。

图片

图4 RandomErasing

对于分类任务,4种不同的架构被用于评估目的:ResNet、ResNet with pre-activation、Wide Residual Networks和ResNeXt。在所有情况下,RandomErasing方法完成了相关的误差减少(至少0.3%)。

对于目标检测任务,当只使用该数据集中的可用数据训练模型时,平均精度(mAP)提高了0.5,当训练数据与VOC2012训练数据集结合时,平均精度(mAP)提高了0.4。图4显示了随机擦除是如何工作的。

2.3 AutoAugment

AutoAugment试图找出给定数据集上的哪些transformations可以提高模型的准确性。它使用5个不同的transformations为给定策略创建一个搜索空间,这些transformations由2个附加参数控制:给定更改概率(Cutout,SamplePairing,Shear X/Y,Translate X/Y,Rotate,AutoContrast,Invert,Equalize,Solarize,Posterize,Contrast,Color,Brightness以及Sharpness)和变化幅度。

图片

图5 AutoAugment

然后将这些策略输入一个“child”模型,该模型是一个用部分训练数据集训练的CNN。这个CNN的准确性被告知一个“控制器”模型,它是一个循环神经网络(RNN)。这个RNN输出一个给定策略在未来被使用的概率。在控制器训练过程的最后,使用5个最佳策略(每个策略有5个子策略)来训练最终的模型,用于评估数据集。使用这些生成的策略和子策略使得AutoAugment在CIFAR-10、CIFAR-100、SVHN和ImageNet数据集上达到了最先进的结果。

这种方法的一个巨大优势是这些策略在不同数据集之间的可迁移性:在最初的工作中,为ImageNet找到的策略被用来训练其他5个不同的数据集,即使没有在这些数据集上训练AutoAugment,也能显著改善结果。这种方法的一个缺点是用来训练控制器模型的时间:例如,对于ImageNet数据集,它需要大约15000个小时的处理,这在一些情况下可能是不切实际的。Fast AutoAugment的目标就是通过一种新的算法来克服这一瓶颈,在产生相似结果的同时,显著减少搜索过程所需的时间。

2.4 PBA

Population Based Augmentation(PBA)不仅展示了一种新的增强算法,而且展示了调度策略而不是固定策略,改进了以往研究的结果。

图片

图6 PBA

在每3步中,它改变了一半的策略,即1/4的权重变化,另外1/4的超参数变化。虽然自动增强意味着在CIFAR-10数据集上的训练开销为5000个小时,但PBA只增加了5个小时。

2.5 RandAugment

如前所述,寻找最佳数据增强的方法的一个巨大瓶颈涉及到它们的计算负担,因为它可能比自己的神经网络训练需要更长的时间。另一个问题与在搜索过程中发现的策略有关,这可能会导致次优策略,即它确实改善了局部的结果;然而,它并不会带来最好的全局结果,因为它使用了一个较浅的神经网络,并假设这个规则可以应用于任何其他的,更深的架构。

图片

图7 RandAugment

图片

14个最常见的策略

RandAugment使用了在之前的工作中发现的14个最常见的策略,并在训练期间对每个策略的大小进行搜索,从而消除了初步探索步骤的需要,并根据当前的训练CNN定制数据放大。结果表明,该方法不仅比以往的方法更快,而且显著改善了结果。

2.6 Mixup

训练CNN的一种可能性是,Mixup来自训练数据集中的2幅图像,并迫使模型可靠地确定这种Mixup图像属于哪一类。然而,如何为这种Mixup生成编码标签并不普遍。提供这个新的输入/输出训练对可以让模型从损坏的输入中学习更多的特征。最初的工作表明,使用这种方法的模型不仅可以改善图像分类任务的结果,而且可以改善语音识别、生成对抗网络的稳定、表格数据集等问题的结果。图5演示了Mixup的工作原理。

图片

图5 Mixup

2.7 CutMix

另一种混合输入和标签以改善结果的策略是CutMix。与Mixup不同,CutMix会替换给定输入中的整个区域,并通过给予与每个类使用的区域相同的权重来更改标签。例如,如果一只猫的图像被30%的图像替换为一个飞机的图像,则该标签被设置为70%的猫和30%的飞机。这一策略的结果有了显著的改善。通过使用绘制Grad-CAM可以观察到生成的Heatmap更好地突出了更准确地定义感兴趣目标的区域。

图片

图6 CutMix

2.8 CutBlur

一些针对图像处理的深度学习任务,如图像分类或目标检测,可以通过使用数据增强来提升模型性能。一些工作,如AutoAugment、Cutout和RandomErasing可以通过对训练图像应用一些transformations来显著改善结果。然而,对于超分辨率(SR)任务,文献中缺乏提出正则化技术来明确地处理这个问题的工作。

图片

图7 CutBlur

尽管可以使用上述技术并可能改善结果,但它们并不是通过手工设计来处理SR问题的。到目前为止,唯一发现的方法是CutBlur,它的工作原理是用来自类似区域的低分辨率(LR)版本替换高分辨率图像(HR)上的给定区域。作者表明,CutBlur有助于模型在SR问题上更好的推广,但同样的技术可以用于重建被高斯噪声退化的图像。

2.9 BatchAugment

训练cnn的一个重要超参数与mini-batch size有关,mini-batch size用于计算反向传播中使用的梯度。该超参数通常采用GPU的上限,这对于提高训练收敛速度至关重要。BatchAugment工作巧妙地利用了这个限制。它不只是使用来自数据集的不同实例来满足整个内存,而是使用默认的数据扩展设置来考虑内存限制的一半,然后复制具有不同数据扩展可能性的所有实例。这听起来像是一个简单的技巧;然而,结果表明,使用这种方法的神经网络在最终结果上有显著的改善。另一点是,通过复制增强图像,分析表明需要更少的时间点来实现收敛。

2.10 FixRes

图像分辨率可能会影响训练周期效率和最终的分类精度。例如,对EfficientNet的研究通过将输入大小作为影响最终结果的参数之一,从而强调了这一想法。然而,如果一个模型被训练,例如,分辨率为224×224,测试集的推理应该使用一样的图像分辨率。

图片

图8 FixRes

FixRes提出的工作强调了测试集的分辨率应该高于用于训练的分辨率。这种变化不仅产生了一个更可靠的神经网络,而且比传统方法训练得更快,因为它需要更少的计算量,因为用于这种目的的图像比用于推理的图像要小。该方法表明,在使用迁移学习时,它可以改善在其他数据集上的结果。

2.11 Bag-of-Tricks

这里分析的工作的一个关键点是,它们经常没有将任何其他正则化方法与它们当前的研究结合起来。因此,很难知道两个正则化器是如何相互影响的。Bag-of-Tricks研究通过结合几种已知的正则化方法,如Mixup、Label Smoothing和Knowledge Destilation。消融研究表明,如果应用一定的方法,最终结果可以显著改善。例如,使用这种方法组合的MobileNet在ImageNet数据集中提高了近1.5%的结果,这是一个显著的收益。然而,该研究缺乏对层间正则化方法的深入评价,如Dropout。

3 结构正规化

正则化方法可以以不同的方式工作。在本文中,将结构正则化定义为在训练过程中改变权值而不改变输入kernel值的方法。本节分为两个主要部分:第一部分介绍了Dropout如何工作和它的一些变体的更深入的描述,如SpatialDropout和DropBlock。在第二部分中,描述了其他旨在执行其他张量操作的方法,如Shake-shake Regularization。

3.1 Dropout and variants

Dropout被认为是一种简单但功能强大的正则化器,旨在去除一些神经元,从而迫使整个系统学习更多的特征。最初的工作表明,它不仅可以应用于cnn,还可以应用于多层感知器(MLPs)和受限玻尔兹曼机(rbm)。

图片

图9 Dropout

在训练阶段的每一步,通过伯努利分布来估计每个神经元的dropping out概率,从而在训练过程中增加了一些随机性。最初的研究表明,被dropping out的神经网络可以比标准的神经网络更好地进行推广。

3.2 MaxDropout

Dropout随机去除训练阶段的神经元,Maxdropout则根据神经元的激活情况去激活神经元。它首先将张量s值归一化,然后将每一个大于给定阈值p的输出设置为0,因此这个值越高,它就越有可能被禁用。

图片

图10 MaxDropOut

最初的工作表明,它可以改进在CIFAR-10和CIFAR-100数据集上的ResNet18结果,而且它在WideResNet-28-10模型上的性能也优于Dropout。

3.3 DropBlock

DropBlock表明,去除给定张量(即特征图)的整个区域可以帮助模型更好地泛化。通过使用ResNet-50和AmoebaNet-B模型对图像进行分类任务,使用retinanet模型对物体进行检测,使用ResNet-101模型对图像进行分割,结果表明该模型比Dropout等内部正则化算法对结果有更好的改善。

图片

图11 DropBlock

DropBlock应用在CNN的每个feature map上,从一个小的比例开始训练,然后慢慢的增加它的值。它的实验显示了ImageNet数据集上的相关结果,当使用ResNet-50时,Baseline精度提高了近2%,打败了其他正则化方法,如Cutout和AutoAugment,使用AmoebaNetB时,基线精度提高了约0.3%。在目标检测任务中,retavanet模型在AP度量上改进了1.5%以上。

3.4 TargetDrop

注意机制可以被整合到一个给定的正则化器中,这样它就可以在适当的区域发挥作用。例如,TargetDrop将这种机制与DropBlock结合在一起。在训练过程中,它允许整个系统去除给定通道上的大多数有区别的区域。结果表明,这种方法不仅比DropBlock获得了更好的结果,而且,通过使用grade-cam,在决定给定输入属于哪个类的区域中显示了更多的一致性。

图片

图12 Dropout,DropBlock,TargetDrop

3.5 AutoDrop

虽然有效,但Dropout缺乏选择掉哪个神经元的空间信息。DropBlock的策略是将整个随机区域放在隐藏层上,而不是单一的神经元,从而迫使CNN学习更好的空间信息。然而,Drop方法是手动设计和固定的,如果这些模式可以在训练中学习,这可能会得到改进。

图片

图13 AutoDrop

AutoDrop迫使CNN根据训练信息学习最佳设计,使用控制器逐层学习最佳滴模式。CIFAR-10和ImageNet的结果表明,这些模式改善了结果,并可以在数据集之间传输。

3.6 LocalDrop

Rademacher复杂性被用来重新定义Dropout和DropBlock。通过对该问题进行广泛的数学分析,提出了一种新的两阶段正则化算法。该方法虽然耗时,但针对图像分类的不同CNN架构取得了相应的改进。CIFAR-10的结果表明,LocalDrop方法至少可以改善结果0.15%,比最佳结果提高了近0.6%。CIFAR-100的结果改善了0.4%;然而,在这种特定的情况下,在反向传播时删除权重的变化最终会得到略微更好的结果,提高了0.5%。除了改进之外,该方法只适用于3分支ResNet,很难直接比较其他方法。

3.7 Shake-Shake

在这些体系结构上强制正则化的一种方法是在训练期间为残差连接的每个分支赋予不同的权重。最初的ResNets的工作原理是在每个分支上添加权重,没有任何区别。在训练过程中,Shake-shake作用于3个分支的ResNets,在前传时改变每个分支的乘因子,在后传时乘以不同的值,从而改变每个分支对最终结果的影响。对于推理,它将每个分支乘以0.5倍。

3.8 ShakeDrop

解决Shake-shake问题的一个改进是ShakeDrop。它不仅适用于ResNeXt架构,也适用于ResNet、Wide ResNet和PyramidNet。为了实现这样的结果,ShakeDrop改变了由Shake-shake提出的配置。这些分支上的Shake组合显示,ShakeDrop有更好的性能,不会被困在局部极小值上。结果表明,该方法可以比前面提到的每一种体系结构获得的原始结果更好。

3.9 Manifold Mixup

神经网络通常被概括为一个函数,给定输入数据和一组可学习参数,输出相应的目标值。Manifold Mixup的作用类似于Mixup,然而,它在CNN的任何内部层中运行,而不仅仅是在输入层。深度神经网络可以被认为是一组较小的神经网络,每一个都输出一些期望的特征;因此,如果所有的子网都运行良好,则可以认为最终的结果是良好的。

Yang等提出了一种新的损失函数设计策略:首先通过前馈过程计算传统的小批量损失。然后,它从原始网络生成子网络,然后通过使用不同的图像变换提供相同的小批处理,为每个模型计算一个损失。最后,将传统损失与各个子网络的损失相加,计算出最终损失。该技术在不同的数据集和CNN架构中显示了巨大的潜力改进。

3.10 其他方法

在过去的几年里,残差连接的使用,首先在众所周知的神经架构ResNet中引入,并对其进行了进一步的改进,在几个任务上取得了相关的成果。后来的研究表明,这种成功是由于创建了一种名为“identity mapping”的结构,它是对原始输入的重建。残差连接迫使模型学习如何构造这些结构。

4 标签正则化

有方法使用Label Smoothing作为其正则化策略的一部分。例如,Mixup根据2个不同图像之间的插值来平均标签的值。同样的规则也适用于Manifold Mixup技术;然而,数据插值是在层之间计算的,并使用相同的微积分来重置标签值。

另一个使用标签转换的正则化器是Cutblur。在本例中,使用了反式格式,在训练期间,可以将标签与输入倒置,使输入作为标签,模型将按照预期收敛。这一预期结果的原因是由于低分辨率和高分辨率图像的切割尺寸,这是没有预先定义的。这意味着输入可以是高分辨率图像中的低分辨率图像,标签可以是高分辨率图像中的低分辨率图像。因此,将标签和输入倒排仍然是有意义的。

其他方法也可以通过使用Manifold Mixup来改进它们的结果。例如,Cutout从输入中删除部分,所以根据crop size“remove”部分标签也是有意义的。假设crop size是图像的25%,因此活动类可以从1下降到0.75。同样的策略也适用于RandomErasing。在训练过程中丢弃神经元的方法,如Dropout,可以在训练过程中将热标签的值降低到相同的范围。

4.1 Label Smoothing

在一般的分类任务中,使用热编码标签是普遍存在的。从2015年开始,Label Smoothing提出了一种在标签编码过程中的正则化技术,通过修改hone-hot表示的每个位置上的值。

Label Smoothing的工作原理是防止了2个主要问题。

  • 首先,过拟合问题
  • 其次,对于不确定结果的过度自信问题

根据作者论述,通过使用编码标签上的平滑因子,应用在向量上的Softmax函数产生更接近平滑编码向量的值,限制了反向传播算法中使用的值,并根据类产生更真实的值。

4.2 TSLA

使用标签平滑的一个困难是找出ϵ的什么值(即平滑因子)是理想的,无论是对于一般的还是对于特定的数据集。最初的工作表明,ϵ=0.1是极好的条件;然而,两阶段标签平滑(TSLA)表明,一般来说,梯度下降结合Label Smoothing技术只能提高结果,直到一定的训练点,之后最好将活动类的所有值设置为0和1。例如,当在CIFAR-100数据集中对ResNet18进行200个Epoch的训练时,结果表明,当使用Label Smoothing时仅仅到160个Epoch便可以获得最好的性能。

4.3 SLS

通常,很难为Label Smoothing因子定义适当的值。结构标签平滑(SLS)提出通过估计贝叶斯估计误差来计算这样的值,根据作者,这有助于定义每个实例的标签边界。实验表明,该方法在不同场合都可以克服传统的标签平滑方法。

虽然这项工作在MobileNetV2上得到了充分的评估,但它没有考虑到其他的神经网络架构。尽管一些流行的数据集被用于比较目的,例如,CIFAR和SVHN,但这项工作仅限于MobileNet-V2。

4.4 JoCor

本文提出了一种避免噪声标签对神经网络的影响的新方法。JoCoR在同一数据集上训练2个相似的神经网络,并试图关联2个不同的标签。该方法通过将2个网络的交叉熵损失加上它们之间的对比损失来计算损失,然后只使用批处理上最可忽略的损失来更新架构的参数。

作者认为,通过使用最小的值来更新参数,这2种网络都与预测结果一致,而且标签的噪声往往更小。虽然该方法是针对弱监督问题开发的,但它可以很容易地适应传统的监督问题,如数据分类,以改善结果。这种方法的缺点是使用2个神经网络进行训练,这需要更多的处理和内存。

#RL-PPO理论知识

关于强化学习中PPO算法的全面解读,从基础概念到算法细节,旨在帮助读者深入理解PPO的理论基础和实现机制。

在去年的这个时候,我以deepspeed-chat的代码为例,解读了rlhf运作的流程。当时写这篇文章的目的,主要是想让读者在没有强化学习知识的情况下,能从直觉上快速理解这份代码,以便上手训练和修改。

由于这篇文章侧重“直觉”上的解读,因此有很多描述不严谨的地方。所以去年我就想接着敲一篇比较严谨的介绍强化学习理论的文章(策略梯度->actor-critic -> PPO),但是由于敲公式真得太累了,所以一直delay到今天。

所以今天这篇文章就来做这件事,我的主要参考资料是Sutton的这本强化学习导论(http://incompleteideas.net/book/the-book-2nd.html)。在现有的很多教材中,一般会按照这本导论的介绍方式,从MDP(马尔可夫决策过程)和价值函数定义介绍起,然后按照value-based,polciy-based,actor-critic的顺序介绍。但是由于本文的重点是actor-critic,所以我在写文章时,按照自己的思考方式重新做了整理:

  • 我们会先介绍policy-based下的优化目标。
  • 然后再介绍价值函数的相关定义。
  • 引入actor-critic,讨论在policy-based的优化目标中,对“价值”相关的部分如何做优化。
  • 基于actor-critic的知识介绍PPO。

为什么在网络上已经有无数强化学习理论知识教程的前提下,我还要再写一篇这样类型的文章呢?主要是因为:

  • 作为一个非RL方向出身的人,我对RL的理论知识其实一直停留在“它长得是什么样”,而不是“它为什么长这样”
  • 当我想去探究“它为什么长这样”的时候,我发现最大的难点在各类资料对RL公式符号定义的太混乱,或者写的太简略了。举例来说:
  • 我们在RL会看到大量  这样求期望的形式, 但是很多公式会把E的下标省略掉, 使人搞不清楚它究竟是从哪里采样,而这点非常重要。
  • 在RL的公式中, 混合着随机变量和确定性变量, 对于随机变量我们常讨论的是它的期望。可是在有些资料中, 经常给出诸如  这样的形式, 且不带符号说明。乍一看你很难想到, 它究竟代表某一次采样中的即时奖励, 还是代表多次采样的即时奖励的期望? 诸如此类
  • 最后,只有当我把所有的过程按自己的思路想一遍,推一遍后,我才发现原来之前自己还有这么多理解不深刻的地方。写这篇文章的过程,也是在问自己为什么的过程。

【全文目录如下】
一、策略
二、奖励
三、运动轨迹和状态转移
四、Policy-based下的强化学习优化目标

五、策略的梯度
5.1基本推导
5.2总结

六、价值函数
6.1 总述:衡量价值的不同方式
6.2 回报
6.3 状态价值函数
6.4 动作价值函数
6.5 状态价值函数和动作价值函数的关系
6.6 优势函数和TD error

七、Actor-Critic
7.1 Actor优化目标
7.2 Critic优化目标
7.3 Actor和Critic之间的关系

八、PPO
8.1 朴素Actor-Critic存在的问题
8.2 重要性采样
8.3 GAE:平衡优势函数的方差与偏差
8.4 PPO前身:TRPO
8.5 PPO做法1: PPO-Clip
8.6 PPO做法2: PPO-Penalty
8.7 PPO中的critic loss

一、策略(policy)

策略分成两种:确定性策略和随机性策略。我们用表示策略的参数。

1.1 确定性策略

智能体在看到状态  的情况下, 确定地执行

1.2 随机性策略

智能体在看到状态  的情况下, 其可能执行的动作服从概率分布  。也就是此时智能体是以一定概率执行某个动作  。

在我们接下来的介绍中,都假设智能体采用的是随机性策略。

二、奖励(Reward)

奖励由当前状态、已经执行的行动和下一步的状态共同决定。

2.1 单步奖励

  • 奖励和策略  无关
  • 用于评估当前动作的好坏,指导智能体的动作选择。

2.2 T步累积奖励

T步累积奖励等于一条运动轨迹/一个回合/一个rollout后的单步奖励的累加.

2.3 折扣奖励

这里  。

三、运动轨迹(trajectory)和状态转移

智能体和环境做一系列/一回合交互后得到的state、action和reward的序列,所以运动轨迹也被称为episodes或者rollouts, 这里我们假设智能体和环境交互了  次:

  •  是初始时智能体所处的状态, 它只和环境有关。我们假设一个环境中的状态服从分布 , 则有 .
  • 当智能体在某个  下采取某个动作  时, 它转移到某个状态  可以是确定的, 也可以是随机的:
  • 确定的状态转移: ,表示的含义是当智能体在某个  下采取某个动作  时,环境的状态一定会转移到
  • 随机的状态转移:

在我们接下来的介绍中,都假设环境采用的是随机状态转移

四、Policy-based强化学习优化目标

抽象来说,强化学习的优化过程可以总结为:

  • 价值评估:给定一个策略 , 如何准确评估当前策略的价值  ?
  • 策略迭代:给定一个当前策略的价值评估 , 如何据此优化策略  ?

整个优化过程由以上两点交替进行, 最终收玫, 得到我们想要的最优策略  和能准确评估它的价值函数

图片

此时, 你肯定会想, 这是否意味着强化学习过程中一定存在  和  两个实体呢? 例如, 这是否意味我们一定要训练两个神经网络,分别表示策略和价值评估?答案是否定的:

  • 你可以只有一个价值实体 , 因为它的输入和状态与动作相关(这里我们不区分 V 和 Q , 留到后文细说)。这意味着只要我们知道状态空间  和动作空间  就可以作用到这两个空间上帮助我们衡量哪个状态/动作的价值最大,进而隐式地承担起制定策略的角色,我们也管这种方法叫value-based
  • 你可以只有一个策略实体 , 在对策略的价值评估中, 我们可以让策略和环境交互多次, 采样足够多的轨迹数据,用这些数据去对策略的价值做评估,然后再据此决定策略的迭代方向,我们也管这种方法叫 policy-based
  • 你可以同时有价值实体  和策略实体 , 然后按照上面说的过程进行迭代, 我们也管这种方法叫 actorcritic, 其中actor表示策略, critic表示价值。这是我们本文讨论的重点。

接下来,我们就直接来看policy-based下的强化学习优化目标:

我们来详细解读这个目标:

  •  :表示一条轨迹序列。
  •  :智能体所采取的策略,下标  表示和策略相关的参数。
  •  :表示这条轨迹序列的累积奖励。
  •  :在使用策略  的情况下, 产出某条轨迹的概率
  •  : 我们知道, 当前这条轨迹序列是在使用策略  的情况下采样出来的, 所以  隐藏的完整含义为:

  • 基于策略的强化学习的总目标是,找到一个策略  ,使得它产出的轨迹的【回报期望】尽量高。 报期望表示为  。
  • 为什么这里我们讨论的是【回报期望】,而不是某一个具体的回报值?这是因为策略和状态转移具有随机性,也就是对于一个固定的策略,你让它和环境交互若干次,它每次获得的轨迹序列也是不一样的,所以是个随机变量,因此我们讨论的是它的期望。从更通俗的角度来讲,你评价一个策略是否好,肯定不会只对它采样一次轨迹,你肯定需要在足够多次采样的基础上再来评估这个策略。

五、策略的梯度上升

5.1 基本推导

现在我们知道强化学习的总优化目标是:

图片

我们据此来计算梯度:

图片

其中,第2行~第3行是因为:

图片

我们对一项再进行展开推导。我们知道策略和状态转移都是随机的,同时我们设一条轨迹有个timestep,则我们有:

图片

据此我们继续推出:

图片

被约去的两项是因为这里我们是在对策略求梯度,而这两项和环境相关,不和策略相关。

综上,最终策略的梯度表达式为:

图片

5.2 总结

在基于策略的强化学习中,我们期望max以下优化目标:

基于这个优化目标,策略的梯度为:

这个梯度表达式有一个简单的直观理解: 当  越高时,动作  贡献的梯度应该越多,这是因为此时我们认为  是一个好动作,因此我们应该提升  ,即提升在  下执行  的概率。反之亦然。

在实践中,我们可以通过采样足够多的轨迹来估计这个期望。 假设采样 N 条轨迹, N 足够大,每条轨迹涵盖  步, 则上述优化目标可以再次被写成:

图片

对应的梯度可以被写成

图片

六、价值函数(Value Function)

通过上面的推导,我们知道在强化学习中,策略的梯度可以表示成

图片

这里  表示一整条轨迹的累积奖励或者累积折扣奖励。

当你端详这个公式时, 你可能会有这样的疑问:  是整条轨迹的奖励, 但是  却是针对单步的。我用整条轨迹的回报去评估单步的价值,然后决定要提升/降低对应  的概率,是不是不太合理呢?例如:

  • 一条轨迹最终的回报很高,并不能代表这条轨迹中的每一个动作都是好的。
  • 但我们又不能完全忽视轨迹的最终回报,因为我们的最终目标是让这个回合的结果是最优的。
  • 综上,在衡量单步价值时,我们最好能在【单步回报】和【轨迹整体回报】间找到一种平衡方式。

有了以上这些直觉, 你开始考虑用一个更一般的符号  来表示各种可行的价值函数, 你用  替换掉了上面的 , 这下策略的梯度就变成:

图片

6.1 总述:衡量价值的不同方式

总结来说可能有如下的实现方式:

图片

我们来做逐一讲解。

(1)整条轨迹累积奖励/累积折扣奖励

这就是我们前文一直沿用的方法,即:

你可以通俗理解成  (省略了折扣因子)

(2)t时刻后的累积奖励/累积折扣奖励

由于MDP的假设,t时刻前发生的事情和t时刻没有关系,t时刻后发生的事情才会受到t时刻的影响,所以我们可以令:

(3)引入基线

我们沿着(2)继续看, 假设在单次采样生成的估计中, t 时刻后的累积奖励为 , 如果这个值很高,那一定证明在某个  下采取某个  一定好吗?答案是否定的,因为这里的"高"是一个绝对概念,而我们更想知道的是一个相对概念:这个动作究竟比别的动作好多少?同时,由于采样具有随机性,有些动作只是没被采样到, 并不代表它们不好。所以这里我们引入一个基线(baseline)的方法来做调控:

这里基线的实现方式也可以有多种,比如当我们采样了一堆轨迹,我们可以找到这些轨迹中状态为  的数据, 求这些数据在(2)下的奖励并做平均(也就是求了个期望)当作基线。

(4)动作价值函数

(5)优势函数

(6)状态价值的TD error

以上三点间具有某种联系,我们这就来详细展开讲解它们。我们先关注这三者,然后再来关注TD error。

我们沿着(4)~(6)继续来讨论的可行形式,一种符合直觉的处理方法是:

  • 智能体来到了某个状态  下, 它的动作空间是  。智能体的策略  本质上是一种概率分布。它按  的概率决定要sample出哪个  。
  • 而在"采样->训练->更新策略参数"的这个循环过程中,智能体要做的事情就是,如果在某个状态  下,某个动作  带来的回报"大",那么智能体就应该提升  这个概率,也就是智能体据此不断调整  的分布。
  • 那么怎么衡量在某个  下,执行某个  带来的回报是否"大"? 我们可以去计算【执行  带来的回报 - 执行其它动作的回报】,这个差值可以告诉我们  比别的动作要好多少。

那么什么叫【执行  带来的回报】和【执行其它动作带来的回报】?

  • 假设你在玩马里奥游戏,你来到了画面的某一帧(某个  )
  • 你在这一帧下有3个选择:顶金币,踩乌龟,跳过乌龟。你现在想知道执行“顶金币”的动作比别的动作好多少。
  • 你先执行了"顶金币"的动作(即现在你采取了某个确定的  pair), 在束。在每一回合中, 你都记录下从(这一帧,顶金币)出发,一直到回合结束的累积奖励。你将这若干轮回合的奖励求平均,就计算出从 (这一帧, 顶金币) 出发后的累积奖励期望, 我们记其为  。
  • 现在你重新回到这一帧(你回到了一个确定的  上),对于"顶金币","踩乌龟","跳过乌龟"这三个动作,你按照当前的策略  从这三者中采样动作(注意,我们没有排除掉"顶金币"),并继续玩这个游戏直到回合结束,你记录下从  出发一直到回合结束的累积回报。重复上面这个过程若干次,然后你将这若干轮回合的奖励求平均, 就计算出从(这一帧)出发后的累积奖励期望, 我们记其为  。
  • 你会发现不管是Q还是V,下标都有一个,这是因为它们和你当前采取的策略是相关的
  • 从直觉上, 我们取  这个差值, 就可以衡量在某个状态  下, 执行某个动作 , 要比其它的动作好多少了。这个差值, 我们可以理解为"优势"(advantage),这个优势更合理地帮助我们衡量了单步的奖励, 所以我们可以用它替换掉上面的  。
  • 当优势越大时,说明一个动作比其它动作更好,所以这时候我们要提升这个动作的概率。

通过上面的例子,我们已经引出一些关于价值函数的基本概念了:

  •  :状态价值函数
  •  :动作价值函数
  •  :优势

所以接下来,我们就从理论的角度,详细展开介绍它们。

6.2 回报

在前面的例子中, 我们说过, 当我们从  某一帧,  顶金币  出发后, 我们玩游戏一直到回合结束,然后我们执行 , 作为这个回合的累积奖励。

但其实,我们计算这个累积奖励的目的是衡量从  某一帧,  顶金币)这一【单步】出发后带来的未来收益。而对于这一个【单步】来说,一般离它越近的timestep受到它的影响越大,离它越远的timestep受到它的影响越小。在这个直觉的启发下, 我们采用【累积折扣奖励】来定义单步(也就是某个t时刻)的回报:

在接下来的讲解中,提到某一个回合中【单步】的奖励,我们说的都是【累积折扣奖励】

6.3 状态价值函数(State-Value Function)

状态价值函数的原子定义如下:

我们先来解释相关的符号:

  • 首先, 状态价值函数一定是和策略相关的。相同的状态  下(例如"同一帧游戏画面"),不同的策略 产生的结果也不一样(例如不同的人玩这个游戏)。所以我们带上了下标  。
  • 其次,  不是随机变量, 而是一个确定值。这是因为此时我们衡量的就是从某个确定的状态  出发带来的累积奖励期望。
  • 但是,  却是一个随机变量, 这是因为因为我们的策略  和环境转移  都是随机的。所以尽管每次智能体都从  出发,但采样到的轨迹却不一样。所以这里我们谈的是  的期望。

上面是状态价值函数最原子的定义,我们把这个定义展开,以便更好理解  是如何计算的(这里我直接对我笔记截图了,因为latex公式显示不出来):

图片

上面这个展开细节帮助我们从理论上理解上面举的例子:从马里奥游戏的某一帧  出发,如何求这一帧的累积回报期望,也就是求这一帧下所有动作的累积回报期望。我们从第 4 行推导开始讲起:

  • 第4~第5行,即如何从  推到  ,可以参见蘑菇书EasyRL的2.2.2的第1节 https://datawhalechina.github.io/easy-rl/#/chapter2/chapter2
  • 第5~第6行讲述我们如何对期望E中的结果做展开。我们以  为例:
  • 仅从这个表达式上看,它表示从某个状态  出发,在执行策略  的情况下,  的期望。我们前面说过,由于策略和状态转移具有随机性,因此  也是个随机变量。所以这里我们讨论的是【期望】而不是某个  值。
  • 理解了这一点, 就不难理解第 6 行的关于策略和状态转移的两个求和展开项。你可以把这些求和项理解成从状态  出发, 做了无数次采样后的结果。
  • 同时,  就是我们在之前定义的奖励函数, 它由三个入参决定。在我们把  展开成两个求和项后,  都是确定的值而不是随机变量了,所以这里  也是一个确定的值, 从  出发某次采样过程中得到的确定值  。
  • 第6行后的推导过程都比较好理解,这里不再解释。

我们在学习 rl 的过程中, 会看到很多材料把上述公式写成  或者  之类的形式, 由于对缺少必要的下标, 这些简略的形式具有歧义性, 使人混淆。所以这边我们干脆多费一点力, 把所有的符号都展示出来, 更方便大家深入理解  的含义。这就是这里大费周章写出上述推导过程的意义。

6.4 动作价值函数(Action-Value Function)

同样,我们先来看动作价值函数的原子定义:

我们来解释相关符号:

  • 首先,动作价值函数也是和策略相关的。从之前的例子我们知道,动作价值函数衡量的是从某个确定的出发后,例如从(马里奥游戏某一帧,顶金币)出发,一直到回合结束为止的累积奖励期望。在策略不一样的情况下(例如玩游戏的人不一样),即使大家都从某个确定的,最后的累积奖励期望也是不一样的。所以动作价值函数一定是对某个而言的。
  • 其余要注意的地方和一致,这里不再赘述。

图片

6.5 动作价值函数和状态价值函数的互相转换

我们来简单回顾下上面的内容。

状态价值函数的原子定义为:

动作价值函数的原子定义为:

展开状态价值函数的原子定义,我们得到:

展开动作价值函数的原子定义,我们得到:

根据这两者的原子定义展开式,我们得到两者的关系为:

图片

关于V和Q,我们可能在脑海里一直有“V是Q的期望”这样一个模糊的印象,但是却很难做具象化的解读。希望这里通过上面马里奥游戏的例子 + 具体的推导过程,能帮助大家更深入了解V和Q的关系。

6.6 优势函数和TD error

在马里奥游戏的例子中, 我们曾经对优势做过简单的定义: 我们取  这个差值, 就可以衡量在某个状态  下, 执行某个动作 , 要比其它的动作好多少了, 这个差值就是优势。

我们展开来讲优势函数,在前面的推导中我们已知:

而对于,我们可以把它重新改写成:

之所以这样改写, 是因为  只依赖于这个确定的 , 而与  无关。

基于这两个式子,我们可以写成优势函数的表达式:

图片

大家发现了吗:

  • 假设这里的  等于那个客观世界存在的状态价值函数的真值, 那么TD_error就是优势函数的无偏估计。这意味着在期望的意义下,使用TD_error近似优势函数不会引起系统性的偏差。
  • 假设这里的  不等于那个客观世界存在的状态价值函数的真值, 那么TD_error对于优势函数则是有偏的。 这意味着由于  的不准确,我们无法用  去近似那个真实的优势函数,因为我们将引入系统性偏差。(读到这里,你可能已经开始联想到在actor-critic算法下,用于估计  的 critic网络在没有收玫之前都是偏离真值的,这就意味着此时我们用TD-error去近似优势是有偏的,所以这时我们就要请GAE出场了, 这是后话, 我们放在后文细说)

七、Actor-Critic

我们先来回顾之前定义的policy-based下的策略梯度:

图片

其中,衡量单步价值的可以有如下几种设计方案:

图片

基于之前的分析,我们现在选择第6种(TD error)作为  ,它衡量在某个时刻 t 选择某个动作 a 会比选择其它的动作要好多少。 需要注意的是, 本质上当  等于客观存在的真值  时, 6 是 5 的无偏估计。

在actor-critic方法下,我们用神经网络  来表示策略(actor),神经网络  来表示价值(critic),所以这里我们进一步把  写成  。注意,这可能不是一个好写法,因为 V 一定是针对某个  而言的,anyway我们需要把这点记在心中, 在后文的表示中可能会出现  和  交替使用的场景, 他们都表示一个东西, 只是笔者写烸了可能忘记从一而终了...

接下来我们来看actor loss和critic loss的具体表达式。

7.1 Actor优化目标

现在我们可以把actor优化目标写成如下形式:

图片

但是有时,一个回个中的timesteps可能非常多,我们无法等到回合结束再进行训练。既然我们已经使用了TD error来估计单步的优势,我们其实可以按照单步的方法进行更新(即你的batch_size是N,其中的每条数据都是一个单步数据),即actor优化目标可以写成:

在接下来的表示中,我们都将采用这种形式。对应的策略梯度前面写过很多遍了,这里就不写出来了。

7.2 Critic优化目标

同理,在单步更新下,我们可以把critic优化目标写成:

对应的critic梯度这里也略去。

7.3 Actor和Critic之间的关系

关于7.1节中,actor这个优化目标的改写我们已经很熟悉了,但对于7.2中的actor loss你可能还是满腹疑惑,例如

  • 看样子,actor loss是在让优势趋于0,但是如此一来,每个动作的好坏不就都差不多了?那你怎么能选出那个最好的动作呢?

为了解答这个问题,我们先回想第四节中提到的“价值评估->策略迭代”这样一个循环的过程:

  • 价值评估: 给定一个策略 , 如何准确评估当前策略的价值  ?
  • 策略迭代: 给定一个当前策略的价值评估 , 如何据此优化策略

图片

我们结合actor-critic的框架把这个循环的优化过程展开来讲:

  • 我们从"策略迭代步骤开始", 假设我们有一个策略 , 且同时有一个能准确评估它的价值的  。基于这个 , 我们计算某个  状态下动作  的优势 , 如果这个优势比较高, 那么我们就应该提升  这个概率。我们按照这个方式去改变策略的分布, 最终会得到一个新策略  。
  • 那么, 什么时候这个  就是我们要找的最优策略  ? 我们假设当策略走到  时, 有一个客观存在的最优的动作  。那么如果当前这个策略走到  时,产出  的概率已经是1或者是最大的,那么就证明策略已经没有提升的空间了,当前的策略已到最优(注意,这里我们始终假设  是能准确估计一个策略的价值的)。
  • 那么如果策略产出  的概率已经是1或者最大时, 优势会发生什么变化? 从6.5节中的推导里我们知道  ,由此不难得知,此时  会非常接近或者等于  ,也就是此时我们有  。
  • 翻译成人话来说,就是当优势趋于 0 的时候,不是说所有的动作都区分不出好坏了。而是此时策略已经趋于最优,他本来产出最优的  的概率就是最大的。而不是像它还没优化好之前那样,还以相当的概率产出别的  们,所以我们要在这些  们之间去比较优势。
  • 现在我们回答"价值评估"步骤上来:此时我们做完了策略迭代,使得  ,那么之前用于衡量  的 已经不适用了,我们需要找到一个  来正确衡量  。而当策略从  改进到  后,这个  等式右侧的分布也有所调整,所以我们应该让等式左侧去拟合等式的右侧, 这样才能得出一个可以正确评估  的
  • 我们把以上内容换成比较好理解,但可能不太精确的人话:当我们推动critic loss(优势)趋于0时:
  • 对于actor来说,是推动它找到某个状态下最佳的动作,逐步向****拟合
  • 对critic来说,是推动它准确衡量当前策略的价值,逐步向****拟合

八、PPO8.1 朴素Actor-Critic的问题

在理解critic loss为何如此设计的前提下,critic的梯度就比较好理解了,这里我们不做过多解释。我们把目光再次放回actor的梯度上来:

图片

再次注意, 这里我们写成  的形式其实是不完整的, 它只是用来刻画  是 critic 网络的参数, 我们还必须铭记  衡量的是某个策略  的价值, 当这个策略发生迭代而变动时,  也会变动。

观察这个梯度表达式,我们会发现如下问题:

问题1:每次执行这个梯度更新时,我们都需要对进行若干次回合采样。我们知道智能体和环境交互的时间成本(fwd)比较高,也就是整个训练过程会比较慢

问题2: 我们在前面说过, 实际训练的过程中, 用 critic网络拟合出来  并不一定是能准确衡量  的那个价值函数, 所以这里我们用TD error去估计优势其实是有偏的。 为了降低这种偏差, 我们需要对  进行改造,改造的方法之一就是GAE。

接下来我们就详细来看如何解决这两个问题。

8.2  重要性采样

在朴素的方法中,我们使用和环境交互若干次,得到一批回合数据,然后我们用这个回合数据计算出来的奖励值去更新。我们管这个过程叫on-policy(产出数据的策略和用这批数据做更新的策略是同一个)

而现在,为了降低采样成本,我们想做下面这件事

  • 假设某次更新完毕后, 我们得到策略
  • 我们用  和环境交互, 得到一批回合数据。
  • 我们将把这一批回合数据重复使用  次: 即我们先把这批数据喂给  ,更新得到  ;我们再把这批数据喂给 , 更新得到  ;以此类推,做 k 次更新后,我们得到  。我们管这个过程叫off-policy(产出数据的策略和用这批数据做更新的策略不是同一个)。
  • 在这k次更新后, 我们令  。重复上面的过程, 直到达到设定的停止条件为止。

我们从更理论的角度来看待这个off-policy的过程:

  • 假设有两个分布
  • 最开始我想从  中进行多次采样, 然后求函数  的期望。例如我想从  中进行采样, 然后求累积奖励的期望,这个期望我们表示成
  • 但是现在, 因为某些原因, 我们无法从  中直接采样, 只能从另一个分布  中进行采样了, 那么此时我们要怎么表示  ?
  • 为了解决这个问题,我们做如下变换:

图片

也就是说,当我们从不同于  的分布  上采样 x 时,从数学上我们确实有办法改写 , 简单来说就是加上一个权重 , 我们管上述的转换过程叫【重要性采样】。

虽然数学上是有办法改写了,但是实际操作中,我们可能遇到p(x)和q(x)分布差异较大的问题。这里我直接引用李宏毅老师的课堂ppt来说明这一点:

图片

  • 我们假设  的真值是负数。
  • 由于p(x)和q(x)差异较大。在某次采样中,我们从q(x)里进行采样,大概率会采集到图中绿色曲线的高处,此时f(x)是正的。也就是说,在单次采样中,我们大概率会得到一个正的f(x)。
  • 所以,只有经过尽可能多次的采样,让某次能命中q(x)这个绿色曲线的低处。这时p(x)/q(x)较大,也就赋予这个好不容易采样到的负的f(x)非常大的权重,这才足以抵消之前正f(x)的影响。
  • 综上所述,当p(x)和q(x)差异较大时,我们需要通过足够多的采样来抵消这种差异对期望的最终影响。我们先记住这一点,在后面我们再来说这一点对我们策略的影响。

知道了重要性采样的过程,现在我们又可以根据它重写我们的优化目标了。

重要性采样前,策略的梯度是:

重要性采样后,策略的梯度是:

我们根据重要性采样构造了这个新的策略梯度,那么对应的新的actor优化目标就可以从这个策略梯度中反推出来:

特别注意 , 它意味着我们这一波的训练数据是由old策略采集来的。

但是到这步为止, 我们还要在心里铭记一个问题, 如何解决  和  分布差异过大的情况。我们先来看对优势函数的改进方法,然后再回来讲这个问题的解决办法。

8.3 GAE:平衡优势函数的方差和偏差

再回顾下6.6节的内容:在假设  能正确评估策略  的价值的前提下,我们用TD_error作为优势函数的无偏估计:

图片

但是, 在训练过程中, 这个  往往无法完全正确评估出策略  的价值, 所以上述这种估计是有偏的, 也即如果我们使用TD error去近似优势函数, 就会引发系统性偏差。这样讲可能比较抽象, 我们来看具象化地解释下。

(1)方差与偏差

图片

  • 低方差,低偏差:​​E(射击点) = 靶心​​,且射击点密集分布在靶心周围。此时我们随机选一个射击点就能很好代表靶心
  • 高方差,低偏差:​​E(射击点) = 靶心​​,但射击点们离靶心的平均距离较远。此时随机一个射击点不能很好代表靶心,但我们却可以从足够多的射击点中估算靶心坐标
  • 高/低方差,高偏差:​​E(射击点)!=靶心​​,无论你做多少次射击,你都估计不准靶心的位置。

对于优势函数我们有 , 我们可以把  当作是蓝色的靶心, 而红色的点就是我们针对某个  做多次采样, 得到的一个个  。

  • 当  能准确估计策略  的价值时,  至少是属于左侧"低偏差"这种情况。 而对于方差它则是由这里的两个随机变量  决定的,之所以说它们是随机变量,是因为在采取某个状态对  的情况下, 会转移到哪个  是确定的, 带来的奖励  也是不确定的。
  • 当  不能准确估计策略  的价值时,  属于右侧"高偏差"这种情况。即红点的分布已经偏离,无论你采样再多次,你也无法估算真正的优势函数。

为了解决因为  估计不准而引发的"高偏差"问题, 直观上我们可以尽量少信任  的策略, 即对于 , 我们可以把  做递归地展开, 得到:

其中,  都是我们某次采样得到的即时奖励数据。如果  不准, 那么我就信任我的实际采样结果, 这样至少不会让我对优势函数的估计出现偏差。

但采取这种做法又会引发一个新问题: 我们知道  它们都是随机变量, 相比之前只用 , 现在的做法带来的随机性更大了(相当于在每一个timestep都引入了随机性,随机性逐步累加)。也就是如果之前的方差是 , 那么现在的方差则变成更大的  。最终, 你把  从上图的右侧纠正了上图的【高方差、低偏差】的位置。这意味着此时虽然偏差降低了,但你需要采样足够多的数据才能准确估计出优势函数,这样加重了实际训练中的采样负担。

那要怎么办呢?

(2)GAE

(排不动latex的版了,这边开始我就放我的笔记截图了😢😢)

图片

8.4 PPO前身:TRPO

图片

8.5 PPO做法1:PPO-Clip

图片

8.6 PPO做法2:PPO-Penalty

图片

8.7 PPO中的critic loss

在PPO的原始论文中,其实并没有对critic和actor拆分成两个网络以后的critic loss形式做详细介绍,所以这部分的解读我直接以deepspeed-chat的rlhf实现为例,将以下critic loss的实现。

我们知道,PPO的更新步骤是

# 对于每一个batch的数据
for i in steps: # 先收集经验值exps = generate_experience(prompts, actor, critic, reward, ref)# 一个batch的经验值将被用于计算ppo_epochs次loss,更新ppo_epochs次模型# 这也意味着,当你计算一次新loss时,你用的是更新后的模型for j in ppo_epochs:actor_loss = cal_actor_loss(exps, actor)critic_loss = cal_critic_loss(exps, critic)actor.backward(actor_loss)actor.step()critc.backward(critic_loss)critic.step()

图片

#7 Papers & Radios~1

本次重要论文包括威斯康星大学麦迪逊分校、微软、港科大华人研究者提出的基于 prompt 的新型交互模型 SEEM,以及 40 多位学者联合发布的基础模型工具学习综述和开源 BMTools 平台。

  1. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness
  2. A Cookbook of Self-Supervised Learning 
  3. Tool Learning with Foundation Models
  4. Scaling Transformer to 1M tokens and beyond with RMT 
  5. Segment Everything Everywhere All at Once 
  6. Deep RL at Scale: Sorting Waste in Office Buildings with a Fleet of Mobile Manipulators 
  7. Collaboration Helps Camera Overtake LiDAR in 3D Detection
  8. ArXiv Weekly Radiostation:NLP、CV、ML 更多精选论文(附音频)

论文 1:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness

  • 作者:Tri Dao、Daniel Y. Fu 等
  • 论文地址:https://arxiv.org/abs/2205.14135

摘要:过去两年,斯坦福大学 Hazy Research 实验室一直在从事一项重要的工作:增加序列长度。他们有一种观点:更长的序列将开启机器学习基础模型的新时代 —— 模型可以从更长的上下文、多种媒体源、复杂的演示等中学习。

目前,这项研究已经取得了新进展。Hazy Research 实验室的 Tri Dao 和 Dan Fu 主导了 FlashAttention 算法的研究和推广,他们证明了 32k 的序列长度是可能的,且在当前这个基础模型时代将得到广泛应用(OpenAI、Microsoft、NVIDIA 和其他公司的模型都在使用 FlashAttention 算法)。

推荐:想把半本《红楼梦》搬进 ChatGPT 输入框?先把这个问题解决掉。

论文 2:A Cookbook of Self-Supervised Learning

  • 作者:Randall Balestriero、 Mark Ibrahim 等
  • 论文地址:https://arxiv.org/pdf/2304.12210v1.pdf

摘要:近日,LeCun 介绍了他和 Meta 人工智能研究院研究员、研究经理田渊栋等人共同撰写的一份「Cookbook」(非常实用、可操作性强、就像一本菜谱一样的论文)。这本 Cookbook 总共 70 页,涵盖了自监督学习的定义、重要性、起源、家族、训练部署方法、扩展方法等方面知识,是一份不可多得的学习材料。「如果你想研究自监督学习,那最好看看这本书。」田渊栋补充说。

推荐:LeCun、田渊栋参与撰写,70 页「自监督学习」大全来了。

论文 3:Tool Learning with Foundation Models

  • 作者:Yujia Qin、Shengding Hu 等
  • 论文地址:https://arxiv.org/abs/2304.08354

摘要:近期,来自清华大学、中国人民大学、北京邮电大学、UIUC、NYU、CMU 等高校的研究人员联合知乎、面壁智能公司探索基础模型调用外部工具的课题,联合发表了一篇 74 页的基础模型工具学习综述论文,发布开源工具学习平台。该团队提出了基础模型工具学习的概念,系统性地整理和阐述了其技术框架,同时展示了未来可能面临的机遇和挑战。这项研究对于了解基础模型工具学习的最新进展及其未来发展趋势具有重要价值。

工具学习整体框架呈现了人类用户和四个核心成分:工具集、控制器、感知器、环境。

推荐:40 多位学者联合发布基础模型工具学习综述,开源 BMTools 平台。

论文 4:Scaling Transformer to 1M tokens and beyond with RMT

  • 作者:Aydar Bulatov、 Yuri Kuratov 等
  • 论文地址:https://arxiv.org/pdf/2304.11062.pdf

摘要:前几天,一篇来自开源对话 AI 技术栈 DeepPavlov 等机构的研究表明:通过采用一种名为 Recurrent Memory Transformer(RMT)的架构,他们可以将 BERT 模型的有效上下文长度增加到 200 万个 token(按照 OpenAI 的计算方式,大约相当于 3200 页文本),同时保持了较高的记忆检索准确性(注:Recurrent Memory Transformer 是 Aydar Bulatov 等人在 NeurIPS 2022 的一篇论文中提出的方法)。新方法允许存储和处理局部和全局信息,并通过使用 recurrence 使信息在输入序列的各 segment 之间流动。

推荐:真・量子速读:突破 GPT-4 一次只能理解 50 页文本限制,新研究扩展到百万 token。

论文 5:Segment Everything Everywhere All at Once

  • 作者:Xueyan Zou、 Jianwei Yang 等
  • 论文地址:https://arxiv.org/pdf/2304.06718.pdf

摘要:最近,一篇「一次性分割一切」的新论文再次引起关注。在该论文中,来自威斯康星大学麦迪逊分校、微软、香港科技大学的几位华人研究者提出了一种基于 prompt 的新型交互模型 SEEM。SEEM 能够根据用户给出的各种模态的输入(包括文本、图像、涂鸦等等),一次性分割图像或视频中的所有内容,并识别出物体类别。该项目已经开源,并提供了试玩地址供大家体验。下图中展示了轻松分割出视频中移动的物体。

推荐:一次性分割一切,比 SAM 更强,华人团队的通用分割模型 SEEM 来了

论文 6:Deep RL at Scale: Sorting Waste in Office Buildings with a Fleet of Mobile Manipulators

  • 作者:Alexander Herzog、 Kanishka Rao 等
  • 论文地址:https://rl-at-scale.github.io/assets/rl_at_scale.pdf

摘要:在谷歌这篇论文中,研究人员探讨了如何通过最新的大规模实验解决这个问题,他们在两年内部署了一支由 23 个支持 RL 的机器人组成的群组,用于在谷歌办公楼中进行垃圾分类和回收。使用的机器人系统将来自真实世界数据的可扩展深度强化学习与来自模拟训练的引导和辅助对象感知输入相结合,以提高泛化能力,同时保留端到端训练优势,通过对 240 个垃圾站进行 4800 次评估试验来验证。在现实世界中,机器人会遇到各种独特的情况,比如以下真实办公楼的例子:

推荐:耗时两年,谷歌用强化学习打造 23 个机器人帮助垃圾分类。

论文 7:Collaboration Helps Camera Overtake LiDAR in 3D Detection

  • 作者:Yue Hu、Yifan Lu 等
  • 论文地址:https://arxiv.org/abs/2303.13560

摘要:摄像头能否实现激光雷达的检测效果,以更低成本实现自动驾驶感知?在最新的 CVPR2023 论文中,来自上海交通大学、加州大学洛杉矶分校、以及上海人工智能实验室的研究者提出了纯视觉协作探测方法(CoCa3D),通过让多个基于纯视觉的智能车高效协作,在 3D 目标探测效果上,接近甚至超越基于激光雷达的智能车。下图为数据集 CoPerception-UAVs + 和 OPV2V + 仿真环境。

推荐:多车协作让纯视觉 3D 目标探测媲美激光雷达。 

#DIFFormer

本⽂介绍⼀项近期的研究⼯作,试图建⽴能量约束扩散微分⽅程与神经⽹络架构的联系,从而原创性的提出了物理启发下的 Transformer,称作 DIFFormer。作为⼀种通⽤的可以灵活⾼效的学习样本间隐含依赖关系的编码器架构,DIFFormer 在各类任务上都展现了强大潜⼒。这项工作已被 ICLR 2023 接收,并在⾸轮评审就收到了四位审稿⼈给出的 10/8/8/6 评分(最终均分排名位于前 0.5%)。

  • 论⽂地址:https://arxiv.org/pdf/2301.09474.pdf
  • 项⽬地址:https://github.com/qitianwu/DIFFormer

如何得到有效的样本表征是机器学习领域的⼀⼤核⼼基础问题,也是深度学习范式在各类下游任务能发挥作用的重要前提。传统的表征学习⽅法通常假设每个输⼊样本是独⽴的,即分别将每个样本输⼊进 encoder ⽹络得到其在隐空间中的表征,每个样本的前向计算过程互不干扰。然⽽这⼀假设通常与现实物理世界中数据的⽣成过程是违背的:由于显式的物理连接或隐含的交互关系,每个观测样本之间可能存在相互的依赖

这⼀观察也启发了我们去重新思考⽤于表征计算的 encoder ⽹络设计:是否能设计⼀种新型的 encoder ⽹络能够在前向计算中显式的利⽤样本间的依赖关系(尽管 这些依赖关系是未被观察到的)。在这个⼯作中,我们从两个物理学原理出发,将神经⽹络计算样本表征的前向过程看作给定初始状态的扩散过程,且随着时间的推移(层数加深)系统的整体能量不断下降(见下图)。

DIFFormer 模型主要思想的示意图:将模型计算样本表征的前向过程看作⼀个扩散过程,随着时间的推移,节点之间存在信号传递,且任意节点对之间信号传递的速率会随着时间适应性的变化,使得系统整体的能量最⼩化。通过扩散过程和能量约束,最终的样本表征能够吸收个体和全局的信息,更有助于下游任务。

通过试图建⽴扩散微分⽅程与神经⽹络架构的联系,我们阐释了能量约束扩散过程与各类信息传递网络(如 MLP/GNN/Transformers)的联系,并为新的信息传递设 计提供了⼀种理论参考。基于此,我们提出了⼀种新型的可扩展 Transformer 模型,称为 DIFFormer(diffusionbased Transformers)。它可以作为⼀种通⽤的 encoder,在前向计算中利⽤样本间隐含的依赖关系。⼤量实验表明在⼩ / ⼤图节点分类、图⽚ / ⽂本分类、时空预测等多个领域的实验任务上 DIFFormer 都展现了强⼤的应⽤潜⼒。在计算效率上,DIFFormer 只需要 3GB 显存就可以实现⼗万级样本间全联接的信息传递

动机与背景

我们⾸先回顾⼀个经典的热⼒学中的热传导过程:假设系统中有

个节点,每个节点有初始的温度,两两节点之间都存在信号流动,随着时间的推移节点的温度会不断更新。上述物理过程事实上可以类⽐的看作深度神经网络计算样本表征(embedding)的前向过程。

将神经⽹络的前向计算过程看作⼀个扩散过程:每个样本视为流形上的固定位置节点,样本的表征为节点的信号,表征的更新视作节点信号的改变,样本间的信息传递看作节点之间的信号流动 

这⾥我们可以把每个样本看作⼀个离散空间中的节点,样本表征看作节点的信号。当模型结构考虑样本交互时(如信息传递),它可以被看作节点之间的信号流动,随着模型层数加深(即时间的推移),样本表征会不断被更新。

扩散过程的描述

⼀个经典的扩散过程可以由⼀个热传导⽅程(带初始条件的偏微分⽅程)来描述

在离散空间中,梯度算⼦可以看作两两节点的信号差异,散度算子可以看作单个节点流出信号的总和,⽽扩散率(diffusivity)是⼀种对任意两两节点间信号流动速率的度量

由此我们可以写出描述 N 个节点每时每刻状态更新的扩散微分⽅程,它描述了每个状态下系统中每个节点信号的变化等于流向其他节点的信号总和:

由扩散方程导出的信息传递

下图概述了这三种信息传递模式: 

我们研究最后⼀种信息传递⽅式,每层更新的样本表征会利⽤上⼀层所有其他样本的表征,在理论上模型的表达能⼒是最强的。但由此产⽣的⼀个问题是:要如何才能确定合适的每层任意两两节点之间的 diffusivity,使得模型能够产⽣理想的样本表征?

刻画⼀致性的能量函数

能量约束的扩散过程

定理

  • DIFFormer-a:在计算相似度时引⼊⾮线性,从⽽提升模型学习复杂结构的表达能⼒:

两种模型 DIFFormer-s 和 DIFFormer-a 每层更新的运算过程(矩阵形式),红⾊标注的矩阵乘法操作是计算瓶颈。DIFFormer-s 的优势在于可以实现对样本数量 N 的线性复杂度,有利于模型扩展到⼤规模数据集

模型扩展
更进⼀步的,我们可以引⼊更多设计来提升模型的适⽤性和灵活度。上述的模型主要考虑了样本间的 all-pair attention。对于输⼊数据本身就含有样本间图结构的情况,我们可以加⼊现有图神经⽹络(GNN)中常⽤的传播矩阵(propagation matrix)来融合已知的图结构信息,从⽽定义每层的样本表征更新如下

DIFFormer 的全局输⼊包含样本输⼊特征 X 以及可能存在的图结构 A(可以省略),通过堆叠 DIFFormer layer 更新计算样本表征。在每层更新时,需要计算⼀个全局 attention(具体的可以使⽤ DIFFormer-s 和 DIFFormer-a 两种实现),如果考虑输⼊图结构则加⼊ GCN Conv

另⼀个值得探讨的问题,是如何处理⼤规模数据集(尤其是包含⼤量样本的数据集,此时考虑全局 all-pair attention ⾮常耗费资源)。在这种情况下我们默认使⽤线性复杂度的 DIFFormer-s 的架构,并且可以在每个训练 epoch 对数据集进⾏ random mini-batch 划分。由于线性复杂度,我们可以使⽤较⼤的 batch size 也能使得模型在单卡上进⾏训练(详⻅实验部分)。

对于包含⼤量样本的数据集,我们可以对样本进⾏随机 minibatch 划分,每次只输⼊⼀个 batch 的样本。当输⼊包含图结构时,我们可以只提取 batch 内部样本所组成的⼦图输⼊进⽹络。由于 DIFFormer-s 只需要对 batch size 的线性复杂度,在实际中就可以使⽤较⼤的 batch size,保证充⾜的全局信息

实验结果

为了验证 DIFFormer 的有效性和在不同场景下的适⽤性,我们考虑了多个实验场景,包括不同规模图上的节点分类、半监督图⽚ / ⽂本分类和时空预测任务。

图节点分类实验
此时输⼊数据是⼀张图,图中的每个节点是⼀个样本(包含特征和标签),⽬标是利⽤节点特征和图结构来预测节点的标签。我们⾸先考虑⼩规模图 的实验,此时可以将⼀整图输⼊ DIFFormer。相⽐于同类模型例如 GNN,DIFFormer 的优势在于可以不受限于输⼊图,学习未被观测到的连边关系,从⽽更好的捕捉⻓距离依赖和潜在关系。下图展示了与 SOTA ⽅法的对⽐结果。

进⼀步的我们考虑在⼤规模图上的实验。此时由于图的规模过⼤,⽆法将⼀整图直接输⼊模型(否则将造成 GPU 过载),我们使⽤ mini-batch 训练。具体的,在每个 epoch,随机的将所有节点分为相同⼤⼩的 mini-batch。每次只将⼀个 mini-batch 的节点输⼊进⽹络;⽽对于输⼊图,只使⽤包含在这个 mini-batch 内部的节点所组成的⼦图输⼊进⽹络;每次迭代过程中,DIFFormer 也只会在 mini-batch 内部的节点之间学习 all-pair attention。这样做就能⼤⼤减⼩空间消耗。⼜因为 DIFFormer-s 的计算复杂度关于 batch size 是线性的,这就允许我们使⽤很⼤的 batch size 进⾏训练。下图显示了在 ogbn-proteins 和 pokec 两个⼤图数据集上的测试性能,其中对于 proteins/pokec 我们分别使⽤了 10K/100K 的 batch size。此外,下图的表格也展示了 batch size 对模型性能的影响,可以看到,当使⽤较⼤ batch size 时,模型性能是⾮常稳定的。

图⽚ / ⽂本分类实验

第⼆个场景我们考虑⼀般的分类问题,输⼊是⼀些独⽴的样本(如图⽚、⽂本),样本间没有已观测到的依赖关系。此时尽管没有输⼊图结构, DIFFormer 仍然可以学习隐含在数据中的样本依赖关系。对于对⽐⽅法 GCN/GAT,由于依赖于输⼊图,我们这⾥使⽤ K 近邻⼈⼯构造⼀个样本间的图结构。

时空预测

进⼀步的,我们考虑时空预测任务,此时模型需要根据历史的观测图⽚段(包含上⼀时刻节点标签和图结构)来预测下⼀时刻的节点标签。这⾥我们横向对⽐ 了 DIFFormer-s/DIFFormer-a 在使⽤输⼊图和不使⽤输⼊图(w/o g)时的性能,发现在不少情况下不使⽤输⼊图模型反⽽能给出的较⾼预测精度。这也说明了在这类任务中,给定的观测图结构可能是不可靠的,⽽ DIFFormer 则可以通过从数据中学习依赖关系得到更有⽤的结构信息。

扩散过程下的统⼀视⻆

从能量约束的扩散过程出发,我们也可以将其他信息传递模型如 MLP/GCN/GAT 看作 DIFFormer 的特殊形式,从⽽给出统⼀的形式化定义。下图概括了⼏种⽅法对应的能量函数和扩散率。相⽐之下,从扩散过程来看, DIFFormer 会考虑任意两两节点之间的信号流动且流动的速率会随着时间适应性的变化,⽽ GNN 则是将信号流动 限制在⼀部分节点对之间。从能量约束来看,DIFFormer 会同时考虑局部(与⾃身状态)和全局(与其他节点)的⼀致性约束,⽽ MLP/GNN 则是分别侧重于⼆者之⼀, 且 GNN 通常只考虑输⼊图中相邻的节点对约束。

总结与讨论

在这个⼯作中,我们讨论了如何从扩散⽅程出发得到 MLP/GNN/Transformer 的模型更新公式,⽽后提出了⼀个能量约束下的扩散过程,并通过理论分析得到了最优 扩散率的闭式解。基于理论结果,我们提出了 DIFFormer。总的来说,DIFFormer 主要具有以下两点优势:

DIFFormer 作为⼀个通⽤的 encoder,可以被主要应⽤于以下⼏种场景:

#MoE-Jetpack

收敛速度最高8倍,准确率提升超30%!华科发布MoE Jetpack框架

华中科技大学的研究人员提出了MoE Jetpack框架,通Checkpoint Recycling方法和SpheroMoE结构,将密集激活模型的预训练权重微调为混合专家(MoE)模型,从而免去了MoE模型的预训练过程,大幅提升了MoE在下游任务中的精度和收敛速度。

混合专家模型(MoE, Mixture of Experts)是一种通过动态激活网络的部分结构来提升计算效率的架构,可以在保持相对稳定的计算成本的前提下大幅增加参数量,从而有效提升模型性能。

这一特性使得MoE能够兼顾模型的规模与效率,已广泛应用于各种大规模任务。然而,MoE模型通常需要在大型数据集上预训练以获得理想性能,导致其对时间和计算资源的需求极高,这也限制了其在深度学习社区中的普及性。

为解决这一问题,华中科技大学的研究人员提出了MoE Jetpack框架,利用密集模型的预训练权重(Dense checkpoints)来微调出视觉混合专家模型(MoE,Mixture of Experts)。

目前,这项工作已被NeurIPS 2024接收。

论文标题:MoE Jetpack: From Dense Checkpoints to Adaptive Mixture of Experts for Vision Tasks

论文地址:​​https://arxiv.org/abs/2406.04801​​

代码地址:​​https://github.com/Adlith/MoE-Jetpack​​

MoE Jetpack框架的核心创新包括:

1. Checkpoint recycling: 通过采样密集模型权重产生差异化的专家,组成MoE模型的初始化权重,从而加速模型收敛、提升性能,并避免大规模的MoE模型预训练。

2. SpheroMoE Layer: 通过调整MoE结构,利用交叉注意力机制进行专家分配,将query和key投影到超球空间以提升微调过程的稳定性,并通过一系列专家正则化方法有效缓解MoE模型微调过程中的过拟合现象。

实验结果表明,MoE Jetpack在多个数据集和网络结构上实现了显著的性能提升。在ImageNet-1K上,模型收敛速度提升2倍,准确率提高了2.8%;在小规模数据集上,收敛速度可达8倍提升,准确率提升超过30%。

图1 (a)MoE Jetpack将密集预训练权重转化为MoE模型的初始化权重,在性能提升的同时保持等效的FLOPs。(b) 未预训练的ViT、微调的ViT、未预训练的Soft MoE 与MoE Jetpack在多个视觉数据集上的性能比较。

在多个下游数据集上的实验表明,该框架能够高效利用预训练权重,实现更快的收敛速度和更优的性能表现。

研究方法

MoE Jetpack的核心由两个阶段组成:Checkpoint Recycling(用于MoE模型的初始化)和SpheroMoE层(用于微调MoE模型),如下图所示。

图2 Checkpoint Recycling和SpheroMoE结构

Checkpoint Recycling:作为MoE Jetpack的基础阶段,Checkpoint Recycling通过将预训练的密集模型权重转换为高质量的MoE初始化权重,使新模型在性能和收敛速度上都得以提升。

具体地,Checkpoint Recycling从密集权重的多层感知器(MLP)中采样出部分权重构建专家层,以确保专家的多样性和灵活性。

本文比较了四种主要的权重回收策略:

  1. 重要性采样(Importance-Based Weight Sampling):重要性采样是 MoE Jetpack 默认的权重采样方法,通过计算输出特征的均值,选择top-d' 个最重要的特征维度,同时根据隐藏单元的激活值大小进行独立采样。这种方法确保每个专家包含关键的特征和隐藏单元,有助于提升模型的初始化质量和训练效率。
  2. 图划分法(Co-Activation Graph Partitioning):图划分法通过构建共激活图,将常一起激活的隐藏单元分组,使用图划分算法(如 Metis),将密集权重的隐藏单元划分成多个子图,组合不同的子图形成不同专家层,确保专家专注于不同的功能区域,提升模型的特征表达能力。
  3. 均匀采样(Uniform Weight Selection):均匀采样在特征维度和隐藏单元上均匀选择权重,保证每个 MoE 专家层均衡分布初始化权重。此方法实现简单,但不考虑特征重要性,因此性能提升效果较为一般。
  4. 随机采样(Random Weight Sampling):随机采样在特征维度和隐藏单元中随机抽取,生成专家层的初始化权重。该方法实现简便,但由于没有关注特征的重要性,性能通常较低。

Checkpoint Recycling引入的计算开销几乎可以忽略,同时显著提升模型性能并与收敛速度。

SpheroMoE层

在MoE模型权重初始化后,SpheroMoE层进一步优化微调过程。SpheroMoE 层的引入解决了 MoE 模型在优化过程中面临的数值不稳定、专家过度专一等问题。它通过三种机制来提升模型在下游任务的性能和稳定性:

  1. 超球路由机制:利用cross attention结构,将输入动态分配给 MoE 模型的不同专家。这种机制首先对随机初始化的专家查询(Q, query)和输入键(K, key)进行归一化投影(L2 Norm)至超球空间,以确保数值稳定性,并通过余弦相似度来选择输入对应的专家。最终输出由各个专家的结果组合而成,保证 MoE 模型的输出特征和密集模型之间的分布一致性。

  1. 自适应双路径MoE:为提升计算效率,SpheroMoE路由将输入划分为高重要性和低重要性两类,并引导其进入不同计算路径:高重要性输入分配至包含更大参数量的核心专家;低重要性输入则进入包含较小专家的通用路径。这样的双路径结构通过划分细粒度的专家增加了专家的数量,优化了资源利用,提升了模型的性能与计算效率。
  2. 图3 自适应双路径MoE
  3. 专家正则化:为避免专家层过度专注于特定输入或出现过度特化,本文引入可学习的软温度参数,用以调整softmax的平滑程度以精确控制输入的分配和输出的组合。
    此外,使用专家随机失活机制能有效防止模型对特定专家的依赖。

这些设计使MoE Jetpack在下游任务微调中不仅具备了更快的收敛速度,还实现了显著的性能提升。​

实验结果

本文在 ViT 和 ConvNeXt 两种典型网络结构以及八个图像分类任务上进行了广泛实验。实验结果表明,MoE Jetpack 在性能上显著优于随机初始化的 Soft MoE 模型,并且利用密集权重的微调效果明显超过直接微调经过预训练的密集模型。

此外,论文还对MoE Jetpack的多种配置进行了深入研究,系统分析了不同专家数量、不同原始网络尺寸大小等因素对模型性能的影响。

表2 各种参数量的MoE Jetpack都展示出了显著的性能提升

下图展示了微调的全过程中MoE Jetpack对加速模型收敛速度和提升模型性能方面的效果,突显了其作为 MoE 模型预训练替代方法的潜力。

图4 MoE Jetpack带来了收敛速度提升

专家注意力图展示了不同的专家关注图像的不同区域,各司其职。专家贡献分布图表明,核心专家和普通专家在不同层次的贡献差异显著,展示了模型的自适应路由调度机制。

图5 专家注意力图和专家贡献分布图​

总结

MoE Jetpack是一个创新框架,旨在将预训练的密集模型权重高效转换为MoE模型。通过提出Checkpoint Recycling技术,MoE Jetpack能够有效继承密集模型的知识;引入的SpheroMoE 层,显著提升微调过程的稳定性和性能。

该框架不仅降低了MoE模型的训练成本和硬件要求,还减少了对环境的影响,使得研究者在普通计算资源下也能轻松使用混合专家模型,为MoE的广泛研究与应用提供了有力支持。

参考资料:

​​https://arxiv.org/abs/2406.04801​​

#TRIBE

近日,华南理工、A*STAR 和港中大(深圳)团队通过大量实验证明,这些真实场景下的测试数据流会对现有方法带来巨大挑战。该团队认为,最先进方法的失败首先是由于不加区分地根据不平衡测试数据调整归一化层造成的。测试时领域适应的鲁棒性得以保证,TRIBE在多真实场景下达到SOTA

测试时领域适应(Test-Time Adaptation)的目的是使源域模型适应推理阶段的测试数据,在适应未知的图像损坏领域取得了出色的效果。然而,当前许多方法都缺乏对真实世界场景中测试数据流的考虑,例如:

  • 测试数据流应当是时变分布(而非传统领域适应中的固定分布)
  • 测试数据流可能存在局部类别相关性(而非完全独立同分布采样)
  • 测试数据流在较长时间里仍表现全局类别不平衡

为此,研究团队提出了一种创新的平衡批归一化层 (Balanced BatchNorm Layer),以取代推理阶段的常规批归一化层。同时,他们发现仅靠自我训练(ST)在未知的测试数据流中进行学习,容易造成过度适应(伪标签类别不平衡、目标域并非固定领域)而导致在领域不断变化的情况下性能不佳。

因此,该团队建议通过锚定损失 (Anchored Loss) 对模型更新进行正则化处理,从而改进持续领域转移下的自我训练,有助于显著提升模型的鲁棒性。最终,模型 TRIBE 在四个数据集、多种真实世界测试数据流设定下稳定达到 state-of-the-art 的表现,并大幅度超越已有的先进方法。研究论文已被 AAAI 2024 接收。

论文链接:https://arxiv.org/abs/2309.14949

代码链接:https://github.com/Gorilla-Lab-SCUT/TRIBE

引言

深度神经网络的成功依赖于将训练好的模型推广到 i.i.d. 测试域的假设。然而,在实际应用中,分布外测试数据的鲁棒性,如不同的照明条件或恶劣天气造成的视觉损坏,是一个需要关注的问题。最近的研究显示,这种数据损失可能会严重影响预先训练好的模型的性能。重要的是,在部署前,测试数据的损坏(分布)通常是未知的,有时也不可预测。

因此,调整预训练模型以适应推理阶段的测试数据分布是一个值得价值的新课题,即测试时领域适 (TTA)。此前,TTA 主要通过分布对齐 (TTAC++, TTT++),自监督训练 (AdaContrast) 和自训练 (Conjugate PL) 来实现,这些方法在多种视觉损坏测试数据中都带来了显著的稳健提升。

现有的测试时领域适应(TTA)方法通常基于一些严格的测试数据假设,如稳定的类别分布、样本服从独立同分布采样以及固定的领域偏移。这些假设启发了许多研究者去探究真实世界中的测试数据流,如 CoTTA、NOTE、SAR 和 RoTTA 等。

最近,对真实世界的 TTA 研究,如 SAR(ICLR 2023)和 RoTTA(CVPR 2023)主要关注局部类别不平衡和连续的领域偏移对 TTA 带来的挑战。局部类别不平衡通常是由于测试数据并非独立同分布采样而产生的。直接不加区分的领域适应将导致有偏置的分布估计。

最近有研究提出了指数式更新批归一化统计量(RoTTA)或实例级判别更新批归一化统计量(NOTE)来解决这个挑战。其研究目标是超越局部类不平衡的挑战,考虑到测试数据的总体分布可能严重失衡,类的分布也可能随着时间的推移而变化。在下图 1 中可以看到更具挑战性的场景示意图。

由于在推理阶段之前,测试数据中的类别流行率未知,而且模型可能会通过盲目的测试时间调整偏向于多数类别,这使得现有的 TTA 方法变得无效。根据经验观察,对于依靠当前批数据来估计全局统计量来更新归一化层的方法来说,这个问题变得尤为突出(BN, PL, TENT, CoTTA 等)。

这主要是由于:

1.当前批数据会受到局部类别不平衡的影响带来有偏置的整体分布估计;

2.从全局类别不平衡的整个测试数据中估计出单一的全局分布,全局分布很容易偏向多数类,导致内部协变量偏移。

为了避免有偏差的批归一化(BN),该团队提出了一种平衡的批归一化层(Balanced Batch Normalization Layer),即对每个单独类别的分布进行建模,并从类别分布中提取全局分布。平衡的批归一化层允许在局部和全局类别不平衡的测试数据流下得到分布的类平衡估计。

随着时间的推移,领域转移在现实世界的测试数据中经常发生,例如照明 / 天气条件的逐渐变化。这给现有的 TTA 方法带来了另一个挑战,TTA 模型可能由于过度适应到领域 A 而当从领域 A 切换到领域 B 时出现矛盾。

为了缓解过度适应到某个短时领域,CoTTA 随机还原参数,EATA 用 fisher information 对参数进行正则化约束。尽管如此,这些方法仍然没有明确解决测试数据领域中层出不穷的挑战。

本文在两分支自训练架构的基础上引入了一个锚定网络(Anchor Network)组成三网络自训练模型(Tri-Net Self-Training)。锚定网络是一个冻结的源模型,但允许通过测试样本调整批归一化层中的统计量而非参数。并提出了一个锚定损失利用锚定网络的输出来正则化教师模型的输出以避免网络过度适应到局部分布中。

最终模型结合了三网络自训练模型和平衡的批归一化层(TRI-net self-training with BalancEd normalization, TRIBE)在较为宽泛的的可调节学习率的范围里表现出一致的优越性能。在四个数据集和多种真实世界数据流下显示了大幅性能提升,展示了独一档的稳定性和鲁棒性。

方法介绍

论文方法分为三部分:

  • 介绍真实世界下的 TTA 协议;
  • 平衡的批归一化;
  • 三网络自训练模型。

真实世界下的 TTA 协议

作者采用了数学概率模型对真实世界下具有局部类别不平衡和全局类别不平衡的测试数据流,以及随着时间变化的领域分布进行了建模。如下图 2 所示。

平衡的批归一化

为了纠正不平衡测试数据对 BN 统计量产生的估计偏置,作者提出了一个平衡批归一化层,该层为每个语义类分别维护了一对统计量,表示为:

通过进一步分析和观察,作者发现当 γ=1 时,整个更新策略就退化成了 RoTTA 中的 RobustBN 的更新策略,当 γ=0 时是纯粹的类别独立的更新策略,因此,当 γ 取值 0~1 时可以适应到各种情况下。

三网络自训练模型

作者在现有的学生 - 教师模型的基础上,添加了一个锚定网络分支,并引入了锚定损失来约束教师网络的预测分布。这种设计受到了 TTAC++ 的启发。TTAC++ 指出在测试数据流上仅靠自我训练会容易导致确认偏置的积累,这个问题在本文中的真实世界中的测试数据流上更加严重。TTAC++ 采用了从源域收集到的统计信息实现领域对齐正则化,但对于 Fully TTA 设定来说,这个源域信息不可收集。

同时,作者也收获了另一个启示,无监督领域对齐的成功是基于两个领域分布相对高重叠率的假设。因此,作者仅调整了 BN 统计量的冻结源域模型来对教师模型进行正则化,避免教师模型的预测分布偏离源模型的预测分布太远(这破坏了之前的两者分布高重合率的经验观测)。大量实验证明,本文中的发现与创新是正确的且鲁棒的。以下是锚定损失的表达式:

实验部分

论文作者在 4 个数据集上,以两种真实世界 TTA 协议为基准,对 TRIBE 进行了验证。两种真实世界 TTA 协议分别是全局类分布固定的 GLI-TTA-F 和全局类分布不固定的 GLI-TTA-V。

上表展示了 CIFAR10-C 数据集两种协议不同不平衡系数下的表现,可以得到以下结论:

1.只有 LAME, TTAC, NOTE, RoTTA 和论文提出的 TRIBE 超过了 TEST 的基准线,表明了真实测试流下更加鲁棒的 TTA 方法的必要性

2.全局类别不平衡对现有的 TTA 方法带来了巨大挑战,如先前的 SOTA 方法 RoTTA 在 I.F.=1 时表现为错误率 25.20% 但在 I.F.=200 时错误率升到了 32.45%,相比之下,TRIBE 能稳定地展示相对较好的性能。

3. TRIBE 的一致性具有绝对优势,超越了先前的所有方法,并在全局类别平衡的设定下 (I.F.=1) 超越先前 SOTA (TTAC) 约 7%,在更加困难的全局类别不平衡 (I.F.=200) 的设定下获得了约 13% 的性能提升。

4.从 I.F.=10 到 I.F.=200,其他 TTA 方法随着不平衡度增加,呈现性能下跌的趋势。而 TRIBE 能维持较为稳定的性能表现。这归因于引入了平衡批归一化层,更好地考虑了严重的类别不平衡和锚定损失,这避免了跨不同领域的过度适应。

更多数据集的结果可查阅论文原文。

此外,表 4 展示了详细的模块化消融,有以下几个观测性结论:

1.仅将 BN 替换成平衡批归一化层 (Balanced BN),不更新任何模型参数,只通过 forward 更新 BN 统计量,就能带来 10.24% (44.62 -> 34.28) 的性能提升,并超越了 Robust BN 的错误率 41.97%。

2.Anchored Loss 结合 Self-Training,无论是在之前 BN 结构下还是最新的 Balanced BN 结构下,都得到了性能的提升,并超越了 EMA Model 的正则化效果。

本文的其余部分和长达 9 页的附录最终呈现了 17 个详细表格结果,从多个维度展示了 TRIBE 的稳定性、鲁棒性和优越性。附录中也含有对平衡批归一化层的更加详细的理论推导和解释。

总结和展望

为应对真实世界中 non-i.i.d. 测试数据流、全局类不平衡和持续的领域转移等诸多挑战,研究团队深入探索了如何改进测试时领域适应算法的鲁棒性。为了适应不平衡的测试数据,作者提出了一个平衡批归一化层(Balanced Batchnorm Layer),以实现对统计量的无偏估计,进而提出了一种包含学生网络、教师网络和锚定网络的三层网络结构,以规范基于自我训练的 TTA。

但本文仍然存在不足和改进的空间,由于大量的实验和出发点都基于分类任务和 BN 模块,因此对于其他任务和基于 Transformer 模型的适配程度仍然未知。这些问题值得后续工作进一步研究和探索。

#vis_dec_neurips

来自鲁汶大学、新加坡国立大学和中科院自动化所的研究者提出了一种视觉 「读脑术」,能够从人类的大脑活动中以高分辨率出解析出人眼观看到的图像。

人类的感知不仅由客观刺激塑造,而且深受过往经验的影响,这些共同促成了大脑中的复杂活动。在认知神经科学领域,解码大脑活动中的视觉信息成为了一项关键任务。功能性磁共振成像(fMRI)作为一种高效的非侵入性技术,在恢复和分析视觉信息,如图像类别方面发挥着重要作用。

然而,由于 fMRI 信号的噪声特性和大脑视觉表征的复杂性,这一任务面临着不小的挑战。针对这一问题,本文提出了一个双阶段 fMRI 表征学习框架,旨在识别并去除大脑活动中的噪声,并专注于解析对视觉重建至关重要的神经激活模式,成功从大脑活动中重建出高分辨率且语义上准确的图像。

论文链接:https://arxiv.org/abs/2305.17214

项目链接:https://github.com/soinx0629/vis_dec_neurips/

论文中提出的方法基于双重对比学习、跨模态信息交叉及扩散模型,在相关 fMRI 数据集上取得了相对于以往最好模型接近 40% 的评测指标提升,在生成图像的质量、可读性及语义相关性相对于已有方法均有肉眼可感知的提升。该工作有助于理解人脑的视觉感知机制,有益于推动视觉的脑机接口技术的研究。相关代码均已开源。

功能性磁共振成像(fMRI)虽广泛用于解析神经反应,但从其数据中准确重建视觉图像仍具挑战,主要因为 fMRI 数据包含多种来源的噪声,这些噪声可能掩盖神经激活模式,增加解码难度。此外,视觉刺激引发的神经反应过程复杂多阶段,使得 fMRI 信号呈现非线性的复杂叠加,难以逆转并解码。

传统的神经解码方式,例如岭回归,尽管被用于将 fMRI 信号与相应刺激关联,却常常无法有效捕捉刺激和神经反应之间的非线性关系。近期,深度学习技术,如生成对抗网络(GAN)和潜在扩散模型(LDMs),已被采用以更准确地建模这种复杂关系。然而,将视觉相关的大脑活动从噪声中分离出来,并准确进行解码,依然是该领域的主要挑战之一。

为了应对这些挑战,该工作提出了一个双阶段 fMRI 表征学习框架,该方法能够有效识别并去除大脑活动中的噪声,并专注于解析对视觉重建至关重要的神经激活模式。该方法在生成高分辨率及语义准确的图像方面,其 50 分类的 Top-1 准确率超过现有最先进技术 39.34%。

方法概述

fMRI 表征学习 (FRL)

第一阶段:预训练双对比掩模自动编码器 (DC-MAE) 

第二阶段:使用跨模态指导进行调整

考虑到 fMRI 记录的信噪比较低且高度卷积的特性,专注于与视觉处理最相关且对重建最有信息价值的大脑激活模式对 fMRI 特征学习器来说至关重要。 

使用潜在扩散模型 (LDM) 生成图像

实验

重建结果 

通过与 DC-LDM、IC-GAN 和 SS-AE 等先前研究的对比,并在 GOD 和 BOLD5000 数据集上的评估中显示,该研究提出的模型在准确率上显著超过这些模型,其中相对于 DC-LDM 和 IC-GAN 分别提高了 39.34% 和 66.7%

在 GOD 数据集的其他四名受试者上的评估显示,即使在允许 DC-LDM 在测试集上进行调整的情况下,该研究提出的模型在 50 种方式的 Top-1 分类准确率上也显著优于 DC-LDM,证明了提出的模型在不同受试者大脑活动重建方面的可靠性和优越性。

实验结果表明,利用所提出的 fMRI 表示学习框架和预先训练的 LDM,可以更好的重建大脑的视觉活动,大大优于目前的基线。该工作有助于进一步挖掘神经解码模型的潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣面试经典 150(下)

文章目录 二叉树的层次遍历82. 二叉树的右视图83. 二叉树的层平均值84. 二叉树的层序遍历85. 二叉树的锯齿形层序遍历 二叉搜索树86. 二叉搜索树的最小绝对差87. 二叉搜索树中第K 小的元素88. 验证二叉搜索树 图89. 岛屿数量90. 被围绕的区域91. 克隆图92. 除法求值93. 课程表9…

Web3的核心技术:区块链如何确保信息安全与共享

在互联网不断迭代的进程中,Web3被视为下一代互联网的核心发展方向,其目标是构建更加开放、安全、去中心化的数字生态。在这一过程中,区块链作为核心技术,为信息安全与共享提供了全新解决方案。本文将深入探讨区块链如何在Web3中实…

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释: 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是: 利用原地修改的方式(in-place)存储下一状态的变化: 通过引入额外的状态值&#xff0…

JavaScript 中 arguments、类数组与数组的深入解析

博客主页: [小ᶻZ࿆] 本文专栏: 前端 文章目录 💯前言💯什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 💯深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列,抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族(产品系列),一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系,可以划分为同一产…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息;requests模块,发生http请求;os模块,文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时,如果不设置User - Agent,默认的…

操作系统基础——针对实习面试

目录 操作系统基础什么是操作系统?简述其主要功能请举例几种不同类型的操作系统,并简要说明它们的特点 操作系统基础 什么是操作系统?简述其主要功能 一、操作系统的定义 操作系统(Operating System,简称OS&#xff…

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理,希望对读者有所帮助。 前置知识: 深度学习基础练习:从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范(命名,格式等) 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法,而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

探索PDFMiner:Python中的PDF解析利器

文章目录 **探索PDFMiner:Python中的PDF解析利器**1. 背景介绍:为何选择PDFMiner?2. PDFMiner是什么?3. 如何安装PDFMiner?4. 简单库函数使用方法4.1 提取文本4.2 获取页面布局信息4.3 提取表格数据4.4 提取图像 5. 应…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js (放在项目根目录下) module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式?二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图: 模板方法设计模式类图 一.什么是模板方法模…

MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择

文章目录 MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择一、MySQL 主备基础原理(一)主备关系与数据同步(二)主备切换流程 二、主备延迟分析(一)主备延迟的定义与计算&#xff08…

VuePress v2 快速搭建属于自己的个人博客网站

目录 为什么用VuePress? 一、前期准备 Node.js 使用主题快速开发 二、VuePress安装 三、个性化定制 修改配置信息 删除不需要的信息 博客上传 四、部署 使用github快速部署 初始化仓库 本地配置 配置github的ssh密钥 部署 为什么用VuePress&#xff…

PostgreSQL常用时间函数与时间计算提取示例说明

文章目录 常用函数与常量to_timestamp(字符串转时间戳、数字转时间戳)date与to_date(字符串转日期、时间戳转日期)interval(时间计算)基本操作与格式混合运算 to_char(各种时间转字符串)extract(提取时间字段,年月日时分秒,周、季度,第几周、…

SlickGrid点击/双击事件

分析 SlickGrid提供了点击事件方法grid.onClick和grid.onDblClick用于捕获用户对表格列的点击,捕获到点击事件之后,修改表格数据,然后使用grid.updateRow方法将修改后的数据更新到表格中。 展示 代码 创建grid(HTML)…

【Unity ShaderGraph实现流体效果之Node入门(二)】

Unity ShaderGraph实现流体效果之Node入门(二) 前言Shader Graph NodeStep NodeMultiply NodeRotate About AxisAddfresnel effectIs Front Face 前言 在(一)中讨论了一部分在制作流体效果时使用的Node,本章继续将剩余…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波(Ensemble Kalman Filter) 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)是…

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前,除了设置网络、数据卷之外,还需要设置各种各样的环境变量。 有时候,由于容器版本的问题,一些文档没有及时更新,可能同时存在多个新旧版本的环…