【论文笔记】Editing Models with Task Arithmetic

news2024/12/20 4:34:35

🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


基本信息

标题: Editing Models with Task Arithmetic
作者: Gabriel Ilharco, Marco Tulio Ribeiro, Mitchell Wortsman, Suchin Gururangan, Ludwig Schmidt, Hannaneh Hajishirzi, Ali Farhadi
发表: ICLR 2023
arXiv: https://arxiv.org/abs/2212.04089

基本信息

摘要

改变预训练模型的行为——例如,提高其在下游任务上的性能或减轻在预训练过程中学习的偏差——是开发机器学习系统时的常见做法。

在本工作中,我们提出了一种以任务向量为中心的新范式来引导神经网络的行为。

任务向量指定了预训练模型权重空间中的一个方向,使得在该方向上的移动可以改善任务性能。

我们通过从在任务上微调后的模型权重中减去预训练模型的权重来构建任务向量。

我们表明,这些任务向量可以通过如取反和加法等算术运算进行修改和组合,并且相应地引导结果模型的行为。

取反任务向量会降低目标任务上的性能,而对控制任务上的模型行为影响很小。

此外,将任务向量相加可以同时提高多个任务上的性能。

最后,当任务通过形式为“ A A A 对于 B B B 正如 C C C 对于 D D D”的类比关系相联系时,结合来自三个任务的向量可以改善第四个任务的性能,即使没有使用第四个任务的数据进行训练。

总的来说,我们在多个模型、模态和任务上的实验表明,任务算术是一种简单、高效且有效的编辑模型的方法。

任务向量

为了我们的目的,一个任务通过用于微调的数据集和损失函数实例化。

θ pre ∈ R d \theta_{\text{pre}} \in \mathbb{R}^d θpreRd 为预训练模型的权重, θ ft t ∈ R d \theta_{\text{ft}}^t \in \mathbb{R}^d θfttRd 为在任务 t t t 上微调后的相应权重。

任务向量 τ t ∈ R d \tau_t \in \mathbb{R}^d τtRd θ ft t \theta_{\text{ft}}^t θftt θ pre \theta_{\text{pre}} θpre 的逐元素差给出,即 τ t = θ ft t − θ pre \tau_t = \theta_{\text{ft}}^t - \theta_{\text{pre}} τt=θfttθpre

当任务从上下文中明确时,我们省略标识符 t t t,简单地将任务向量称为 τ \tau τ

任务向量可以应用于来自相同架构的任何模型参数 θ \theta θ,通过逐元素加法,带有可选的缩放项 λ \lambda λ,使得生成的模型具有权重 θ new = θ + λ τ \theta_{\text{new}} = \theta + \lambda \tau θnew=θ+λτ

在我们的实验中,缩放项是使用留出的验证集确定的。

请注意,将单个任务向量添加到预训练模型中,其中 λ = 1 \lambda = 1 λ=1,结果是该任务上微调的模型。

Editing models with task arithmetic

An illustration of task vectors and the arithmetic operations we study for editing models

我们重点关注三种任务向量上的算术表达式,如图1所示:对任务向量取反、将任务向量相加,以及组合任务向量以形成类比。

所有操作都是逐元素应用于权重向量的。

当对任务向量 τ \tau τ 取反时,应用得到的向量 τ new = − τ \tau_{\text{new}} = -\tau τnew=τ 对应于在微调模型和预训练模型之间进行外推。得到的模型在目标任务上表现更差,对控制任务的性能几乎没有变化。

将两个或多个任务向量 τ i \tau_i τi 相加得到 τ new = ∑ i τ i \tau_{\text{new}} = \sum_i \tau_i τnew=iτi,结果是一个在所有任务上都表现出色的多任务模型,有时甚至比在单个任务上微调的模型表现更好。

最后,当任务 A A A B B B C C C D D D 形成类比形式“ A A A 对于 B B B 正如 C C C 对于 D D D”时,任务向量 τ new = τ C + ( τ B − τ A ) \tau_{\text{new}} = \tau_C + (\tau_B - \tau_A) τnew=τC+(τBτA) 提升了任务 D D D 的性能,即使该任务的数据很少或没有数据。

对于所有操作,通过应用 τ new \tau_{\text{new}} τnew 得到的模型权重由 θ new = θ + λ τ new \theta_{\text{new}} = \theta + \lambda \tau_{\text{new}} θnew=θ+λτnew 给出,其中缩放项 λ \lambda λ 是使用留出的验证集确定的。

Forgetting via negation

在这部分中,我们展示对任务向量取反是一种有效的方法,可以在不显著影响其他任务性能的情况下降低其在目标任务上的表现。

遗忘或“反学习”可以帮助缓解预训练时学到的不希望有的偏差;完全遗忘任务可能是为了遵守法规或出于伦理原因,比如防止图像分类器识别面部,或通过OCR“读取”个人信息。

这些干预措施不应显著影响模型在处理编辑范围之外的数据时的行为。

因此,我们在控制任务上测量准确率,除了评估任务向量来源的目标任务。

我们的实验展示了对任务向量取反在编辑图像分类和文本生成模型中的有效性。

图像分类

对于图像分类,我们使用了CLIP模型和Ilharco等人研究的八个任务的任务向量,这些任务从卫星图像识别到交通标志分类:Cars、DTD、EuroSAT、GTSRB、MNIST、RESISC45、SUN397和SVHN。

对于控制任务,我们使用ImageNet。我们通过在每个目标任务上进行微调来生成任务向量。

我们与两个额外的基线进行比较:通过向增加损失的方向进行微调(即,使用梯度上升),如Golatkar等人和Tarun等人所做;以及使用一个随机向量,其中每一层的幅度与任务向量的相应层相同。

Forgetting image classification tasks via negation

如表1所示,对任务向量取反是在减少目标任务准确率的同时对控制任务影响最小的有效编辑策略。

例如,负任务向量将ViT-L/14的平均目标任务准确率降低了45.8个百分点,而对控制任务的准确率几乎没有变化。

相比之下,使用随机向量对目标任务准确率影响不大,而使用梯度上升进行微调则严重恶化了控制任务的性能。

文本生成

我们研究了是否可以通过对训练出特定行为的任务向量取反来缓解该模型的特定行为。

具体而言,我们的目标是减少由各种大小的GPT-2模型生成的有毒内容的数量。

我们通过在Civil Comments中毒性分数高于0.8的数据上微调来生成任务向量,然后对这个任务向量取反。

与上节一样,我们还比较了在微调时使用梯度上升的基线,以及使用相同幅度的随机任务向量。

此外,我们还与从Civil Comments(毒性分数小于0.2)的非有毒样本上进行微调进行了比较,类似于Liu等人。

我们使用Detoxify测量了一千个模型生成的毒性。

对于控制任务,我们测量了语言模型在WikiText-103上的困惑度。

Making language models less toxic with negative task vectors

如表2所示,使用负任务向量进行编辑是有效的,将分类为有毒的生成量从4.8%减少到0.8%,同时在控制任务上保持困惑度在预训练模型的0.5个百分点以内。

相比之下,使用梯度上升进行微调通过将控制任务的性能降低到不可接受的水平来减少有毒生成,而在非有毒数据上进行微调在减少任务生成和控制任务上都比任务向量差。

作为实验对照,添加一个随机向量对有毒生成或在WikiText-103上的困惑度几乎没有影响。

Learning via addition

我们现在将注意力转向添加任务向量,无论是构建能够在多个任务上同时表现出色的多任务模型,还是改进单任务性能。

这一操作使我们能够在不进行额外训练或访问训练数据的情况下,重用和转移来自内部模型或大量公开可用的微调模型的知识。

我们探索了在各种图像分类和自然语言处理任务上添加任务向量的应用。

图像分类

我们开始使用与上文相同的八个模型,这些模型在一系列多样化的图像分类任务(Cars、DTD、EuroSAT、GTSRB、MNIST、RESISC45、SUN397和SVHN)上进行了微调。

Adding pairs of task vectors from image classification tasks

如图2所示,我们展示了通过添加这些任务中所有成对的任务向量所获得的准确性。

为了考虑任务难度的差异,我们通过在该任务上微调的模型的准确率来归一化每个任务的准确率。

在归一化后,微调模型在其各自任务上的性能均为1,因此使用多个专用模型的平均性能也为1。

如图2所示,添加成对的任务向量得到一个单一模型,其性能大幅超越零样本模型,并且与使用两个专用模型相当(平均归一化准确率为98.9%)。

除了任务对之外,我们还探索了为所有可能的子集(总共 2 8 2^8 28 个)添加任务向量。

Adding task vectors builds multi-task models for image classification tasks

在图3中,我们展示了最终模型的归一化准确性,这些准确性是通过对所有八个任务进行平均得到的。

随着可用任务向量数量的增加,可以生成更好的多任务模型。当所有任务向量都可用时,通过添加任务向量生成的最佳模型达到了91.2%的平均性能,尽管将多个模型压缩成了一个。

自然语言处理

除了构建多任务模型外,我们还探讨了添加任务向量是否是提高单个目标任务性能的有效方法。

为此,我们首先在GLUE基准中的四个任务上微调T5-base模型,如Wortsman等人所做。

然后,我们在Hugging Face Hub上搜索兼容的检查点,共找到427个候选者。

我们尝试将每个对应的任务向量添加到我们的微调模型中,基于留出的验证数据选择最佳的检查点和缩放系数。

Improving performance on target tasks with external task vectors

如表3所示,添加任务向量可以提高目标任务的性能,相比微调。

Task analogies

在本节中,我们探讨了以“ A A A 对于 B B B 正如 C C C 对于 D D D”形式的任务类比,并展示使用前三个任务的向量进行任务算术可以提高任务D的性能,即使对于该任务的数据很少或根本没有数据。

Domain generalization

对于许多目标任务,收集未标记的数据比收集人工注释更容易且成本更低。

当目标任务的标记数据不可用时,我们可以使用任务类比来提高目标任务的准确性,利用有标记数据的辅助任务和无监督学习目标。

例如,考虑使用Yelp数据进行情感分析的目标任务。

使用任务类比,我们可以构建一个任务向量 τ ^ yelp; sent = τ amazon; sent + ( τ yelp; lm − τ amazon; lm ) \hat{\tau}_{\text{yelp; sent}} = \tau_{\text{amazon; sent}} + (\tau_{\text{yelp; lm}} - \tau_{\text{amazon; lm}}) τ^yelp; sent=τamazon; sent+(τyelp; lmτamazon; lm),其中 τ amazon; sent \tau_{\text{amazon; sent}} τamazon; sent 是通过在来自Amazon的标记数据上进行微调获得的(情感分析使用来自Amazon的数据;McAuley & Leskovec),而 τ yelp; lm \tau_{\text{yelp; lm}} τyelp; lm τ amazon; lm \tau_{\text{amazon; lm}} τamazon; lm 是通过在两个数据集的输入上进行(无监督)语言建模获得的任务向量。

Improving domain generalization with task analogies

在表4中,我们展示了使用此类任务类比可以提高T5模型在多个尺度上的准确性,无论是将Amazon还是Yelp二元情感分析作为目标任务。

我们经验性地发现,给情感分析任务向量更高的权重可以提高准确性,因此我们在这些实验中使用了两个独立的缩放系数——一个用于情感分析任务向量,另一个用于两个语言建模任务向量。

使用任务向量在所有模型和数据集上都优于在剩余的辅助情感分析任务上进行微调,接近在目标任务上进行微调的性能。

Subpopulations with little data

在某些数据子群体中通常存在一些固有的稀缺性——例如,室内环境中的狮子图像比户外环境中的狮子图像或一般情况下的狗(无论室内还是室外)图像更为罕见。

每当这些子群体与数据更为丰富的其他群体存在类比关系时(如本例所示),我们可以应用任务类比,例如, τ ^ lion indoors = τ lion outdoors + ( τ dog indoors − τ dog outdoor ) \hat{\tau}_{\text{lion indoors}} = \tau_{\text{lion outdoors}} + (\tau_{\text{dog indoors}} - \tau_{\text{dog outdoor}}) τ^lion indoors=τlion outdoors+(τdog indoorsτdog outdoor)

我们通过创建四个子群体来探索这一情景,使用ImageNet和人类素描数据集之间的125个重叠类别。

我们将这些类别分为大致相等的两个子集,创建四个子群体A、B、C和D,其中(A, C)和(B, D)共享相同的类别,而(A, B)和(C, D)共享相同的风格(照片逼真图像或素描)。

尽管这些子群体在我们的实验中有许多类别,但我们使用简化的子集 “real dog”, “real lion”, “sketch dog” and “sketch lion” 作为运行示例。

给定一个目标子群体,我们通过在剩余的子群体上独立微调三个模型来创建任务向量,然后通过任务算术将它们组合起来,例如,对于目标子群体“sketch lion”, τ ^ sketch lion = τ sketch dog + ( τ real lion − τ real dog ) \hat{\tau}_{\text{sketch lion}} = \tau_{\text{sketch dog}} + (\tau_{\text{real lion}} - \tau_{\text{real dog}}) τ^sketch lion=τsketch dog+(τreal lionτreal dog)

我们在图4中展示了结果,这些结果是对四个目标子群体的平均值。

Learning about subpopulations via analogy.

与预训练模型相比,任务向量平均提高了3.4个百分点的准确性。

此外,当目标子群体的一些数据可用于微调时,从编辑后的模型开始始终比从预训练模型开始获得更高的准确性。

仅从类比中获得的收益(没有额外的数据)大致相当于为目标子群体收集和标注大约一百个训练样本的效果。

讨论

在这一节中,我们通过探讨不同任务的任务向量之间的相似性,以及不同学习率和随机种子的影响,对先前结果进行了进一步的分析。

我们最后讨论了我们方法的一些局限性。

Similarity between task vectors

在图5中,我们探讨了不同任务的任务向量之间的余弦相似度,旨在了解如何通过加法将多个模型合并为单个多任务模型。

我们观察到来自不同任务的向量通常接近正交,并推测这允许通过加法组合任务向量,干扰最小。

我们还观察到当任务在语义上彼此相似时,余弦相似度更高。

Task vectors are typically close to orthogonal

例如,图5中最大的余弦相似度出现在MNIST、SVHN和GTSRB之间,这些任务的关键是识别数字,以及EuroSAT和RESISC45之间,它们都是卫星图像识别数据集。

这种“任务空间”中的相似性可能有助于解释Ilharco等人中的某些结果,其中在单个任务上微调的模型权重与预训练模型权重之间进行插值——用我们的术语来说,就是应用单个任务向量——有时可以提高没有数据的不同任务的准确性(例如,应用MNIST任务向量可以提高SVHN的准确性)。

The impact of the learning rate

在图6中,我们观察到增加学习率会降低使用任务向量和微调单个模型时的准确性,但对于单个模型,这种下降更为平缓。

The impact of learning rate when fine-tuning

这些发现与的研究结果一致,该研究观察到在使用较大的学习率时,两个微调模型之间的线性路径上的准确性会降低。

因此,虽然较大的学习率在微调单个模型时可能可以接受,但我们建议在使用任务向量时更加谨慎。

此外,我们假设较大的学习率可以解释在添加来自自然语言处理任务的向量时的一些方差,其中我们采用社区中其他人微调的模型。

The evolution of task vectors throughout fine-tuning

图7展示了任务向量在微调过程中的演变。

How task vectors evolve throughout fine-tuning

中间任务向量迅速收敛到微调结束时获得的最终任务向量方向。

此外,通过添加两个图像分类任务的中间任务向量获得的模型精度在仅几百步后就趋于饱和。

这些结果表明,使用中间任务向量可以是一种在精度损失很小的情况下节省计算的有用方法。

Limitations

任务向量仅限于具有相同架构的模型,因为它们依赖于模型权重上的逐元素操作。

此外,在我们所有的实验中,我们仅在从同一预训练初始化微调的模型上执行算术运算,尽管有研究表明放宽这一假设是有希望的。

我们还注意到,一些架构非常流行,并且有“标准”初始化——例如,在撰写本文时,Hugging Face Hub上有超过3000个模型是从同一BERT-base初始化微调的,还有超过800个模型是从同一T5-small初始化微调的。

总结

在这篇论文中,我们介绍了一种基于任务向量算术运算的编辑模型新范式。

对于各种视觉和NLP模型,添加多个专用任务向量可以导致一个在所有目标任务上表现良好的单一模型,甚至可以提升单个任务的表现。

取反任务向量允许用户移除不希望的行为,例如,有毒生成,甚至完全忘记特定任务,同时保持其他方面的性能。

最后,任务类比利用现有数据来提高数据稀缺的领域或子群体的性能。

在任务向量上的算术运算仅涉及添加或减去模型权重,因此计算效率高,尤其是与涉及额外微调的替代方案相比。

因此,用户可以轻松尝试各种模型编辑,从大量公开可用的微调模型中回收和转移知识。

由于这些操作导致单个模型大小不变,因此不会产生额外的推理成本。

我们的代码可在https://github.com/mlfoundations/task_vectors上获取。

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

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

相关文章

c++ [eigen库配置和使用]

实验环境 eigen 3.40 下载链接 https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip Visual Studio 2022配置 解压eigen后&#xff0c;在项目中配置包含目录 代码示例 加头文件 #include <Eigen/Dense> using namespace Eigen;矩阵运算 MatrixXd …

SpringBoot完整技术汇总

SpringBoot 注意&#xff1a;SpringBoot技术示例中的项目均已上传至Gitee&#xff0c;均可通过此处自行下载 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 Spring程序与SpringBoot程序对比如下 Spring程序配置…

windows 使用python共享网络给另外一个网卡

# -*- coding: utf-8 -*- import subprocessdef open_share(to_shared_adapter, from_shared_adapter):"""打开以太网的网络共享:return: None"""powershell_script f"""# Register the HNetCfg library (once)# regsvr32 hnetc…

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip&#xff0c;怎么办&#xff0c;怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…

Linux入门攻坚——42、Nginx及web站点架构模式

对于lvs集群&#xff0c;是一个四层路由的集群&#xff0c;Director无需启用对端口的监控&#xff0c;直接将报文转发给后端业务服务器RealServer。 使用Nginx也可以实现集群功能&#xff0c;Nginx实现反向代理&#xff0c;实现的是七层上的转发&#xff0c;要求Nginx本身就是…

Git merge 和 rebase的区别(附图)

在 Git 中&#xff0c;merge 和 rebase 是两种用于整合分支变化的方法。虽然它们都可以将一个分支的更改引入到另一个分支中&#xff0c;但它们的工作方式和结果是不同的。以下是对这两者的详细解释&#xff1a; Git Merge 功能&#xff1a;合并分支&#xff0c;将两个分支的…

密码编码学与网络安全(第五版)答案

通过如下代码分别统计一个字符的频率和三个字符的频率&#xff0c;"8"——"e"&#xff0c;“&#xff1b;48”——“the”&#xff0c;英文字母的相对使用频率&#xff0c;猜测频率比较高的依此为&#xff09;&#xff0c;t,*,5&#xff0c;分别对应s,o,n,…

我在广州学 Mysql 系列之 数据类型和运算符详解

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要学习 Mysql的数据类型以及运算符操作~~ 上周五学习了“Mysql 系列之 数据“表”的基本操作”~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “我是你的敌人,…

SpringBoot中基于JWt的授权与续期方案

一、 SpringBoot中Token登录授权、续期和终止的方案RedisToken SpringBoot项目写登录注册之类的方案 使用Cookie或Session的话&#xff0c;它是有状态的&#xff0c;不符合分布式技术架构使用Security或者Shiro框架实现起来比较复杂&#xff0c;一般项目无需用那么复杂使用JW…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

【OSS】php使用oss存储

阿里云oss官方文档&#xff1a;文档 1、前期工作 创建阿里云账号&#xff0c;登录创建bucket&#xff0c;注意修改权限&#xff0c;要不然可能读取不到 申请accessKeyId和accessKeySecret accessKey 2、项目中安装OSS扩展 composer require aliyuncs/oss-sdk-php3、基础使…

Elasticsearch02-安装7.x

零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch &#xff08;1&#xff09;JDK安装 Elasticsearch是基于java开发的&#xff0c;所以需要安装JDK。我们安装的Elasticsearch版本是7.15&#xff0c;对应JDK至少1.8版本以上。也可以不安装jdk&#xff0c;…

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…

redis 缓存使用

工具类 package org.springblade.questionnaire.redis;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factor…

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第一部分-表格边界框检测

目录 说明 效果 模型 项目 代码 frmMain.cs YoloDet.cs 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分&#xff0c;首先&#xff0c;ppyoloe-plus-x 对边界框进行预测&#xff0c;并对置信…

创建项目以及本地仓库和远程仓库并上传项目

创建项目以及本地仓库和远程仓库并上传项目 其详细流程如下&#xff1a; 1、本地创建项目 2、创建本地仓库&#xff08;若使用idea在创建项目时选择了创建.git本地仓库&#xff0c;则此步骤省略&#xff09; 进入到你需要上传的项目的目录下&#xff0c;右键找到Git Bah He…

鸿蒙操作系统简介

华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;&#xff0c;是华为公司于2019年8月9日在东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的面向全场景的分布式操作系统&#xff0c;可以创造一个超级虚拟终端互联的世界&#xff0c;将人、设备、场…

MySQL存储引擎-概述

存储引擎 存储引擎&#xff08;Storage Engine&#xff09;是数据库管理系统中负责数据存储和检索的部分。之前在MySQL的历史地位中曾经讲过&#xff0c;存储引擎是可插拔的。5.5之前默认采用MyISAM存储引擎&#xff0c;从5.5开始采用InnoDB存储引擎。 9大存储引擎 可以通过…

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析 在裸聊敲诈、虚假理财诈骗案件类型中&#xff0c;犯罪分子为了能实现更低成本、更快部署应用的目的&#xff0c;其服务器架构多为常见的初始化网站架构&#xff0c;也称为站库同体服务器&#xff01;也就是说网站应用…

【数据结构进阶】AVL树深度剖析 + 实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、AVL树的概念 二、AVL树底层解析及实现 1. 节点的定义 2. 接口声明 3. AVL树的插入 3.1 更新平衡因子 3.2 旋转&#xff08;重点…