[论文精读]序列建模使大视觉模型的规模化学习成为可能

本博客是一篇最新论文的精读,论文为UC伯克利大学及约翰·霍普金斯大学相关研究者新近(2023.12.1)在arxiv上上传的《Sequential Modeling Enables Scalable Learning for Large Vision Models》 。知名科技新媒体“新智元”给与本文极高评价,并以《计算机视觉GPT时刻!UC伯克利三巨头祭出首个纯CV大模型,推理惊现AGI火花》为题进行了专题报道。

导读:

  • 本文提出了一种新的序列建模方法,可以在不使用任何语言数据的情况下,通过大量视觉数据训练出大视觉模型(LVM)。方法的关键是提出“视觉句子”的概念,它可以表示原始图像、视频及各种带标注的数据,并转换成统一的序列格式。在420亿个token(相当于16亿幅图像)的数据上训练后,LVM展现出随着模型和数据规模增长而scaling的良好特性。同时,许多不同的下游视觉任务可以通过在测试时设计合适的视觉提示来“解决”。
  • 实验结果表明,LVM从无标注图像、视频及含标注数据的多样性中受益明显。此外,LVM还展现出进行一般视觉推理的潜力,如处理分布之外的数据并执行新任务,但还有待进一步探索。当前的一些局限包括:视觉提示定义任务时常常欠约束,请求的任务可能超出模型能力,图像tokenize存在问题等。尽管LVM是迄今最大的视觉模型之一, 但与语言模型相比仍较小,真正的泛化仍有待研究。
  • 总体而言,基于“视觉句子”理念的序列建模为构建单模型执行多任务的大规模视觉系统提供了有前景的途径。

摘要

我们提出了一种新的序列建模方法,这种方法无需使用任何语言数据就可以学习大视觉模型(Large Vision Model,LVM)。为此,我们定义了一种通用格式:“视觉句子(visual sentences)”,通过这种格式,我们可以将原始图像和视频以及语义分割和深度重建等有标注数据源表示成序列,而无需任何像素之外的元知识。一旦这种各种视觉数据(包括4,200亿个tokens)表示为序列,模型就可以通过下一token的预测来最小化交叉熵损失(cross-entropy loss)进行训练。通过在各种规模的模型体系结构和数据多样性上进行训练,我们提供了模型可以有效扩展的实验证据。通过在测试时设计合适的视觉提示(visual prompts),我们可以解决许多不同的视觉任务。

引言

G P T GPT GPT [11]和 L L a M A LLaMA LLaMA [80]这样的大语言模型(LLM)风靡全球。那么构建一个大视觉模型(LVM)需要什么?从动物世界中,我们知道视觉能力与语言无关。特别是,许多实验表明,非人灵长类动物的视觉世界与人类惊人地相似。因此,尽管像 L L a V A LLaVA LLaVA [54]这样的视觉语言模型(vision-language models)空间很有趣,很值得探索,但在本文中,我们试图回答一个不同的问题——仅从像素出发,我们能走多远?

我们在LVM中试图模仿的当代LLM的关键特征是:1)在大数据环境下的规模化学习,2)通过提示(上下文学习)灵活地指定任务。我们如何实现这一点?和往常一样,有三个主要组成部分需要确定:

数据:我们想利用视觉数据的显著多样性。首先是原始的无标注图像和视频。此外,我们想利用过去几十年中产生的各种带标签的视觉数据源的多样性——语义分割、深度重建、关键点、3D对象的多视图等。我们定义了一种通用格式“视觉句子”,可以在不需要任何像素之外的元知识的情况下表示这些不同的注释。我们的训练数据集总共包含16亿张图像或视频帧。

架构:我们使用一个大的transformer架构(30亿个参数)在视觉数据上训练,这些数据表示为token序列: 使用学习得到的tokenizer将每个图像映射到256个矢量量化token的字符串。

损失函数:我们汲取自然语言社区的灵感,其中masked token modeling已经为sequential autoregressive prediction让路。一旦图像/视频/标注图像都可以表示为序列,我们就可以训练模型以最小化预测下一个token的交叉熵损失。

通过这个非常简单的设计,我们展示了一些值得注意的性质:

  • 随着模型大小和数据大小的增加,可以观察到适当的scaling行为。

  • 现在可以通过在测试时设计合适的提示来“解决”许多不同的视觉任务。尽管与专用特定训练模型的结果相比,结果的表现还不高,但是一个单一的视觉模型可以解决这么多任务,这是非常令人鼓舞的。

  • 我们看到无监督数据对各种标准视觉任务的性能有明确的好处。

  • 我们看到了进行一般视觉推理的能力的迹象——处理分布之外的数据并执行新任务。但尚需要进一步的研究。

相关工作

预训练视觉模型。使用预训练模型(例如在ImageNet上预训练的AlexNet [46])的价值可以追溯到2015年的R-CNN [35],从那时起它就成为计算机视觉的标准实践。自监督预训练则是一种可以大大增加预训练中可用数据量的方法[17,26,38,62,63,99]。不幸的是,这并没有取得很大成功,可能是因为当时的基于CNN的体系结构没有足够的容量来吸收数据。随着transformer [84]的引入,其容量远高于CNN,研究人员重新审视了自监督预训练,结果表明基于transformer的 masked im- age reconstruction 方法(如BEiT [7]、MAE [39]、SimMIM [91])的表现远远优于其基于CNN的对应方法[63]。然而,尽管最近取得了成功,当前仅视觉预训练的模型在像LAION [72]这样的大型数据集上scaling up仍有困难。

多任务学习和上下文学习。 从经典的每个任务一个模型的设置出发,计算机视觉正在慢慢向单个模型执行多个不同任务的方向发展。存在各种多任务学习方法[25,41,44,73,97],但它们通常限于固定的、预定义的任务数目。更近期的方法受大语言模型中上下文学习的启发,摒弃了任何任务的概念,而是让模型直接从输入提示中推断任务。例如,视觉提示[8,87]在测试时采用任务输入/输出示例对和query图像,将它们连接成一个2×2图像,并使用图像补全生成所需的输出。 但由于图像补全是使用MAE [39]的变体执行的,因此这些方法继承了MAE在scaling上的同样问题。

自回归视觉模型。 使用自回归模型合成视觉数据的想法至少可以追溯70年。 受香农使用 N N N-grams合成语言的启发[74,75], 从Attneave 1954年的开创性论文[5]开始,一系列工作将这一想法应用于序列的合成像素[29,32,40,65]、图像块[28]、视频帧[69]和运动捕捉数据[4,45,49]。 当深度模型流行起来时,更新的工作用RNN或CNN替换了 N N N-grams 来合成像素[81,82]。 最近,基于transformer的自回归视觉生成方法也被提出[16,30,94,96],并且与语言相结合,已经展示了令人印象深刻的图像合成结果,例如Parti [95]。

数据

“数据!数据!数据! 没有泥土,我无法制造砖石!”
— 夏洛克·福尔摩斯

任何大规模预训练模型的关键要求是它必须在大量数据上进行训练。 对于语言模型,获得数量极大且极为多样化的数据集相对比较容易。例如,流行的Common Crawl[1] 包含来自整个网络的250亿个网页,极为多样化,并包括诸如语言翻译、问答等“自然演示”。 在计算机视觉方面,我们距离拥有可比规模和多样性的数据源还相距甚远。

我们工作的一个核心贡献是向汇编这样一个数据集迈出了第一步,我们称之为统一视觉数据集$v1 (Unified Vision Dataset v1,UVDv1)。为构建该数据集,我们利用了许多不同来源的视觉数据:(1)无标注图像,(2)含视觉标注的图像,(3)无标注视频,(4)含视觉标注的视频,以及(5)3D合成物体。无标注图像占我们的数据的80%以上,捕捉了我们的视觉世界中的很大部分,提供所需的多样性,代价是质量较低。带标注的图像分布更加约束,但质量通常更高。视频数据的约束性甚至更强(典型的,以人类为中心的活动为主), 但它是宝贵的时序数据来源。 3D合成物体渲染的多样性最低,但可以为3D结构的行为提供有价值的提示。重要的是,UVDv1 是一个纯粹的视觉数据集,不包含非视觉元数据(例如文本)。 UVDv1 总共包含 16.4 亿张图像

另一个与大模语言模型的重要区别是,语言数据具有自然的、统一的一维结构 —— 文本流。不幸的是,这在视觉数据的情况并非如此,不同来源的数据具有不同的结构。在这项工作中,我们提出视觉句子(visual sentences)作为统一的视觉数据单元,这使我们能够从各种来源进行规模化模型训练。简单来说,视觉句子是一个序列,包含一个或多个图像,后跟句子结束(end-of-sentence,EOS) token。

在这里插入图片描述

图1显示了如何将各种数据源划分为视觉句子。具体而言:

单个图像。单个图像本身代表了最简单的视觉句子形式 —— {image, EOS}。我们使用来自LAION 5B [71]数据集中过滤后的1.49亿张图像子集[88]。这是我们数据中最大的一部分,占88.5%。

图像序列。图像序列是一种自然的视觉语句形式。我们通过从各种现有数据集中获取视频数据来创建这样的序列[12,13,22,36,37,47,51,52,56,58-60,64,68,76-78,92,93]。通过三种不同的步幅(10、20和30)随机对视频进行采样,形成16帧的视觉语句。

此外,我们利用Objaverse数据集[23]中的合成3D对象为各种物体生成以物体为中心的多视图序列。 对于每个物体,我们在物体中心与相机之间采样一个从1.5到2.2的半径长度,并采样一个从-45度到45度的常量仰角,然后通过改变方位角以15度的步长遍历物体的不同视图并渲染24个视图。我们总共渲染了42000个这样的训练序列和8000个测试序列。最后,我们也可以将属于相同语义类别的图像表示为(部分)序列。我们使用ImageNet中的类别,将属于同一类别的图像组(2、4、8或16个)连接成16幅图像长的视觉语句。

含标注的图像。 为了以统一的方式处理不同类型的图像标注,我们选择将所有标注表示为图像。某些数据类型(例如语义分割图[100]、边缘图[79]、深度[66]和法线图像[6])已经以这种方式表示。对于其他类型,我们为每种特定的标注类型应用定制的方法:

1)目标检测:我们通过在每个对象周围绘制颜色编码的边界框来创建标注,遵循[15]中的方法;

2)人体姿态:人体骨架在像素空间中渲染,遵循OpenPose格式,利用MMPose[20];

3)深度估计、表面法线和边缘检测:给定ImageNet和COCO图像,我们根据[55]中的协议生成标签;

4)风格迁移[9]、去雨[98]、去噪[85]、低光照增强[89]和立体数据集[34]: 这些都表示为图像对(例如输入/输出)。

5)着色:我们将ImageNet图像转换为灰度图像,生成图像对。

6)补全:该过程涉及在图像中随机添加黑色框以模拟损坏,生成图像对。

对于上述所有标注类型, 我们可以通过将8个属于相同标注类型的图像对连接成一个16幅图像的视觉语句来创建视觉语句。对于包含相同图像的 k k k种不同注释的数据集,我们使用不同的方法:对于每组 1 + k 1 + k 1+k幅图像(输入及 k k k个标注),我们随机选择 m m m个元素,其中 m < = n + 1 < = 16 m<=n+1<=16 m<=n+1<=16。然后将这些 m m m元组连接成形成视觉序列。

含标注的图像序列。在将含标注的视频数据(VIPSeg [57]、Hand14K [31]、AVA [60]、JHMDB [42])转换为视觉语句时,我们应用两种互补的策略。第一种与我们处理含成对标注的图像数据的方式类似:每个视觉语句都是通过连接帧及其标注构建的 —— {frame1,annot1,frame2,annot2,…}。第二种方法涉及组合多个帧,后跟对应的标注 —— {frame1,frame2,annot1,annot2,…}。

我们在附录中详细总结了UVDv1的所有数据源、标注类型和数据统计信息。

方法

在这一节中,我们描述了我们的自回归大视觉模型的设计。与自然表现出离散序列结构的文本数据不同,它不是直接对视觉句子中的图像像素进行建模。在这项工作中,我们采用两阶段方法:
1)训练一个大规模的视觉tokenizer(作用于单个图像上)将每个图像转换成一系列视觉tokens;
2)在视觉句子上训练一个自回归transformer模型,每个句子表示为一系列token。我们在图2中总结了我们的方法。
在这里插入图片描述

图像Token化

尽管连续图像之间的视觉语句展现出序列结构,但我们在图像内部没有这样的自然序列结构。因此,为了将transformer模型应用于图像,先前的工作通常执行以下一种操作:要么按扫描线顺序将图像划分成patches, 并将其视为一个序列[27],要么使用预训练的图像tokenizer(如VQVAE [83]或VQ-GAN [30])将图像特征聚类成一个离散tokens的网格, 这些tokens再次按扫描线顺序转换为序列。我们采用后一种方法,因为模型的离散分类输出自然形成一个概率分布,人们可以轻松对其进行采样,从而在视觉语句内灵活的条件生成新的图像。

具体地,我们采用Esser等人[30]提出的VQGAN模型进行语义token生成。该框架由编码和解码机制组成,具有量化层,该量化层将输入图像分配给从已建立的codebook中获得的一系列离散tokens。我们的编码器和解码器完全由卷积层构建。编码器配备了几个下采样模块来缩减输入的空间维度,而解码器配备了等量的上采样模块系列来将图像恢复到其初始大小。对于给定图像,我们的VQGAN tokenizer产生256个离散tokens。

我们需要注意,我们的tokenizer独立地对单个图像进行操作,而不是一次对整个视觉语句进行操作。这种独立性使我们能够将tokenizer的训练与下游Transformer模型解耦,以便tokenizer可以在不考虑视觉语句分布的单图像数据集上进行训练。

实现细节:我们采用Chang等人[14]的开源VQ-GAN体系结构。我们遵循Chang等[14]中的同样设置,使用下采样因子 f = 16 f=16 f=16, codebook大小为8192。这意味着对于大小为 256 × 256 256×256 256×256的图像,我们的VQGAN tokenizer会产生 16 × 16 = 256 16×16=256 16×16=256个标记,其中每个token可以取8192个不同的值。我们发现,使用ImageNet预训练tokenizer的结果不能很好地推广到ImageNet图像之外。因此,我们在LAION 5B数据集[71]的1.5B子集上训练了自己的tokenizer。

视觉语句的序列建模

在用VQGAN将图像转换成离散token后,我们通过将多个图像的离散token连接成1D序列来将我们的视觉语句视为统一序列(unified sequence)。重要的是,所有视觉语句都是平等对待的——我们不使用任何特殊tokens来标识特定任务或格式。我们训练一个因果Transformer模型,其目标是预测下一个token,使用与标准语言模型[11]方法[11]类似的交叉熵损失。以相同的方式在所有视觉语句上训练模型可以使模型从上下文(而非从特定任务或格式的tokens中)中推断图像之间的关系。这为模型提供了推广到其他未见视觉语句结构的机会。

实现细节:在将视觉语句中每个图像tokenize成256个token后,我们将它们连接成1D token 序列。在视觉token序列之上,我们的Transformer模型与自回归语言模型几乎相同,因此我们采用LLaMA [80]的Transformer体系结构,这是一种流行的开源语言模型,具有广泛可用的实现。我们使用4096个token的上下文长度,在我们使用VQGAN tokenizer条件下可以容纳16幅图像。与语言模型类似,我们在每个视觉语句的开头添加 [BOS] token,在结尾添加 [EOS] token,并在训练期间使用序列连接[19]来提高效率。我们使用整个UVDv1数据集(420亿个token)对模型进行一轮训练(在语言模型中,进行simple epoch training是标准操作,以避免潜在的过拟合)。我们按照相同的训练配置训练了4个不同参数数量的模型:3亿、6亿、10亿和30亿。我们在附录6中提供了详细的训练超参数。

视觉提示(Visual Prompting)推理

由于我们模型中的自回归Transformer输出了基于前面token的下一个token的概率分布,我们可以轻松地从这个分布中采样以生成新的视觉token,从而完成一个视觉语句。要将模型用于下游任务,可以在测试时构造一个部分视觉语句来定义任务,并应用模型生成输出。这类似于语言模型中的上下文学习[10]或计算机视觉中的视觉提示[8,40]。

实验结果和分析

在这一节中,我们评估了所训练的模型的规模化特性以及其理解和回答各种提示任务的能力。

可扩展性

我们研究了随着模型大小和训练过程中看到的tokens数增加,我们从训练损失和下游任务性能的角度研究模型的规模化特性。

训练损失。我们首先检查了不同参数大小的LVM的训练损失,结果在图3中呈现。由于我们的所有模型都仅针对数据集进行了一轮训练,因此模型在训练期间的任何时间点都只看到给定的数据样本一次,因此训练中的任何时刻的训练损失与验证损失非常相似。可以观察到:

1)不管模型的大小如何,模型的训练损失(困惑度)都在持续下降;
2)随着模型大小(参数数量)的增加,损失下降得更快。

这些观察表明,LVM随着更大的模型和更多的数据表现出强大的规模化性。

在这里插入图片描述
在下游基准上的规模化特性。尽管LVM的整体损失在训练期间表现良好的规模化特性,但不能保证更好的整体模型在给定的特定下游任务上也会表现更好。因此,我们在4个下游任务上评估不同大小的模型:语义分割、深度估计、表面法线估计和边缘检测。我们在ImageNet验证集上评估这些任务,并使用第3节中描述的相应方法生成所有标签。 对于每个任务,我们提供5对输入及其相应的ground-truth标注以及query图像作为输入提示,并评估ground-truth标注在我们模型对下256个token(一幅图像)的预测下的困惑度。我们在图4中给出结果。我们可以看到,更大的模型在所有任务上确实获得更低的困惑度,表明我们的整体规模化特性确实转移到了一系列下游任务中。
在这里插入图片描述

Dataset ablation。 尽管LVM随着更大的模型和更多的数据而获得更好的性能,但是自然会产生一个问题,即我们在UVDv1中收集的每个数据组件是否都有帮助。 为了回答这个问题,我们通过在数据集的子集上训练几个30亿参数的模型来进行数据集上的ablation study,并比较它们在下游任务上的性能。 我们与前面相同使用4个下游任务和设置,并在图5中呈现结果。 我们观察到每个数据组件都对下游任务有正面贡献。 LVM不仅从更大的数据中受益,而且随着图像和视频中无监督数据和标注数据的多样性的增加也有改进。
在这里插入图片描述

序列提示

我们从最直观和直接的方法开始视觉提示LVM: 序列推理。这里的提示构造非常简单:我们向模型展示一系列7个图像,并要求它预测下一个图像(256 tokens)。

视频帧预测。 最直接的序列提示任务是视频预测。 图6展示了几个下一帧预测示例,通过Kinetics-700验证集中的序列进行提示。 在顶部,7帧提示(蓝边框)后跟预测帧(红边框)。 我们观察到一定程度的推理能力,关于空间定位、视点和对象理解。 Kinetics val集上的预测困惑度为49.8。 最后4行显示了更长的上下文(15帧)和更长的预测(4帧)。 请参见附录中的图17至22以获取更多示例。

在这里插入图片描述

旋转和类别预测。 相同类型的简单序列提示也可以以其他方式使用。 例如,图 16 展示了如何通过合成对象绕任意轴的一系列 3D 旋转来提示模型使其能够预测进一步的旋转。 或者,我们可以将给定类别的类目列表视为一个序列,并预测同一类别中的其他ideas,如图 15 所示。请注意,虽然系统是根据来自相同 ImageNet 类别的图像组进行训练的,但这里的提示由草图(sketches)组成,而这些草图在任何标注数据中都没有见过。
在这里插入图片描述
在这里插入图片描述
上下文长度分析。 接下来我们问需要多少时序上下文才能准确预测后续帧? 当提示不同长度(1 到 15 帧)的上下文时,我们评估了模型的帧生成困惑度。 如图 7 所示,在 Kinetics-700 验证集上,我们看到困惑度从 1 帧到 11 帧有明显改善,之后趋于稳定(从 62.1 → 48.4)。
在这里插入图片描述

类比提示

我们的研究通过评估更复杂的提示结构(我们称之为“类比提示(Analogy Prompting)”)来取得进展。 该方法挑战模型理解任意长度和复杂性的类比,从而测试其高级解释能力。

定性结果。 图 8 显示了对许多任务进行类比提示的定性结果抽样。 提示由一系列 14 个图像组成,给出了各种任务的示例,后面的第 15 个是query图像。 给定每个提示,预测的下一个图像就是结果。 该图的顶部显示了几个示例提示,这些提示定义训练集一部分任务,但这些实际图像在训练中从未见过。 该图的底部展示了对训练中从未展示过的任务的泛化。 有关更多定性示例,请参阅附录。
在这里插入图片描述
未见任务和数据集。我们展示了在Pascal 3D+ [90]上的关键点检测结果,使用标准的正确关键点百分比(Percentage of Correct Keypoints,PCK)指标进行评估,阈值为0.1。值得注意的是,LVM在没有在此数据集上训练的情况下达到了81.2的PCK,展示了令人印象深刻的泛化能力。相比之下,我们展示了一些现有的特定任务模型:StackedHourglass[61]得分为68.0 PCK,MSS-Net[43]达到68.9 PCK,StarMap[101]为78.6 PCK。

与视觉提示的比较。与我们的方法最接近的也允许定义任意任务的方法是视觉提示(Visual Prompting) [8]。在表1中,我们在分割、目标检测和着色等少样本任务上比较了各种视觉提示模型。注意,我们的序列LVM在几乎所有任务上都优于之前的方法。
在这里插入图片描述
任务复合。图9演示了在单个提示内复合多个任务。在这里,我们演示了旋转任务与新的关键点对应任务,并要求模型继续这个模式。该模型能够在测试时成功组合这两个任务,展示了一定程度的组合性。
在这里插入图片描述

多样提示

在这里,我们尝试通过提供模型以前未见过的各种提示来看我们的模型能走多远。图10显示了一些正常工作的提示。图11显示了一些不易用文字描述的提示——这是LVM最终可能会战胜LLM的任务类型。
在这里插入图片描述
在这里插入图片描述

在图13中,我们展示了在典型的视觉推理问题上的初步定性结果,这些问题常见于非语言人类智商测试(Raven’s Progressive Matrices [67])。通过适当的猜测,人们可以想象LVM具有理解抽象视觉模式并将所掌握的模式应用于推断所示视觉序列的潜在能力。这个激动人心的结果值得进一步研究。
在这里插入图片描述

局限性

图12显示了当前模型的一些典型失败案例。一个共同点在于: 使用视觉提示来定义任务通常是欠约束的(比语言中更甚,因为图像是非常高维的),或者请求的任务可能超出当前系统的能力。其他更为琐碎的失败涉及tokenizer问题和高质量视频训练数据的缺乏。
在这里插入图片描述
有限的计算资源对我们探索一系列有趣问题施加了严格的约束,包括不同数据集的影响和详细的ablation study。值得注意的是,尽管这是迄今为止最大的视觉模型之一,但与现代大语言模型相比,它仍然相当小。因此,大视觉模型中涌现和真正泛化的问题仍然是开放的,值得进一步研究。

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

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

相关文章

STM32(PWM、ADC)

1、PWM 定义 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;它通过改变信号的高电平和低电平的持续时间比例来控制输出信号的平均功率或电压。 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff…

FPGA实现电机位置环、速度环双闭环PID控制

一、设计思路 主要设计思路就是根据之前写的一篇FPGA实现电机转速PID控制&#xff0c;前面已经实现了位置环的控制&#xff0c;思想就是通过电机编码器的当前位置值不断地修正PID去控制速度。 那为了更好的实现控制&#xff0c;可以在位置环后加上速度环&#xff0c;实现电机位…

scipy

scipy 是什么常用方法 是什么 scipy是Python语言的一个开源数值计算库&#xff0c;主要目的是为科学、工程、计算等领域提供有用的数学算法和函数&#xff0c;包括线性代数、优化、信号处理、傅里叶变换、统计函数等。它是Python科学计算环境的重要组成部分&#xff0c;通常与N…

2021年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

go学习之goroutine和channel

文章目录 一、goroutine(协程)1.goroutine入门2.goroutine基本介绍-1.进程和线程说明-2.程序、进程和线程的关系示意图-3.Go协程和Go主线程 3.案例说明4.小结5.MPG模式基本介绍6.设置Golang运行的CPU数7.协程并发&#xff08;并行&#xff09;资源竞争的问题8.全局互斥锁解决资…

MySQL 8 update语句更新数据表里边的数据

数据重新补充 这里使用alter table Bookbought.bookuser add userage INT after userphone;为用户表bookuser在userphone列后边添加一个类型为INT的新列userage。 使用alter table Bookbought.bookuser add sex varchar(6) after userage ;为用户表bookuser在userage 列后边添…

Oracle-数据库连接数异常上涨问题分析

问题&#xff1a; 用户的数据库在某个时间段出现连接数异常上涨问题&#xff0c;时间持续5分钟左右&#xff0c;并且问题期间应用无法正常连接请求数据库 从连接数的监控上可以看到数据库平常峰值不到100个连接&#xff0c;在问题时间段突然上涨到400以上 问题分析&#xff1a;…

unity | 动画模块之循环滚动选项框

一、作者的话 评论区有人问&#xff0c;有没有竖排循环轮播选项框&#xff0c;我就写了一个 二、效果动画 如果不是你们想要的&#xff0c;就省的你们继续往下看了 三、制作思路 把移动分成里面的方块&#xff0c;还有背景&#xff08;父物体&#xff09;&#xff0c;方块自…

网络模拟与网络仿真

目录 一、概念界定 二、模拟&#xff08;simulation&#xff09;与仿真&#xff08;emulation&#xff09; 2.1 模拟&#xff08;simulation&#xff09; 2.2 仿真&#xff08;emulation&#xff09; 2.3 区分 三、网络模拟与网络仿真 3.1 网络模拟 3.2 网络仿真 3.…

【算法】算法题-20231206

这里写目录标题 一、非自身以外数字的乘积二、最大数三、奇数排序 一、非自身以外数字的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀…

VA05销售报表屏幕增强

业务需求&#xff1a;在VA05报表界面增强两个字段&#xff08;BELNR1/BELNR2&#xff09;. 第一步&#xff1a;扩展VA05相关表结构 由于新增的字段是按照销售订单行维度展示的&#xff0c;所以本篇加在VBAP表里&#xff08;不扩展表字段&#xff0c;直接写增强&#xff0c;会…

融云 Global IM UIKit,灵活易用的即时通讯组件设计思路和最佳实践

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 融云近期推出的 Global IM UIKit&#xff0c;支持开发者高效满足海外用户交互体验需求&#xff0c;且保留了相当的产品张力赋予开发者更多自由和灵活性&#xff0c;是实现全…

现货黄金会面临哪些风险?

进行现货黄金投资&#xff0c;我们除了要了解怎么找到交易机会以外&#xff0c;也要知道我们交易会面临哪些风险&#xff0c;了解风险就是做到知己知彼&#xff0c;了解风险才能控制风险。控制住风险&#xff0c;才能为我们稳定盈利打好基础&#xff0c;那么下面我们就来看看在…

ESP32-Web-Server编程-在网页中插入图片

ESP32-Web-Server编程-在网页中插入图片 概述 图胜与言&#xff0c;在网页端显示含义清晰的图片&#xff0c;可以使得内容更容易理解。 需求及功能解析 本节演示在 ESP32 Web 服务器上插入若干图片。在插入图片时还可以对图片设置一个超链接&#xff0c;用户点击该图片时&a…

Oracle merge into语句(merge into Statement)

在Oracle中&#xff0c;常规的DML语句只能完成单一功能&#xff0c;&#xff0c;例如insert/delete/update只能三选一&#xff0c;而merge into语句可以同时对一张表进行更新/插入/删除。 目录 一、基本语法 二、用法示例 2.1 同时更新和插入 2.2 where子句 2.3 delete子句 2.4…

Gitee项目推荐-HasChat

最近由于使用的局域网通信工具总是出问题&#xff0c;就在考虑有没有好的替代品。搜索了一番&#xff0c;发现这个还不错&#xff1a; HasChat: 一款极简聊天应用&#xff0c;比较完整&#xff0c;略好看 页面简洁&#xff0c;功能也比较齐全&#xff0c; 感兴趣的小伙伴可以…

【Redis】redis 高性能--线程模型以及epoll网络框架

目录 一.前言 二.多线程的弊端 2.1 锁的开销问题 2.2 多线程上下文切换带来的额外开销 2.3 多线程占用内存成本增高 三.基本IO模型与epoll 模式 3.1 基本IO模型 3.2 单线程处理机制 四.总结 一.前言 我们经常讨论到&#xff0c;redis 是单线程&#xff0c;那为什么单线…

sizeof()、strlen()、length()、size()的区别(笔记)

​ 上面的笔记有点简陋&#xff0c;可以看一下下面这个博主的&#xff1a; c/c中sizeof()、strlen()、length()、size()详解和区别_csize,sizeof,length_xuechanba的博客-CSDN博客

the name of a constructor must match the name of the enclosing class

构造器名匹配封闭类名 命令码的位置关系不对 解决&#xff1a;调整 命令码所在层级

xxljob学习笔记02(小滴课堂)

分布式调度参数传递和调度日志配置讲解 可以设置任务参数。 代码层面&#xff1a; 可以这样传递参数。 我们在xxljob页面去设置参数&#xff1a; 我们执行一次任务&#xff1a; 我们这里就拿到了参数。 这样我们就能拿到参数了。 日志打印&#xff1a; 在代码中也可以实现&…