当前位置: 首页 > news >正文

大模型基础BERT——Transformers的双向编码器表示

大模型基础BERT——Transformers的双向编码器表示

整体概况

BERT:用于语言理解的深度双向Transform的预训练
论文题目:BERT: Pre-training of Deep Bidirectional Transformers for
Language Understanding
Bidirectional Encoder Representations from Transformers.
概括:这篇文章在摘要部分说明了其参考的主要的文章就是ELBO和GPT的相关工作。

  1. BERT 模型只需一个额外的输出层即可进行微调,从而为各种任务(例如问答和语言推理)创建最先进的模型,而无需对特定于任务的架构进行大量修改

  2. 和论文的标题要对应起来预训练最早我们使用的是词嵌入来做模型的预训练的任务的,当然后面GPT系列的文章。

  3. 做预训练任务的时候主要有两种方式例如ELBO基于特征的方式,和BERT基于微调的方式。(GPT)感觉就像是迁移学习

  4. 受完形填空任务启发,通过使用“掩码语言模型”(MLM)预训练目标来实现前面提到的单向性约束(Taylor,1953)。

词嵌入wordembing(word2vec)

在进一步学习自然语言处理之前,因为自己之前主要研究的是cv的方向,因此对自然语言处理缺乏足够的知识去学习。在学习双向编码器之前需要先学习一些NLP的基础知识。

在这里插入图片描述

在自然语言处理中: 词是意义的基本单元。顾名思义, 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。 近年来,词嵌入逐渐成为自然语言处理的基础知识

在NLP领域构建词向量的过程中,我们如果使用独热编码的方式来进行词向量的构建是一个不好的方式。

  • 独热向量很容易构建,但它们通常不是一个好的选择。一个主要原因是独热向量不能准确表达不同词之间的相似度,比如我们经常使用的“余弦相似度”

  • 由于任意两个不同词的独热向量之间的余弦相似度为0,所以独热向量不能编码词之间的相似性。

x ⊤ y ∥ x ∥ ∥ y ∥ ∈ [ − 1 , 1 ] . \frac{\mathbf{x}^{\top} \mathbf{y}}{\|\mathbf{x}\|\|\mathbf{y}\|} \in[-1,1] . x∥∥yxy[1,1].

我们通过词嵌入的技术可以将onehot编码下的高维稀疏向量,转化为低维且连续的向量。

然后我们这一部分学习的就是常用的词嵌入算法 ——word2vec的技术。通过特定的词嵌入算法,如word2vec、fasttext、Glove等训练一个通用的嵌入矩阵

在这里插入图片描述

word2vec工具是为了解决上述问题而提出的。它将每个词映射到一个固定长度的向量,这些向量能更好地表达不同词之间的相似性和类比关系

嵌入矩阵的行,是语料库中词语的个数,矩阵的列是表示词语的维度

在这里插入图片描述
5000个单词每个单词都使用128维度的向量来进行表示。

在这里插入图片描述

主要包括了两个部分组成。训练依赖于条件概率

  • 跳元模型(skip-gram)
  • 连续词袋(CBOW)

跳元模型(Skip-Gram)

跳元模型假设一个词可以用来在文本序列中生成其周围的单词。以文本序列“the”“man”“loves”“his”“son”为例。假设中心词选择“loves”,并将上下文窗口设置为2。

给定中心词“loves”,跳元模型考虑生成上下文词“the”“man”“him”“son”的条件概率:

在这里插入图片描述

P("the","man","his","son" | "loves").  \text { P("the","man","his","son" | "loves"). }  P("the","man","his","son" | "loves"). 

假设上下文词是在给定中心词的情况下独立生成的(即条件独立性)。在这种情况下,上述条件概率可以重写为:

P ( "the" | "loves")  ⋅ P ( "man" | "loves")  ⋅ P ( "his" | "loves"  ) ⋅ P ( "son" | "loves")  P(\text { "the" | "loves") } \cdot P(\text { "man" | "loves") } \cdot P(\text { "his" | "loves" }) \cdot P(\text { "son" | "loves") } P( "the" | "loves") P( "man" | "loves") P( "his" | "loves" )P( "son" | "loves") 

也就是要设置好窗口的长度。设置好窗口的长度后,需要根据目标词,预测窗口内的上下文词:

在这里插入图片描述

在这里我们抛开公式来解释一下这一个跳元模型的建模的思想是什么?

也就是:Skip-gram在迭代时。

  • 调整词向量使目标词的词向量与其上下文的词向量尽可能的接近。
  • 使目标词的词向量与非上下文词的词向量尽可能的远离。

在这里插入图片描述
这里我们的建模的思想就是给定一个词向量,我们希望这样建模也就是:上下文词的词向量相似与非上下文词的词向量不相似。那么我们的词向量就能捕获词语之间的语义关系。

之后我们需要提出的问题就是,如何判断两个词向量是否相似呢?这里就是给定两个词向量,我们与Transform中一样使用点积来判断两个词向量之间的相似性。

A ⋅ B = a 1 b 1 + a 2 b 2 + … + a n b n A = ( a 1 , a 2 , … , a n ) B = ( b 1 , b 2 , … , b n ) \begin{array}{l} A \cdot B=a 1 b 1+a 2 b 2+\ldots+a n b n \\ A=(a 1, a 2, \ldots, a n) \\ B=(b 1, b 2, \ldots, b n) \end{array} AB=a1b1+a2b2++anbnA=(a1,a2,,an)B=(b1,b2,,bn)

向量的点积:衡量了两个向量在同一方向上的强度点积越大:两个向量越相似,它们对应的词语的语义就越接近。

在这里插入图片描述

跳元网络结构

Skip-Gram网络模型是一个神经网络。它主要是包括了

  • in_embedding和out_embedding两个嵌入层组成。
  • 向该神经网络输入一个目标词之后。
  • 模型会返回一个词表大小的分布情况。

词汇表中的每个词是目标词的上下文的可能性

在这里插入图片描述

词表中的词,与目标词有两种关系上下文词:正样本,标记为1非上下文词:负样本,标记为0

给定中心词w(词典中的索引lc),生成任何上下文词w。(词典中的索引lo)的条件概率可以通过对向量点积的softmax操作来建模:

P ( w o ∣ w c ) = exp ⁡ ( u o ⊤ v c ) ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) P\left(w_{o} \mid w_{c}\right)=\frac{\exp \left(\mathbf{u}_{o}^{\top} \mathbf{v}_{c}\right)}{\sum_{i \in \mathcal{V}} \exp \left(\mathbf{u}_{i}^{\top} \mathbf{v}_{c}\right)} P(wowc)=iVexp(uivc)exp(uovc)

在这里插入图片描述

整体的模型得到的词表概率分布的公式如下所示:

∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) \prod_{t=1}^{T} \prod_{-m \leq j \leq m, j \neq 0} P\left(w^{(t+j)} \mid w^{(t)}\right) t=1Tmjm,j=0P(w(t+j)w(t))

网络训练

跳元模型参数是词表中每个词的中心词向量和上下文词向量。在训练中,我们通过最大化似然函数(即极大似然估计)来学习模型参数。这相当于最小化以下损失函数:

指定窗口长度为m,同时词向量的长度为T

− ∑ t = 1 T ∑ − m ≤ j ≤ m , log ⁡ P ( w ( t + j ) ∣ w ( t ) ) -\sum_{t=1}^{T} \sum_{-m \leq j \leq m,} \log P\left(w^{(t+j)} \mid w^{(t)}\right) t=1Tmjm,logP(w(t+j)w(t))

这里就可以使用随机梯度下降来最小化损失函数的值。

连续词袋(CBOW)模型

CBOW连续词袋模型 Continuous Bag of Words与刚刚说过的跳元模型相比是一个相反的过程了。

在这里插入图片描述
假设将我们的窗口长度设置为2以后,就有如下的推导关系了。

在这里插入图片描述

连续词袋模型假设中心词是基于其在文本序列中的周围上下文词生成的。例如,在文本序列“the”“man”“loves”“his”“son”中,在“loves”为中心词且上下文窗口为2的情况下,连续词袋模型考虑基于上下文词“the”“man”“him”“son”

在这里插入图片描述

P ( "loves" | "the","man","his","son").  P(\text { "loves" | "the","man","his","son"). } P( "loves" | "the","man","his","son"). 

CBOW的网络结构

我们按照这个顺序继续向下推导直到整个句子推导结束的时候在停止。

CBOW模型同样也是一个神经网络模型,该神经网络会接收上下文词语将上下文词语转换为最有可能得目标词。

在这里插入图片描述

我们将这个网络模型在进一步的进行细化进行解释。我们将其中每一个部分的蓝色部分单独的拿出来其中蓝色的部分就是我们的嵌入矩阵,也就是之前提到的N x V的部分。 其输出的结果就是一个词向量。

然后:由于某个词的上下文中,包括了多个词语这些词语会同时输入至embeddings层每个词语都会被转换为一个词向量

embeddings层的输出结果:是一个将语义信息平均的向量V

v = ( v 1 + v 2 + v 3 + v 4 ) / 4 v=(v 1+v 2+v 3+v 4) / 4 v=(v1+v2+v3+v4)/4

在这里插入图片描述

在这里插入图片描述

最后一步我们将所有词向量得到的平均值输入到最后的线性层中,通过最后的激活函数就可以得到需要预测的词了。整个过程就可以如下所示。概率最大的词就是我们的输出结果了。

在这里插入图片描述

按照和上面同样的思想我们就可以采用如下的方式来进行数学上的建模操作。

P ( w c ∣ w o 1 , … , w o 2 m ) = exp ⁡ ( 1 2 m u c ⊤ ( v o 1 + … , + v o 2 m ) ) ∑ i ∈ V exp ⁡ ( 1 2 m u i ⊤ ( v o 1 + … , + v o 2 m ) ) P\left(w_{c} \mid w_{o_{1}}, \ldots, w_{o_{2 m}}\right)=\frac{\exp \left(\frac{1}{2 m} \mathbf{u}_{c}^{\top}\left(\mathbf{v}_{o_{1}}+\ldots,+\mathbf{v}_{o_{2 m}}\right)\right)}{\sum_{i \in \mathcal{V}} \exp \left(\frac{1}{2 m} \mathbf{u}_{i}^{\top}\left(\mathbf{v}_{o_{1}}+\ldots,+\mathbf{v}_{o_{2 m}}\right)\right)} P(wcwo1,,wo2m)=iVexp(2m1ui(vo1+,+vo2m))exp(2m1uc(vo1+,+vo2m))

在这里插入图片描述

P ( w c ∣ W o ) = exp ⁡ ( u c ⊤ v ‾ o ) ∑ i ∈ V exp ⁡ ( u i ⊤ v ‾ o ) . P\left(w_{c} \mid \mathcal{W}_{o}\right)=\frac{\exp \left(\mathbf{u}_{c}^{\top} \overline{\mathbf{v}}_{o}\right)}{\sum_{i \in \mathcal{V}} \exp \left(\mathbf{u}_{i}^{\top} \overline{\mathbf{v}}_{o}\right)} . P(wcWo)=iVexp(uivo)exp(ucvo).

BERT的由来

BERT的由来本质上来自于NLP领域迁移学习的思考。使用预训练好的模型来抽取词、句子的特征 例如word2vec

最后我们就可以将整个的建模过程表示如下了:

∏ t = 1 T P ( w ( t ) ∣ w ( t − m ) , … , w ( t − 1 ) , w ( t + 1 ) , … , w ( t + m ) ) \prod_{t=1}^{T} P\left(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}\right) t=1TP(w(t)w(tm),,w(t1),w(t+1),,w(t+m))

然而对于我们的一个新的任务来说需要构建新的网络来抓取新任务需要的信息Word2vec忽略了时序信息,语言模型只看了一个方向。

在这里插入图片描述

在CV方向上迁移学习有广泛的应用这里我自己举一个例子:例如在许多的网络中我们的backbone都使用的是预训练好的restnet50的权重,并且在网络训练的过程中会冻结这部分权重不需要在调整或者进行新的训练了。

同样NLP是否可以:基于微调的NLP模型预训练的模型抽取了足够多的信息新的任务只需要增加一个简单的输出层。

它就是一个只要Transform编码器的部分—只保留编码器的部分。它是第一个在NLP领域做的很大的网络,并且使用了很大的一个数据集,可以看作是大模型的一个前置的基础了

基础架构

BERT: 主要使用的是Transform的编码器的部分。也就是左半部分所以整个完整的结构理解起来还是挺容易的。

这里提到了是Transform的双向编码器的表示方式:也就是在自注意力机制中,每个词元都与其他所有词元计算注意力分数,这意味着每个词元在编码时都能获取到整个序列的信息。这种机制允许模型在编码时同时考虑前文和后文的信息,从而实现双向处理。

但是我们的Transform的Decode部分通常是单项的部分了,主要的原因是:在自然语言处理中,解码器通常用于生成文本,例如在机器翻译、文本摘要或问答系统中生成回答。在这些任务中,解码器需要根据已经生成的文本来预测下一个词元,而不能利用未来的信息。

在这里插入图片描述

我们的编码器部分主要包括了三个部分组成,其中BERT base是堆叠了12个编码器,而BERT large部分主要是堆叠了24个编码器部分。

  • 输入部分
  • 注意力机制部分
  • 前馈神经网络的部分

BERT和Transform的主要的区别在什么地方呢?

  1. Transform是由6个encode部分堆叠起来构成编码端,6个decode部分构成了解码端。

在这里插入图片描述

  1. 在编码方式上存在不同之处,Transform主要使用的是位置编码也就是正余弦的三角函数编码,而BERT采用的是

Input=token emb+ segment emb+ position emb

在这里插入图片描述

在我们的Transform的结构中,例如机器翻译的任务我们的句子要从source(原句子)经过encode的部分到target,在将得到的targets输入到decode部分中进行解码。同步的输出翻译的句子

这里的改进主要的就是想:如何通过新的编码的方式只使用encode完成

在这里插入图片描述

上面解释了我们的BERT是一个预训练的任务,也就是要实现通用的功能呀

论文中也提到了BERT主要包括了两个步骤预训练微调

在这里插入图片描述

如何做预训练

BERT的预训练主要包括了两个部分,主要是MLM+NSP :掩码语言模型+ 判断两个句子之间的关系。

BERT在预训练的时候使用的是大量的无标记的预料来进行的。(考虑通过无监督来去做。)

MLM:

在这里要考虑到两种无监督的目标函数。AR模型和AE模型

  • AR:auto regressive,自回归模型;只能考虑单侧的信息,典型的就是GPT。

在这里插入图片描述

自回归模型(Autoregressive Model,简称AR模型)是时间序列分析中的一种常用模型,它假设一个时间序列的未来值可以通过其过去值的线性组合来预测。自回归模型基于这样的假设:一个变量的当前值可以作为其过去值的函数来预测。

  • AE:auto encoding,自编码模型;从损坏的输入数据中预测重建原始数据。可以使用上下文的信息,Bert就是使用的AE

在这里插入图片描述

预训练任务一:MLM

带掩码的语言模型(Masked Language Model, MLM)是一种特殊的预训练任务,它通过随机地将输入文本中的一些词元替换为特殊的掩码标记(如mask),然后让模型预测这些被掩码的词元 。

受完形填空任务启发,通过使用“掩码语言模型”(MLM)预训练目标来实现前面提到的单向性约束(Taylor,1953)其实也就是说在做完型填空的时候不能只看一侧而应该关注左右两边的信息。

这种训练方式使得模型能够学习到词汇之间的语义关系和上下文依赖。在BERT等模型中,这种掩码策略通常包括将80%的词汇被替换为MASK,10%被替换为随机词汇,剩余10%保持不变 。这样的随机替换策略既保证了模型能够学习到足够的上下文信息,又避免了模型过度依赖MASK标记而忽略真实的词汇信息 。

在这里插入图片描述

预训练任务二:下一句子预测NSP

NSP:

NSP的样本如下:

  1. 从训练语料库中取出两个连续的段落作为正样本
  2. 从不同的文档中随机创建一对段落作为负样本

也就是预测:预测一个句子对中两个句子是不是相邻的这一个任务了。

也就是让我们的训练样本中:50%概率选择相邻句子对:50%概率选择随机句子对:将对应的输出放到一个全连接层来预测。

最后需要解释的就是我们输入的token序列对是如何进行的它包含的两个字符[CLS]和[SEP]的两个部分。

  1. 每个序列的标记始终是一个特殊的分类标记([CLS])
  2. 句子对被打包成一个序列。 我们以两种方式区分句子。 首先,我们用一个特殊的标记([SEP])将它们分开。

在这里插入图片描述

下面的这个图就是我们嵌入层的一个关系图也就是之前提到的编码方式。

在这里插入图片描述

  • Input:作为词嵌入层的一个输入属于是这里的[CLS]是用于NSP任务的一个标志词[SEP]用来将两个句子断开。

  • 第二部分的Segment Embeddings层这里将我们的第一个句子的编码EA设置为0,第二个部分的编码设置为1即可

  • 第三部分是位置编码的部分:这里是随机初始化让我们的模型自己学习出来

微调

更多的情况下我们不会去预训练一个BERT的模型而是使用大公司给我们预训练模型并在此基础上进行微调的操作。

也就是如何更好的将我们的BERT应用到下游的任务中去。

这里的微调就是:

  1. 在相同领域 上继续训练LM (Domain transfer)
  2. 在任务相关的小数据上继续训练LM(Tasktransfer)

相关文章:

大模型基础BERT——Transformers的双向编码器表示

大模型基础BERT——Transformers的双向编码器表示 整体概况 BERT:用于语言理解的深度双向Transform的预训练 论文题目:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Bidirectional Encoder Representations from…...

怎么禁止Ubuntu自动更新升级

怎么禁止Ubuntu自动更新升级 笔者在做MIT 6.S081的时候发现他给我的qemu自动更新了又卡住了,故关闭了自动更新 文章目录 怎么禁止Ubuntu自动更新升级一、图形化修改二、基于命令行修改配置文件的方法 一、图形化修改 1.打开设置->软件和更新->更新 2.选择自…...

【SpringBoot】20 同步调用、异步调用、异步回调

Git仓库 https://gitee.com/Lin_DH/system 介绍 同步调用:指程序在执行时,调用方需要等待函数调用返回结果后,才能继续执行下一步操作,是一种阻塞式调用。 异步调用:指程序在执行时,调用方在调用函数后立…...

【Excel】数据透视表分析方法大全

数据透视表的最常用的功能是分类汇总,其实它还有很强大的数据分析功能。在数据透视表右键菜单的值显示方式中,可以看到有14个很实用的分析选项。 1、总计的百分比 作用:透视表中每一个数字(包括汇总行、总计行)占右…...

深度学习在边缘检测中的应用及代码分析

摘要: 本文深入探讨了深度学习在边缘检测领域的应用。首先介绍了边缘检测的基本概念和传统方法的局限性,然后详细阐述了基于深度学习的边缘检测模型,包括其网络结构、训练方法和优势。文中分析了不同的深度学习架构在边缘检测中的性能表现&am…...

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…...

常用的生物医药专利查询数据库及网站(很全!)

生物医药专利信息检索是药物研发前期不可或缺的一步,通过对国内外生物医药专利网站信息查询,可详细了解其专利技术,进而有效降低药物研发过程中的风险。 目前主要使用的生物医药专利查询网站分为两大类,一个是免费生物医药专利查询…...

「QT」几何数据类 之 QPolygon 多边形类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

写给初学者的React Native 全栈开发实战班

React Native 全栈开发实战班 亲爱的同学们: 很高兴在这里与大家相聚!我是你们的讲师,将带领大家一起踏上 React Native 移动开发的学习之旅。 为什么选择 React Native? 在这个移动互联网时代,App 开发工程师已经…...

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1:Ubuntu TSL换源报错:Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作(已经操作的则忽略),首先在文件/etc/apt/sources…...

如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践

案例背景 某保险机构客户的数据中台,自系统上线后不久,会定期的用 obload 工具从上游业务系统导入数据至OceanBase数据库。但,不久便遇到了应用服务器的 Memory 与 CPU 资源占用持续攀升,最终导致系统夯住而不可用的异常。 memo…...

Git零基础到入门

一、开始工作区 clone: 克隆一个仓库到新的目录。 git clone https://github.com/username/repository.git init: 创建一个新的空 Git 仓库或重新初始化现有的仓库,新建git项目。 //创建项目两种方式 //一、本地项目自己创建项目,先创建好工作文件夹,通…...

HTTP 1.0、HTTP 1.1 和 HTTP 2.0 区别

HTTP 1.0、HTTP 1.1 和 HTTP 2.0 是超文本传输协议(HTTP)不同版本的规范,各自进行了多项更新和改进: 1. HTTP/1.0 单一请求-响应:每次请求都需要建立一个新的 TCP 连接,完成后立即断开。无状态连接&#…...

解决 ElSelect 数据量大导致加载速度慢

遇到一个性能相关的问题&#xff0c;使用 Element Plus 的 <ElSelect> 组件在数据量很大时&#xff0c;加载速度变慢。 下面简单分析下原因&#xff0c;并提供了一些解决方法。 1. 问题分析 1、大量 DOM 节点渲染 问题&#xff1a;当数据量非常大时&#xff0c;每一个…...

在 CentOS 系统中,您可以使用多种工具来查看网络速度和流量

在 CentOS 系统中&#xff0c;您可以使用多种工具来查看网络速度和流量 在 CentOS 系统中&#xff0c;您可以使用多种工具来查看网络速度和流量1. 使用 iftop安装 iftop使用 iftop 2. 使用 nload安装 nload使用 nload 3. 使用 vnstat安装 vnstat初始化 vnstat查看流量 4. 使用 …...

分布式----Ceph部署

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…...

使用 PyTorch 实现 AlexNet 进行 MNIST 图像分类

AlexNet 是一种经典的深度学习模型&#xff0c;它在 2012 年的 ImageNet 图像分类比赛中大放异彩&#xff0c;彻底改变了计算机视觉领域的格局。AlexNet 的核心创新包括使用深度卷积神经网络&#xff08;CNN&#xff09;来处理图像&#xff0c;并采用了多个先进的技术如 ReLU 激…...

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识&#xff0c;实现简单的一个小案例&#xff0c;网易云音乐热…...

【Linux】HTTP协议和HTTPS加密

文章目录 HTTP1、概念2、认识URL3、协议格式、请求方法和状态码4、HTTP请求和响应报头5、Cookie和Session HTTPS1、对称和非对称加密2、对称非对称加密安全分析3、证书 HTTP 1、概念 我们在应用层定制协议时&#xff0c;不建议直接发送结构体对象&#xff0c;因为在不同的环境…...

Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式

目录 红帽镜像9救援模式 现象 解决 第一步&#xff1a;修改启动参数以进入救援模式 第二步&#xff1a;进入救援模式、获取root权限、编辑/etc/fstab文件 第三步&#xff1a;编辑好后在重启 下面是ai给的模板 红帽镜像9救援模式 编辑/etc/fstab不当时 17 /dev/nvme0n3p1…...

ubuntu升级postgres

已经有了postgres12&#xff0c;记录一下升级从postgres12升级到15的过程及遇到的一些问题&#xff0c;我没有备份&#xff0c;单纯升级 1、升级过程 深色版本 sudo systemctl stop postgresql 升级PostgreSQL 停止PostgreSQL服务&#xff1a; 停止当前版本的PostgreSQL服务…...

vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结

在 Vue 2 中&#xff0c;如果你想通过 ref 调用一个方法&#xff08;如 inputFocus&#xff09;来聚焦一个输入框&#xff0c;确保以下几点&#xff1a; 确保 ref 的设置正确&#xff1a;你需要确保在模板中正确设置了 ref&#xff0c;并且它指向了你想要操作的组件或 DOM 元素…...

SpringBoot(十七)创建多模块Springboot项目

在gitee上查找资料的时候,发现有不少Springboot项目里边都是嵌套了多个Springboot项目的。这个玩意好,在协作开发的时候,将项目分成多个模块,有多个团队协作开发,模块间定义标准化通信接口进行数据交互即可。 这个好这个。我之前创建的博客项目是单模块的SpringBoot项目,…...

Vue.js 高质量翻页功能的完整开发指南

文章目录 Vue.js 翻页组件的完整开发与优化指南前言分析分页需求与设计要点基础分页功能的实现分页逻辑 优化分页&#xff1a;封装为组件化设计组件化代码 提升用户体验与性能动态调整每页显示的条目数优化移动端与桌面端的展示高性能翻页策略&#xff1a;按需加载与懒加载提示…...

android dvr黑屏

问题现象&#xff1a;dvr拍摄的图片是黑的&#xff0c;没有buffer数据的。 查看相关的log文件发现&#xff1a; video surface 未释放导致 祥见一下报错信息&#xff1a; 38298 2024-10-16 01:02:51.855 4056 32068 W MediaCodecRenderer: java.lang.IllegalStateExcepti…...

css文字间距撑满横向距离

效果&#xff1a; 代码&#xff1a; 、 text-align:justify;text-align-last: justify;...

【Unity基础】对比OnCollisionEnter与OnTriggerEnter

在Unity中&#xff0c;OnCollisionEnter 和 OnTriggerEnter 是两种用于处理碰撞的回调函数&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; 1. OnCollisionEnter 触发条件&#xff1a;当一个带有 Collider 组件并且**未勾选“Is Trigger”**的物体&#xff0c;与…...

算法训练(leetcode)二刷第二十五天 | *134. 加油站、*135. 分发糖果、860. 柠檬水找零、*406. 根据身高重建队列

刷题记录 *134. 加油站*135. 分发糖果860. 柠檬水找零*406. 根据身高重建队列 *134. 加油站 leetcode题目地址 当前站点可以剩余油量gas[i] - cost[i]; 将每站的剩余油量求和计算累计剩余油量&#xff0c;总剩余油量小于0&#xff0c;则无法行驶一周。 若在到达某一站时累计剩…...

Springboot 整合 itext 实现PDF文件合并,识别图片则转成PDF拼接

目录 前言一、引用依赖二、使用步骤1.Controller2.Service接口3.实现类三、请求接口及结果前言 本文实现 Springboot 整合 itext 实现PDF文件合并,图片转PDF拼接。 一、引用依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-co…...

TypeScript 中的 ! 和 ? 操作符

在 TypeScript 中&#xff0c;! 和 ? 是两个非常重要且常用的操作符&#xff0c;分别用于非空断言和可选链操作。下面简单介绍一下二者。 1. 非空断言操作符 ! 1.1 含义 非空断言操作符 !&#xff08;Non-null assertion operator&#xff09;用来告诉 TypeScript 编译器&a…...