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

【学习笔记】多模态综述

多模态综述

  • 前言
  • 1. CLIP & ViLT
  • 2. ALBEF
  • 3. VLMO
  • 4. BLIP
  • 5. CoCa
  • 6. BeiTv3
  • 总结
  • 参考链接

前言

本篇学习笔记虽然是多模态综述,本质上是对ViLT后多模态模型的总结,时间线为2021年至2022年,在这两年,多模态领域的模型也是卷的飞起,不断刷新领域的SOTA。在模型结构和数据上提出了很多高效有用的方法,如果你对多模态近两年的发展感兴趣,不妨看一看这一篇文章~


1. CLIP & ViLT

image.png
之所以将CLIP和ViLT放在一起,是因为在ViLT这篇论文中对这两项工作进行了很好的总结。从(a)到(d)是文图领域特征抽取模型的发展过程(到ViLT为止),其中(b)展示的就是CLIP的模型结构。它是一个典型的双塔模型,在训练时通过对比学习,将相同的图文对距离拉得很近,对于不同图文对的距离尽量拉得更远。抽取到的图文特征只需要进行简单的点乘就可以做很多多模态的任务。但是CLIP模态交互的部分过于简单,因此很难做复杂的理解任务。为此(c)中的方法在模态融合部分加入了复杂的模型,极大提升了效果。
在ViLT之前,几乎所有的工作都是目标检测的视觉抽取任务,由于都是提前抽取好特征缓存下来,研究人员并没有把过多的注意力放在计算复杂度和推理延迟上。显然在面对未见的下游任务场景时,视觉特征抽取部分的延迟是巨大的。因此ViLT应运而生,ViLT受到ViT的启发,ViT的工作证明了基于图像块的视觉特征和基于目标区域的视觉特征没有太大区别,也能很好拿来做目标检测任务。因此ViLT的作者将图像处理成图像块,和文本以相同的embedding形式输入到模态融合Transformer中,这大大降低了计算复杂度,并且对于下游任务来说,极大降低了推理延迟。
尽管如此,ViLT训练成本巨大,并且在性能上还是和(c)中的方法有一定的差距,可能的原因是在多模态中,视觉特征要远远大于文本特征,而ViLT中文本特征通过BERT的Tokenizer有很好的表征,但是视觉特征只是简单的随机初始化。
因此从结构上,一个好的多模态模型应该更接近于(c)的形式,视觉特征抽取模型要比文本特征抽取模型大,并且在模态融合上有更大的模型。对于训练目标,应该采用ITC+ITM+MLM方法的结合,即图文对比学习,图文匹配,完形填空,高效且性能出色。

2. ALBEF

ALBEF正是上面讨论的理想的多模态模型。ALBEF这篇工作来自于NeurIPS2021,与VILT出发的动机不同,ViLT只是为了提高模型的推理速度,而ALBEF的目的是在模型融合之前,就把图像和文本的特征align起来。具体来说,ALBEF有如下的贡献:

  1. 采用图文对比学习的方法提前将图文特征进行融合。
  2. 提出动量蒸馏方法解决噪声网络数据的问题。

对于第二个改进中提到的噪声网络数据,是指从网络中爬取的图文数据,文字内容大多都是关键词,而不是真正描述图像中的内容,因此成为了noisy的图文数据,导致模型很难学习到图文特征。

image.png
上图是ALBEF的整体模型架构。从简化模型的角度分析,左边是ViT,右边是劈成两半的BERT,前半部分输出和ViT的输出进行ITC的任务,后半部分对图文的特征进行融合。具体来说,图像这边打包成patch输入到ViT中,得到768维度的序列,文本这边转换为文本token序列喂入到6层的文本编码器中,输出768维的特征序列。接着图文token序列中的cls表征通过下采样和标准化降维到256维的特征,然后进行ITC的正负样本对比,让图像和文本的特征尽可能拉进,就完成了第一阶段的学习。
第二阶段,图像特征和文本特征共同输入到multimodal encoder中来实现模态的融合,通过ITM和MLM两个任务进行学习。ITM即图文匹配任务,判断当前的图片和文本是不是同一对,但是ITM任务过于简单,因此作者利用ITC任务中计算的余弦相似度,将最相似的样本作为负样本,来加大模型训练的难度,从而更好学习到特征的信息。MLM任务对输入的文本进行随机掩码,利用上下文和图像特征来预测mask的文本。这里也可以看出,虽然ITM和MLM画在一起,但是属于不同的前向过程,因此训练时间更长。
接着我们再探讨ALBEF另一个贡献点——动量蒸馏。由于预训练的图像对从互联网上收集,因此质量很差,图文经常不匹配。对于ITC学习,即使是负样本的文本也可能与图像匹配,对于MLM来说,可能存在更好的单词能够描述图像。但是ITC和MLM的one-hot标签仍然对这些结果进行惩罚,这会让模型的学习变得困难。作者提出采用动量模型生成的伪标签来帮助模型学习。训练时,作者训练基模型使其预测结果与动量模型的预测结果相匹配。具体来说,这个过程相当于为整个训练又额外添加了两个损失,即针对伪标签的ITC和MLM损失。
image.png
上图是伪标签和原始标签的对比,可以看到伪标签有时候更能有效捕获图像的相关信息。
预训练采用的数据集和ViLT一致,都是4million数据集。此外作者又额外加入了更多噪声的CC12million数据集,将性能进一步提高。
实验在五个不同任务的数据集上进行,首先是消融实验的结果:
image.png
可以看到加入了ITC后,模型的性能有了大幅度的提升,表明融合之前的模态对齐是很有必要的。并且更难的ITM、额外的两个伪标签loss以及更大的训练数据集都对模型的性能有所提升。
image.png
上表是在Flickr30K数据集上零样本的结果,ALBEF仅在4M数据集上预训练就超过了CLIP和ALIGN,二者都是在百倍大的规模数据集上进行预训练。微调结果也是同样的趋势:
image.png
此外,在多个下游任务上与其他SOTA模型相比也是大幅领先。
image.png
文中作者还从互信息的角度对ALBEF进行了理论分析,表明不同的训练任务可以解释为生成图像文本对视图的不同方式,即数据增强。总而言之,ALBEF无论在训练速度,还是在推理速度,亦或是通用性和性能表现上都非常亮眼,属于多模态领域里程碑式的工作。

3. VLMO

VLMO这篇工作来自于微软团队,中稿于NeurIPS2022,它主要提出两个贡献点:

  1. 模型结构上的改进,Mixture-of-Modality-Experts。
  2. 训练方式的改进,采用分阶段的模型预训练。

这些贡献点的动机也很明确。对于第一个贡献点,当前的双塔模型架构应用广泛,如CLIP和ALIGN,它们采用双编码器架构,分别对文本和图像进行编码,模态交互通过图像和文本特征的余弦相似度实现的。这种方法虽然计算高效,可以提前存储特征信息,但是交互简单难以处理复杂的任务。另一种模型架构是跨模态注意力融合编码器,它可以在复杂的VL分类任务上实现卓越的性能,但是需要计算所有可能的图文对,以计算检索任务的相似度,导致推理时间过慢。
因此本文的VLMO相当于这两种模型的融合,既可以做双编码器也可以做融合编码器,它通过引入Multiway Transformer实现,该模型应用模态expert来取代标准Transformer中的前馈网络,对于不同模态的数据,切换不同的expert来捕获特定于模态的信息,并使用跨模态共享自注意力来对齐视觉和语言信息。
对于第二个贡献点,由于多模态领域常用的数据集仅有4million大小,远远不能满足大规模预训练的要求,但是在单独的文本和图像模态数据集却十分丰富。因此作者提出一种分阶段预训练策略,将vision expert在视觉领域训练好,language expert在文本领域训练好,这样初始化好的参数再在多模态数据集上训练,就会在性能上有大幅的提升。
image.png
模型结构从形式上和ALBEF一致,单个Transformer块采用的是Multiway Transformer块,相对于Transformer,它在FFN上进行了改动,变成了V-FFN,L-FFN和VL-FFN,根据训练数据模态的不同调整更新不同的FFN。训练任务目标也和ALBEF一致,包括ITC,ITM和MLM,其中ITM也使用了Hard Negative Mining,即将一个batch中最相似的样本作为负样本。ITC的过程和CLIP一致,对V-FFN和L-FFN进行更新。ITM的过程是先单模态更新后模态融合,前L-F层分别对V-FFN和L-FFN进行更新,后F层对VL-FFN进行更新,执行二分类任务。MLM模型和ITM一致,只是拿最后一层对mask的token进行预测。
image.png
接下来就是本文的第二个贡献点具体实施过程,如上图所示。首先学习图像表征,更新V-FFN和多头自注意力机制的参数,接着冻住多头自注意力和视觉参数,对语言文本进行训练,更新L-FFN,最后所有参数都打开,在多模态数据下进行训练。这里有一个有趣的现象,作者是先在图像上进行训练,再在文本上进行训练,而不是反过来,因为实验发现反过来时效果会变差。
image.png
实验部分如上表所示,可以看到无论是base模型,还是large模型,亦或是Large++模型,VLMO的性能都要好于其他模型,并且随着模型增大,训练数据增多,模型的性能也进一步提升。
总结一下,本文提出了统一的视觉语言预训练模型VLMO,它既可以作为双编码器用于高效的视觉和语言的检索,又可以作为融合编码器为跨模态交互建模。此外,作者还表明利用大规模图像和纯文本语料的分阶段预训练极大改善了视觉语言预训练。实验部分表明,VLMO在各种视觉语言分类和检索基准上都要优于先前的先进模型。
未来作者将从以下几个方面对VLMO进行改进:

  1. 进一步扩大VLMO预训练模型的规模。
  2. VLMO微调执行视觉语言生成任务是有趣的方向,比如根据图像生成字幕。
  3. 视觉-语言预训练在多大程度上可以帮助彼此,特别是Multiway Transformer自然融合了图文表征的时候。
  4. 可以尝试融入更多模态的信息(speech,video,structured knowledge),支持通用的多模态预训练。

4. BLIP

随着多模态领域的发展,近两年的工作采用了Transformer Encoder和Decoder的方法,典型的工作就有来自ICML2022的BLIP。BLIP的动机和上篇工作VLMO有异曲同工之妙。首先都是从模型角度出发,现有的方法大多数都是encoder架构的模型,可以在理解任务上有出色的表现,但是在生成任务上表现不佳。此外还有一些encoder-decoder架构的模型,它们可以做生成任务,但是又在图文检索等理解任务上表现不佳。第二个动机也是和数据有关。当前大多数模型都是在充满噪声的大规模数据集上预训练,虽然通过扩大数据集获得了性能上的提升,但是嘈杂的网络文本对视觉的学习并不是最优的。
因此,本文提出了BLIP模型,其主要贡献点如下:

  • Multimodal mixture of Encoder-Decoder(MED):一个用于有效多任务预训练和灵活迁移学习的新模型架构。联合了三个联合预训练目标ITC、ITM和LM。
  • Captioning and Filtering(CapFilt):一种新的数据集增强方法,用于从噪声文本对中学习。Captioner模块用于为图像生成描述,filter模块从原始网络文本和合成文本中删除嘈杂的标题。

image.png
上图是MED的整体架构。之前的工作如VLMO,它的MOME模型就是受到ALBEF的启发构建出来的,这里的MED模型同时受到ALBEF和VLMO启发,其Encoder就是ALBEF,其共享参数的形式就是参考了VLMO。具体来说,MED由四个模块组成,第一个模块是图像的编码器,将图像打包成patch抽取图像的特征。后面三个模块本质上是一个模型,只不过执行不同的任务,第一个模块对文本进行单独编码,和图像特征执行ITC任务,可以看成是CLIP模型。第二个模块将文本和图像的编码进行混合,执行ITM任务,学习模态融合的知识。第三个模块是解码器模块,在之前编码器基础上去除了Bi Self-Att,加入了Causal Self-Att,执行LM任务,让模型拥有生成的能力。由于这篇工作的作者都是ALBEF的原班人马,因此ALBEF中有用的trick也被搬到BLIP中,比如动量编码器,难负样本等。
image.png
接着就是BLIP第二个贡献CapFilt,如上图所示。左边部分是在原始的噪声数据集上训练并执行下游任务的模块,显然这些数据并不是最优的选择。因此作者提出了Captioning和Filtering,合成CapFilt,前者用于给定网络图像生成图像的caption,后者作为过滤器过滤噪声文本。二者都是通过相同的MED模型初始化,并在COCO数据集上微调,只不过前者基于ITC和ITM微调,后者基于LM微调。微调后的模型作用于噪声数据集,对数据集进行清洗,生成更可靠的caption。
image.png
为了进一步解释上述过程,上图展示了生成过滤的结果。第一张图生成的caption明显可以更好描述图像,因此选择生成的caption作为图像的文本,第三张图原始的文本更契合图像内容,因此保留原始的文本而丢弃生成的caption。
image.png
消融实验部分很好说明了大模型,大的更干净的数据集可以对模型性能有着更好的提升。
image.png
和别的模型相比,BLIP也是极具优越性,在COCO和Flickr30K数据集上都达到了SOTA。

5. CoCa

之前的工作证明了decoder模型的优越性,但是由于计算不同的loss需要多次前向过程,因此计算和时间成本过高。CoCa进一步简化了之前工作的设计,文本端只使用decoder模型,只需要一次的前向过程就可以计算ITC Loss和Captioning Loss。其结构和伪代码如下图所示:
image.png
可以看到整体的结构和ALBEF几乎一样,只不过在文本端全部换成了Decoder,图像特征也通过attention pooling用于模态的融合。整体的方法相当简洁,由于是decoder架构,所以作者在几十亿规模的数据集、21亿参数的模型上进行预训练,scale的能力是相当出色。
image.png
文中的多边形图也极大展示了CoCa的优势。CoCa在各个数据集以及零样本上都展现出强大的能力,刷新了各个榜单的SOTA。

6. BeiTv3

随着多模态领域的工作越来越丰富,研究人员开始追求真正的大一统模型。BeiTv3的目标非常明确,它就是为了做更大一统的多模态模型,无论是模型大小还是目标函数甚至是数据集的规模,都要求统一。这篇工作上来就卖弄它的结果,如下图所示:
image.png
image.png
性能可谓是全方位包围之前的模型。BEiTv3得出了两点结论:

  • 目标函数不是越多越好,关键还是在于loss之间能否互相弥补。
  • 数据不是越大越好,数据的质量更为关键。

为了达到大一统的目的,本篇工作本质上是融合了之前所有模型的优势,主要从以下三个方面展开:

  1. Transformer提供统一编码,实现模态模型架构的统一。
  2. mask-then-predict的训练目标,减少过多训练目标带来的效率低下和冗余。
  3. 扩大模型规模和预训练数据规模。

image.png
模型的具体结构如上图所示,其实就是VLMO的变体,并且预训练任务只做Masked Data Modeling。
image.png
在执行下游任务时,模型也能实现很好的迁移,如上图所示,通过调用模型中不同的模块来执行下游任务,而这些模块都在预训练阶段得到充分的训练,只需要简单微调甚至零样本就能得到很好的效果。

总结

image.png
上述的一系列工作可以总结为上面这张图。本文关于多模态的工作其实是从ViT出发的,之前多模态领域对于图像特征的抽取都需要借助CNN架构的模型和目标检测任务,效率低,性能差。随着ViT提出后,多模态领域终于实现文图框架上的统一,即ViLT工作的诞生。但是此时的工作还是在探索图像特征抽取模型、文本特征抽取模型和特征融合模型之间的权重,因此性能甚至还不如之前的模型。ALBEF的工作奠定了模型的权重关系,结合了CLIP的方法,在融合前先进行一次文图特征的对齐,整个训练过程设计了三个训练目标,在性能上实现了显著的提升。但是ALBEF针对不同的模态总共设计了三个模型,既然都是统一的Transformer架构的模型,为什么不能只使用一个模型呢?为此VLMO采用了Multiway Transformer,让所有的模态特征学习都在一个模型中进行,通过冻结FFN和共享自注意力机制实现,实验结果上也是优于ALBEF。但是之前这些工作都只能做多模态理解任务,BLIP开创了生成任务的先河,加入了decoder架构,执行LM任务,并且利用对图像生成caption的优势对数据进行质量上的提升,从而进一步提高模型的性能。CoCa进一步简化先前的工作,文本端只采用decoder架构模型,只需要一次的前向过程就可以计算ITC Loss和Captioning Loss。最后,BeiTv3总结前面所有的工作,目标是成为大一统的多模态模型,在模型和数据规模上都进一步scale,以搭积木的方式处理各种下游任务,结果全方位包围了多模态领域和多个单模态领域的SOTA。
上面主要是从模型结构角度来分析多模态领域方法的改进,其实数据上也有很多改进。因为多模态领域数据集和单模态比起来明显不足,于是很多工作都采用从网络中爬取的文本对进行训练,但是网络数据质量不佳。为此ALBEF提出动量蒸馏方法解决噪声网络数据的问题,VLMO利用单模态数据集进行预训练,而BLIP出色的生成能力让其可以为图像生成更准确的文本caption,从而进一步提升模型的性能。
实际上,虽然BeiTv3这篇工作的目标是成为大一统模型,并且能够做各种各样的下游任务,但都是需要通过模型的组合拼接实现的,从本质上并没有实现大一统,真正的大一统模型是不需要根据下游任务调整模型结构的,如现在的GPT-4等大模型,而这也正是当前多模态领域发展的方向。

参考链接

https://arxiv.org/pdf/2104.13921.pdf
http://proceedings.mlr.press/v139/radford21a/radford21a.pdf
https://arxiv.org/pdf/2107.07651.pdf
https://proceedings.neurips.cc/paper_files/paper/2022/file/d46662aa53e78a62afd980a29e0c37ed-Paper-Conference.pdf
https://proceedings.mlr.press/v162/li22n/li22n.pdf
https://arxiv.org/pdf/2205.01917.pdf
https://arxiv.org/pdf/2208.10442.pdf

相关文章:

【学习笔记】多模态综述

多模态综述 前言1. CLIP & ViLT2. ALBEF3. VLMO4. BLIP5. CoCa6. BeiTv3总结参考链接 前言 本篇学习笔记虽然是多模态综述,本质上是对ViLT后多模态模型的总结,时间线为2021年至2022年,在这两年,多模态领域的模型也是卷的飞起…...

MLAgents (0) Unity 安装及运行

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…...

typename关键字详解(消除歧义)

typename关键字详解 文章目录 typename关键字详解定义用法1.和class同义,用于引入泛型编程中所用到的模板参数2.用来消除歧义,告诉编译器后面的是类型名而不是变量名 定义 typename相当于泛型编程中class的同义关键字,用来指出模板类型所依赖…...

设计模式_解释器模式

解释器模式 案例 角色 1 解释器基类 (BaseInterpreter) 2 具体解释器1 2 3... (Interperter 1 2 3 ) 3 内容 (Context) 4 用户 (user) 流程 (上下文) ---- 传…...

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…...

PDCA循环

目录 1.认识PDCA&#xff1a; 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点&#xff1a; 5.案例 6.其他作用 1.认识PDCA&#xff1a; PDCA循环最早由美国质量统计控制之父Shewhat&#xff08;休哈特&#xff09;提出的PDS&#xff08;Plan Do Se…...

Redis 缓存雪崩、缓存穿透、缓存击穿

Redis 是一种常用的内存缓存工具&#xff0c;但在某些情况下&#xff0c;它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议&#xff1a; 1、缓存雪崩 缓存雪崩指的是在某个时间点上&#xff0c;大量的缓存数据同时失效或过期&#xff0c;导致大…...

Android Media3 ExoPlayer 开启缓存功能

ExoPlayer 开启播放缓存功能&#xff0c;在下次加载已经播放过的网络资源的时候&#xff0c;可以直接从本地缓存加载&#xff0c;实现为用户节省流量和提升加载效率的作用。 方法一&#xff1a;采用 ExoPlayer 缓存策略 第 1 步&#xff1a;实现 Exoplayer 参考 Exoplayer 官…...

MyBatis注解开发

MyBatis常用注解 注解对应XML说明Insert< insert>新增SQLUpdate< update>更新SQLDelete< delete>删除SQLSelect< select>查询SQLParam–参数映射Results< resultMap>结果映射Result< id>< result>字段映射 开发流程&#xff1a; 1…...

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...

Fiddler常用的快键键

Fiddler有很多常用的快捷键&#xff0c;这些快捷键可以帮助你更快速地完成任务。以下是一些常用的快捷键&#xff1a; F12&#xff1a;启动/停止抓包。 CtrlR&#xff1a;打开FiddlerScript窗口。 CtrlH&#xff1a;切换到 Inspector 页签的 Header 视图。 CtrlT&#xff1a;切…...

【Linux】生产消费模型 + 线程池

文章目录 &#x1f4d6; 前言1. 生产消费模型2. 阻塞队列2.1 成员变量&#xff1a;2.2 入队(push)和出队(pop)&#xff1a;2.3 封装与测试运行&#xff1a;2.3 - 1 对代码进一步封装2.3 - 2 分配运算任务2.3 - 3 测试与运行 3. 循环阻塞队列3.1 POSIX信号量&#xff1a;3.1 - 1…...

基于springboot+vue的爱心助农网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

“华为杯”研究生数学建模竞赛2019年-【华为杯】D题:汽车行驶工况构建(附获奖论文和MATLAB代码实现)

目录 摘 要: 1. 问题重述 2. 模型假设 2.1 题目对模型给出的假设...

v-cloak的作用和原理

1、作用 v-cloak 指令常用在插值表达式的标签中&#xff0c;用于解决当网络加载很慢或者频繁渲染页面时&#xff0c;页面显示出源代码的情况。 所以为了提高用户的体验性&#xff0c;使用指令 v-cloak&#xff0c;搭配着 CSS 一起使用&#xff0c;在加载时隐藏挂载内容&#x…...

pip pip3安装库时都指向python2的库

当在python3的环境下使用pip3安装库时&#xff0c;发现居然都指向了python2的库 pip -V pip3 -V安装命令更改为&#xff1a; python3 -m pip install <package>...

和逸云 RK3229 如何进入maskrom强刷模式

图中红圈两个点短接以后插usb&#xff0c;就可以进入maskrom模式强刷...

防静电离子风扇的应用及优点

防静电静电离子风扇是一种用于消除静电的设备&#xff0c;它可以通过离子化原理将静电荷离子化&#xff0c;从而达到静电的效果。防静电静电离子风扇通常采用离子风扇的形式&#xff0c;通过离子化原理将静电荷离子化&#xff0c;从而消除静电。 防静电静电离子风扇的工作原理…...

git中无法使用方向键的问题

windows下使用git命令行执行react脚本安装&#xff0c;发现无法使用上下键来去选中选项。最后只能换成cmd命令执行&#xff0c;发现可以上下移动以选中需要的选项。 bash命令行&#xff1a;移动光标无法移动选项 cmd命令行...

负载均衡中间件---Nginx

一.nginx的好处 学习 Nginx 对于一个全栈开发者来说是非常有价值的&#xff0c;下面是一些学习 Nginx 的原因和好处&#xff1a; 反向代理和负载均衡&#xff1a;Nginx 是一个高性能的反向代理服务器&#xff0c;可以用于将客户端请求转发给多个后端服务器&#xff0c;实现负…...

Linux硬链接、软链接

硬链接是一个目录条目(在基于目录的文件系统中)&#xff0c;它将一个名称与一个文件关联起来。因此&#xff0c;每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(alias eff…...

React面试题总结(一)

1、redux本来是同步的&#xff0c;为什么它能执行异步代码&#xff1f;实现原理是什么&#xff1f;中间件的实现原理是什么&#xff1f; 1、Redux-thunk这个中间件支持异步操作 2、执行异步的操作首先需要下载一个thunk&#xff0c;通过thunk来进行异步的一个操作&#xff0c;支…...

一句话设计模式12:适配器模式

适配器模式: 继承原对象,持有目标对象; 文章目录 适配器模式: 继承原对象,持有目标对象;前言一、适配器模式的作用二、如何适配器模式直接上代码 总结 前言 适配器模式一般使用场景是: 将一个类(接口)转换成客户希望的另外一个类(接口)。其中适配器充当一个假的原类的作用; 一…...

iOS加固保护技术:保护你的iOS应用免受恶意篡改

目录 转载&#xff1a;开始使用ipaguard 前言 下载ipa代码混淆保护工具 获取ipaguard登录码 代码混淆 文件混淆 IPA重签名与安装测试 转载&#xff1a;开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件…...

阿里云产品试用系列-云桌面电脑

无影云电脑&#xff08;WUYING Workspace&#xff09;&#xff0c;是一种易用、安全、高效的云上桌面服务。它支持快速便捷的桌面环境创建、部署、统一管控与运维。无需前期传统硬件投资&#xff0c;帮您快速构建安全、高性能、低成本的企业桌面办公体系。可广泛应用于具有高数…...

vue3使用vue-virtual-scroller虚拟滚动遇到的问题

安装和使用 见官方文档&#xff1a;https://github.com/Akryum/vue-virtual-scroller/tree/master/packages/vue-virtual-scroller 如何获取子组件的实例 背景 本来正常情况下&#xff0c;要获取v-for渲染的子组件的实例&#xff0c;通过ref绑定即可获取到数组&#xff0c;并…...

c#用Gnuplot画图源码

直接调用这个类即可&#xff0c;需要下载个GnuPlot安装下。 // Author: Leonardo Tazziniusing System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Windows.Forms;/// <summary> /// Tested with Gnuplot 5.2 /// </summary&g…...

【前端设计模式】之工厂模式

工厂模式特性 工厂模式是一种创建对象的设计模式&#xff0c;它通过使用工厂类来封装对象的创建逻辑&#xff0c;隐藏了具体对象的实例化过程。工厂模式的主要特性包括&#xff1a; 封装对象的创建过程&#xff1a;工厂模式将对象的创建过程封装在一个工厂类中&#xff0c;客…...

Hive 的函数介绍

目录 ​编辑 一、内置运算符 1.1 关系运算符 1.2算术运算符 1.3逻辑运算符 1.4复杂类型函数 1.5对复杂类型函数操作 二、内置函数 2.1数学函数 2.2收集函数 2.3类型转换函数 2.4日期函数 2.5条件函数 2.6字符函数 三、内置的聚合函数 四、内置表生成函数 五、…...

【Linux基础】第31讲 Linux用户和用户组权限控制命令(三)

用户组管理命令 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同。如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组…...

这几年做那个网站致富/优化网站排名解析推广

厂商提供的PeopleSoft 安装镜像有两个版本&#xff0c;(1)VirtualBox虚拟机版本&#xff0c;这里面是一堆虚拟机文件&#xff0c;直接导入VirtualBox虚拟机中做一些配置即可。(2)NativeOS版本&#xff0c;这个版本的安装文件是直接往windows或者linux安装的&#xff0c;既可以直…...

顺德专业网站制作/搜索引擎优化的简称

学习总结 &#xff08;1&#xff09;学习张贺大佬的题解&#xff0c;使用的模型主要是CNN LSTM Attention&#xff0c;主要学习的是数据处理的完整流程&#xff0c;以及模型构建的完整流程。虽然还没有使用 Bert 等方案&#xff0c;但是理解了这个整个流程之后&#xff0c;如…...

英文网站建/软文广告图片

今天在刷题的时候用到了正则&#xff0c;用的过程中就感觉有点不太熟练了&#xff0c;很久没有用正则都有点忘了。所以现在呢&#xff0c;我们就一起来review一下python中正则模块re的用法吧。 今天是review&#xff0c;所以一些基础的概念就不做介绍了&#xff0c;先来看正则中…...

一个人做网站现实吗/网络营销软件站

原文: http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议&#xff0c;因为他要解决很多问题&#xff0c;而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程&#xff0c;但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节&…...

临沂网站建设设计公司/百度seo技术优化

懒惰像生锈一样&#xff0c;比操劳更能消耗身体&#xff1b;经常用的钥匙&#xff0c;总是亮闪闪的。 ——富兰克林...

wordpress主题ashley/免费发广告的网站

- START - 什么是内存管理器&#xff08;what&#xff09; Python作为一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言&#xff0c;与大多数编程语言不同。Python中的变量无需事先申明&#xff0c;变量无需指定类型&#xff0c;程序员无需关心内存管理&#xff…...