生成模型(自编码器、VAE、GAN)

news2024/11/15 9:41:32

文章目录

  • 自编码器
    • Autoencoder
    • 潜在表示(latent representation)
    • VAE
    • 迁移学习
  • 生成对抗网络GAN
    • 李沐论文精读
      • 摘要
      • 导言
      • 相关工作
      • Adversarial net
      • 简单总结
    • 精读挖坑(
    • 上课内容

来自Manolis Kellis教授(MIT计算生物学主任)的课《人工智能与机器学习》,中间结合李沐的一个精读视频(GAN)作为补充

主要内容就是生成模型,包括自编码器(Autoencoder)、变分自编码器(VAE)和生成对抗网络(GAN)

由于这部分在我学习的课程中不到15分钟,所以内容很少,下面贴出油管链接(这个有一个半小时):

Kellis教授详细的课:Generative Models, Adversarial Networks GANs, Variational Autoencoders VAEs, Representation Learning

生成模型,最经典和热门的就是VAE(变分自编码器)和GAN(生成对抗网络)。

一篇不错的博客:【ML】 第17章 使用自动编码器和 GAN 的表示学习和生成学习

生成模型(Generative Models)和传统的深度学习神经网络是机器学习中两种不同的建模方法,它们的主要区别主要体现在如何学习数据以及预测未来的方式上。

  1. 生成模型(Generative Models):生成模型的目标是学习数据的真实分布,以便能生成新的数据。这些模型会尝试捕获数据的内在结构或者模式,然后用来生成新的、相似的数据。这意味着生成模型可以生成新的、从未见过的数据实例。典型的生成模型包括生成对抗网络(GANs)、变分自编码器(VAEs)和自回归模型等。

    重点:生成模型关注的是学习和理解输入数据的整体分布,并尝试从这个分布中生成新的数据实例。

  2. 传统的深度学习神经网络:这类神经网络主要通过学习输入与输出之间的映射关系进行预测。这种方法通常用于监督学习任务,如分类或回归问题。例如,对于一个图片分类任务,神经网络会尝试学习从图片(输入)到类别标签(输出)的映射关系。典型的这类模型包括卷积神经网络(CNNs)、循环神经网络(RNNs)、全连接网络(DNNs)等。

    重点:传统的深度学习神经网络主要关注学习输入到输出的映射关系,并根据学习到的映射关系进行预测。

总的来说,生成模型和传统的深度学习神经网络的最大区别在于它们的目标不同:生成模型试图理解和生成与训练数据相似的新数据,而传统的深度学习神经网络则试图理解输入数据与输出数据间的映射关系。

自编码器

自编码器就是试图使其输出等于输入的模型。

先放两个快速入门视频,加起来就十分钟

让机器学习重画图(自动编码器Autoencoder)

61 编码器-解码器架构【动手学深度学习v2】

Autoencoder

首先还是得说明一下为什么要有自编码器。我们根据猫猫的图片,要最后生成猫猫的图片,达到最后以假乱真的效果,这个过程不是简单的输入复制到输出。根据自编码器的结构,我们中间是必然有个数据压缩的过程,这个过程可以保证不是简单的复制,而是学到了重要的东西。

  • 自编码器是一种特殊的神经网络,它的输入和输出是相同的。它由两部分组成:编码器(Encoder)和解码器(Decoder)

    • 编码器将高维的输入数据压缩成低维的表征(通常称为“瓶颈”或"bottleneck")
    • 解码器将这个低维表征恢复成高维的数据。编码器和解码器通常都是神经网络。
  • 训练自编码器的过程就是让自编码器学习一个函数,这个函数可以将输入数据编码和解码,使得解码后的数据尽可能接近原始的输入数据。由于自编码器在编码过程中会将数据压缩到低维,所以它常常被用于数据的降维

  • 自编码器的另一个应用是特征学习。自编码器在编码过程中会学习到输入数据的有效表示,这些表示可以捕捉到输入数据的关键特征。在许多应用中,这些特征比原始的输入数据更有用。(编码的过程就是特征抽取,类似CNN的卷积层)

  • 使用**限制性玻尔兹曼机(RBM)**进行预训练的方法。这是一个常见的策略,用来帮助自编码器学习更好的表征。具体来说,我们可以先用RBM在无标签的数据上进行预训练,然后将RBM的输出作为自编码器的输入进行训练。这种预训练的方法可以帮助自编码器学习到更好的特征表示。

  • 使用反向传播(Backpropagation)进行微调的步骤。这是指在预训练之后,我们会使用反向传播算法对自编码器进行微调,使得它的输出更接近输入数据。这个步骤也被称为“微调”或"fine-tuning"。

潜在表示(latent representation)

编码器的输出就是潜在表示(latent representation)

自编码器是一种神经网络模型,它的目标是找到输入数据的潜在表示(latent representation),并通过这个表示重构输入数据。它由编码器和解码器两部分组成,编码器将输入数据压缩到一个潜在空间,而解码器则试图从这个潜在空间恢复原始的输入数据。

然而,传统的自编码器存在一些缺点(在那个科普视频里提到,比较形象):

  1. 没有对潜在表示的约束:这意味着在潜在空间中可能存在“空洞”或“间隙”(gaps),即某些区域可能没有对应的有效输入。这使得从潜在空间中随机抽样并通过解码器生成新的样本变得困难。
  2. 易于过拟合:自编码器可能会“记住”输入数据,而不是学习到数据的真实结构或分布。特别是当模型的复杂度(如神经元数量或层数)过高时,自编码器可能会几乎复制输入数据,而不是找到其潜在表示。
  3. 不清楚如何生成新的样本:由于上述问题,传统的自编码器并不能直接用于生成新的数据。虽然它们可以重构输入数据,但在潜在空间中生成有意义的新数据通常是困难的。
  • 自编码器的结构如图

VAE

补充学习视频:17-机器视觉-13 生成模型VAE

为了解决这些问题,研究人员提出了多种变体,例如变分自编码器(Variational Autoencoder,VAE)。VAE通过引入随机性和对潜在空间的显式约束(例如假设潜在变量遵循某种已知的概率分布,如高斯分布),使得模型可以更好地学习数据的潜在结构,并能够生成新的样本。

  • VAE的结构

  • VAE的结构包括一个概率编码器和一个概率解码器。概率编码器将输入数据编码成一个潜在向量,但不同于传统的自编码器,这个潜在向量不是一个固定的值,而是一个概率分布的参数(例如高斯分布的均值和标准差)。然后,我们从这个分布中采样一个潜在向量,将其输入到概率解码器中,生成重构的输入数据。

  • VAE的一个关键技巧是"重参数化技巧"(reparameterization trick)。这个技巧允许我们在训练过程中通过反向传播优化概率编码器和概率解码器。具体来说,我们将潜在向量的采样过程写成一个确定性的函数和一个独立的噪声项的和。例如,如果我们假设潜在向量遵循高斯分布,那么我们可以将潜在向量表示为均值加上标准差乘以一个标准正态分布的随机噪声。这样,我们就可以将所有的随机性归因于噪声项,而将确定性的函数(即编码器和解码器)通过反向传播进行优化。

  • “ideally they are identical”,这可能是指VAE的目标是使重构的输入数据尽可能接近原始的输入数据。这一目标通过最小化重构损失和一个正则化项(通常是KL散度)来实现,KL散度项鼓励潜在空间的分布接近先验分布(例如标准正态分布)。

  • “An compressed low dimensional representation of the input”,这是指VAE的潜在向量,它是输入数据的低维压缩表示,捕捉了输入数据的关键信息。通过调整这个潜在向量,我们可以生成新的数据样本,这是VAE的一个主要优点。

迁移学习

迁移学习:迁移学习是一种机器学习策略,它利用在源任务上学习到的知识来帮助解决目标任务。例如,如果我们已经在一个大型公共数据集(如ImageNet)上训练了一个深度神经网络,那么我们可以利用这个网络在目标任务(如医疗影像识别)上的表现。这通常会在目标任务的数据集较小时带来显著的性能提升。

具体来说,我们通常会将源任务的模型的卷积层(conv layers)作为特征提取器使用,并在其上加一个新的全连接层(fc layer)和softmax层进行分类。全连接层和softmax层会在目标任务的数据上进行训练,而卷积层可以选择冻结(不训练)或进行微调

领域适应:领域适应是迁移学习的一个特例,它主要关注的是源任务和目标任务的数据分布不一致的情况。例如,我们可能在清晰的照片上训练了一个人脸识别模型,但我们希望在模糊的监控视频中使用这个模型。在这种情况下,我们需要进行领域适应,以使模型能够适应目标领域的数据分布

领域适应通常涉及到一些特殊的技术,如领域对抗神经网络(Domain-Adversarial Neural Network, DANN)。DANN通过对模型添加一个领域分类器,使模型在源领域和目标领域的数据上的表现尽可能一致,从而达到领域适应的目标。

总的来说,迁移学习和领域适应都是利用源任务的知识来帮助解决目标任务,它们在许多实际应用中都表现出了显著的效果

生成对抗网络GAN

李沐论文精读

沐神:GAN论文逐段精读【论文精读】

论文:https://arxiv.org/pdf/1406.2661.pdf【最早版本的】

Generative Adversarial Nets

摘要

我们提出了一种新的框架,通过对抗过程来估计生成模型,该过程中我们同时训练两个模型:一个是生成模型G,捕获数据分布;另一个是判别模型D,估计一个样本来自训练数据的概率,而非从模型G生成。模型G的训练过程是最大化模型D出错的概率。这个框架对应一个极小极大两人博弈。在任意函数G和D的空间中,存在一个唯一的解决方案,模型G能恢复训练数据分布,模型D在各处等于0。在模型G和D被定义为多层感知机的情况下,整个系统可以通过反向传播进行训练。在训练或生成样本过程中,无需任何马尔可夫链或展开近似推断网络。实验证明,通过定性和定量评估生成的样本,该框架具有巨大潜力。

导言

作者认为深度学习不仅仅是神经网络,更多的是对整个数据分布的一个特征的表示。目前DL在辨别模型上表现还可以,但在生成模型上表现很差。原因是在最大化似然函数的时候,要对概率分布进行很多近似,这个近似带来了很多计算上的困难。意思就是说我不用去近似你那个似然函数了,我有其他方法得到一个好的计算模型(其实还是近似似然函数 只是KL divergence这个度量本身也拿来近似了。)。

在我们提出的对抗网络框架中,生成模型与一个对手即判别模型对立:判别模型学习判断一个样本是来自模型分布还是数据分布。生成模型可以被视为类似于造假币的团队,试图制造假币并在不被检测的情况下使用,而判别模型可以被视为警察,试图检测出假币。这个游戏中的竞争驱使两个团队都提升他们的方法,直到假币与真币无法区分。

这个框架可以产生针对许多类型的模型和优化算法的特定训练算法。**在这篇文章中,我们探索了生成模型通过多层感知器传递随机噪声生成样本,而判别模型也是多层感知器的特殊情况。我们称这个特殊情况为对抗网络。**在这种情况下,我们可以使用高度成功的反向传播和dropout算法来训练两种模型,并且仅使用前向传播从生成模型中采样。不需要近似推断或马尔可夫链(复杂的采样)。

首先搞明白噪声的定义是均匀分布的数据 MLP是拟合数据分布特征 所以才会输入噪音的说法

输入噪声是为了提供随机性。在生成模型中,特别是在对抗生成网络(GAN)中,我们希望模型能生成多样性的样本,而不仅仅是重复或复制训练数据。这种多样性的一种来源就是输入噪声。噪声提供了随机性,使得每次通过模型生成的样本都有所不同。

将噪声作为输入,能使模型学习将这个噪声映射到数据的分布上。模型不断调整自己的参数,以尽量使噪声经过模型处理后生成的样本更接近真实数据的分布。这是一个动态的过程,模型会不断地通过学习来改善这种映射,使得生成的样本能更好地反映真实数据的特性。

此外,通过输入噪声,可以拟合数据的分布特征,这是因为这个过程实际上是在模拟数据生成的过程。在现实世界中,数据的生成往往也是伴随着各种不确定性和随机性的,这些随机性就像是噪声一样。因此,我们通过将噪声输入到模型中,实际上是在模拟这种数据生成的过程,使得生成的样本能更好地反映数据的分布特性。

  • 举个例子

我们可以想象一下生成模型就像一个画家,而噪声就像他的灵感来源。

画家需要画一张和给定样本(比如说一幅著名的油画)相似的画。画家每次画画的时候,都会受到一些随机的灵感(这就是噪声)。这些灵感会影响他的画作,使得每一次他画出来的画都有一些细微的不同。然而,尽管他的每一幅画都不完全相同,但是他的目标是让他的画作尽可能地接近那幅著名的油画。

开始的时候,画家可能还不是很擅长画画,他的画和著名的油画相去甚远。但是,通过不断地练习和改进,他的技巧会越来越好,他的画作也会越来越接近那幅著名的油画。最终,他可能会达到一个点,他的画作已经无法被人类观察者区分出是否为原作。

这就是生成模型(画家)如何通过输入噪声(灵感)来拟合数据(著名的油画)的分布特征。噪声提供了一种随机性,使得模型生成的样本具有多样性,同时模型通过学习和优化,使得这些生成的样本尽可能地接近真实的数据分布。

相关工作

直到近期,大部分关于深度生成模型的研究都集中在提供概率分布函数参数化规定的模型上。然后,这种模型可以通过最大化对数似然来进行训练。在这个模型系列中,可能最成功的就是深度Boltzmann机器。这种模型通常有难以处理的似然函数,因此需要对似然梯度进行大量近似。这些困难激发了“生成机器”的开发——这些模型并不明确表示似然,但却能从期望的分布中生成样本。生成随机网络就是一种可以通过精确的反向传播进行训练的生成机器,而不是像Boltzmann机器那样需要大量的近似。我们的工作扩展了生成机器的理念,通过使用观察到的结果进行反向传播梯度,消除了生成随机网络中使用的马尔可夫链。

以往的深度生成模型,如深度Boltzmann机器,往往需要对复杂的似然函数进行近似处理,这导致了训练过程的困难。为了解决这个问题,研究者发展出了不直接依赖似然的生成模型,例如生成随机网络,这些模型能更简单地通过反向传播进行训练。本文的工作进一步扩展了这种生成模型的理念,消除了生成过程中的马尔可夫链,使得模型更简洁,训练过程更直接。

作者提及了他们在开发这项工作时并未意识到其他研究者已经开发了更为通用的随机反向传播规则,这些规则允许通过有限方差的高斯分布进行反向传播,并且可以向协方差参数以及均值进行反向传播。这种方法有可能使人们能够学习生成模型的条件方差,而在当前的工作中,这被视为超参数。

他们还提到了变分自编码器(VAEs)和生成对抗网络(GANs)的相似性和差异。两者都配备了一个可微分的生成网络和第二个神经网络,但是在VAEs中,第二个网络是执行近似推理的识别模型。相比之下,GANs则不能模拟离散数据,而VAEs不能具有离散的潜在变量。

此外,作者还讨论了一些其他的方法,例如噪声对比估计(NCE),它通过学习鉴别数据和噪声分布的权重来训练生成模型。然而,NCE的主要限制在于它的"鉴别器"需要能够评估和通过噪声分布和模型分布的概率密度进行反向传播。

最后,作者提到了他们的工作与“可预测性最小化”这个概念的不同之处。在可预测性最小化中,网络的每个隐藏单元都被训练成与第二个网络的输出不同,而在这项工作中,网络之间的竞争是唯一的训练标准,而且它本身就足以训练网络。

Adversarial net

视频从15:50到25:33

比较适合多听几遍(就懂了),比笔记效果好

D目标是尽量完美,使得V最大;G目标是尽量使D犯错,使得V最小。并且我们最终要让G胜利,通过这种对抗中进步,能使得G的对手越来越厉害,相应的,G也会越来越厉害。

有点像EM算法

在对抗模型框架中,最直接的应用是在两个模型都是多层感知机(MLP)的情况下。为了学习生成器的数据分布pg,我们在输入噪声变量pe(z)上定义了一个先验,然后通过多层感知机将它映射到数据空间,得到G(z; θg)。同时,我们还定义了一个输出单一标量的多层感知机D(x; θd),D(x)表示样本x来自真实数据的概率。我们同时训练D和G,使D最大化为训练样本和G生成的样本分配正确标签的概率,而G最小化log(1 - D(G(z)))。

在这个过程中,D和G实质上是在进行一种最小最大化的双人博弈,其目标函数为V(D, G)。理论分析表明,只要G和D给定足够的容量,这个训练标准就能恢复出数据生成的分布。

然而在实践中,需要通过迭代的数值方法来实现这个博弈。由于在有限数据集中完全优化D的计算成本过高,且会导致过拟合,所以我们选择在优化D的k步之后,优化G一步。这种策略类似于SML/PCD训练中的做法,即在学习的每一步都保持马尔科夫链的样本,以避免在学习的内层循环中进行马尔科夫链的燃烧。

此外,作者提到,在实践中,公式(1)可能并不提供足够的梯度以供G良好地学习。在学习初期,当G的性能较差时,D可以高度自信地拒绝样本,因为它们明显与训练数据不同。在这种情况下,log(1 - D(G(z)))会饱和。为了解决这个问题,我们可以训练G去最大化log D(G(z)),这样可以在学习初期提供更强的梯度。

所以,这段内容的核心点在于:

  1. 描述了对抗模型框架的实施细节。
  2. 提出了在训练中遇到的问题,以及针对这些问题的解决方案。
  3. 指出在理论上,只要给定足够的模型容量,就能恢复出数据生成的分布。

后面的理论部分和证明真妙啊,光顾着听了,笔记以后在补充(挖坑+1)

简单总结

首先GAN是一个无监督学习,但是他用的是有监督学习的损失函数来训练。他数据的标号来自于数据(是采样的还是生成的),在训练上高效很多。这是以后自监督学习比如BERT的灵感来源。

精读挖坑(

还有一个精读笔记以后再补充(挖坑+2):

同济子豪兄:生成对抗网络GAN开山之作论文精读

上课内容

Kellis教授这些讲的很快,就5张ppt,甚至还没讲(晕),就贴个图吧

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

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

相关文章

14种UML图(统一建模语言)

目录 1.简述2.UML组成3.UML事物4.UML关系5.UML图5.1 UML图的分类5.2 结构图(静态图)1)类图2)对象图3)构件图4)部署图5)制品图6)包图7)复合结构图 5.3 行为图(…

k8s进阶4——安全机制常用工具之kube-beach、kube-hunter、Trivy、kubesec

文章目录 一、K8s安全机制二、kube-beach工具2.1 安装2.2 工具使用2.2.1 改成INFO状态2.2.2 改成pass状态 三、kube-hunter工具四、Trivy镜像漏洞扫描工具五、kubesec检查YAML文件安全配置 一、K8s安全机制 基本了解: 我们在前面学习的安全控制RBAC就属于K8s安全机制…

【Midjourney】Midjourney Prompt 提示词 ② ( 怀旧像素风 | 物体 A 被物体 B 包围 | 折纸艺术风格 )

文章目录 一、8-bit 16bit 提示词 - 怀旧像素风二、A out of B 提示词 - 物体 A 被物体 B 包围三、layered paper 提示词 - 折纸艺术风格 一、8-bit 16bit 提示词 - 怀旧像素风 使用 8-bit 16-bit 提示词 , 可以绘制出 像素游戏风格的图像 , 如下图所示 ; 该提示词适合创作与游…

Linux Web服务(HTTP HTML DNS)

DNS 域名解析 DNS负责将域名转换为IP地址。 详细的介绍在之前的博客中有详细记录。 这里回顾一下DNS的解析过程。 域名结构 主机名.子域.[二级域].顶级域.(根域) DNS 解析过程(面试题) 客户端 -> 本地缓存域名服务器 -> 根域服务器 -> 二级域服…

测试分析流程及输出项

测试分析 一、确认测试范围 根据测试项目的不同需求,有大致几类测试项目类型:商户平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析,并给出对应…

NIFI1.21.0最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050

这里要提一嘴...看中文的,视频或者文档虽然学习会快一点,但是... 有的时候一些新的东西没有中文的,还是得看英文的...时间就了就好了,要不然解决不了问题 英文写的,凡是好东西,肯定是很详细的,并且就是为了让别人弄明白,做了大量解释,所以不用担心看不懂... 首先,把安装包,上…

Java的Arrays类的sort()方法(41)

目录 sort()方法 1.sort()方法的格式 2.使用sort()方法时要导入的类 3.作用 4.作用的对象 5.注意 6.代码及结果 (1)代码 (2)结果 sort(&…

redis【stream】:对redis流数据类型的详细介绍

目录 stream产生原因 stream的概念 stream底层实现 stream的常用指令 常用命令一览: xadd命令 xread命令 xlen命令 xrange命令 xrevrange命令 xtrim命令 xdel命令 xgroup命令 xinfo命令 xpending命令 xreadgroup命令 xack命令 xclaim命令 stream产…

集合的三种遍历方式

文章目录 目录 文章目录 一.迭代器遍历 二.增强for遍历 三. forEach方法 四. Lambda表达式 函数式接口: 函数式接口是指只有一个抽象方法的接口 为什么Lambda只能用于函数式接口 总结 前言 作者简介:最爱吃兽奶 座右铭:抱怨身处黑暗,不如提灯前行 内容介绍:今天给大家讲一下集合…

学完能拿下阿里23k的JMeter+Grafana+Influxdb搭建可视化性能测试监控平台

【背景说明】 使用jmeter进行性能测试时,工具自带的查看结果方式往往不够直观和明了,所以我们需要搭建一个可视化监控平台来完成结果监控,这里我们采用三种JMeterGrafanaInfluxdb的方法来完成平台搭建 【实现原理】 通过influxdb数据库存储…

Shell运维实战3-while、case、for、select

目录 case基本case 企业级案例 while 循环当型与直到后台运行while 实战 for & selectfor 循环方法linux 生成随机数select case 基本 请注意 case 使用后的闭合问题,开头 case,结尾 esac #! /bin/bashread -p "input your number:" ans…

【C++刷题集】-- day3

目录 选择题 单选 OR59 字符串中找出连续最长的数字串⭐ 【题目解析】 【解题思路】 JZ39 数组中出现次数超过一半的数字⭐ 【题目解析】 【解题思路1】 【解题思路2】 选择题 单选 1、以下程序的输出结果是 ( ) #include <stdio.h> int main() {char a[10] …

vite + vue3 + storybook + ts 搭建组件库记录

目标 只按需引入&#xff0c;不依赖babel-import-plugin 插件。第三方依赖都不打包。用原生fetch请求数据。仅支持esmodule。配置package.json type:"module" 搭建 根据storybook 官网文档&#xff0c;需要在已有的项目中运行 npx storybooklatest init 也就是事…

电源原理分析、波形分析、应力计算、回路布局

1、Flyback变换器工作模态分析&#xff1b; 2、Flyback关键波形分析&#xff1b; 3、RCD吸收电路设计及开关管应力&#xff1b; 4、从噪音回路看布线要点。 5、基于实际项目&#xff0c;原创反激开关电源视频教程曝光 Flyback 变换器模态分析 ​ ON&#xff1a;开关管导通&…

516. 最长回文子序列

516. 最长回文子序列 C代码&#xff1a;dp int longestPalindromeSubseq(char* s) {int n strlen(s);int dp[n][n];memset(dp, 0, sizeof(dp));for (int i 0; i < n; i) {dp[i][i] 1;}for (int i n - 1; i > 0; i--) {for (int j i 1; j < n; j) {if (s[i] s[…

2023最新CTF入门的正确姿势

前言 随着网络安全意识的增强&#xff0c;越来越多的人开始涉足网络安全领域&#xff0c;其中CTF比赛成为了重要的学习和竞赛平台。本人从事网络安全工作多年&#xff0c;也参加过大大小小的CTF比赛&#xff0c;今天就来详细介绍CTF的流程&#xff0c;以及需要具备的知识&…

【前端相关】elementui使用el-upload组件实现自定义上传

elementui使用el-upload组件实现自定义上传 一、问题描述二、实现方式三、实现步骤3.1 方式一&#xff1a;选择后自动上传3.2 方式二&#xff1a;选择图片后手动上传3.3 拓展&#xff1a;上传文件夹 四、服务器相关接口 一、问题描述 elmentui 中的upload默认的提交行为是通过…

[C++]哈希表实现,unordered_map\set封装

目录​​​​​​​ 前言&#xff1a; 1 哈希 1.1 为什么有哈希 1.2 哈希结构 1.3 哈希冲突 2 闭散列 2.1 闭散列结点结构和位置状态表示 2.2 哈希类结构 2.3 插入 2.4 查找 2.5 删除 3 开散列 3.1 哈希表结点结构 3.2 哈希表结构 3.3 插入 3.4 查找、删除 3.5…

Ubuntu/Debian/CentOS搭建Socks5代理一键脚本

说明 Socks5属于明文代理&#xff0c;不要用于科学上网&#xff0c;否则会被阻断端口&#xff0c;可用于正常的跳板使用&#xff1b; 比如SSH转发加速国外VPS的连接速度&#xff0c;特别是一些延迟高或者丢包高的VPS&#xff1b; 使用Socks5转发后SSH就可以快速稳定的连接了&a…

Java中的Replace和ReplaceAll的区别

replace和replaceAll是都是String类中提供的两种用于字符/字符串替换的方法&#xff0c;从字面意思理解&#xff0c;replace表示替换单个匹配项&#xff0c;而replaceAll表示替换所有匹配项&#xff1b;实际上并不是这样子的,replace和replaceAll都是替换所有匹配项,replace是非…