【AI理论学习】深入理解Prompt Learning和Prompt Tuning

news2024/12/23 22:57:24

深入理解Prompt Learning和Prompt Tuning

  • 背景
  • Prompt Learning简介
    • 1. Prompt是什么?
    • 2. 为什么要使用Prompt?
    • 3. Prompt Learning的形式(举例)
    • 4. 有哪些Pre-training language model?
    • 5. 常见的Prompt Learning的方法
  • Prompt Tuning的策略
    • 1. Fine-turn的策略
    • 2. NLP中基于Prompt的fine-tune
    • 3. CV中基于Prompt的fint-tune
      • 1. 分类
      • 2. 持续学习
      • 3. 多模态模型
        • 1. Vision-Language Model: Context Optimization (CoOp)
        • 2. Conditional Prompt Learning for Vision-Language Models
      • 4. 域适应
        • Domain Adaptation via Prompt Learning
  • 内容来源
  • 参考文献

近年来NLP学术领域发展真是突飞猛进,从 对比学习( contrastive learning)到现在的 提示学习(prompt learning)。自从Self-Attention 和 Transformer出现以来,它们就成为了NLP领域的热点。由于全局注意力机制和并行化的训练策略,基于Transformer的自然语言模型能够方便地编码长距离依赖关系,同时可以在大规模自然语言数据集上进行并行化训练。

众所周知,数据标注数据很大程度上决定了AI算法上限,并且成本非常高,无论是对比学习还是提示学习都着重解决少样本学习而提出,甚至在没有标注数据的情况下,也能让模型表现比较好的效果。而且由于自然语言处理领域任务种类繁多,而且任务之间的差别微小,所以为每个任务单独创建一个大语言模型很不划算。与此同时,在CV中,不同的图像识别任务往往也需要微调整个大模型。

因此,Prompt Learning的提出给这个问题提供了一个很好的方向。本文主要介绍prompt learning的基本思想和目前常用的方法。

背景

(1)基于传统机器学习模型:在以往的机器学习方法中,基本上都是基于全监督学习(fully supervised learning)的方法。然而,由于监督学习需要大量的数据学习性能优异的模型,而NLP中为特定任务标注的数据集往往是不足的,因此在深度学习出现之前研究者通常聚焦于特征工程(feature engineering),即利用领域知识从数据中提取好的特征;在这一阶段的方法例如tf-idf特征+朴素贝叶斯等机器算法;

(2)基于深度学习模型: 深度学习出现之后,由于可以从数据中得到隐含的特征,因此研究人员转向了结构工程(architecture engineering),即通过设计一个合适的网络结构来把归纳偏置(inductive bias)引入模型中,从而有利于学习好的特征。例如word2vec 特征 + LSTM 等深度学习算法,相比于传统方法,模型准确有所提高,特征工程的工作也有所减少;

(3)基于预训练模型 + finetuning: 自从BERT出现之后,NLP研究者开始转向另一个新的模式,即预训练 + 微调(pre-train and fine-tune)。在这个模式中, 先用一个固定的结构预训练一个语言模型(language model, LM),预训练的方式就是让模型补全上下文(比如完形填空)。相比于深度学习模型,模型准确度显著提高,但是模型也随之变得更大,但小数据集就可训练出好模型;

(4)基于预训练模型 + Prompt + 预测的方法:在预训练的过程中,由于不需要专家知识,因此可以在网络上搜集的大规模文本上直接进行训练。然后这个LM通过引入额外的参数或微调来适应到下游任务上。这就逐渐形成了目标工程(objective engineering),即为预训练任务和微调任务设计更好的目标函数

可以发现,整个NLP领域是朝着精度更高、少监督,甚至无监督的方向发展的,而Prompt Learning是目前学术界向这个方向进军最新也是最火的研究成果。

Prompt Learning简介

1. Prompt是什么?

预训练模型中存在大量知识;预训练模型本身具有少样本学习能力。GPT-3 提出的In-Context Learning,也有效证明了在Zero-shotFew-shot场景下,模型不需要任何参数,就能达到不错的效果,特别是近期很火的GPT3.5系列中的ChatGPT

在做objective engineering的过程中,研究者发现让下游任务的目标与预训练的目标对齐是有好的。因此下游任务通过引入文本提示符(textual prompt),把原来的任务目标重构为与预训练模型一致的填空题

比如一个输入 “I missed the bus today.” 的重构:

  • 情感预测任务。输入:“I missed the bus today. I felt so___.” 其中 “I felt so” 就是提示词(prompt),然后使用 LM 用一个表示情感的词填空。
  • 翻译任务。输入:“English: I missed the bus today. French: ___.” 其中 “English:” 和 “French:” 就是提示词,然后使用 LM 应该再空位填入相应的法语句子。

用不同的prompt加到相同的输入上,就能实现不同的任务,从而使得下游任务可以很好的对齐到预训练任务上,实现更好的预测效果。然而,有研究表明,在同一个任务上使用不同的 prompt,预测效果也会有显著差异,因此现在有许多研究开始聚焦于prompt engineering

因此,Prompt Learning 的本质是将所有下游任务统一成预训练任务;以特定的模板,将下游任务的数据转成自然语言形式,充分挖掘预训练模型本身的能力。即设计一个比较契合上游预训练任务的模板,通过模板的设计就是挖掘出上游预训练模型的潜力,让上游的预训练模型在尽量不需要标注数据的情况下比较好的完成下游的任务。Prompt Learning关键包括三个步骤:

  • 设计预训练语言模型的任务
  • 设计输入模板样式(Prompt Engineering)
  • 设计label样式,以及模型的输出映射到label的方式(Answer Engineering)

2. 为什么要使用Prompt?

先从Prompt Learning之前的学习模式来分析,即预训练模型PLM+finetuning范式,常用的是BERT+finetuning。如下图所示:
BERT+finetuning
这种学习模式是想要预训练模型更好的应用在下游任务,需要利用下游数据对模型参数微调;首先,模型在预训练的时候,采用的训练形式:自回归自编码,这与下游任务形式存在极大的gap,不能完全发挥预训练模型本身的能力。必然导致:较多的数据来适应新的任务形式——>少样本学习能力差、容易过拟合
MLM pre-training Fine-tuning
其次,现在的预训练模型参数量越来越大,为了一个特定的任务去 finetuning 一个模型,然后部署于线上业务,也会造成部署资源的极大浪费。

3. Prompt Learning的形式(举例)

  1. 以电影评论情感分类任务为例,模型需根据输入句子做二分类:
    「原始输入」:特效非常酷炫,我很喜欢。
    「Prompt输入」
    • 「提示模板1」: 特效非常酷炫,我很喜欢。这是一部[MASK]电影;
    • 「提示模板2」: 特效非常酷炫,我很喜欢。这部电影很[MASK]

提示模板的作用就在于:将训练数据转成自然语言的形式,并在合适的位置 MASK,以激发预训练模型的能力
提示模板

  1. 类别映射/Verbalizer:选择合适的预测词,并将这些词对应到不同的类别。
    类别映射
    通过构建提示学习样本,只需要少量数据的Prompt Tuning,就可以实现很好的效果,具有较强的零样本/少样本学习能力。

4. 有哪些Pre-training language model?

  • Left-to-Right LM: GPT, GPT-2, GPT-3
  • Masked LM: BERT, RoBERTa
  • Prefix LM: UniLM1, UniLM2
  • Encoder-Decoder: T5, MASS, BART

5. 常见的Prompt Learning的方法

  • 按照 prompt 的形状划分:完形填空式,前缀式。
  • 按照人的参与与否:人工设计的,自动的(离散的,连续的)
    人工设计的Prompt人工设计的 Prompt

Prompt Tuning的策略

1. Fine-turn的策略

在下游任务上微调大规模预训练模型已经成为大量NLP和CV任务常用的训练模式。然而,随着模型尺寸和任务数量越来越多,微调整个模型的方法会储存每个微调任务的模型副本, 消耗大量的储存空间。尤其是在边缘设备上存储空间和网络速度有限的情况下,共享参数就变得尤为重要。

一个比较直接的共享参数的方法是只微调部分参数,或者向预训练模型中加入少量额外的参数。比如,对于分类任务:

  • Linear:只微调分类器 (一个线性层), 冻结整个骨干网络。
  • Partial-k:只微调骨干网络最后的 k 层, 冻结其他层。
  • MLP-k:增加一个 k 层的 MLP 作为分类器。
  • Side-tuning:训练一个 “side” 网络,然后融合预训练特征和 “side” 网络的特征后输入分类器。
  • Bias:只微调预训练网络的 bias 参数。
  • Adapter:通过残差结构,把额外的MLP模块插入Transformer。

另一种方式是使用Transformer。近年来,Transformer模型在NLP和CV上大放异彩。基于Transformer的模型在大量CV任务上已经比肩甚至超过基于卷积的模型。
Transformer 与 ConvNet 比较:Transformer 相比于 ConvNet 的一个显著的特点是:它们在对于空间(时间)维度的操作是不同的。

  • ConvNet:卷积核在空间维度上执行卷积操作,因此空间内不同位置的特征通过卷积(可学习的)操作融合信息, 且只在局部区域融合。
  • Transformer:空间(时间)维度内不同位置的特征通过 Attention(非学习的)操作融合信息,且在全局上融合。

Transformer在特征融合时非学习的策略使得其很容易的通过增加额外的 feature 来扩展模型

2. NLP中基于Prompt的fine-tune

  • Prefix-Tuning
  • Prompt-Tuning
  • P-Tuning
  • P-Tuning-v2

3. CV中基于Prompt的fint-tune

1. 分类

Visual Prompt Tuning
Visual Prompt Tuning
目前调整预训练模型的工作方式包括更新所有骨干参数,即全面微调(full fine-tuning)。本文介绍了Visual Prompt Tuning(VPT),它是视觉中大型Transformer模型full fine-tuning的一种有效替代方案。VPT从有效调整大型语言模型的最新进展中获得灵感,在输入空间中只引入少量(不到模型参数的1%)可训练参数,同时保持模型主干冻结。通过对各种下游识别任务的大量实验,表明,与其他参数有效的调优协议相比,VPT实现了显著的性能提升。最重要的是,在许多情况下,在模型容量和训练数据规模方面,VPT甚至优于完全微调,同时降低了每个任务的存储成本。

论文地址:https://arxiv.org/abs/2203.12119
VPT vs other transfer learning methods
Overview of our proposed VPT
给定一个预先训练好的Transformer,在Embed层后的输入空间引入一组d维的p个连续embedding,即prompts。在微调过程中,只有prompts会被更新,主干将会冻结,根据加入prompts的层的数量分为VPT-shallow和VPT-deep。
(1)VPT-Shallow:Prompts仅插入第一层。每一个prompt token都是一个可学习的d维参数。shallow-prompted ViT表示如下:
VPT-Shallow
(2)VPT-Deep:Prompt被插入到每一个Transformer layer的输入空间。deep-prompted ViT表示如下:
VPT-Deep
Table1

2. 持续学习

Learning to Prompt for Continue Learning
Learning to Prompt for Continual Learning
持续学习背后的主流范式是将模型参数调整到非平稳数据分布中灾难性遗忘是核心挑战。典型的方法依赖于测试时间的彩排缓冲区或已知的任务标识来检索学习的知识和地址遗忘,而这项工作为持续学习提供了新的范式,旨在训练更简洁的记忆系统而不在测试时间访问任务身份。我们的方法学会了动态提示dynamically prompt(L2P)一个预训练的模型,以在不同的任务转换下依次学习任务。在我们提出的框架中,提示是小的可学习参数,可维持在记忆空间中。目的是优化提示,以指导模型预测,并在维持模型可塑性的同时明确管理任务不变和特定于任务的知识。我们在流行的图像分类基准下进行全面的实验,并具有不同的挑战性持续学习设置,其中L2P始终优于先前的最新方法。令人惊讶的是,L2P即使没有排练缓冲液,也可以针对基于排练的方法取得竞争成果,并且直接适用于挑战性的任务无关持续学习。

论文地址:https://doi.org/10.48550/arXiv.2112.08654
代码地址:https://github.com/google-research/l2p

引入一个 prompt pool,对每个 input,从 pool 中取出与其最近的 N 个 prompts 加入 image tokens。input 和 prompts 距离的度量通过计算 input feature 和每个 prompt 的 key 的距离来得到,这些 key 通过梯度随分类目标一起优化。
L2P
Continue Learning
注意,最后使用 prompt 来分类。

3. 多模态模型

1. Vision-Language Model: Context Optimization (CoOp)

CoOp
大预训练视觉-语言模型(如CLIP)学得的表征可以迁移到广泛的下游任务上,展现出了巨大的潜力。不同于传统的从离散的标签中进行表征学习,视觉-语言预训练在一个共同的特征空间中对齐图像和文本,这样就可以通过prompting的方式实现下游任务的zero-shot transfer,比我们可以通过语言来描述物体而获取分类的权重。这篇文章展示了在实际应用中prompt engineering(提示工程)存在很大的挑战,因为提示工程往往需要专业知识并且很耗时间去设计。作者受到NLP中的prompt learning的启发,提出Context Optimization(CoOp)。CoOp是一个将CLIP之类的视觉-语言预训练模型适应到下游任务上的方法。具体地,CoOp用可学的向量来model prompt中的单词,而整个过程中预训练模型的参数都是固定的。为了解决不同的图像识别任务,作者提供了CoOp的两种实现:unified contextclass-specific context。作者在11个下游任务上验证CoOp的有效性,结果显示CoOp的性能明显好于原始预训练模型如CLIP。

论文地址:https://arxiv.org/abs/2109.01134

多模态学习的预训练模型。比如CLIP,通过对比学习对齐文本和图像的特征空间,如下图所示:
CLIP
在CLIP在zero-shot预测中,text encoder输入的text是固定的,如“A photo of a {object}.”。而在CoOp中,输入的text是learnable,随着在下游任务的few-shot样本而更新。

选择不同的文本 prompt 对于精度影响较大。一张图其实可能有多种描述,比如一张猫的图像可能的描述:“一个猫。”,“一张猫的照片。”,“这是一只猫。”等。其实CLIP原文中,其作者发现了这个问题,并且发现prompt对预测性能的影响还挺大,于是还做了prompt ensembling。CoOp其实就是为了研究这个问题,就是说我们能不能不要手工设计prompt了,直接learn一个最优的prompt?
Prompt engineering vs Context Optimization (CoOp)
Prompt engineering vs Context Optimization (CoOp)

把人工设定的 prompt 替换为 learnable 的 prompt

  • [CLASS]放在后面
    CLASS放在后面
  • [CLASS] 放在中间:
    class放在中间
    Prompt 可以在不同类之间公用,也可以为每个类使用不同的 prompts(对于细粒度分类任务更有效)。CoOp考虑了两种learnable prompt,第一种是unified context,也就是不管样本是什么类别,其learnable context都是一样的,而第二种则是class-specific context,也就是每个类别都有自己特有的learnable context
    Learning to Prompt for Vision-Language Model
    CoOp先在四个数据集上做实验,发现更合理的prompt能够大幅度的提升分类精度尤其是使用了本文提出的CoOp之后,最终的分类精度远超CLIP人为设计的prompt。
    Learning to Prompt for Vision-Language Model
    Learning to Prompt for Vision-Language Model

2. Conditional Prompt Learning for Vision-Language Models

Conditional Prompt Learning for Vision-Language Models
随着大规模视觉-语言预训练模型如CLIP展现出的强大表征能力,如何有效地将这些预训练模型adapt到下游任务上变得至关重要。近期的工作CoOp将NLP中的prompt learning的概念初次引入到CV领域以更好地将上述预训练模型adapt到下游任务上CoOp将原本CLIP中的手动设定的propmt变成learnable vectors,然后只需要借助few-shot labeled images就能带来很大的性能提升。但作者发现CoOp也同时存在一个问题:CoOp中learned context的泛化性不够好,很难泛化到同一个数据集内的unseen classes,这就意味着CoOp在训练时overfit到了base classes上。为了解决此问题,作者提出Conditional Context Optimization (CoCoOp)。CoCoOp在CoOp基础之上引入一个轻量级的神经网络为每张图像生成input-conditional tokens (vectors),这些tokens会加上原本CoOp中的learnable vectors上。相比CoOp中静态的prompt,CoCoOP这种动态的prompt是instance-adaptive的,对于class shift更加鲁棒。实验表明对于unseen class,CoCoOp的泛化性比CoOp好,甚至还展示了有潜力的单数据集迁移性。
论文地址:https://arxiv.org/abs/2203.05557

CoOp 在泛化到新的类别上时性能不好。
To learn generalizable prompts
To learn generalizable prompts
所以把 prompt 设计为instance-conditional 的。
To learn generalizable prompts
相比于CoOp, CoCoOp增加了一个轻量级的网络(Meta-Net) h θ ( ⋅ ) h_\theta(\cdot) hθ(),Meta-Net的输入是image feature x x x,输出则是一个instance-conditional token π \pi π,然后再在每个context token v m v_m vm上加上 π \pi π。也就是为 prompt 加上一个跟当前图像相关的特征以提高泛化性能。具体来说,先用 Image Encoder 计算当前图像的 feature,然后通过一个 Meta-Net 把 feature 映射到 prompt 的特征空间,加到 prompt 上面

实验使用的11个数据集和CoOp中的一致。
To learn generalizable prompts

4. 域适应

Domain Adaptation via Prompt Learning

Domain Adaptation via Prompt Learning
无监督域适应 (UDA) 旨在将从注释良好的源域学习的模型适应目标域,其中只给出未标记的样本。当前的 UDA 方法通过对齐源和目标特征空间来学习域不变特征。这种对齐是由诸如统计差异最小化或对抗训练等约束所施加的。然而,这些约束可能导致语义特征结构的扭曲和类别可辨别性的丧失。在本文中,我们介绍了一种新颖的 UDA Prompt学习范式,名为Domain Adaptation via Prompt Learning(DAPL)。与之前的工作相比,我们的方法利用了预训练的视觉语言模型,并且只优化了很少的参数。主要思想是将域信息嵌入到prompt中,这是一种由自然语言生成的表示形式,然后用于执行分类。该域信息仅由来自同一域的图像共享,从而根据每个域动态调整分类器
论文地址:https://arxiv.org/abs/2202.06687

(1)用prompt来标识 domain 的信息。
Example prompt structure
(2)通过对比学习解耦 representation 中的 class 和 domain 的表示。
对比学习
Domain Adaptation via Prompt Learning
通过采用这种范式,我们表明我们的模型不仅在几个跨域基准测试上优于以前的方法,而且训练效率高且易于实现。

内容来源

  1. 一文详解Prompt学习和微调(Prompt Learning & Prompt Tuning)
  2. 《Visual Prompt Tuning》视觉prompt
  3. 深入浅出提示学习思想要旨 及 常用Prompt方法
  4. Prompt—从CLIP到CoOp,Visual-Language Model新范式
  5. CoOp: Learning to Prompt for Vision-Language Models
  6. CoCoOp: Conditional Prompt Learning for Vision-Language Models

参考文献

[1] Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing. Pengfei Liu, Weizhe Yuan, Jinlan Fu, Zhengbao Jiang, Hiroaki Hayashi, Graham Neubig. In arXiv 2021 https://arxiv.org/abs/2107.13586
[2] How transferable are features in deep neural networks? Jason Yosinski, Jeff Clune, Yoshua Bengio, Hod Lipson. In NeruIPS 2014 https://proceedings.neurips.cc/paper/2014/hash/375c71349b295fbe2dcdca9206f20a06-Abstract.html
[3] Masked autoencoders are scalable vision learners. Kaiming He, Xinlei Chen, Saining Xie, Yanghao Li, Piotr Dollár, Ross Girshick. In arXiv 2021 https://arxiv.org/abs/2111.06377
[4] Side-tuning: a baseline for network adaptation via additive side networks. Jeffrey O. Zhang, Alexander Sax, Amir Zamir, Leonidas Guibas, Jitendra Malik. In ECCV 2020 https://link.springer.com/chapter/10.1007/978-3-030-58580-8_41
[5] Bitfit: Simple parameter-efficient fine-tuning for transformer-based masked language-models.Elad Ben Zaken, Shauli Ravfogel, Yoav Goldberg. In ACL 2022 https://arxiv.org/abs/2106.10199
[6] TinyTL: Reduce memory, not parameters for efficient on-device learning. Han Cai, Chuang Gan, Ligeng Zhu, Song Han. In NeurIPS 2020 https://proceedings.neurips.cc/paper/2020/hash/81f7acabd411274fcf65ce2070ed568a-Abstract.html
[7] Parameter-efficient transfer learning for nlp. Neil Houlsby, Andrei Giurgiu, Stanislaw Jastrzebski, Bruna Morrone, Quentin De Laroussilhe, Andrea Gesmundo, Mona Attariyan, Sylvain Gelly. In ICML 2019 http://proceedings.mlr.press/v97/houlsby19a.html
[8] Visual Prompt Tuning. Menglin Jia, Luming Tang, Bor-Chun Chen, Claire Cardie, Serge Belongie, Bharath Hariharan, Ser-Nam Lim. In arXiv 2022 https://arxiv.org/abs/2203.12119
[9] Learning to Prompt for Continual Learning. Zifeng Wang, Zizhao Zhang, Chen-Yu Lee, Han Zhang, Ruoxi Sun, Xiaoqi Ren, Guolong Su, Vincent Perot, Jennifer Dy, Tomas Pfister. In CVPR 2022 https://arxiv.org/abs/2112.08654
[10] Learning to Prompt for Vision-Language Models. Kaiyang Zhou, Jingkang Yang, Chen Change Loy, Ziwei Liu. In arXiv 2021 https://arxiv.org/abs/2109.01134
[11] Conditional Prompt Learning for Vision-Language Models. Kaiyang Zhou, Jingkang Yang, Chen Change Loy, Ziwei Liu. In CVPR 2022 https://arxiv.org/abs/2203.05557
[12] Domain Adaptation via Prompt Learning. Chunjiang Ge, Rui Huang, Mixue Xie, Zihang Lai, Shiji Song, Shuang Li, Gao Huang. In arXiv 2022 https://arxiv.org/abs/2202.06687

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

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

相关文章

WebRTC 源码分析——Android 视频硬件编码

作者:DevYK 1. 简介 本文将重点介绍在 Android 平台上,WebRTC 是如何使用 MediaCodec 对视频数据进行编码,以及在整个编码过程中 webrtc native 与 java 的流程交互。 本篇开始会先回顾一下 Andorid MediaCodec 的概念和基础使用&#xff0…

Node【Global全局对象】之【Process】

文章目录 🌟前言🌟Process🌟process属性🌟process.env 🌟process方法🌟process事件🌟uncaughtException 🌟写在最后 🌟前言 哈喽小伙伴们,新的专栏 Node 已开…

VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

文章目录 问题背景问题描述测试代码测试结果现象描述问题分析 解决方案修改默认配置1. 已经存在的文件全部使用gbk编码重新保存。2. 在工程目录下新建.vscode目录,如果已存在则跳过此步骤。3. 在.vscode目录中新建settings.json,launch.json两个文件&…

SAP CAP篇二:为Service加上数据库支持

在篇一快速创建一个Service,基于Java的实现中,可见使用SAP CAP (Cloud Programming Model)确实可以提高开发效率。尤其是Java技术栈上,对比于之前使用Olingo框架来实现oData,使用SAP CAP真的可以做到指数级…

Hightopo应邀参加 2023 第十届中国工业数字化论坛

3 月 30 日,以“加快数字化转型,助推高质量发展”为主题的第十届中国工业数字化论坛在北京隆重举行。厦门图扑软件科技有限公司(以下简称“图扑软件”)应邀参展,与诸位专家、领导、业界同仁共同研讨工业领域的数字化创…

红包算法关于---随机分发和平均分发

目录 群发普通红包 流程图 MainRedPacket类 Manager类 Member类 User类 群发普通红包 题目介绍 某软件有多名用户(User类),某群聊中有群主(Manager类)和多名普通成员(Member类)&#x…

c++ 11 auto的概念和用法

目录 auto的概念: 使用auto声明变量的语法: auto关键字使用场景: 1.简化代码的书写和阅读 2.避免类型繁琐的重复定义 auto使用时的注意事项: auto的概念: 在C11标准中,auto是一种类型推导机制。它可以让编译器根据右值表达式…

代码随想录训练营day52|300、最长递增子序列;674、最长连续递增序列;718、最长重复子数组

300、最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

【Spring Boot】SpringBoot 优雅整合Swagger Api 自动生成文档

文章目录 前言一、添加 Swagger 依赖二、创建接口类三、添加 Swagger 配置类四、访问 Swagger 页面五、整合一个更友好的UI接口文档 Knife4j1、添加 Knife4j 依赖2、添加 Knife4j 配置类3、访问 Knife4j 页面 总结 前言 Swagger 是一套 RESTful API 文档生成工具,可…

《选择》比努力更重要——C语言

目录 前言: 1.语句 2.选择语句 2.1小栗子 2.2选择结构 3.误导性else 3.1写法上的可读性和代码的稳健性: 3.2一些练习 4.switch选择语句 4.1嵌套的switch ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其…

Qt·DBus快速入门

目录 一、QtDBus简介 二、QtDBus类型系统 1、QtDBus类型系统简介 2、原生类型 3、复合类型 4、类型系统的使用 5、扩展类型系统 三、QtDBus常用类 1、QDBusMessage 2、QDBusConnection 3、QDBusInterface 4、QDBusReply 5、QDBusAbstractAdaptor 6、QDBusAbstract…

【Python_Opencv图像处理框架】图像阈值与滤波

写在前面 本篇文章是opencv学习的第二篇文章,主要讲解了图像的阈值和滤波操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️ 写在中间 一、 图像阈值 ( 1 )简单介绍…

扩散模型原理记录

1 扩散模型原理记录 参考资料: [1]【54、Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读】 https://www.bilibili.com/video/BV1b541197HX/?share_sourcecopy_web&vd_source7771b17ae75bc5131361e81a50a0c871 [2] https://t.bili…

音视频通讯QoS技术及其演进

利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验。 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的缩写,指一个网络能够…

MoE 系列(二)|Golang 扩展从 Envoy 接收配置

文|朱德江(GitHub ID:doujiang24) MOSN 项目核心开发者蚂蚁集团技术专家 专注于云原生网关研发的相关工作 本文 1445 字 阅读 5 分钟 上一篇我们用一个简单的示例,体验了用 Golang 扩展 Envoy 的极速上手。 这次我们再通过一个…

这篇把「精准测试」算是讲明白了

作为测试同学,我们经常在工作中会有这样的困惑:我写的用例真的有效且全面吗,我的测试真的做到有效覆盖了吗?回归阶段我到底需要回归什么,回归验证充分吗?这次的改动到底影响范围有多大?针对以上…

JAVA集成强密码校验

JAVA集成强密码校验 1 : 背景2 : 代码设计编写2.1 : 引入规则配置2.2 : 密码校验工具类 3 : 验证4 : 相关链接 1 : 背景 最近系统需要做用户密码升级,增加强密码校验,密码长度,复杂度等等,所以整理了一份通用的密码复杂度控制代码…

你了解这2类神经性皮炎吗?常常预示着这5类疾病!

属于慢性皮肤病,患者皮肤可出现局限性苔藓样变,同时伴有阵发性瘙痒。神经性皮炎易发生在颈部两侧和四肢伸侧,中年人是高发人群。到目前为止神经性皮炎病因还并不是很明确,不过一部分病人发病前常常出现精神神经方面异常&#xff0…

SLAM 十四讲(第一版)各章方法总结与理解

SLAM 十四讲(第一版)各章方法总结与理解 总结十四讲中各章各步骤提到的各种方法,以及具体方法在哪个 c 库中可以调用。目的在于能更直观地了解 slam 过程各步骤到底在做什么,以及是怎么联系在一起的。 2. 初识 SLAM SLAM&#x…

ggplot作图中的图例处理方法

文章目录 改变坐标轴和图例的名称方法1, labs()方法2,scale_xxx_discrete/continuous() 删除坐标轴和图例的名称方法1, labs()方法2,scale_xxx_discrete/continuous()方法3,theme()方法4,guides()可以去图例名称 改变图…