语言模型记忆容量:为什么每个参数只值 3.6 比特?
你可能听过一句安慰性的话:”大模型不是数据库,它只是学会了规律,不会死记硬背。” 这句话对,也不对。真相比这更精确、更有趣:模型确实会记忆,而且记忆的容量是一个几乎恒定的常数——大约每个参数 3.6 比特。更反直觉的是,这种”记忆”未必是缺陷,它可能恰恰是模型学会泛化的必经之路。
一个价值一万美元的问题
假设你训练了一个 80 亿参数的模型,喂给它 15 万亿 token 的文本——按字节算相当于 7TB 的数据,而模型本身存在磁盘上只有 32GB。这中间差了两百多倍。
这个悬殊的比例引出一个显而易见的问题:这么小的模型,到底”记住”了训练数据里的多少东西?
这个问题不是纯学术兴趣。它牵扯到三件很现实的事:
第一,版权和隐私。如果一本书、一段个人信息被”记住”了,模型在被适当提示后能不能把它一字不差地吐出来?这是过去几年一系列诉讼和监管关注的核心。
第二,评测污染。如果测试集碰巧混进了训练数据(哪怕是无意的),模型在测试集上的高分到底是因为它”学会了”知识,还是因为它”背过”答案?这直接决定了我们能不能相信一个 benchmark 分数。
第三,也是最有意思的一点:记忆和泛化到底是什么关系?传统机器学习理论告诉我们,一个模型如果把训练数据背得太死,往往在新数据上表现更差——这叫过拟合。但深度学习里有一个长期让人困惑的现象:最先进的图像分类器,即便完美拟合了训练集里那些奇怪的、甚至标签错误的样本,依然能在测试集上表现出色。这跟经典理论是矛盾的。
要回答这些问题,你首先得能回答一个更基础的问题:“记忆”到底怎么定义?怎么测量?
这篇文章要讲的,就是过去几年里研究者们如何一步步把”记忆”从一个模糊的直觉,变成一个可以用比特精确计量的物理量——以及这个测量结果揭示出的、关于神经网络本质的惊人事实。
先讲个反常识的老故事:为什么”记住训练标签”这件事本身很奇怪
在讲怎么测量记忆之前,你需要先理解为什么这是个真正的谜题,而不是显而易见的事。
想象你在教一个学生识别猫和狗的照片。给他一千张标注好的照片作为练习题。一个”聪明”的学生应该学会猫和狗的共同特征——耳朵形状、体型比例、毛发纹理——然后用这些特征去判断没见过的新照片。
但假设这一千张照片里,有几张标错了——一张明明是狗的照片被标成了”猫”。一个真正学到了”猫狗的共同规律”的学生,应该会在这几张标错的照片上犯错(因为规律和标签冲突),但在新照片上表现良好。
奇怪的是,现代深度神经网络不是这样的。它们会把那几张标错的照片也完美地记住——包括错误的标签。它们不仅在训练集上表现完美,连那些”不合规律”的异常样本都能精确复现。按照经典的统计学习理论,这应该是过拟合的信号,应该导致测试集表现变差。
但事实恰恰相反:这些同样的模型在全新的测试图片上表现出色,甚至比那些”更保守”、不去死记硬背异常样本的模型表现更好。
这个矛盾困惑了研究者很多年。直到 Google 的 Vitaly Feldman 在 2019-2020 年提出了一个理论解释,情况才开始清晰起来——这也是理解”记忆”意义的第一块拼图。
直觉:长尾世界里,”死记硬背”可能是唯一的活路
Feldman 的核心观察很简单:真实世界的数据分布几乎从来不是均匀的,而是长尾的。
打个比方。假设你要教一个模型识别”狗”。现实中大多数狗的照片长得都差不多——金毛、拉布拉多、柴犬这些常见品种,你有成千上万张样本,规律很明显,模型很容易从统计规律里学出”狗长什么样”。
但总有一些罕见的品种——比如某种只有几百张照片流传在网上的稀有猎犬。这些照片数量太少,不足以让模型”归纳”出一个稳定的视觉规律。对于这种情况,模型面前只有两个选择:
- 忽略它,把它归到”其他常见品种”里,代价是遇到这个品种的新照片时大概率判断错误。
- 单独记住它——把这几张训练图片的具体像素模式直接刻进权重里,代价是消耗一部分模型容量,好处是遇到同一品种的新照片时反而能认对,因为稀有品种内部的照片往往彼此高度相似(可能是同一批爱好者拍摄、同一网站流传的图)。
Feldman 用数学证明了一件事:当数据分布是长尾的,选项 2(记忆)在很多情况下反而能让整体的泛化误差更低。而且更关键的是,你事先根本无法从统计上区分”这个稀有样本值得记住”和”这个样本就是随便一个噪声,记住也没用”——这两种样本长得几乎一样,唯一的差别是背后有没有一群相似的测试样本在等着被正确分类。
这解释了一个长期悬而未决的谜题:为什么神经网络”记住”了一些看起来毫无意义的边缘样本,反而没有变笨,甚至变聪明了。记忆不是泛化的敌人,在长尾世界里,它可能是泛化的必要成本。
Feldman 和合作者 Chiyuan Zhang 后续在图像数据集上做了实证验证,发现在 ImageNet 上大约 32% 的训练样本存在明显的”记忆分数”,而这些被记忆的样本,能带来大约 3.4% 的额外准确率提升——这个数字远高于随机抽取同等比例样本所能带来的提升。视觉上检查这些”高价值记忆”样本对,几乎全是那种”训练集里有一张长得很怪的图,测试集里刚好有一张长得几乎一样的怪图”——完美印证了长尾理论的预言。
那么在语言模型里,记忆到底是怎么”称重”的?
图像分类的故事讲清楚了”为什么记忆有用”,但没有回答一个更实际的问题:怎么给记忆一个精确的数字?
这在语言模型上尤其棘手,因为过去的研究者一直在用一种不太靠谱的方法测量记忆——看模型会不会把训练数据”吐出来”。
一个看似合理但站不住脚的旧方法
早期研究者(包括 Nicholas Carlini 团队一系列著名的工作)测量记忆的方式很直接:给模型一段训练数据的开头当提示,看它能不能把后面的内容一字不差地续写出来。如果能续写出一长串一模一样的文字,就认为这段数据被”记住”了。
Carlini 2020 年那篇著名的 “Extracting Training Data from Large Language Models” 用这种方法,从 GPT-2 里成功抽取出了几百条可识别的个人信息、代码片段和文本;2023 年的后续工作把这个思路推广到了商用大模型,并发现模型越大,能被抽取出的训练数据也越多。
这类”抽取式”方法揭示了真实的隐私风险,是有价值的。但作为记忆的定义,它有一个致命漏洞:你没法区分”模型是因为记住了原文才输出它”还是”模型是因为足够聪明,靠泛化能力’蒙对了’“。
举个例子:如果你让语言模型计算 $2^{100}$,它可能会输出正确答案 1267650600228229401496703205376。这串数字极其罕见,几乎不可能出现在别的地方,如果直接套用”能被诱导输出=记住了”的标准,你会得出这个数字被”记住”的结论。但真相很可能是模型学会了怎么做二进制乘法这种通用规律,而不是死记硬背了这一个具体的数。
这就是 Meta、Google DeepMind、康奈尔大学和 NVIDIA 联合团队在 2025 年那篇《语言模型到底记住了多少?》里要解决的核心问题:如何把”记忆”和”泛化”这两件在效果上看起来一模一样的事,在数学上彻底分开。
直觉:记忆是”压缩”,泛化是”理解规律”
他们的解法建立在一个非常优雅的直觉上,这个直觉来自信息论,可以用一个类比讲清楚。
假设你要向朋友描述一串数字:1, 2, 3, 4, 5, 6, 7, 8, 9, 10。你完全不需要把十个数字都念一遍,只需要说”从 1 到 10 的连续整数”就够了——因为这里面有规律,规律本身就是一种压缩。这就是”泛化”:模型学到了数据背后的生成规则,只需要极少的信息就能重建整个数据集。
但假设你要描述另一串数字:47, 13, 92, 5, 88, 31。这串数字之间没有明显规律(它们是随机生成的),你唯一的办法就是把六个数字原样念出来——这就是”记忆”:当数据里没有规律可循时,模型唯一能做的就是把具体的比特值直接刻进参数里。
这个团队的关键洞察是:用”压缩率”这一个统一的量,就可以同时衡量记忆和泛化,而且能把两者精确地分开。
具体来说,他们定义了两个概念:
- 总记忆:一个训练好的模型能帮你把某个数据点压缩到多短。如果模型对这个数据”了解”得越多,你需要传输的额外信息就越少。
- 无意记忆(unintended memorization):在总记忆里,减去”任何一个理解了数据生成规律的模型都会具备”的那部分理解(也就是泛化),剩下的才是模型真正”死记硬背”下来的、跟这个具体样本绑定的信息。
技术细节(选读):怎么用数学把这两者分开
如果你想知道背后的数学是怎么做到的,可以往下看;如果只想知道结论,可以跳到下一节。
核心工具是互信息。对于一个真实的数据生成过程 $\Theta$(可以理解为”世界的真实规律”),一个训练数据集 $X$,和训练出来的模型 $\hat\Theta$,总记忆定义为:
\[\text{mem}(X, \hat\Theta) = I(X, \hat\Theta) = H(X) - H(X \mid \hat\Theta)\]翻译回人话:总记忆 = 数据集本身包含的全部信息量,减去”看了模型之后,数据集还剩下多少不确定性”。如果模型把数据集的每个细节都记得清清楚楚,那么看了模型之后,数据集就没有任何剩余的不确定性,记忆量等于数据的全部信息量。
而真正要分离出的”无意记忆”,定义是在已知真实规律 $\Theta$ 的前提下,模型还额外记住了多少和这个具体数据集绑定、无法从规律里推出的信息:
\[\text{mem}_U(X, \hat\Theta, \Theta) = H(X \mid \Theta) - H(X \mid \Theta, \hat\Theta)\]翻译回人话:先假设你已经完全懂得了”世界的真实规律”(比如你已经懂加法、懂语法),那么单独这份数据集里,还剩下多少你原本猜不到、但看了训练好的模型之后就能猜到的具体信息?这部分才是纯粹的”死记硬背”。
由于真实世界的模型是唯一的、单个的样本,没法直接算随机变量的熵,团队进一步用Kolmogorov 复杂度(一个字符串最短的可执行描述长度)来落地这个定义,再用算术编码这种和模型概率紧密关联的压缩方案去做实际的数值估计——本质上就是拿模型给这段数据打的”概率有多高”来反推”这段数据能被压缩到多短”。这一整套推导虽然绕了几层,但最后落地的计算方式很朴素:模型对一段数据打分越高(困惑度越低),这段数据被认为”记住”的程度就越高;再减去一个更大参照模型(泛化能力的上限代表)在同样数据上的打分,剩下的差值就是这个模型独有的、不可解释为”任何聪明模型都会有”的那部分记忆。
关键实验:先让模型没有规律可循,专心测”容量”
分离出了记忆的定义,下一步是测量它。但真实文本里记忆和泛化天然纠缠在一起,很难干净地分开验证方法对不对。
所以团队做了一件很聪明的事:先构造一批完全随机、没有任何规律的数据——每个 token 都从词表里独立随机采样,前后没有任何关联。既然这些数据里根本不存在可以”泛化”出来的规律,那么模型对这些数据表现出的所有”记忆”就一定是纯粹的、无意的记忆,不可能混入泛化的成分。这就为测量提供了一个完全干净的对照实验。
他们训练了从 50 万到 15 亿参数的几百个 GPT 风格 transformer,喂给每个模型不同规模的随机数据,然后测量前面定义的”无意记忆”指标。结果出现了一个非常清晰、几乎像物理定律一样的规律:
随着训练数据量增加,模型记住的比特数会持续上升,直到触及一个上限,然后彻底停止增长——不管你再喂多少数据,模型能记住的信息总量就是不会再变多了。
这个上限,就是团队定义的模型容量。测出来的结果相当一致:GPT 风格的 transformer,大约能在每个参数里存下 3.5 到 4 比特信息,精细测量后的平均值定在了 约 3.6 比特/参数(在半精度 bfloat16 下约 3.51,全精度 float32 下约 3.83)。有意思的是,把数值精度从 16 位翻倍到 32 位,存储容量只提升了不到 10%——说明限制记忆的瓶颈不是”每个数字能表示多精细”,而是模型架构本身能承载多少独立的信息单元。
这个数字之所以让人印象深刻,是因为它几乎不依赖模型的具体形状——不管是层数多、维度窄,还是层数少、维度宽,不同架构测出来的 3.6 这个常数都惊人地稳定。这暗示了一件事:限制记忆容量的,可能不是某个具体的架构设计选择,而是 transformer 这类模型本身某种更根本的信息承载极限。
那真实文本呢?这才是最有意思的转折
随机字符串测出的是模型的”极限容量”。但真实文本里既有规律又有例外,更接近实际训练场景。当团队把同样的实验搬到真实文本数据上,发生了一件非常关键的事情:
模型一开始的行为和随机数据一样——数据量小的时候,记忆量随着数据增多线性上涨。但一旦逼近容量上限,曲线出现了转折:无意记忆不再继续增长,反而开始下降,同时模型在测试集上的表现开始变好。
这个转折点,正是最近几年深度学习圈子里热议的“grokking”(顿悟)现象在发生的地方。当模型的容量被训练数据”填满”之后,继续增加数据不再给模型更多空间去死记硬背每一个具体样本,模型被”逼着”去寻找能同时压缩更多样本的通用规律——也就是开始真正的泛化。
这也解开了另一个深度学习界长期讨论的谜题:“双重下降”(double descent)现象为什么会恰好在数据量接近模型参数量的那个点上发生。经典统计学告诉我们,模型复杂度和数据量的比例存在一个”危险区”,测试误差会先降后升再降,呈现出双峰形状。这篇研究给出了一个具体、可测量的解释:双重下降开始出现的临界点,恰好就是数据集的信息总量超过模型记忆容量的那一刻——在这之前,继续增加参数或数据都在帮模型”背题”,一旦跨过这条线,继续增加的部分就只能拿来学规律,行为模式因此发生质变。
换句话说,过去被形容为”神秘的双重下降曲线”,本质上可能就是”模型的记忆槛位被填满后被迫转向泛化”这件事在损失曲线上留下的指纹。
这件事的下游意义:成员推断和数据规模的关系
有了”容量”这把精确的尺子,团队进一步推导出了一个可以直接指导工程实践的结论,叫做成员推断攻击的规模定律。
成员推断攻击(membership inference attack)问的是:给你一个训练好的模型,和一条具体的数据,你能不能判断”这条数据当年到底有没有被用来训练这个模型”?这是隐私研究领域最基础也最重要的攻击形式之一——如果攻击者能可靠地判断”你的某条私人数据被用于训练了某个模型”,这本身就是一种隐私泄露。
按照这篇研究的框架,这件事其实有一个非常直白的解释:一个模型能不能”记得住”某条数据是不是训练集里的,取决于模型的总容量,除以数据集里样本的数量。模型容量固定的情况下,你喂给它越多的数据,分摊到每一条具体样本上能”记住”的比特数就越少——因此单条数据被精确识别出”是不是训练集成员”的难度就越大。
团队用这套框架推导出了一条清晰的规模定律,并且用它去外推现代大模型的实际训练规模:结论是,今天绝大多数主流大语言模型的训练数据量,已经远远超过了它们的参数容量能够支撑的、可靠进行成员推断的临界点。
翻译回人话:一个 80 亿参数、3.6 比特/参数的模型,理论容量大约是 28.8 亿比特,折算成 32GB 左右的信息量。但它却被喂了 7TB 的数据——数据量是容量的两百多倍。按照这个比例,平均每条数据只能分摊到极其微量的记忆额度,绝大多数单条数据几乎不可能被可靠地”认出来是不是训练集成员”。这从数学上解释了为什么现代大模型总体上对单条隐私数据的”记忆风险”其实相当有限——不是因为模型刻意”忘记”了什么,而是因为容量被摊得太薄,根本没有余地精确记住每一条具体的样本。
但这不意味着记忆风险为零。研究同时指出一个重要的例外:如果某条数据在训练集里出现了多次(重复/近似重复),它会不成比例地占用更多的记忆容量,变得远比单次出现的数据更容易被记住和抽取——这也和 Carlini 团队更早关于”数据重复率是记忆强度最强预测因子之一”的实证发现完全吻合。
把两条线拉到一起:长尾理论和容量测量讲的是同一个故事
回过头看,这篇文章其实串起了两个相隔五年、看似不相关的研究:2019-2020 年 Feldman 关于图像分类的长尾记忆理论,和 2025 年 Meta 团队关于语言模型容量的精确测量。它们其实是同一个故事的两个章节。
Feldman 的理论回答的是”为什么记忆会发生、什么时候记忆是有益的”——答案是:当数据分布长尾,某些样本只能靠死记硬背才能在测试时被正确处理,记忆就成了泛化误差的必要组成部分,而不是它的敌人。
而容量测量的研究回答的是”记忆到底有多少空间、什么时候会被填满、填满之后会发生什么”——答案是:每个参数大约能装 3.6 比特,填满之前模型偏向记忆,填满之后模型被迫转向泛化,这个转折点正是双重下降和 grokking 现象的根源。
把两者放在一起看,你会得到一幅更完整的图景:语言模型的训练过程,本质上是一场”记忆预算”的动态分配。数据集里越是常见、越有规律的部分,模型能用极低的记忆成本、靠泛化的方式去覆盖;越是罕见、越难归纳的长尾部分,模型不得不消耗宝贵的容量去死记硬背。当数据规模远超模型容量(就像今天绝大多数商用大模型的实际情况),模型被迫把有限的”记忆预算”优先分配给性价比最高的部分——那些能同时解释大量样本的通用规律——而对绝大多数单条具体数据,只能给出极其稀薄、几乎不足以被精确复原的一丝印记。
这解释了一个经常被问到、却很少有人能讲清楚的问题:”大模型到底是在’理解’还是在’背题’?”答案是:两者都在发生,而且是以一种可以被精确测量、此消彼长的方式同时发生的。模型没有”理解”和”记忆”两种互斥的运行模式,它只有一个统一的、有限的信息容量,理解(泛化规律)和背题(死记硬背)在争夺同一份预算,而争夺的结果,恰好可以用比特数来称重。
下一篇预告
这篇文章讲的是模型”记住”了多少信息量这个静态问题。但一个自然的延伸问题是:模型记住的这些信息,具体储存在网络的哪个角落?是均匀分布在每一层里,还是集中在某几个特定的神经元或权重矩阵上?如果是后者,我们能不能像做外科手术一样,精确定位并修改某一条被记住的知识,而不影响模型的其他能力?这其实正是本系列之前”知识编辑”那篇文章(ROME 与 MEMIT)所探讨的问题的另一面——如果你对”记忆到底存在哪里”这个问题感兴趣,那篇文章会是一个很好的延伸阅读。