一文带你全面理解Transformer的工作原理【图解】

news2024/11/15 4:02:29

文章目录

  • 1、Transformer背景介绍
    • 1.1、Transformer的诞生
      • 1.1.1、首次提出
      • 1.1.2、后续的发展
    • 1.2、Transformer的优势
    • 1.3、Transformer的市场
  • 2、Transformer架构
    • 2.1、总览
    • 2.2、输入部分
    • 2.3、输出部分包含
    • 2.4、编码器部分
      • 2.4.1、总览
      • 2.4.2、详细拆分
    • 2.5、解码器部分
      • 2.5.1、总览
      • 2.5.2、详细拆分
  • 3、为什么说Transformer可以代替seq2seq?
    • 3.1、seq2seq的两大缺陷
    • 3.2、Transformer的改进
  • 4、对于AT和NAT
    • 4.1、AT Decoder(自回归解码器)
    • 4.2、NAT Decoder(非自回归解码器)
    • 4.3、细节讨论
    • 4.4、小结

🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发,目前开始人工智能领域相关知识的学习
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

下一篇文章是:一文带你全面上手Transformer的代码实现

1、Transformer背景介绍

1.1、Transformer的诞生

1.1.1、首次提出

Transformer模型的诞生时间可以追溯到2017年6月,当时由Google Brain团队的研究人员提出。
这一重要的突破性成果是标志性论文《Attention is All You Need》的发表,这篇论文奠定了Transformer模型的基础。

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

具体来说,这篇论文由Vaswani等人(包括Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, 和 Illia Polosukhin)撰写,并于2017年6月12日发表在arXiv上。
论文介绍了Transformer模型,这是一个基于注意力机制的神经网络架构,能够在自然语言处理任务中取得优异的表现,尤其是在机器翻译任务中。


在这之前,大多数自然语言处理任务主要依赖于循环神经网络(RNNs)和长短时记忆网络(LSTMs),这些模型在处理序列数据时效果良好。
然而,这些模型的计算效率较低尤其在处理长序列时,因为它们依赖于逐步处理序列中的每一个元素。Transformer通过引入自注意力机制,消除了这种顺序性依赖,使得计算能够并行化,从而极大地提升了训练和推理的速度。


《Attention is All You Need》这篇论文的核心贡献在于提出了一种全新的架构——Transformer,这种架构完全抛弃了循环和卷积的结构,而是仅依赖注意力机制来捕捉序列中的依赖关系。
它引入了自注意力(Self-Attention)机制,使得模型在处理每一个词时,能够根据序列中所有其他词的相关性来调整当前词的表示,这大大提升了模型的性能和灵活性。


总的来说:

  1. 2017年发表的《Attention is All You Need》标志着Transformer模型的诞生,这篇论文在自然语言处理领域具有划时代的意义,并且引发了深度学习和人工智能领域的一系列创新和变革
  2. 自此之后,Transformer模型被广泛应用于各种NLP任务,并且成为了诸如BERT、GPT、T5等众多成功模型的基础架构

1.1.2、后续的发展

2018年10月,Google发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT模型横空出世, 并横扫NLP领域11项任务的最佳成绩!

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

而在BERT中发挥重要作用的结构就是Transformer, 之后又相继出现XLNET,roBERT等模型击败了BERT,但是他们的核心没有变,仍然是:Transformer


在《Attention is All You Need》一文提出了Transformer模型之后,研究界开始探索如何在更广泛的自然语言处理任务中应用这一架构。
BERT的出现正是在这一背景下进行的,它的目标是通过预训练和微调的方法,进一步提升模型在语言理解任务中的表现。
BERT的核心创新在于它引入了一种新的预训练方法,该方法结合了深度双向Transformer架构无监督的语言模型训练技术;
与传统的单向语言模型(如GPT)不同,BERT模型在预训练阶段使用了双向注意力机制,即模型在处理某个词时,可以同时关注该词前后的上下文信息;
这使得BERT能够捕捉更丰富的上下文关系,从而提高了其在各种下游任务中的表现。


论文的主要贡献与方法:

  1. 双向Transformer架构:BERT基于Transformer的编码器部分,但它与最初的Transformer模型不同,BERT是一个深度的、双向的模型。这意味着BERT在处理每一个词时,能够同时利用词的左侧和右侧的上下文信息,这种双向性在捕捉句子语义时尤为重要。
  2. Masked Language Model (MLM):在预训练阶段,BERT使用了“掩码语言模型”任务。具体做法是随机掩盖输入文本中的一些词,然后要求模型根据上下文预测这些被掩盖的词。这一任务使得模型能够学习词语的上下文相关表示。
  3. Next Sentence Prediction (NSP):除了掩码语言模型任务,BERT还引入了“下一句预测”任务。模型会输入成对的句子,并要求判断第二个句子是否是第一个句子的下一句。这一任务帮助模型学习句子级别的关系,对于下游的任务如问答、自然语言推理等非常有用。
  4. 迁移学习与微调:BERT模型在大量无标注的文本数据上进行预训练,然后可以通过微调应用到具体的下游任务中。这种预训练-微调的范式在NLP中取得了巨大的成功,成为了之后许多模型的标准做法。

影响与后续发展:
BERT的提出标志着自然语言处理领域进入了一个新的时代。它的表现远远超越了之前的模型,在多个标准基准任务(如GLUE、SQuAD)上刷新了记录。BERT的成功证明了预训练语言模型在处理语言理解任务中的巨大潜力,这种方法被广泛应用于各类NLP任务,并且成为了许多后续模型(如RoBERTa、DistilBERT、ALBERT等)的基础。
总之,2018年发表的《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》这篇论文,是NLP领域的重要里程碑之一,它不仅推动了基于Transformer架构的模型的发展,还使得预训练-微调的范式成为标准,大大提升了机器在各种语言理解任务中的表现。

1.2、Transformer的优势

相比之前占领市场的LSTMGRU模型,Transformer有两个显著的优势:

  1. Transformer能够利用分布式GPU进行并行训练,提升模型训练效率;
  2. 在分析预测更长的文本时, 捕捉间隔较长的语义关联效果更好

具体展开如下:

  1. 并行化训练与分布式GPU的利用
    1. Transformer模型能够利用分布式GPU进行并行训练,这确实是其相对于LSTM和GRU的一个显著优势
    2. 由于Transformer模型采用了自注意力机制,计算不再依赖于序列的顺序处理,因此可以对整个序列数据进行并行处理
    3. 这种特性使得Transformer在现代硬件(尤其是GPU和TPU)上具有更高的训练效率
    4. 相比之下,LSTM和GRU等循环神经网络(RNN)模型由于其顺序依赖的特性,必须逐步处理输入序列,难以进行有效的并行计算;这使得它们在处理长序列数据时的计算效率较低,训练速度也相对较慢
  2. 处理长距离依赖的能力
    1. Transformer在分析和预测长文本时,能够更好地捕捉间隔较长的语义关联
    2. 这一优势源自自注意力机制,它允许模型在处理一个词时,同时关注到整个输入序列中的所有其他词
    3. 这种机制使得Transformer在捕捉长距离依赖关系时非常有效
    4. 相比之下,LSTM和GRU虽然也设计了机制(如门控单元)来处理长距离依赖,但它们仍然受到梯度消失和梯度爆炸问题的困扰,尤其是在处理非常长的序列时
    5. 此外,LSTM和GRU在每一步处理时只能依赖之前的状态信息,而不能像Transformer那样一次性获取全局的上下文信息

下面是一张测评比较图:
image.png

  1. 这张图展示了不同模型在不同句子长度(Sent Lengths)上的BLEU分数表现,比较了有无注意力机制的翻译系统在句子长度变化时的效果;
  2. 图中使用了不同符号和颜色来表示不同的系统和配置,BLEU(Bilingual Evaluation Understudy)是一个常用的机器翻译质量评估指标,得分越高,说明翻译质量越好;
  3. 这张图强调了注意力机制在神经机器翻译中的关键作用,特别是在处理长句子时,注意力机制能够显著提升模型的翻译性能;
  4. 通过对比,图中展示了各种模型的表现,突出了使用优化的注意力配置能够带来的显著改进

1.3、Transformer的市场

在著名的SOTA机器翻译榜单上,几乎所有排名靠前的模型都使用Transformer:
image.png
其基本上可以看作是工业界的风向标,市场空间自然不必多说!

2、Transformer架构

2.1、总览


Transformer 也由编码器和解码器组成。编码器将输入序列编码成隐藏状态,解码器则生成输出序列。这些操作都通过多个堆叠的注意力层和前馈网络层实现
位置编码:因为 Transformer 模型不具有内置的顺序处理机制(不像 RNN 有时间步概念),因此它依赖 位置编码(Positional Encoding) 为输入数据注入序列位置信息。位置编码通过正弦和余弦函数生成,向模型提供相对和绝对位置信息
image.png
所以,其实Transformer就是四个部分:

  1. 输入部分
  2. 输出部分
  3. 编码器部分
  4. 解码器部分

2.2、输入部分

  1. 源文本嵌入层及其位置编码器
  2. 目标文本嵌入层及其位置编码器

2.3、输出部分包含

  1. 线性层
  2. softmax层

2.4、编码器部分

2.4.1、总览

  1. 由N个编码器层堆叠而成
  2. 每个编码器层由两个子层连接结构组成
  3. 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
  4. 第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接


下面进行详细拆分。

2.4.2、详细拆分

左侧是传统的Encoder,使用RNN或者CNN实现,
右侧则是Transformer的Encoder架构:
image.png
对右侧的图先做一个简单的介绍:

  1. 输入嵌入 ( Input Embedding):Transformer 的输入序列首先通过嵌入层(Input Embedding)被转换为向量表示,这类似于传统编码器中的词嵌入。
  2. 位置编码 ( Positional Encoding):Transformer 没有像 RNN 那样的内在顺序处理机制,因此需要显式地添加位置信息。位置编码被加到输入嵌入上,使得模型能够感知输入序列中元素的位置。
  3. 多头注意力机制 ( Multi-Head Attention):核心组件之一是多头注意力机制,它允许模型在每个位置上都可以关注输入序列的所有其他位置。这种机制使得 Transformer 可以捕捉序列中的全局依赖关系,而不依赖于序列的顺序处理。
  4. 前馈神经网络 ( Feed Forward):在注意力机制之后,每一层还有一个前馈神经网络,对每个位置的表示进行进一步的非线性变换。
  5. 层归一化和残差连接 ( Add & Norm):每个多头注意力和前馈网络层之后,都有一个层归一化操作和残差连接。这些操作有助于稳定训练过程,避免梯度消失或爆炸。
  6. 重复 N 次 ( Nx):Transformer 编码器通常由多个这样的层堆叠而成,每层都包含多头注意力机制和前馈神经网络。N 表示层数,通常设置为 6 或 12 层。

每一个transformer的Encoder经历输入到输出的中间过程,可能是有多个Block组成的,这里的Block可以理解为“不止一个网络层”:
image.png
下面这个图片展示残差连接(Residual Connection)层归一化(Layer Normalization):

image.png

  1. 残差连接(Residual Connection)
    1. 定义:残差连接是一种技术,在模型中将输入直接传递到后续层,与后续层的输出相加。这种连接方式最早在 ResNet(残差网络)中被提出,目的是解决深层神经网络中的梯度消失问题,保持信息流通顺畅。
    2. 图中表示
      1. ab: 图中 ab 代表两个操作的输出。例如,a 可能是自注意力层的输出,b 可能是输入或其他层的输出。通过将 ab 相加(表示为 a + b),实现了残差连接。
      2. 这种相加操作使得模型能够直接学习到与输入相关的特征,而不仅仅是学习输入的变换。这有助于模型在训练时更容易优化,并在深层结构中保持性能稳定。
  2. 层归一化(Layer Normalization, Layer Norm)
    1. 定义: 层归一化是对输入进行标准化处理,使得输入在每一层中具有相同的分布。具体来说,对于每个神经元的输入,它会减去其均值并除以标准差,然后乘以一个缩放因子并加上一个偏量,以确保不同层之间有较好的协同工作。
    2. 公式:层归一化的公式是: x i ′ = x i − m σ x_i' = \frac{x_i - m}{\sigma} xi=σxim其中, x i x_i xi 是输入, m m m 是均值, σ \sigma σ 是标准差, x i ′ x_i' xi 是归一化后的输出。
    3. 图中表示:在图中,层归一化位于残差连接后的步骤,它将相加后的结果(a + b)进行标准化。这一操作有助于稳定训练过程,尤其是在深层模型中,避免梯度消失或梯度爆炸。

2.5、解码器部分

2.5.1、总览

  1. 由N个解码器层堆叠而成
  2. 每个解码器层由三个子层连接结构组成
  3. 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
  4. 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接
  5. 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接

2.5.2、详细拆分

Transformer当中的Decoder有一个非常重要的模式,那就是 自回归(Autoregressive, AT) 模式。

  1. 自回归生成:自回归模式意味着解码器一次生成序列中的一个元素,并且每个元素的生成都依赖于前面已经生成的元素。例如,在生成翻译句子时,生成下一个单词时会基于之前生成的单词。
  2. 输入与输出
    1. 输入序列(Input Sequence):这是输入到编码器的原始序列,例如一个句子的单词。
    2. 输出序列(Output Sequence):解码器生成的目标序列,例如目标语言的翻译句子。
  3. 解码器的工作过程逐步生成:解码器在生成第一个词后,将其作为输入的一部分,用来生成第二个词,依此类推,直到生成完整的序列。这种逐步生成的方式使得解码器的每一步都可以考虑前面已经生成的内容,从而更好地捕捉序列间的依赖关系。

先输入一个开始标记,然后接下来的每一个输出,都是下一个的输入:
image.png
如果放任它挨个往下输出:
image.png
所以最后需要输出一个结束标记,完成本次的Decoder解码:
image.png
如果把Decoder架构中间的跟Encoder交互的那一部分先遮掉,我们可以发现,剩下部分的Decoder和Encoder架构并无明显差别(但是也并不相同):
image.png
可以看到标红色框的地方,二者的区别就是,Encoder采用的是Multi-Head Attention,而Decoder采用的是Masked Multi-Head Attention。
那么它们有何区别呢?请往下看:
首先是Self-attention的,非常熟悉了:
image.png
那么为何需要Masked Multi-Head Attention,这需要从Decoder的工作原理入手:
image.png
前面提到了Decoder是挨个输入挨个输出的,它这里跟Self-attention最大的区别就是:self-attention可以同时考虑所有内容,来进行下一步判断,而这里的Decoder并不行;
所以就有了Masked Multi-Head Attention!
Masked Multi-Head Attention主要用于在生成序列时防止信息泄露(即模型在生成一个词时,不能提前看到后续的词)。这是实现自回归生成模式的关键技术。
也就是说,它考虑的是它本身以及前面输出过的内容,对于后续内容它不做考虑也无法考虑!

3、为什么说Transformer可以代替seq2seq?

3.1、seq2seq的两大缺陷

  1. seq2seq架构的第一大缺陷是将Encoder端的所有信息压缩成一个固定长度的语义向量中, 用这个固定的向量来代表编码器端的全部信息. 这样既会造成信息的损耗, 也无法让Decoder端在解码的时候去用注意力聚焦哪些是更重要的信息.
  2. seq2seq架构的第二大缺陷是无法并行, 本质上和RNN/LSTM无法并行的原因一样.

3.2、Transformer的改进

Transformer架构同时解决了seq2seq的两大缺陷, 既可以并行计算, 又应用Multi-head Attention机制来解决Encoder固定编码的问题, 让Decoder在解码的每一步可以通过注意力去关注编码器输出中最重要的那些部分.

4、对于AT和NAT

image.png


这张图片对比了 自回归解码器(Autoregressive Transformer, AT)非自回归解码器(Non-Autoregressive Transformer, NAT) 两种解码器在序列生成任务中的不同之处。它们都是用于生成序列(如文本)的模型,但在生成方式上存在显著差异。

4.1、AT Decoder(自回归解码器)

  1. 工作方式
    1. 自回归解码器是逐步生成输出序列的。在每一步中,解码器根据前一步生成的输出来预测当前步的输出。
    2. 例如,生成第一个词 w1 后,模型将 w1 作为输入,用来生成第二个词 w2。生成 w2 后,再用 w1w2 作为输入来生成 w3,依此类推,直到生成特殊标记 END 表示序列结束。
  2. 图示
    1. 图中 START 表示解码器的初始输入,通常是一个特殊的开始标记。
    2. 解码器逐步生成 w1w2w3 等词,并最终生成 END,表示序列结束。
  3. 优点
    1. 高质量生成:由于每一步生成时都参考了前面的生成结果,生成的序列通常连贯性更好,质量更高。
    2. 灵活性:可以处理不同长度的输出序列,并且能很好地捕捉词与词之间的依赖关系。
  4. 缺点
    1. 生成速度慢:由于每一步都依赖于前一步的结果,生成过程无法并行化,尤其在处理长序列时,速度较慢。

4.2、NAT Decoder(非自回归解码器)

  1. 工作方式
    1. 非自回归解码器在生成序列时,所有词汇可以同时生成,而不需要依赖之前生成的词。这种并行生成的方式极大地加快了生成速度。
    2. 解码器直接根据输入(如编码器的输出)生成整个序列,所有位置上的词汇在同一时间生成。
  2. 图示
    1. 图中 START 表示解码器的初始输入,非自回归解码器为每个位置都提供了相同的起始标记,或者一些固定的输入,之后并行生成整个序列 w1, w2, w3, w4 等。
    2. 在这种模式下,解码器不需要等待前一步的输出即可生成每一步的词汇。
  3. 优点
    1. 生成速度快:由于生成过程是并行化的,非自回归解码器的生成速度比自回归解码器快得多。这在实时应用中(如文本到语音合成,TTS)非常有优势。
    2. 稳定性:在某些任务(如 TTS)中,非自回归解码器的并行生成方式可以提供更稳定的生成结果。
  4. 缺点
    1. 质量问题:由于每个词的生成是独立的,非自回归解码器难以捕捉词与词之间的依赖关系,容易出现生成质量较低或不连贯的问题。
    2. 多模态问题(Multi-modality):在生成过程中,由于词与词之间的独立性,非自回归解码器可能在相同的上下文下生成多种可能的序列,导致生成的不确定性增大。

4.3、细节讨论

  1. 如何确定 NAT 解码器的输出长度
    1. 长度预测器:需要一个额外的模型或模块来预测输出序列的长度。
    2. 生成超长序列:另一种策略是生成一个非常长的序列,然后丢弃多余的部分,直到遇到 END 标记。
  2. AT 和 NAT 的对比
    1. AT 通常在生成质量上优于 NAT,特别是在生成需要考虑上下文和依赖关系的任务上,如机器翻译。
    2. NAT 的优势在于速度,在对生成速度要求高的应用(如 TTS)中有明显的优势。

4.4、小结

  1. 自回归解码器(AT):依赖于前面生成的词汇,逐步生成整个序列,生成质量较高但速度较慢。
  2. 非自回归解码器(NAT):所有词汇同时生成,生成速度极快,但在捕捉上下文依赖和生成连贯性上存在挑战,通常生成质量较低。

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

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

相关文章

前沿重器[55] | prompt综述的解释和个人思考

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

输入名字和链接转换成对象

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>输入名字和链接转换成对象</title> </he…

Open3D 基于曲率条件的滤波(37)

Open3D 基于曲率条件的滤波&#xff08;37&#xff09; 一、算法介绍二、算法实现1.代码2.效果 一、算法介绍 曲率是描述曲面或曲线弯曲程度的数学量。在三维空间中&#xff0c;曲率可以用于分析点云数据的几何特征。通常&#xff0c;较小的曲率值表明该点位于相对平坦的区域&…

文章中的错字一并替换成正确的字

with open("文件路径"&#xff0c;"模式"&#xff0c;"编码") as file ("r" 是读&#xff0c;"w"是写) with open(r"D:\python-installer\python-code\pythonProject\src\关于文件操作练习/人物介绍.txt",&quo…

爆改YOLOv8 | 利用MB-TaylorFormer提高YOLOv8图像去雾检测

1&#xff0c;本文介绍 MB-TaylorFormer是一种新型多支路线性Transformer网络&#xff0c;用于图像去雾任务。它通过泰勒展开改进了softmax-attention&#xff0c;使用多支路和多尺度结构以获取多层次和多尺度的信息&#xff0c;且比传统方法在性能、计算量和网络重量上更优。…

拉取Github仓库错误

说明&#xff1a;记录一次拉取github仓库时&#xff0c;报下面的错误 $ git clone https://github.com/LamSpace/data-plus.git Cloning into data-plus... fatal: unable to access https://github.com/LamSpace/data-plus.git/: SSL certificate problem: unable to get loc…

windows本地搭建zookeeper和kafka环境

zookeeper 1.1 下载zookeeper 下载地址 随便进一个站点&#xff0c;默认是新版本&#xff0c;旧版本点击archives进入&#xff0c;选择合适的版本下载&#xff0c;本文使用的是3.7.2 下载时候选择apache-zookeeper-3.7.2-bin.tar.gz 格式的&#xff0c;编译后的&#xff0c;解…

Overleaf参考文献由 BibTex 转 \bibitem 格式

目录 Overleaf参考文献由 BibTex 转 \bibitem 格式一、获取引用论文的BibTex二、编写引用论文对应的bib文件三、编写生成bibitem的tex文件四、转化bibitem格式 参考资料 Overleaf参考文献由 BibTex 转 \bibitem 格式 一、获取引用论文的BibTex 搜索论文引用点击BibTex 跳转出…

Ps:首选项

Photoshop 的“首选项” Preferences是一个集中的设置面板&#xff0c;允许用户根据自己的工作流程和个人喜好来定制软件的行为和界面。 Windows&#xff1a; Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K macOS&#xff1a; Ps菜单&#xff1a;…

市域社会治理解决方案

1. 建设背景与政策解读 市域社会治理现代化是响应党的十九届四中全会《决定》和中央政法委秘书长陈一新的指示&#xff0c;旨在加强和创新社会治理&#xff0c;构建和谐社会。通过“综治中心网格化信息化”模式&#xff0c;提升基层社会治理能力&#xff0c;确保社会安定有序。…

一道ssrf题目--Web-ssrfme

目录 环境搭建 代码分析 漏洞点寻找 渗透 使用工具构造payload 结果 ​编辑 环境搭建 使用docker拉取上面文件 rootubuntu:~/web-ssrfme/web-ssrfme# docker-compose up -d代码分析 首先进入题目环境&#xff0c;查看docker发现在8091端口下&#xff0c;进入后出现这…

基于ssm+vue的前后端分离鲜花销售系统

系统背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#xff0c;不接受…

Springboot里集成Mybatis-plus、ClickHouse

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Springboot里集成Mybati…

第2章-09-浏览器同源策略及跨域

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

RPA自动化流程机器人助力企业财务数字化转型

在数字经济时代&#xff0c;企业需要快速响应市场变化&#xff0c;而财务数字化转型是企业适应现代商业环境、提升竞争力的必要步骤。财务数字化转型不仅涉及企业财务能力的提升&#xff0c;推动了财务管理与决策模式的转变。RPA自动化流程机器人因其能通过自动化技术帮助企业实…

【Hot100】LeetCode—200. 岛屿数量

目录 1- 思路DFS 深搜 2- 实现⭐200. 岛屿数量——题解思路 3- ACM 思路 题目连接&#xff1a;200. 岛屿数量 1- 思路 DFS 深搜 在遍历中对 res 结果进行 操作 。遇到一个陆地结果为 1 的地方&#xff0c; 就将他们直接填充为 0 思路 ① 先遍历&#xff0c;收集 res② 之后…

Springboot打包、部署

一、导入maven打包插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build> 二、执行打包操作&#xff08;…

【消息中间件】RabbitMQ

1 基础篇 1.1 为什么需要消息队列 1.2 什么是消息队列 1.3 RabbitMQ简介 1.4 RabbbitMQ安装 一、安装 # 拉取镜像 docker pull rabbitmq:3.13-management# -d 参数&#xff1a;后台运行 Docker 容器 # --name 参数&#xff1a;设置容器名称 # -p 参数&#xff1a;映射端口号…

MFC对话框程序界面UI优化Demo

目录 1. 修改MFC对话框背景色 1.1 在对话框头文件中申明画刷对象 1.2 在对话框源文件中OnInitDialog()函数中创建画刷对象 1.3 重载OnCtlColor&#xff0c;即WM_CTLCOLOR消息 2 修改文本框等控件的背景色、文字颜色 3 修改文本框等控件的字体大小 4 修改按钮控件的背景色…

在DDD中应用模式

深层模型和柔性设计并非唾手可得。要想取得进展&#xff0c;必须学习大量领域知识并进行充分的讨论&#xff0c;还需要经历大量的尝试和失败。但有时我们也能从中获得一些优势。一位经验丰富的开发人员在研究领域问题时&#xff0c;如果发现了他所熟悉的某种职责或某个关系网&a…