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

自监督表征预训练之掩码图像建模

自监督表征预训练之掩码图像建模

前言

目前,在计算机视觉领域,自监督表征预训练有两个主流方向,分别是对比学习(contrastive learning)和掩码图像建模(masked image modeling)。两个方向在近几年都非常火爆,有许多优秀的工作涌现。对比学习方向,有 MoCo 系列、SimCLR 系列、SWaV、SimSiam、DINO 等;掩码图像建模方向,有 BEIT 系列、MAE、CAE 等。本文主要整理几篇掩码图像建模方向的工作。

在自然语言处理领域,BERT 提出的掩码语言建模(masked language modeling)作为一种表征学习预训练方法,已经取得了巨大的成功。那么,在计算机视觉领域,尤其是在 ViT 的提出证明了 Transformer 在 CV 中同样可用之后,掩码建模的预训练方式是否有效呢?

BEiT

前言

ViT 的提出证明了只要经过图像分块和线性映射嵌入, Transformer 同样可以处理图像数据。然而,相较于 CNN,ViT 不存在针对图像数据的归纳偏置,因此通常需要更大的数据来进行训练。为了节省标注的成本,研究者们探索了如何使用自监督的方式对 ViT 进行预训练。对标 BERT 中的掩码语言建模(MLM)训练目标,BEiT(Bidirectional Encoder representation from Image Transformers)提出了掩码图像建模(MIM),使用大量无标注的图像数据,对 ViT 进行自监督表征学习预训练。

要对图像进行掩码,首先想到的就是选择一些像素进行掩码。然而,由于图像中像素信息的冗余性很高,模型通过简单的插值就能大致恢复出被掩码的像素,很难学习到图像的高层语义。那么。是否可以像 BERT 一样,对 token 进行掩码呢?在自然语言中,文本是一种离散的数据形式,所有的单词都存在于一个单词数量有限的词表(vocab)中,而图像中的像素是一种连续的数据形式,可能的像素排列组合数目极其巨大。这使得 MIM 无法直接照搬 MLM 中使用分类头预测被掩码 token 的方式。借鉴 DALL-E 中 dVAE 的做法,BEiT 的解决方案是对图像块进行离散化,需要设计一种方式来构造一种 “视觉词表”。BEiT 的模型结构如图 1 所示。

方法

在这里插入图片描述

图1. BEiT的模型结构

图像表示

BEiT 中每张图像有两个视角(view):图像块(image patchs)和离散的视觉 token(visual tokens)。在预训练阶段,它们分别作为 BEiT Encoder 模型的输入和输出。

  • 图像块

    与标准 ViT 的做法一致,BEiT 将原始图像切分为多个规则的图像块。作为 BEiT Encoder 的输入。

  • 视觉token

    为了将图像数据离散化,BEiT 通过一个 tokenizer 将图像表示为一个离散的 token 序列。

    与 DALL-E 一样,BEiT 使用 dVAE 来对 tokenizer 进行训练。训练时, tokenizer qϕ(z∣x)q_\phi(z|x)qϕ(zx) 将输入图像 xxx 编码为离散的 token 序列 zzz,decoder pψ(x∣z)p_\psi(x|z)pψ(xz)根据 token 序列 zzz 重构出输入图像 xxx。其中,所有可选的 token 序列保存在码本(codebook)中,这里的码本就相当于 NLP 中的词表 vocab。dVAE 的训练过程的目标函数可表示为:Ez∼qϕ(z∣x)[log⁡pψ(x∣z)]\mathbb{E}_{z\sim q_\phi(z|x)}[\log p_\psi(x|z)]Ezqϕ(zx)[logpψ(xz)] 。由于视觉 token 是离散的,整个过程不可导,因此 BEiT 中引入 gumble softmax 来解决这一问题。在 dVAE 训练结束后,开始对 BEiT Encoder 进行预训练时,decoder 将被丢弃,仅使用 tokenizer 来为 BEiT Encoder 的训练生成目标 token。

骨干网络:Image Transformer

BEiT Encoder 是一个标准的 ViT。图像块输入经过线性映射后,每个图像块对应一个特征嵌入 token,然后拼接一个特殊 token [S],并为所有 token 添加位置编码。与标准 ViT 的输入不同的是,BEiT 的对图像块进行掩码,将被掩码图像块的 token 替换为一个共享的、可学习的 token。经过 LLL 层 Transformer Block 提取特征之后,得到图像的特征嵌入。

BEiT 预训练:Masked Image Modeling

经过 BEiT Encoder 图像特征之后,每个被掩码位置的特征经过一个 softmax 分类器,预测该位置的 token。本质上是一个分类任务,候选的类别数即为码本中 token 的个数。整个预训练过程的目标函数可表示为:
max⁡∑x∈DEM[∑i∈Mlog⁡pMIM(zi∣xM)]\max\sum_{x\in\mathcal{D}}\mathbb{E}_\mathcal{M}[\sum_{i\in\mathcal{M}}\log p_{\text{MIM}}(z_i|x^\mathcal{M})] maxxDEM[iMlogpMIM(zixM)]
其中 D\mathcal{D}D 是全部训练数据,M\mathcal{M}M 表示被随机掩码的位置,xMx^{\mathcal{M}}xM 是经过掩码的图像,ziz_izi 是待预测的视觉 token。

微调

BEiT Encoder 经过预训练之后,可以提取图像的特征。这些特征经过不同的 task specific layer 处理之后,可用于处理不同的下游任务,如图像分类、语义分割等。

其他细节

  • BEiT 中的掩码策略不是完全随机的,而是按照 block 进行掩码;
  • BEiT 中的掩码率为 40%;
  • BEiT 直接使用了 DALL-E 通过 dVAE 训练好的 tokenizer;
  • 论文中提供了 BEiT 在 VAE 视角下的 ELBO 数学解释;
  • 中间微调,BEiT 在自监督预训练结束之后,可以先在规模稍大的中间数据集(原文中为 ImageNet-1K)上微调,然后再在不同的下游任务上微调。

总结

BEiT 是比较早期的 MIM 算法。它通过先训练一个 tokenizer 并构造离散化码本,使得 ViT 能够通过 MIM 目标进行训练。

MAE

前言

MAE(Masked AutoEncoder)的想法非常直接:将图像中的某些图像块掩码掉,然后要求模型重构出掩码掉的像素。如图 2 所示,MAE 整体上是一个编码器-解码器架构。其中,编码器提取可见图像块的特征,解码器根据这些特征重构出原始图像。MAE 有两个需要注意的关键设计:1) 非对称的编码器-解码器架构, 2) 高掩码率。MAE 的编码器-解码器架构是非对称的,编码器的模型尺寸相对较大,仅接收可见的(未被掩码的)图像块,提取其特征,解码器相对轻量,编码后的图像特征 token 和统一且可学习的掩码 token 作为输入。MAE 中掩码的比率非常高,达到 75%。相对的,在 BERT 中,对文本数据的掩码率为 15%。这体现出图像数据的冗余性和文本数据的高度语义性。得益于这两项设计,MAE 可以高效地训练出强大的模型。模型的强大来自于高掩码率带来的任务难度,高效来自于非对称的架构设计,编码器仅需处理可见图像块。

方法

在这里插入图片描述

图2. MAE的模型结构

掩码方法

与 ViT 一致,MAE 将原始图像分为规则的、无重叠的图像块。然后,从这些图像块中随机选择一部分保留,另一部分掩码掉。

编码器

MAE 的编码器是一个标准 ViT 模型,但是只接受可见的、未被掩码的图像块作为输入。与标准 ViT 一致,这些可见的图像块经过线性映射,添加位置嵌入,然后经过数个 Transformer Block 提取图像的特征。由于仅需处理可见的图像块, MAE 的编码器计算非常高效,这使得 MAE 编码器的模型尺寸可以非常大。

解码器

MAE 的解码器接收一组完整的 token,包括经过编码器编码的可见图像块的 token,以及 mask token。MAE 中的 mask token 是一个可学习的、共享的向量,表示此位置图像块缺失,需要重构。解码器同样需要给全部 token 添加位置嵌入,然后经过数个 Transformer Block,得到重构结果。注意,解码器仅在预训练时需要,在预训练完成之后,在下游任务上进行微调时,可将解码器丢弃。另外,相较于编码器,解码器模型尺寸较小,MAE 论文中默认解码器对于每个 token 的计算量是编码器的 1/10。

重构目标

BEiT 中,模型的重构目标是 token,不同于此,MAE 是直接重构图像的像素。MAE 中,解码器的最后一层是一个线性层,将每个 token 映射为对应图像块的像素。损失函数为 MSE,只在掩码掉的图像块上计算损失。

另外,MAE 中的关于重构目标的一个小 trick 是对图像块内像素进行标准化(normalization),先计算图像块内所有像素的均值和标准差,然后根据它们对图像块内的所有像素进行标准化。实验显示,进行标准化可以提高表征的质量。

总结

MAE 与 BEiT 不同,它的重构目标是原始像素。MAE 训练高效,表征能力强,它的核心创新点有两个:非对称的编码器-解码器架构和高掩码率。

BEiTv2

前言

当时已有的 MIM 方法的重构目标有三种:原始像素、手工特征和视觉 tokens。这些重构目标都是 low-level 的图像元素,而自监督表征预训练实际更想得到关于高层语义的图像特征。因此,BEiTv2 试图构建语义感知的监督信号,为此,BEiT 有两点主要的创新。首先是提出了向量化知识蒸馏(Vector Quantised Knowledge Distillation,VQ-KD),为 MIM 预训练提供语义层面的监督信号。另外是提出一种块聚合策略(patch aggregation strategy),鼓励模型聚合所有块的信息,提取图像的全局特征,而不是仅关注图像块的重构。

方法

BEiTv2 是在 BEiTv1 的基础上进行改进。前文已经介绍,BEiTv1 分为两个阶段,分别是 tokenizer 的训练和 BEiT Encoder 的预训练。BEiTv2 中两个阶段与 BEiTv1 是一样的,先训练出 tokenizer,为 BEiT Encoder 的预训练提供重构目标。BEiTv2 的两个创新点分别在这两个阶段中。

训练tokenizer

BEiTv1 的 tokenizer 使用 dVAE 进行训练,如此得到的离散 token 高层语义不够丰富。BEiTv2 中提出 VQ-KD 来训练 tokenizer, 训练流程如图 3 所示。BEiTv2 中,同样有 tokenizer 和decoder 两个模型参与训练。tokenizer 又由 encoder 和 quantizer 组成,encoder 将图像映射为一串视觉 token,quantizer 通过最近邻的方式从码本 V\mathcal{V}V 中查找与每个 token 的 L2 距离最接近的 embedding。码本 V∈RK×D\mathcal{V}\in\mathbb{R}^{K\times D}VRK×D ,其中包含 KKK 个维度为 DDD 的 embedding。这就是 VQ。在得到量化后的视觉 token 之后,将其送入解码器,解码器的输出目标是教师模型(如 CLIP、DINO 等)给出的语义特征。这个训练过程的目标是最大化解码器的输出与教师模型语义特征的余弦相似度。这就是 KD。通过 VQ-KD 的训练方式,BEiTv2 的 tokenizer 能够为 BEiT encoder 的预训练提供含有高层语义特征的重构目标。tokenizer训练的目标函数为:
max⁡∑x∈D∑i=1Ncos⁡(oi,ti)−∣∣sg[l2(hi)]−l2(vzi)∣∣22−∣∣l2(hi)−sg[l2(vzi)]∣∣22\max\sum_{x\in \mathcal{D}}\sum_{i=1}^N\cos(o_i,t_i)-||\text{sg}[l_2(h_i)]-l_2(v_{z_i})||^2_2-||l_2(h_i)-\text{sg}[l_2(v_{z_i})]||_2^2 maxxDi=1Ncos(oi,ti)∣∣sg[l2(hi)]l2(vzi)22∣∣l2(hi)sg[l2(vzi)]22

在这里插入图片描述

图3. BEiTv2中tokenizer的训练流程

预训练 BEiTv2

BEiTv2 的预训练与 BEiTv1 大体一致,将图像进行掩码,并分块送入 Transformer,得到的特征通过 softmax 分类器,预测掩码位置上的 token。BEiTv2 的优化之处是提出了块聚合策略,在图像 token 上拼接了一个 [CLS] token,用来鼓励模型聚合各个图像块,提取图像的全局特征。而不是仅仅关注较为底层的图像块重构。配备有块聚合策略的 MIM 训练流程如图 4 所示。BEiTv2 构建了一个瓶颈层来对 <CLS> token 进行预训练,使其尽可能多地汇聚信息。

[CLS] 的预训练网络如图 4 的右半部分的虚线框所示,是一个两层的 ViT。它的输入是由 BEiTv2 Encoder 的第 lll 层的输出向量和第 LLL 层的[CLS] 向量拼接而成。这两层 ViT 的输出特征也经过 MIM head (与 BEiT Encoder 的 MIM head 共享权重)预测掩码处的 token。在计算整体 MIM 损失时,添加一项 LMIMc\mathcal{L}^c_{MIM}LMIMc

为什么说通过对[CLS]的预训练,我们得到的特征 hCLSLh_\text{CLS}Lh_\text{CLS}L 具有图像的全局信息呢?由于在训练 [CLS] token 时,舍弃了图 4 中最左侧的第 l+1l+1l+1 层到第 LLL 层的,却要求两个不同的 MIM 任务共享同一个MIM输出头,这就迫使 <CLS> token 学习更多的全局信息,以弥补被舍弃的图像所有标志的特征的信息。

在这里插入图片描述

图4. 包含块聚合策略的MIM预训练

其他细节

  • 训练 tokenizer 时,由于中间的最近邻查表操作是不可微的,为了梯度反传,可将 decoder 输入的梯度直接拷贝到 encoder 输出。因为 quantizer 查找的是每个编码器输出的最近邻 embedding,码本 embedding 的梯度可以为编码器指示合理的优化方向;
  • 为了稳定码本的训练并提高利用率,避免码本坍塌,导致只有一小部分 embedding 会被使用,tokenizer 的训练采用了一些 trick。其中包括使用标准化 l2 距离、降低 embedding 维度到 32 维、滑动指数平均 (EMA);
  • 额外的用于预训练 <CLS> token 的两层 ViT Block 在预训练结束后即被丢弃,不用于下游任务。

总结

BEiTv2 针对 BEiT 等已有 MIM 工作中语义特征缺失的问题,提出了 VQ-KD,对 embedding 进行量化并将 CLIP、DINO 等语义特征提取强的模型作为教师模型,生成重构目标。并提出使用 <CLS> token 来聚合图像块,提取全局特征。

Ref

自监督表征预训练之掩码图像建模:CAE 及其与 MAE、BEiT 的联系

MAE 论文逐段精读【论文精读】

如何看待BEIT V2?是否是比MAE更好的训练方式?

相关文章:

自监督表征预训练之掩码图像建模

自监督表征预训练之掩码图像建模 前言 目前&#xff0c;在计算机视觉领域&#xff0c;自监督表征预训练有两个主流方向&#xff0c;分别是对比学习&#xff08;contrastive learning&#xff09;和掩码图像建模&#xff08;masked image modeling&#xff09;。两个方向在近几…...

华为OD机试题 - 磁盘容量(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

ChatGPT:“抢走你工作的不会是 AI ,而是先掌握 AI 能力的人”

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; ChatGPT&#xff1a;“抢走你工作的不会是 AI &#xff0c;而是先掌握 AI 能力的人” ChatGPT&#xff1a;美国OpenAI 研发的聊天机器人程序&#xff0c;人工智能技术…...

数据结构与算法(Java版) | 线性结构和非线性结构

之前&#xff0c;我们说过&#xff0c;数据结构是算法的基础&#xff0c;因此接下来在这一讲我就要来给大家重点介绍一下数据结构了。 首先&#xff0c;大家需要知道的是&#xff0c;数据结构包括两部分&#xff0c;即线性结构和非线性结构。知道这点之后&#xff0c;接下来我…...

电商数据查询平台:母婴行业妈妈用品全网热销,头部品牌格局初现

以往&#xff0c;奶粉、纸尿裤这类产品基本就代表了整体母婴市场中的消费品。而如今&#xff0c;随着母婴行业的高速发展和消费升级&#xff0c;母婴商品的种类日益丰富&#xff0c;需求也不断深入。 在京东平台&#xff0c;母婴大品类中除了包含婴童相关的食品&#xff08;奶粉…...

STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

STM32模拟SPI协议获取24位模数转换&#xff08;24bit ADC&#xff09;芯片AD7791电压采样数据 STM32大部分芯片只有12位的ADC采样性能&#xff0c;如果要实现更高精度的模数转换如24位ADC采样&#xff0c;则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24…...

华为OD机试题 - 交换字符(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

最好的工程师像投资者一样思考,而不是建设者

我在大学期间住在图书馆。“我学习的教科书理论越多&#xff0c;我就会成为一名更好的工程师&#xff0c;”我想。然而&#xff0c;当我开始工作时&#xff0c;我注意到业内最优秀的工程师并不一定比应届毕业生了解更多的理论。他们只是带来了不同的心态&#xff0c;即投资者的…...

Mysql里的ibtmp1文件太大,导致磁盘空间被占满

目录 一、查看磁盘的时候发现磁盘空间100% 二、 排查的时候&#xff1a;查看是什么文件占用的时候&#xff0c;发现是数据库临时表空间增长的 三、为了避免以后再次出现ibtmp1文件暴涨&#xff0c;限制其大小&#xff0c;需在配置文件加入 四、重启Mysql实例&#xff08;重启后…...

android kotlin 协程(四) 协程间的通信

android kotlin 协程(四) 协程间的通信 学完本篇你将会了解到: channelproduceactorselect 先来通过上一篇的简单案例回顾一下挂起于恢复: fun main() {val waitTime measureTimeMillis {runBlocking<Unit> {println("main start") // 1 // …...

苹果手机通讯录突然没了怎么恢复?

手机成为生活中的必需品&#xff0c;都会存储着各种数据文件&#xff0c;比如我们使用过的APP、音乐、照片、通讯录等通常都是存在这里面的。但我们的操作难免会有意外&#xff0c;有的是手动不小心删的&#xff0c;有的是误删的&#xff0c;有的是自己孩子删的等&#xff0c;却…...

BI知识全解,值得收藏

2021年度&#xff0c;中国商业软件市场的增长趋势是快速增长的&#xff0c;达到7.8亿美元&#xff0c;同比增长34.9%。商业智能BI在企业应用中具有巨大的价值&#xff0c;并逐渐成为现代企业信息化和数字化转型的基础。所以&#xff0c;全面了解BI&#xff0c;对于企业管理是非…...

【机器学习】GBDT

1.什么是GBDT GBDT(Gradient Boosting Decision Tree)&#xff0c;梯度提升树。它是一种基于决策树的集成算法。其中Gradient Boosting 是集成方法boosting中的一种算法&#xff0c;通过梯度下降来对新的学习器进行迭代。它是利用损失函数的负梯度方向在当前模型的值作为残差的…...

C#开发的OpenRA游戏高性能内存访问的方法

C#开发的OpenRA游戏高性能内存访问的方法 一个游戏性能往往是比较关键的, 因为游戏很多时候是比拼的是人的速度和技巧。 比如王者荣耀里,一个大招是否及时地放得出来,就会影响到一场比赛的关键。 而这个大招的释放,又取决于游戏运行在手机上的性能。 如果游戏太耗性能,导致…...

【elasticsearch】elasticsearch es读写原理

一、前言&#xff1a; 今天来学习下 es 的写入原理。 Elasticsearch底层使用Lucene来实现doc的读写操作&#xff1a; Luence 存在的问题&#xff1a; 没有并发设计 lucene只是一个搜索引擎库&#xff0c;并没有涉及到分布式相关的设计&#xff0c;因此要想使用Lucene来处理海量…...

数据在内存中的存储【上篇】

文章目录⚙️1.数据类型的详细介绍&#x1f529;1.1.类型的基本归类⚙️2.整型在内存中的存储&#x1f529;2.1.原码、反码、补码&#x1f529;2.2.大小端的介绍⚙️1.数据类型的详细介绍 &#x1f973;基本的内置类型 &#xff1a; &#x1f4a1;char ---------- 字符数据类型…...

慕了没?3年经验,3轮技术面+1轮HR面,拿下字节30k*16薪offer

前段时间有个朋友出去面试&#xff0c;这次他面试目标比较清晰&#xff0c;面的都是业务量大、业务比较核心的部门。前前后后去了不少公司&#xff0c;几家大厂里&#xff0c;他说给他印象最深的是字节3轮技术面1轮HR面&#xff0c;他最终拿到了30k*16薪的offer。第一轮主要考察…...

「可信计算」与软件行为学

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

华为OD机试题 - 找字符(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

Linux 进程启动方法

现实中程序编写的时候&#xff0c;经常会碰到一些这样需求&#xff1a;调用系统命令&#xff0c;完成一些操作&#xff0c;或判定结果 或获取结果作为启动进程&#xff0c;调用第三方进程&#xff0c;并监控进程是否退出加载升级进程&#xff0c;升级进程kill调用者或调用者自行…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...