无过拟合的记忆:分析大语言模型的训练动态

Kushal Tirumala⇤ Aram H. Markosyan⇤ Luke Zettlemoyer Armen Aghajanyan
Meta AI 研究
{ktirumala,amarkos,lsz,armenag}@fb.com

原文链接:[2210.09262] Physics-Driven Convolutional Autoencoder Approach for CFD Data Compressions 

摘要

尽管超大语言模型被广泛应用,但其潜在的训练和记忆动态机制仍未得到充分理解。我们通过实证研究,在因果语言建模和掩码语言建模中,针对不同模型规模以及整个训练过程进行精确记忆的研究。我们衡量了数据集大小、学习率和模型规模对记忆的影响,发现更大的语言模型在所有设置下都能更快地记忆训练数据。令人惊讶的是,我们发现更大的模型在过拟合之前能够记忆更多的数据,并且在整个训练过程中遗忘的倾向更小。我们还分析了不同词性的记忆动态,发现模型首先记忆名词和数字;我们提出假设并提供实证证据,表明名词和数字可作为记忆单个训练示例的唯一标识符。这些发现共同为理解随着模型规模增大而出现的独特训练动态,增添了新的拼图碎片。

1 引言

模型记忆其训练数据的速度和程度,是提供关于其如何泛化到新测试实例的关键统计指标。经典框架,如偏差 - 方差权衡主张在不进行完全记忆的情况下拟合训练集。然而,最近的研究表明,深度学习中记忆与泛化之间存在更为共生的关系。本文通过实证研究,在因果语言建模和掩码语言建模中,针对不同模型规模以及整个训练过程进行记忆研究。

语言模型最近的大部分性能提升都来自于规模的扩大,最新的模型参数数量达到了 10 的 11 次方。众所周知,更大的模型能够记忆更多的训练数据,这是它们泛化能力提升的关键因素。然而,令人惊讶的是,在理解模型规模对训练过程中语言模型记忆动态的影响方面,相关研究相对较少。现有工作主要集中在训练后对记忆的分析。在本研究中,我们致力于研究语言模型中的记忆和遗忘动态,重点在于更好地衡量随着模型规模扩大,这些动态如何变化。我们的主要贡献包括:

  1. 我们测量了训练过程中记忆动态对模型规模(以及其他因素,如数据集大小、过拟合和学习率)的依赖程度。我们发现更大的语言模型能够更快地记忆训练数据。
  2. 我们设计了控制实验,以刻画语言模型中的遗忘曲线(即语言模型在整个训练过程中自然遗忘记忆的方式)。我们的实证研究表明,遗忘曲线存在下限 —— 我们将其称为遗忘基线,并且该基线随着模型规模的增加而上升,即增加模型规模可以减轻遗忘。
  3. 我们分析了不同词性的记忆速率,发现名词和数字的记忆速度比其他词性快得多。我们假设这是因为名词和数字集合可被视为特定样本的唯一标识符,并通过在现有唯一标识符设置下分析记忆速率为该假设提供了证据。

这些发现共同为理解随着模型规模增大而出现的独特训练动态,提供了更多线索。

2 背景和相关工作

2.1 语言模型中的记忆

无意记忆是语言模型面临的一个已知挑战,这使得它们容易受到提取攻击和成员推理攻击,尽管已有研究致力于减轻这些漏洞。最近的研究认为,记忆并非完全有害,对于某些类型的泛化(例如在问答任务中)至关重要,同时还能让模型编码大量的世界知识或事实性知识。也有越来越多的工作分析语言模型中记忆的基本属性。与我们的工作最相关的是 Carlini 等人的研究,他们分析了完全训练后的语言模型的记忆情况,并观察到记忆与模型规模、训练数据重复度以及提示上下文长度之间的依赖关系。虽然我们也研究缩放行为,但我们的重点在于整个训练过程中的记忆动态。

2.2 语言模型训练动态

先前的工作广泛分析了训练动态,以了解神经网络模型在训练过程中如何获取信息。Saphra 和 Lopez 率先分析了语言建模的训练动态,重点关注预训练过程中内部表示的演变。这激发了一系列研究,分析神经语言模型如何在预训练过程中学习语言结构、世界知识、单个单词以及跨语言结构。这种分析已扩展到许多下游任务,包括文本摘要、机器 / 语音翻译以及各种自然语言处理任务。

2.3 语言模型中的遗忘

也有研究关注语言模型中的记忆退化(遗忘)现象。灾难性遗忘或灾难性干扰最早被报道,研究神经网络在训练新数据时,如何倾向于遗忘先前训练任务或训练批次中的信息。这给持续学习(或终身学习)带来了关键挑战,其目标是在对通常非常大的数据流进行单次遍历的过程中逐渐学习。已经提出了许多机制来提高对灾难性遗忘的鲁棒性。也有越来越多的工作表明,模型和数据集的规模都可以使模型更不易遗忘,以及研究图像分类器中遗忘自然发生的特征和遗忘如何提高训练效率。机器遗忘是一种迫使训练好的模型忘记先前学习样本的技术,主要是受数据保护和隐私法规的推动。我们的工作独特之处在于关注训练过程中的遗忘测量,并量化其随规模的变化情况。

2.4 缩放定律

我们一直观察到通过扩大模型规模可以提高性能,并且规模本身已被证明会使模型内部行为偏离经典的偏差 - 方差范式。最近的努力集中在尝试为语言模型建模缩放定律,包括数据和模型规模、在迁移学习中的应用、路由网络以及各种自回归生成任务。虽然缩放定律的大部分工作是实证性的,但也有一些有趣的研究致力于从理论上解释神经缩放定律。大多数缩放定律仅关注交叉熵损失,而我们研究的是记忆。

3 实验设置

为了大规模研究训练过程中的记忆动态,我们的记忆度量必须易于计算,同时又要足够精确,以反映模型实际从训练数据中记住了多少信息。标签记忆是一个理想的候选指标,因为它一直为神经网络的潜在属性提供理论见解,在实证环境中仍然适用,并且计算成本相对较低。我们将我们的度量制定为自监督设置下标签记忆的类似物。

定义如下:设 V 表示词汇表大小。设 c 表示一组上下文,可视为元组 (s, y) 的列表,其中 s 是输入上下文(不完整的文本块),y 是词汇表中完成该文本块的真实标记的索引。设 S 表示输入上下文的集合,设 f: S→R 的 V 次方表示一个语言模型。如果 argmax (f (s)) = y,则上下文 c = (s, y) ∈ C 被记忆。

请注意,单个单词可以作为多个上下文的真实标记出现。对于给定的一组上下文 c(即给定的训练数据集),我们可以分析被记忆上下文的比例。我们将其称为精确记忆,尽管它也可以被视为准确率,因为我们衡量的是语言模型的 argmax 与真实标记匹配的频率。在本文中,除非另有说明,当我们提到记忆时,均指上述定义。我们定义 T 为 M (f) 的阈值,并将 T (N, τ) 表示为具有 N 个参数的语言模型 f 为了满足 M (f)≥τ,每个训练数据点需要被查看的最小次数。在利用更大的数据集时,模型无法进行多个轮次的训练,因此我们改为考虑每次更新时的记忆情况。我们引入 M_update (f, U) 作为模型在进行第 U 次梯度下降更新时,对该批次数据的记忆情况,并定义 T_update (N, τ) 为具有 N 个参数的语言模型为了满足 M_update (f, U)≥τ,需要执行的最小梯度下降更新次数。

先前分析语言模型记忆的工作对记忆的定义有所不同。出于隐私考虑,有研究从训练数据提取的角度定义记忆,即如果一个字符串 s 可以通过与语言模型交互生成,则该字符串是可提取的。更具体地说,有研究将字符串 s 定义为 k - 逼真记忆,如果它是可提取的,并且在最多 k 个训练示例中出现。还有研究将字符串 s 定义为 k - 记忆,如果语言模型可以通过使用训练数据中的 k 个上下文标记进行提示来生成它。由于对训练数据提示的依赖,这个定义仅适用于因果语言建模;对于掩码语言建模,使用上述定义。请注意,如果一个示例被精确记忆,根据定义它就是可提取的。换句话说,k - 逼真记忆标记集和 k - 记忆标记集都包含精确记忆标记集。因此,分析精确记忆为 k - 逼真记忆和 k - 记忆提供了一种下限。在另一项旨在估计单个训练示例影响的工作中,将训练示例 x 定义为被记忆的,如果模型在包含 x 的数据子集和不包含 x 的数据子集上的预期性能差异足够大。这个定义借鉴了先前在理论上分析分类设置中标签记忆的工作。

3.1 模型架构

我们复制了公开可用的 Transformer 语言模型架构参考。我们使用 1.25 亿、3.55 亿、13 亿、27 亿、67 亿和 130 亿参数的模型配置。我们研究因果语言模型和掩码语言模型。我们使用 FairSeq 框架进行训练,以 PyTorch 为底层框架。对于更大的模型,我们使用 FairScale 中提供的全分片数据并行实现,并使用 Aim 实验跟踪工具。

3.2 数据集

在所有实验中,我们使用两个现有数据集:包含约 1.03 亿个标记的 WIKITEXT-103 基准数据集,以及用于训练原始 RoBERTa 模型的 RoBERTa 语料库,包含约 390 亿个标记。在第 4 节中,我们使用了这两个数据集,由于计算限制,在其他部分主要使用 WIKITEXT-103 数据集。

4 更大的语言模型记忆更快

众所周知,更大的神经语言模型样本效率更高,在达到相同性能时需要更少的优化步骤,并且收敛速度更快,其中性能通常定义为测试困惑度。在本节中,我们研究训练集上的 T (N, τ) 与 N 的关系,以回答这个问题。

当我们固定记忆阈值 τ = 0.9,并随着 N 的增加检查 T (N, τ) 时,发现更大的语言模型需要查看每个训练数据点的次数更少,就能实现对训练集 90% 的精确记忆;换句话说,T (N, 0.9) 随着 N 的增加单调递减。当我们将 T 在 0.4 到 0.95 之间变化时,仍然观察到 T (N, τ) 通常随着 N 的增加而减少。对于固定的 N,T (N, τ) 随着 τ 的增加而增加,这是预期的,因为记忆更多的训练集需要对模型进行更多轮次的训练。更有趣的是,增加 T 会使 T (N, τ) 从与 N 无关的常数,平滑过渡到随 N 指数递减。

我们将 0.4 作为范围的下限,因为对于所有模型规模,低于此值的记忆阈值在最初几个轮次内即可达到;将 0.95 作为上限,因为对于较小的模型,更高的值需要不合理的长时间训练。

4.1 对语言建模任务和数据集大小的依赖

为了研究我们的观察结果对特定语言建模任务的依赖程度,我们在 WIKITEXT103 上以 0.15 的掩码概率对掩码语言建模任务重复此分析。与因果语言建模不同,对于较低的 T 值,T (N, τ) 并不随 N 单调递减,而对于较高的 T 值,T (N, τ) 随 N 单调递减,这两种情况之间的相变发生在 τ = 0.6 和 τ = 0.7 之间。较小的模型最初记忆训练数据更快,但从长远来看速度较慢。

语言模型的训练严重依赖于数据集的大小,因此我们预计 M (f) 也会受到类似的影响。在更大的 ROBERTA 数据集上针对掩码和因果语言建模分析训练集记忆情况时,由于数据集太大,对整个训练集进行多轮训练并评估记忆变得不可行,尤其是在训练更大的模型时。因此,我们关注较小的 T 值,并研究达到记忆阈值所需的梯度下降更新次数。我们观察到与之前类似的趋势,即在掩码和因果语言建模中,对于各种 T 值,T_update (N, τ) 都随 N 单调递减。与 WIKITEXT103 不同,掩码语言建模在 τ 上没有相变。

4.2 为何更大的模型记忆更快?

此时一个很自然的问题是,为何更大的模型记忆更快?通常,记忆与过拟合相关,这似乎提供了一个简单的解释。为了将记忆与过拟合区分开来,我们在过拟合发生之前考察记忆情况,这里我们将过拟合定义为语言模型在验证集上的困惑度首次增加的训练轮次。令人惊讶的是,随着参数数量的增加,过拟合之前的记忆比例总体上呈上升趋势,这表明过拟合本身并不能完全解释随着模型规模增大,记忆动态所表现出的特性。

在我们的训练配置中,学习率并非固定不变。直观地说,更大的学习率应该会使记忆速度更快。为了探究学习率在多大程度上能够解释我们的实验结果,我们选取了部分模型架构,在 WIKITEXT103 数据集上,以标准的学习率范围进行训练,并同时测量记忆情况。即使固定学习率,更大的模型达到 0.9 的记忆比例也更快,这表明我们的结果并非仅仅由学习率的差异所导致。有趣的是,随着模型规模的增加,模型对学习率的敏感度通常会降低。我们还注意到,T (N, τ) 最初会下降,最终会上升,并且只要选择的学习率处于曲线的最低点附近,记忆动态就不会发生显著变化。这一结果与越来越多的观点一致,即对于超过特定规模的神经语言模型而言,学习率不再是一个关键的超参数。

详尽地探究所有可能的影响因素是难以实现的,并且完整地解释为何更大的模型记忆更快也超出了本文的研究范围。在接下来的部分,我们将展示一些研究,希望这些研究能够丰富解答此类问题的方法。

4.3 通过唯一标识符进行记忆

近期有研究探索如何利用外部记忆来提升模型性能。在本小节中,我们思考这种架构上的改变是否必要。受信息检索系统的启发,我们采用一种简单的方法:为训练集中的每个样本添加一个唯一标识符,然后观察记忆速度是否会提升。具体而言,我们将语言建模任务设定为在 WIKITEXT103 上进行因果语言建模,并使用 1.25 亿参数的模型。在每个训练样本前,插入字符串 “document ID <unique_id>”,其中 unique_id 是一个唯一的整数,每个训练上下文对应一个。为了使用这些唯一整数,我们必须将它们添加到词表中,这会显著增加模型的规模,因为语言模型的最后一层输出维度必须与词表大小相等。因此,M (f) 动态的任何变化都可能归因于因词表大小增加而添加的额外参数。为了控制这一因素,我们首先考察仅增加词表大小(不使用任何新增词元)的影响。然后,利用这些新增词元为每个训练样本添加前缀,观察 M (f) 动态的变化。增加词表大小确实提高了记忆速度。尽管我们之前已经证明更大的模型记忆更快,但考虑到我们并没有显著增加参数数量,这一结果仍然令人惊讶。此外,当我们利用这些新增词元来唯一标识训练样本时,记忆速度进一步提升,不过使用文档 ID 进行提示会使记忆动态不再随时间单调增加。

4.4 从词性角度看记忆

上一节中,我们展示了唯一标识符能够增强记忆效果。常规文本中,数字和专有名词也可作为唯一标识符的有力替代。受此启发,我们利用词性标注来研究记忆的句法特征。我们追踪词性 p 的正确预测位置数量与标注为该词性 p 的真实词元总数的比率 R (p) 。我们还展示了一个类似的比率,记为 R_mem (p),但分子仅考虑那些也被精确记忆的词元。正确预测词性并不一定意味着精确记忆,语言模型对词性的记忆速度比对词元的确切值的记忆速度更快。虽然所有词性最终都会被记忆,但某些词性的记忆速度更快,这与先前的研究结果一致。然而,与先前的工作不同,我们发现名词、专有名词和数字的记忆速度明显快于动词和形容词,无论是在 R (p) 还是 R_mem (p) 方面。这对隐私保护具有潜在影响,因为敏感信息很可能是名词、专有名词或数字。我们的发现也与研究儿童语言习得的工作存在一定的一致性。

5 语言模型中的遗忘曲线

本节研究记忆的对立面 —— 语言模型中的遗忘现象。受遗忘曲线假说的启发,该假说认为在没有刻意保留的情况下,人类记忆会随时间衰退,我们希望了解语言模型中记忆退化的动态过程。

我们首先选择一批训练集中不存在的数据,即从验证集中选取一批数据。我们将这批数据称为特殊批次。然后,我们从模型训练过程中选取一个检查点,将特殊批次输入模型进行训练,之后恢复在训练集上的标准训练。接着,我们评估特殊批次上的记忆退化情况,并分析遗忘曲线可能依赖的各种因素。在本节中,我们将整个验证集作为特殊批次。特殊批次仅在首次引入时被模型查看一次。

特殊批次上的精确记忆在开始时迅速下降,但随着训练的继续,下降速度呈指数级减缓。换句话说,特殊批次上的遗忘曲线似乎趋近于一个基线 —— 我们将这种趋势称为遗忘基线。我们通过查看训练过程中特殊批次上的最低记忆值来近似遗忘基线。

遗忘基线的数值随着模型规模的增加而单调上升。这意味着更大的模型遗忘更少,这与近期在图像分类任务中研究灾难性遗忘的工作结果一致。这是有益的,因为更大的模型可以利用来自先前任务的更多信息;然而,从隐私角度来看,这并不理想,因为这意味着更大的模型可能会保留更多训练数据中的敏感信息。

我们还研究了遗忘基线对数据批次顺序的敏感性。我们执行上述相同的遗忘曲线分析,但从不同的训练检查点开始分析。通过这种方式,我们在不显著改变实验设置的情况下,改变了输入给模型的数据批次顺序。我们观察到遗忘基线对数据批次顺序不敏感。

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

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

相关文章

黑马Redis(三)黑马点评项目

优惠卷秒杀 一、全局唯一ID 基于Redis实现全局唯一ID的策略&#xff1a; Component RequiredArgsConstructor public class RedisIdWorker {private static final Long BEGIN_TIMESTAMP1713916800L;private static final int COUNT_BITS 32;Resourceprivate final StringRed…

flume----初步安装与配置

目录标题 **flume的简单介绍**⭐flume的**核心组件**⭐**核心特点** **安装部署**1&#xff09;**解压安装包**2&#xff09;**修改名字** **&#xff08;配置文件时&#xff0c;更方便&#xff09;****3&#xff09;⭐⭐配置文件**4&#xff09;**兼容Hadoop**5&#xff09;**…

深度整合Perforce P4+Jira+Confluence:游戏开发团队协作工具链搭建指南

现场对话 游戏开发团队最头疼的版本管理问题是什么&#xff1f; SVN宕机&#xff1f; Git仓库爆炸&#xff1f; 还是美术资源管理一团乱&#xff1f; 在4月11-12日的GGS 2025全球游戏峰会上&#xff0c;Perforce中国授权合作伙伴-龙智的销售和技术支持团队&#xff0c;与行业…

k8s基本概念-YAML

YAML介绍 YAML是“YAML Aint a Markup Language” (YAML不是一种置标语言)的递归缩进写,早先YAML的意思其实是:“Yet Another Markup Language”(另一种置标语言) YAML是一个类似XML、JSON的标记性语言。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义…

ECharts散点图-散点图20,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

Infrared Finance:Berachain 生态的流动性支柱

在加密市场中&#xff0c;用户除了参与一级和二级交易&#xff0c;还有一种低门槛参与的就是空投。从 2021 年 DeFi 成为主流开始&#xff0c;空投一直都是“以小搏大”的机会&#xff0c;通过参与项目早期的链上交互和任务以获取空投奖励&#xff0c;近几年已成为一种广受欢迎…

附1:深度解读:《金融数据安全 数据安全分级指南》——数据分类的艺术专栏系列

文章目录 一、文件背景与意义1.1 文件背景1.2 文件意义 二、文件结构与核心内容2.1 文件结构概述2.2 核心内容解析2.2.1 范围与适用对象2.2.2 数据安全定级目标与原则2.2.3 数据安全定级要素2.2.4 要素识别2.2.5 数据安全级别划分 三、定级方法与流程3.1 定级流程3.2 级别变更机…

vue mixin混入与hook

mixin混入是 ‌选项式 API‌&#xff0c;在vue3-Composition API <script setup> 中无法直接使用&#xff0c;需通过 setup() 函数转换 vue2、vue3选项式API: // mixins/mixin.js export const mixin {methods: {courseType(courseLevel) {const levelMap {1: 初级,…

Excel如何安装使用EPM插件并且汉化?

Excel如何使用EPM插件 Excel如何使用EPM插件一、安装EPM插件二、启动EPM插件三、插件汉化设置 Excel如何使用EPM插件 一、安装EPM插件 在安装EPM插件时&#xff0c;若运行安装包后出现报错提示&#xff0c;通常是因为系统缺少 Visual Studio 2010 组件&#xff0c;需先安装该…

vue3-springboot-mysql的docker部署

Docker配置原理与部署文档 概述 本文档详细说明RuoYi-Vue与BladeX集成项目的Docker部署原理&#xff0c;包括配置文件的作用、相互关系及数据流动。通过三个核心配置文件&#xff08;docker-compose.yml、Dockerfile和docker-entrypoint.sh&#xff09;&#xff0c;实现了应用…

第十二天 使用Unity Test Framework进行自动化测试 性能优化:Profiler分析、内存管理

前言 在完成游戏核心功能开发后,如何确保项目质量并成功发布到各大平台?本文将从自动化测试到商店上架,手把手教你构建完整的游戏开发闭环。使用Unity 2022 LTS版本进行演示,所有代码均经过实际项目验证。 一、自动化测试实战(Unity Test Framework) 1.1 测试框架搭建 …

【专题四】前缀和(3)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

深度解析:TextRenderManager——Cocos Creator艺术字体渲染核心类

一、类概述 TextRenderManager 是 Cocos Creator 中实现动态艺术字体渲染的核心单例类。它通过整合资源加载、缓存管理、异步队列和自动布局等功能&#xff0c;支持普通字符模式和图集模式两种渲染方案&#xff0c;适用于游戏中的动态文本&#xff08;如聊天内容、排行榜&…

【漫话机器学习系列】229.特征缩放对梯度下降的影响(The Effect Of Feature Scaling Gradient Descent)

特征缩放对梯度下降的影响&#xff1a;为什么特征标准化如此重要&#xff1f; 在机器学习和深度学习中&#xff0c;梯度下降是最常用的优化算法之一。然而&#xff0c;很多人在训练模型时会遇到收敛速度慢、训练不稳定的问题&#xff0c;其中一个重要原因就是特征未进行适当的…

【神经网络与深度学习】批标准化(Batch Normalization)和层标准化(Layer Normalization)

引言 在深度学习中&#xff0c;标准化技术&#xff08;Normalization&#xff09;是提高神经网络训练效率和性能的重要工具。其中&#xff0c;批标准化&#xff08;Batch Normalization, BN&#xff09;和层标准化&#xff08;Layer Normalization, LN&#xff09;是两种常用的…

OpenHarmony之电源管理子系统公共事件定义

OpenHarmony之电源管理子系统公共事件定义 电源管理子系统面向应用发布如下系统公共事件&#xff0c;应用如需订阅系统公共事件&#xff0c;请参考公共事件接口文档。 COMMON_EVENT_BATTERY_CHANGED 表示电池充电状态、电平和其他信息发生变化的公共事件的动作。 值&#x…

linux 环境下 c++ 程序打印 core dump 信息

linux 信号机制 软中断信号 Signal&#xff0c;简称信号&#xff0c;用来通知进程发生了异步事件&#xff0c;进程之间可以互相通过系统调用 kill 等函数来发送软中断信号。内核也可以因为内部事件而给进程发送信号&#xff0c;通知进程发生了某个事件。 进程对信号的处理 进…

Qt开发环境的安装与问题的解决(2)

文章目录 1. Qt开发环境安装的说明2. 通过安装包进行安装3. 通过在线下载程序 解决问题下载 https....网路错误问题解决开始安装--第一部分开始安装--第二部分 4. 建议配置环境变量&#xff08;非必须&#xff09;配置环境变量的意义 简介&#xff1a;这篇文章主要分享Qt开发环…

【每日EDA行业分析】2025年4月25日

深度总结&#xff1a;EDA 软件行业现状与发展趋势 一、引言 在半导体产业的复杂生态中&#xff0c;EDA 软件宛如一颗闪耀的明珠&#xff0c;它是集成电路设计的核心工具&#xff0c;贯穿芯片从设计构思到最终封装测试的全流程&#xff0c;其重要性不言而喻&#xff0c;被誉为…

flutter实践:比例对比线图实现

需求&#xff1a;flutter实现一个左右对比线图,带有动画效果 效果图&#xff1a; Widget _buildTop() {return Container(height: themeData.heightXl,padding: EdgeInsets.symmetric(horizontal: themeData.hSpacingMd),child: Row(mainAxisAlignment: MainAxisAlignment.spa…