大语言模型中的第一性原理:Scaling laws

news2024/11/19 8:33:48

大语言模型的尺度定律在大语言模型的训练过程中起到了非常重要的作用。即使读者不参与大语言模型的训练过程,但了解大语言模型的尺度定律仍然是很重要的,因为它能帮助我们更好的理解未来大语言模型的发展路径。

1. 什么是尺度定律

尺度定律(Scaling laws)是一种描述系统随着规模的变化而发生的规律性变化的数学表达。这些规律通常表现为一些可测量的特征随着系统大小的增加而呈现出一种固定的比例关系。尺度定律在不同学科领域中都有广泛的应用,包括物理学、生物学、经济学等。

有趣的是,OpenAI的研究者在2020年发现,大语言模型也遵循着尺度定律[1]。

大语言模型的尺度定律描述的是模型的性能 𝐿 ,模型的参数量大小 𝑁 ,训练模型的数据大小 𝐷 以及训练模型使用的计算量 𝐶 之间的关系。需要注意的是,这里的尺度定律默认要求大语言模型使用的是Transformer的解码器结构。

模型的性能 𝐿 是指模型在测试集上的交叉熵损失:

            (1)

𝐷 表示token字典表, 𝑇 表示文本样本被划分为token后的长度。值得注意的是,这里的数学表达进行了一定的简化,仅针对单个文本样本。实际上,测试集由多个文本样本组成。

模型的参数量大小 𝑁 是除了静态编码矩阵和位置编码外的参数。

训练数据大小 𝐷 指的是在训练过程中使用的token数量。通常情况下, 𝐷 等于 𝐵𝑆 ,其中 𝐵 代表使用梯度下降法时的批量大小(Batch Size), 𝑆 表示参数迭代的次数(Step)。

训练模型使用的计算量 𝐶 是指训练模型时,使用的浮点运算次数。每训练一个token会涉及一次前向传播,一次反向传播,在大语言模型的训练中,反向传播的浮点运算次数约为前向传播的两倍。需要注意的是,和参数量大小 𝑁 类似,这里的浮点运算次数需要排除掉静态编码和位置编码。

在使用Transformer的解码器结构训练模型时,我们可以得到如下的关于 𝐶,𝑁,𝐷 之间的近似计算关系:

    (2)

关于上述公式的推导过程,可参考论文“Scaling Laws for Neural Language Models”的2.1小节,在此不再详述。公式(2)表明,当 𝐶 、 𝑁 、 𝐷 三者中已知其中的两个值时,我们可利用上述公式估算出第三个值。

尺度定律的核心结论可以用下面这句话简单总结:

对于计算量 𝐶 ,模型参数量 𝑁 和数据集大小 𝐷 ,当不受其他两个因素制约时,模型性能 𝐿 与每个因素都呈现 幂律关系

首先,我们来了解一下什么是幂律关系。幂律关系是指类似于如下的数学表达式:

           (3)

这里的 𝑥 是变量, 𝑐,𝛼 是常数。随着 𝑥 的增加, 𝐿(𝑥) 不断减少。有时,我们也会将上式中的 𝑥 替换为,然后两边取对数,将 log⁡𝐿(𝑥) 替换为 𝑦′ ,公式(3)会转换为下面的样子:

𝑦′=𝛼log⁡𝑐−𝛼𝑥′          (4)

公式(4)告诉我们,在幂律关系中,经过适当的变形,可以自然的转换为线性关系。

需要注意的是,大语言模型的尺度定律并非源于理论推导,而是基于经验性的实验分析。那么,尺度定律究竟有何作用呢?至少有以下几个方面:

  1. 预测模型效果,便于调整训练策略和超参数。 大语言模型的训练需要大量时间和计算资源。与传统机器学习不同,我们无法直接在大模型和大数据集上进行实验以验证超参数或训练策略。因此,一个明智的做法是在小模型和小数据集上进行训练,然后利用尺度定律将训练效果外推到大模型和大数据集上。通过这种方式,我们可以快速地迭代模型的训练策略和超参数。
  2. 合理的分配资源。 训练大语言模型既费时又耗费计算资源。根据尺度定律,我们能够合理地分配模型参数 𝑁 和训练数据大小 𝐷 ,以在有限的预算内尽可能获得效果优良的模型。
  3. 分析大语言模型的极限。 通过尺度定律,我们可以尝试分析预训练模型的极限在哪里。

接下来,我们将对尺度定律的一些性质进行更详细的解读。

2. 尺度定律的性质

2.1 三个幂律关系

D与L的幂律关系

限制训练数据大小,在比较大的语言模型上训练,使用早停策略选择停止训练的时机(一旦测试集损失停止下降就停止训练)。换句话说,我们只限制了数据集大小 𝐷,模型参数量 𝑁 和计算量 𝐶 没有被限制。模型性能 𝐿 和 𝐷 有如下的幂律关系:

      (5)

𝐷𝑐 和 𝛼𝐷 均为常数。

为什么公式(5)成立呢?虽然这个公式只是通过数据得到的经验性结论,但我们可以通过一个简单的均值估计模型更深刻地理解幂律关系的内涵。

假设有样本采样自高斯分布。我们用样本均值估计高斯分布的期望 𝜇 。样本均值的定义如下:

   (6)

根据相关的统计学知识,下面的等式成立:

  (7)

公式(7)的左边类似于 𝐿(𝐷) ,度量的是预测值和真实值之间的差异。不难看到公式(7)其实就是一种幂律关系,不同点在于公式(7)中的 𝛼𝐷 为数字 1 。论文"Explaining Neural Scaling Laws"的作者[2]认为,幂律关系中的 1𝛼𝐷 代表数据集“内在的维度”。

N与L的幂律关系

在不限制数据集的情况下,训练具有不同参数量的大语言模型,直至测试集损失达到收敛。换句话说,我们只限制了模型参数量 𝑁 ,而数据集 𝐷 和计算量 𝐶 没有受到限制。模型性能 𝐿 和 𝑁 之间存在如下的幂律关系:

    (8)

𝑁𝑐 和 𝛼𝑁 均为常数。需要注意的是,模型参数量 𝑁 不包含静态编码的矩阵 𝑊𝑒𝑚𝑏 。

C与L的幂律关系

在计算量 𝐶 受限的情况下,通过关系式 𝐶≈6𝑁𝐵𝑆 ,我们可以遍历不同参数量大小的模型,参数学习迭代次后停止。在这个过程中,我们保持批量大小 𝐵 不变。然后,我们可以选择效果最好的一个模型。接着,我们就得到了模型性能 𝐿 和 𝐶 之间的幂律关系:

(9)

均为常数。

需要注意的是,由于这里的批量大小 𝐵 对于所有的模型都是固定不变的。因此上述的经验性结论并不是最优的结论。在论文“Scaling Laws for Neural Language Models”中,作者进一步定义了 𝐶𝑚𝑖𝑛 ,并总结了 𝐶𝑚𝑖𝑛 和模型性能 𝐿 的幂律关系,为了避免引入更多其他的概念,我们不介绍和 𝐶𝑚𝑖𝑛 相关的内容。

上面介绍了三个幂律关系,需要特别强调的是,这些幂律关系中的常数会受到不同数据集、tokenizer方法以及token字典表大小的影响,从而得到不同的拟合结果。

2.2 进一步的结论

从数据集大小的幂律关系和模型参数量的幂律关系出发,通过设计不同的实验,我们可以经验性地得到以下几个进一步的结论:

  1. 不同类型的数据会显著影响模型的性能。

在大模型的训练中,通常会使用不同类型的组合数据。数据的多样性和适当的组合对最终模型性能的至关重要。

2.在固定模型总参数量的情况下,不同层数的模型的性能差距比较小。

需要注意的是,这里需要排除掉静态编码的矩阵和位置编码的相关参数。

3.模型的结构会有一定的影响,更好的模型结构会得到更好的尺度定律。

在探索新的模型结构时,判断新模型结构的有效性一个好的方法是检查其是否符合尺度定律,以及尺度定律是否比基准模型更为优越。上图显示Transformer结构优于多层LSTM结构。

2.3 联合幂律关系

除了单个变量和模型性能 𝐿 的幂律关系外,我们还可以建立 𝐷,𝑁 和 𝐿 的联合幂律关系。目前有两类常用的联合幂律关系假设:

在"Scaling Laws for Neural Language Models"中,作者假设联合幂律关系如下:

     (10)

需要注意的是,这里的等常数的值和2.1小节提到的值不一定相同。

在"Training Compute-Optimal Large Language Models"中[3],作者假设联合幂律关系如下:

     (11)

这里的 𝛼 和 𝛽 为常数, 𝐸 是数据集自身的不可约误差

通过第一个幂律关系假设,我们可以推导出一个有趣的结论。

当模型的参数量为 𝑁 时,我们需要保证数据集大小 𝐷 大于 才能保证模型不会过拟合。

下面我们详细介绍一下这个值是如何得到的。首先作者利用公式(10),拟合得到的值:

(12)

接着定义 𝛿𝐿(𝑁,𝐷) :

  (13)

𝐿(𝑁,∞) 表示在无限的数据下,损失的情况。当有无限的数据时,我们认为不会出现过拟合。因此上面公式度量的是在数据集 𝐷 大小的情况下,过拟合的程度。该值越大,表示过拟合越严重,该值等于0,表示没有过拟合。然而,由于一些随机性,即使 𝐷 已经足够的大,不会导致过拟合, 𝐿(𝑁,𝐷) 也不可能恰好等于零。因此,我们可以认为当 𝛿𝐿(𝑁,𝐷) 小于某个上界时, 𝐿(𝑁,𝐷) 就可以近似认为没有过拟合。

这个上界通过估计 𝐿(𝑁,∞) 的方差得到。即选择不同的随机种子,在足够大的数据集上训练,得到不同的性能 𝐿 ,以此估计出方差。在"Scaling Laws for Neural Language Models"中,作者估计的方差为 0.02 。因此,结合公式(10)和(13):

  (14)

带入前面拟合的估计值,最终可得:

    (15)

需要注意的是,不同的数据集,tokenizer方法,token字典表大小会得到不同的拟合结果,方差估计结果。因此掌握上面的计算流程是很有必要的。

2.4 最优算力分配

𝐶 与 𝐿 的幂律关系告诉我们,为了获取“智能”,我们是需要付出一定的代价的。每增加10倍的计算量,模型的性能就会有一定的提升。在计算量的预算有限的情况下,应该如何分配数据集大小 𝐷 和模型参数量 𝑁 ,使得模型的性能达到最佳呢?

OpenAI和DeepMind给出了两种不同的结论:

OpenAI认为[1],每增加10倍的计算量,应该让数据集大小增加为约1.8倍,模型参数量增加为约5.5倍。换句话说,OpenAI认为,模型参数量更加的重要。

DeepMind认为[3],每增加10倍的计算量,应该让数据集大小增加为约3.16倍,模型参数量也增加为约3.16倍。换句话说,DeepMind认为,数据集大小和模型参数量一样重要。

需要注意的是,这里的数据使用的是对应论文中的数据,在实际的应用中它可能会随着使用的数据集,tokenizer方法,token字典表大小而变化。

在上述描述中,最优算力分配实际上忽略了推断时的算力消耗。在实际应用中,我们可能更应优先考虑的是模型的推理速度,而非仅仅追求训练速度最快。这是因为训练时的算力消耗只发生一次,而后续模型推理可能会进行无数次。因此,Meta开源的Llama大语言模型[4]选择了一种不同的策略,他们采用了参数量较小但在推断时消耗计算资源较少的大语言模型。在随后的训练过程中,他们持续扩展训练集,直至模型性能不再提高。

需要注意的是,这并不代表Meta的策略就是最优的。这是因为按照OpenAI和DeepMind的算力分配策略训练出的大语言模型,在尽量不降低模型效果的前提下,可以利用诸如模型蒸馏、模型压缩、模型量化、模型剪枝等技术手段来缩小模型的体积。

2.5 关于模型的性能

通常我们以测试集上的损失来度量模型性能 𝐿 。尽管存在2.1小节提到的三个幂律关系,但为了稍微减小一点损失就付出成倍的模型参数和计算量,这真的是一种划算的策略吗?

实际上,研究者发现,尽管模型的损失只是在稳定下降,但模型在某些下游任务的性能却可能突然出现大幅度的提升,正如下图所示[5](参考自"Emergent Abilities of Large Language Models"):

这种由量变所带来的质变,称为涌现。因此,虽然损失只由 𝑙 降低到了 0.9𝑙 ,但这并不等价于“性能”只提升了百分之十。

3. 尺度定律的未来

尺度定律的极限

"Scaling Laws for Neural Language Models"中提到的幂律关系和联合幂律关系其实会推导出一些矛盾,这些矛盾可能能帮助我们思考尺度定律的极限。

在2.3中我们提到,为了防止过拟合,需要数据集大小 𝐷 和模型参数量 𝑁 满足如下的关系:

(16)

在2.4中,我们又提到,按照近似 5.5:1.8 的比例分配关系增加模型参数量 𝑁 和数据集大小 𝐷 ,可以使得损失 𝐿 按照幂律关系不断降低。

然而,很明显,如果不断的按照 5.5:1.8 的比例增加模型参数量 𝑁 和数据集大小 𝐷 ,那么一定存在一个点 𝑁∗,𝐷∗ ,使得。换句话说,按照2.4的结论,在达到 𝑁∗,𝐷∗ 后,继续增加模型参数量和数据集大小,损失 𝐿 会继续降低,但按照2.3的结论,模型会出现过拟合, 𝐿 并不会降低,反而会升高。

为什么会出现这种矛盾呢?"Scaling Laws for Neural Language Models"的作者认为有两种可能:

  1. 在 𝑁 和 𝐷 增长到 𝑁∗,𝐷∗ 之前,尺度定律会失效。
  2. 𝑁∗,𝐷∗ 点的损失值是自然语言数据自身的不可约误差。

实际上,我们离 𝑁∗,𝐷∗ 还有一定的距离。因为除了自然语言数据外,还有其他模态的数据,例如图像数据,语音数据。这些模态的数据也存在着类似的尺度定律,但在多模态的数据集中,尺度定律的极限更加难以达到。

模型性能的涌现

在2.5小节中,我们提到,随着损失 𝐿 的下降,一些下游任务的性能可能会出现突变,即涌现现象。然而,这种涌现现象无法通过尺度定律进行准确预测。

随着 𝑁 和 𝐷 的进一步增加,损失 𝐿 的进一步降低是否会导致更多的涌现出现仍然是未知的。然而,我们对这种未知充满期待。只要尺度定律尚未达到极限,我们仍有机会显著提升大语言模型的“智能”,即使损失 𝐿 并未大幅下降。

类梅特卡夫定律

尺度定律是通过增加计算量、模型参数和数据集大小来提升单个大语言模型的“智能”水平。

基于大语言模型设计的智能体能够协同合作、任务分工,甚至相互竞争。智能体数量的扩展可能进一步推动智能的涌现,就如同人类文明随着人数的增加以及分工的细化而不断发展一样。

因此,在一个存在多个智能体交互的网络中,可能存在一种类似于梅特卡夫定律[6]的经验法则,即随着网络内可交互智能体数量的增加,整个网络的“智能”也会不断提升。

本书的读者对象是大语言模型的使用者和应用开发者,全书共分为4篇。

  • 第1篇讲述机器学习、神经网络的基本概念,自然语言处理的发展历程,以及大语言模型的基本原理。鉴于本书的重点在于大语言模型的应用和二次开发,因此本书将不涉及大语言模型的训练细节。然而,我们仍强烈建议读者熟悉每个关键术语的含义,并了解大语言模型的工作流程,以更好地理解后面的内容。
  • 第2篇讲述大语言模型的基础应用技巧。首先,介绍大语言模型常用的3种交互格式。随后,深入讲解提示工程、工作记忆与长短期记忆,以及外部工具等与大语言模型使用相关的概念。最后,对大语言模型生态系统中的关键参与者——ChatGPT的接口与扩展功能进行详解。
  • 第3篇讲述大语言模型的进阶应用技巧。首先,介绍如何将大语言模型应用于无梯度优化,从而拓宽大语言模型的应用领域。随后,详细讨论各类基于大语言模型的自主Agent系统,以及微调的基本原理。最后,介绍与大语言模型相关的安全技术。
  • 第4篇讲述大语言模型的未来。一方面,探讨大语言模型的生态系统和前景,简要介绍多模态大语言模型和相关的提示工程。另一方面,深入解析大语言模型的尺度定律,并尝试从无损压缩的角度来解析大语言模型具备智能的原因,最后以图灵机与大语言模型的联系作为全书的结尾。

参考

  1. ^abKaplan J, McCandlish S, Henighan T, et al. Scaling laws for neural language models[J]. arXiv preprint arXiv:2001.08361, 2020.
  2. ^Bahri Y, Dyer E, Kaplan J, et al. Explaining neural scaling laws[J]. arXiv preprint arXiv:2102.06701, 2021.
  3. ^abHoffmann J, Borgeaud S, Mensch A, et al. Training compute-optimal large language models[J]. arXiv preprint arXiv:2203.15556, 2022.
  4. ^Touvron H, Lavril T, Izacard G, et al. Llama: Open and efficient foundation language models[J]. arXiv preprint arXiv:2302.13971, 2023.
  5. ^Wei J, Tay Y, Bommasani R, et al. Emergent abilities of large language models[J]. arXiv preprint arXiv:2206.07682, 2022.
  6. ^梅特卡夫定律认为,一个网络的价值与网络中的节点数量的平方成正比。具体而言,如果一个网络有n个节点,那么它的价值大致与n^2成正比。这表明网络的价值随着节点数量的增加呈二次方增长。

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

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

相关文章

现代循环神经网络(GRU、LSTM)(Pytorch 14)

一 简介 前一章中我们介绍了循环神经网络的基础知识,这种网络 可以更好地处理序列数据。我们在文本数据上实现 了基于循环神经网络的语言模型,但是对于当今各种各样的序列学习问题,这些技术可能并不够用。 例如,循环神经网络在…

【错题集-编程题】十字爆破(预处理 + 模拟)

牛客对于题目链接:十字爆破 (nowcoder.com) 一、分析题目 暴力模拟会超时。 预处理,先把每一行以及每一列的和存起来。 模拟即可,但是由于数据量过⼤,我们可以提前把每⼀⾏以及每⼀列的和存起来,⽅便统计总和。 二、代…

(centos)yum安装mysql8.4

1.MySQL官方已经提供了适用于不同Linux发行版的预构建软件包,包括适用于CentOS的Yum Repository MySQL :: MySQL Community Downloads 2.在/usr/local文件夹下创建mysql文件夹,将下载的rpm文件放到目录下 3.执行安装命令 yum install mysql-community-…

思科防火墙查如何查看现有ipsec隧道信息

环境: 思科ASA5555 问题描述: 思科防火墙查如何看现有ipsec隧道信息 解决方案: 1.进入特权模式: enable 查看isakmp信息 show crypto isakmp sa2.查看ipsec信息 show crypto ipsec sa上述命令将显示当前的ISAKMP安全关联…

leetCode69. x 的平方根

leetCode69. x 的平方根 题目思路 常见的二分法模板&#xff08;背过就行&#xff0c;模板而已&#xff09; // 区间[L,R]被划分为[L,mid]和[mid 1, R]时使用这个模板 int bsearch_1(int l, int r){while(l < r){int mid l r >> 1;if(check(mid)) r mid; //che…

08 IRF技术 华三交换机实现

IRF 详细介绍 我知道 AI IRF 技术是指集成路由功能(Integrated Routing and Bridging)技术,是惠普(Hewlett Packard)公司开发的一种基于硬件的虚拟化技术。IRF 技术可以将多台物理设备组合成一个逻辑设备,实现设备的高可用性和灵活性。 IRF 技术主要有以下特点: 1. …

【强训笔记】day9

NO.1 思路&#xff1a;利用两个string&#xff0c;一个输入数据&#xff0c;一个做逗号处理&#xff0c;如果该字符的位数减去下标减去1等于3的倍数的话&#xff0c;该位置就插入逗号。 代码实现&#xff1a; #include<iostream> #include<string> using names…

Redis事务,管道,发布订阅

Redis事务 redis事务本质上是一组命令的集合,按照顺序串行化执行命令而不被其他命令打断 redis事务开启后将要执行的命令放到事务队列中,提交事务后一次性顺序排他地执行所有命令 关键词:单线程,无隔离级别,不保证原子性,排他性,顺序性 要注意和mysql的acid进行区分 怎么用…

C++:智能指针(RAII思想)

目录 1、什么是智能指针&#xff1f; 2、为什么需要智能指针 3、RAII思想及智能指针的原理 4、智能指针的发展 4.1 auto_ptr 4.2 unique_ptr 4.3 share_ptr 5、share_ptr的模拟实现 6、循环引用问题 7、share_ptr中的自定义删除器 1、什么是智能指针&#xff1f; 智能…

java spring 09 Bean的销毁过程

1.Bean销毁是发送在Spring容器关闭过程中的 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) context.getBean("userService");userService.test();// 容器关闭cont…

LeetCode题练习与总结:最大矩形--85

一、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],[&quo…

C++入门系列-类对象模型this指针

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类对象模型 如何计算类对象的大小 class A { public:void printA(){cout << _a << endl;} private:char _a; }; 算算看&#xff0c;这个类的大小是多少 我们知道…

Typora编辑markdown的技巧

参考视频的B站链接&#xff1a; 手把手教你撰写Typora笔记 在其中选择了常用的部分做标记。 一、标题 使用ctrl数字键&#xff0c;可以快捷的把一行文字变成n级标题 二、源代码模式 可以在下图所示进入 三、设置typora能够自动显示粘贴的图片 打开“偏好设置”&#xff0…

Android使用kts发布aar到JitPack仓库

Android使用kts发布aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑.相信Groovy的方式是大家经常使用的&#xff0c;…

力扣每日一题106:从中序与后序遍历序列构造二叉树

题目 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

R语言学习—6—多元相关与回归分析

1、引子 xc(171,175,159,155,152,158,154,164,168,166,159,164) #身高 yc(57,64,41,38,35,44,41,51,57,49,47,46) #体重 par(marc(5,4,2,1)) #设定图距离画布边缘的距离&#xff1a;下5&#xff0c;左4&#xff0c;上2&#xff0c;右1 plot(x,y) 2、相关…

Web API之DOM

DOM 一.认识DOM二.获取元素三.事件基础四.操作元素(1).改变元素内容(2).修改元素属性(str、herf、id、alt、title&#xff09;(3).修改表单属性(4).修改样式属性操作(5).小结 五.一些思想(1).排他思想(2).自定义属性的操作 六.节点操作1.认识2.节点层级关系3.创建和添加、删除、…

PR2019软件下载教程

打开下载网址&#xff1a;rjctx.com 选择Premiere&#xff1a; 选择PR2019&#xff0c;并点击&#xff1a; 拉到最后&#xff0c;选择百度网盘下载&#xff1a; 下载到本地。 二&#xff0c;软件安装 解压缩后&#xff0c;双击set_up 选择位置后&#xff0c;进行安装&…

直播素材安卓情侣飞行棋v2.22 仿dofm 支持自定义模式—可用直播素材

一个情侣间增进友谊的小游戏非常好玩&#xff0c;适合男孩女孩之间增进感情&#xff01;快和你暗恋的女孩一块玩吧&#xff0c;极速升温 永久免费&#xff01;解锁激活码内容全部畅玩&#xff01;全网最强超级给力&#xff01;真人说书音频 网盘自动获取 链接&#xff1a;http…

Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f31f; 引言 在软件开发的浩瀚宇宙里&#xff0c;选择合适的代码管理方式是构建高效开发环境的关键一步。今天&#xff0c;我们将深入探讨两大策略——Monorepo&#xff08;单体仓库&#xff09;与MultiRepo&#xff08;多仓库&#xff09;&#xff0c;并通过使用现代化…