Hacker News 中文摘要

RSS订阅

You could have invented transformers from memory

如今的大型语言模型能回忆起世界各地的冷门知识。最近我去朋友的桌游之夜要迟到了,便让阿斯特拉(Astra)提醒我沙丘:帝国(Dune: Imperium)的规则。它在路上讲给我听,帮我复习到能重新上手。我们太习惯于向模型提问,以至于把它们的广博知识视作理所当然。模型是怎么记住这么多信息的?它们又能存多少?

正文

如今的大型语言模型能回忆起世界各地冷僻的事实。最近我赶着去朋友的桌游之夜,让 Astra 提醒我《沙丘:帝国》(Dune: Imperium)的规则。它在路上给我讲了一遍,帮我回忆起足够多的规则,让我又能上桌游戏。我们太习惯什么事都问模型,以至于把它们广博的知识视作理所当然。

模型是怎么记住这么多信息的?它们又能存多少?

我会用一种直观的方式,把线性映射、MLP 和自注意力都看成不同类型的记忆存储器。从这个直觉出发,我们可以粗略估计每一层能存多少记忆。

衡量一个“好”的记忆存储器的关键性质,是它能召回存进去的东西。毕竟,就算能存无限多事实,如果在需要时想不起来也没用。存的记忆越多,召回某一条时其他记忆的干扰就越强。因此我们要盯住一个量:干扰—信号比(interference-to-signal ratio),它衡量召回时其他记忆造成多大妨碍。当干扰增大到和信号一样大之前,一个存储器能容纳的记忆数量就是它的容量(capacity)。

沿着这个视角,我们会看到如何从线性层走到更好的 MLP——它同时提升了容量和召回质量——再走到自注意力:自注意力的召回非常好,而且能存的记忆数量可能无上限。在键维度为 64 时,容量从大约 64 条记忆,跳到大约 2,700 条,再到超过一百万条。

先统一术语。记忆存储器是一个保存 $M$ 条记忆的函数 $f$($i = 1, \ldots, M$)。一条记忆就是一个键值对:键 $ki \in \mathbb{R}^{dk}$ 用于按相似度查找,值 $vi \in \mathbb{R}^{dv}$ 是我们想取回的东西。用输入 $x$ 去查询 $f$,它会召回一个输出 $f(x)$。好的存储器在用 $ki$ 或与其相似的向量查询时,应该召回 $vi$。文献中把这种按相似度召回的存储器称为联想记忆(associative memory)。

外积记忆存储器

最基本的存储器是线性的:它通过外积累加记忆,

$$W = \sum{i=1}^{M} vi k_i^\top = V^\top K$$

其中 $K \in \mathbb{R}^{M\times dk}$ 和 $V \in \mathbb{R}^{M\times dv}$ 的行分别是键 $ki^\top$ 和值 $vi^\top$。这种键值累加有时也叫“赫布学习”(Hebbian learning),因为同时激活的输入(键)和输出(值)会增强突触(权重)的强度。

要存入一条新记忆 $(k, v)$,只要把 $v k^\top$ 加到现有权重上。这种外积存储器被用于线性注意力(也叫 fast weights)的状态:每个 token 通过把 $v k^\top$ 加到一个矩阵上来存储记忆 $(k, v)$,后面的 token 再查询这个矩阵(Katharopoulos 等;Schlag、Irie 与 Schmidhuber)。

旁白:一步梯度下降就是写一条记忆 在一个带标量损失 $L$ 的网络里取线性层 $y = Wx$,令 $\bar y = \nabla L(y)$ 为损失对层输出的梯度。损失对 $W$ 的梯度是 $\bar y x^\top$,因此学习率为 $\eta$ 的一步更新是

$$W \leftarrow W - \eta\, \bar y x^\top.$$

这个递推就是一个记忆更新:它用键为 $x$、值为 $-\eta\bar y$ 的新记忆去更新权重。关于这个视角的更多内容,见 Irie、Csordás 与 Schmidhuber 的工作,他们把用梯度下降训练的线性层表示为对其所有训练输入的注意力。

用输入 $x$ 查询存储器时,把它和矩阵相乘:

$$f(x) = V^\top K x = \sum{i=1}^{M} vi\,(k_i^\top x).$$

所以召回就是按与所存键的相似度查表:把查询和每个键比较,返回按这些相似度加权求和的值。

召回会引入干扰

存记忆很容易:不断把外积加到权重上就行。但当我们想召回一条时会发生什么?

简单假设每个键都归一化为长度 1,即 $kj^\top kj = 1$。那么

$$f(kj) = \underbrace{vj}{\text{信号}} + \underbrace{\sum{i\neq j} vi\,(ki^\top kj)}{\text{干扰}},$$

也就是说,我们取回了目标记忆(即用来查询的那个键对应的记忆)的值,再加上所有其他与查询相似的键对应记忆的干扰。

如果所有键都标准正交,干扰就是零,召回完全准确。但 $\mathbb{R}^{dk}$ 只有 $dk$ 个正交方向,所以一旦存的记忆数超过键维度($M > d_k$),就无法完美召回。

外积存储器的容量是多少?直观来看:共有 $M-1$ 个干扰项。如果键是随机的单位向量,每个相似度 $ki^\top kj$ 大约是 $\pm 1/\sqrt{dk}$。如果值也是随机的且长度相近,这 $M-1$ 个干扰项会像随机游走一样叠加,于是干扰的平方长度大约是信号的 $(M-1)/dk$ 倍,即

$$\frac{\|\text{干扰}\|}{\|\text{信号}\|} \sim \sqrt{\frac{M}{d_k}}.$$

令这个比值为 1,得到容量

$$M \approx d_k,$$

也就是说,当存的记忆数达到键维度时,干扰就和信号一样大,把信号淹没了。

下面每张条形图里的每根柱子,代表单次召回中一条记忆相对于目标记忆(红色)的权重;把 $M$ 拖到 $d_k = 64$ 以上,会看到小柱子越堆越多,直到召回失败。其他按钮可切换到后面会构建的存储器。

如何减少干扰?

即便远未达到大约 $d_k$ 条的容量,外积存储器在召回时也会有明显的干扰。(这里说的是召回一个干净的值向量;如果每个值只需要在固定集合中指向正确答案,比如选出最可能的 token,那么召回只要离正确答案比离错误答案更近即可,此时一个 $d\times d$ 矩阵能存下大约 $d^2$ 条事实,见 Nichani、Lee 与 Bietti。)要提高容量,或者在容量以下召回得更干净,就必须减少干扰。

暴力方法是把键维度 $dk$ 变大,因为线性存储器的容量随 $dk$ 增长。$d_k$ 能取多大受硬件限制。

另一种做法是算法上的改进。我们可以更小心地存记忆:外积存储器每加一条记忆都不看其他记忆,因此完全不会去抵消它们之间的干扰;我们也可以更有选择地召回:在线性存储器里,每条记忆都会贡献干扰,哪怕它的键与查询相似度很低,所以抑制不太相似的键就能改善召回。

接下来会看到:更仔细地存外积记忆,就得到最优线性存储器,容量大约翻倍;通过非线性来选择性召回,就得到 MLP 和自注意力。

最优线性记忆存储器

外积存储器写每条记忆时都不管其他记忆。我们也可以选择权重 $W$,让召回一次性拟合所有已存的记忆。这就是一个线性回归问题(我们也可以用这个回归目标来设计序列模型在前向过程中写入的短时记忆,比如线性注意力和自注意力;参见我的 test-time regression 工作):

$$\minW \sum{i=1}^M \|W ki - vi\|_2^2.$$

当存的记忆数多于键维度、即 $M > d_k$ 时,最小二乘解是

$$W = \Bigl(\sumi vi ki^\top\Bigr)\Bigl(\sumi ki ki^\top\Bigr)^{-1} = V^\top K\,(K^\top K)^{-1}.$$

它和外积存储器 $V^\top K$ 只差一点:在把查询和键比较之前,先乘上 $(K^\top K)^{-1}$,抵消掉键的协方差 $K^\top K$。这相当于对键做白化(whiten),存储器就不会再过度偏重许多键共有的方向。

当 $M \le d_k$ 时,只要键线性无关,回归就能精确拟合每条记忆,因此最优存储器召回时完全没有干扰——哪怕键并不正交。

当 $M > dk$ 时,由于存储器只有 $dk$ 个方向可用,就开始出现干扰。对随机的键和值,干扰—信号比变成

$$\frac{\|\text{干扰}\|}{\|\text{信号}\|} \approx \sqrt{\frac{M}{d_k} - 1}.$$

令比值等于 1,得到

$$M = 2d_k,$$

所以最优存储器的容量是之前的两倍!

旁白:最优线性记忆存储的推导 当 $M \le dk$ 时,若键线性无关,键间内积组成的 $M\times M$ 矩阵 $KK^\top$ 可逆,解 $W = V^\top (KK^\top)^{-1} K$ 能精确拟合每条记忆。$M < dk$ 时问题欠定,有无穷多解,上面这个是最小范数解。$(KK^\top)^{-1} K$ 的行 $\tilde ki^\top$ 构成 $K$ 各行的对偶基:由构造有 $(KK^\top)^{-1} KK^\top = I$,故 $\tilde ki^\top kj = \delta{ij}$。于是 $f(kj) = \sumi vi \tilde ki^\top kj = vj$,没有干扰,完美召回。

当 $M > dk$ 时,令目标函数对 $W$ 的梯度为零得 $W K^\top K = V^\top K$,所以 $W = V^\top K (K^\top K)^{-1}$。两种情形都可写成 $W = V^\top (K^\top)^\dagger$,其中 $A^\dagger$ 是伪逆:键线性无关时 $(K^\top)^\dagger = (KK^\top)^{-1} K$;键张成 $\mathbb{R}^{dk}$ 时 $(K^\top)^\dagger = K(K^\top K)^{-1}$。

再看 $f(kj) = V^\top K (K^\top K)^{-1} kj$ 的干扰。对存好的键 $kj$,每个值 $vi$ 的权重是 $ki^\top (K^\top K)^{-1} kj$,正好是 $M\times M$ 矩阵 $P = K(K^\top K)^{-1} K^\top$ 的第 $(i,j)$ 项:

$$f(kj) = \sum{i=1}^M vi P{ij} = \underbrace{P{jj} vj}{\text{信号}} + \underbrace{\sum{i\neq j} P{ij} vi}_{\text{干扰}}.$$

$P$ 是到 $K$ 列空间($\mathbb{R}^M$ 中的一个 $d_k$ 维子空间)的投影。关于投影有两个事实可用来分析干扰—信号比:

  • 信号项:由迹的循环性,$\sum{j=1}^M P{jj} = \operatorname{tr}(K(K^\top K)^{-1} K^\top) = \operatorname{tr}(I{dk}) = dk$,所以 $M$ 个信号权重加起来是 $dk$。若键随机,没有哪个键特殊,故 $P{jj} \approx dk/M$。
  • 干扰项:$P$ 是对称投影矩阵,$P^2 = P$。于是 $\sum{i\neq j} P{ij}^2 = \sumi P{ij}^2 - P{jj}^2 = (P^\top P){jj} - P{jj}^2 = P{jj} - P{jj}^2 \approx dk/M - (d_k/M)^2$。

若值随机且长度相近,则

$$\frac{\|\text{干扰}\|}{\|\text{信号}\|} \approx \frac{\sqrt{P{jj} - P{jj}^2}}{P{jj}} = \sqrt{\frac{M}{dk} - 1}.$$

和外积存储器的 $\sqrt{M/dk}$ 相比,那个 $-1$ 就是最优存储器抵消掉的大约 $dk$ 条记忆的干扰。

我们可以用数值实验验证预测:在 $dk = 64$ 维里随机采样 $M$ 条单位长度的键组成的记忆,用其中一个存好的键去查询,测量干扰—信号比。结果显示,外积存储器在 $M \approx dk = 64$ 时达到容量;最优存储器到 $M = dk$ 之前都能精确召回,之后干扰从零开始按 $\sqrt{M/dk - 1}$ 上升,并在 $M = 2d_k = 128$ 附近达到容量,和预测一致。由于它抵消的是固定条数的干扰,两种存储器的差距会随 $M$ 增大而缩小。

不过这个最优存储器对相似度仍然是线性的:它必须把小相似度和大相似度按同一个因子缩放。要想更好,就得改变召回的方式。

MLP 作为非线性记忆存储器

线性存储器的召回是

$$f(x) = \sum{i=1}^M vi (k_i^\top x).$$

如果能有办法在 $k_i^\top x$ 很小时压低它的权重,就能减少低相似度键带来的干扰。

那就把每个相似度在算值的加权和之前,先过一个非线性函数 $\sigma$:

$$f(x) = \sum{i=1}^{M} vi\,\sigma(k_i^\top x) = V^\top \sigma(Kx).$$

我们从第一性原理重新发现了两层 MLP!第一个权重矩阵的行是键,第二个权重矩阵的列是值。Sukhbaatar 等人指出了前馈层和记忆存储器的这种相似性;Geva 等人发现训练好的 transformer 里的前馈层常常就是这么工作的,其键会对输入中可识别的模式产生响应。

理想情况下,门控函数 $\sigma$ 应满足:当相似度很低($ki^\top x \sim 0$,甚至 $ki^\top x < 0$)时,求和里对应的项被压低,以减少干扰。ReLU 会把负相似度对应的键清零,加上偏置还能移动这个阈值。(对随机键,ReLU 能把干扰缩小 $\sqrt 2$ 倍:随机键的相似度正负各半,ReLU 清零约一半权重、另一半不变,于是干扰的方差减半、干扰本身缩小 $\sqrt 2$ 倍;完整推导见 Zhong 等人。)平方 ReLU 会进一步压低相似度接近零的键:相似度 0.1 变成 0.01,而相似度 1 仍是 1。事实上,平方 ReLU 是那些较少人知道、但已在大规模上验证有效的 MLP 激活函数改进之一(So 等人)。

平方 ReLU MLP 是一个门控和输入投影共享权重的 GLU MLP,因为 $\operatorname{ReLU}(Kx)^2 = \operatorname{ReLU}(Kx) \odot Kx$。今天语言模型里的 SwiGLU MLP 给门控单独权重,并用 Swish 激活替代 ReLU。

实践中,MLP 把事实存在叠加态里:许多事实共享同一组权重,输出是多种记忆的混合。Garcia 等人显式构造了一个:GLU MLP 的隐藏单元计算输入的随机特征 $\phi(x)$,第二个权重矩阵是在这些特征上的外积存储器 $\sumi vi \phi(k_i)^\top$,这个 MLP 存下的事实远多于它的隐藏单元数。不过,训练好的 transformer 的 ReLU MLP 对给定输入可能只激活少到 1% 的隐藏单元,所以每次召回只用到很小一部分记忆(Li 等人)。

Transformer 的作者早就知道这一点 原始 transformer 论文也建立了这个联系,但只出现在 arXiv 的 v2 和 v3 里。Vaswani 等人把前馈层描述成“一种注意力”,其两个权重矩阵的行分别是键和值,并用 ReLU 代替 softmax。他们甚至试过用对习得键值参数的注意力来替换前馈层,翻译质量大致相当:一版略差,另一版略好,不过第一版训练慢了约 30%。这一段在论文的后续版本里被删掉了。下面会讲到自注意力和这一切的关系。

用更高次幂减少干扰

对相似度取平方之所以有效,是因为它把小相似度权重收缩得比大相似度厉害得多。我们可以进一步用 $\sigma(s) = \operatorname{ReLU}(s)^p$ 推到更高次。信号不变,因为 $1^p = 1$;而一个相似度为 $1/\sqrt{dk}$ 的干扰项会收缩到 $dk^{-p/2}$。$M$ 个干扰项像随机游走一样叠加,于是干扰—信号比为

$$\frac{\|\text{干扰}\|}{\|\text{信号}\|} \approx \sqrt{\frac{M}{d_k^p}}.$$

这意味着容量大约是

$$M \approx d_k^p$$

条记忆,比之前呈几何级增长!

我们用同一个实验在五种 $\sigma$ 下验证。因为干扰随 $\sqrt{M}$ 增长,在双对数坐标下这些线几乎平行,只有高度变化,容量(每条线与 1 相交的位置)也随之变化:

  • 线性:容量 $M \approx d_k = 64$。
  • ReLU:清零负相似度把干扰缩小 $\sqrt 2$ 倍,容量增至 $M \approx 2d_k = 128$。
  • 平方 ReLU:每个干扰项从约 $1/\sqrt{dk}$ 缩到约 $1/dk$,容量增至 $M \approx 2d_k^2/3 \approx 2700$,约为线性存储器的 40 倍。
  • SwiGLU MLP(门控和输入投影共享权重,和平方 ReLU 一样),$\sigma(s) = \operatorname{Swish}(s)\cdot s = s^2/(1+e^{-s})$:容量几乎追平方 ReLU。
  • 立方 ReLU:每个干扰项缩到约 $dk^{-3/2}$,容量增至 $M \approx 2dk^3/15 \approx 35000$。

自注意力作为非参数记忆存储器

把权重取 $p$ 次幂能把容量提升到大约 $d_k^p$。如果能推到极限呢?与其只选一个幂次,不如同时用无穷多个幂次。指数函数就是所有幂次的加权和:

$$e^{\beta s} = 1 + \beta s + \frac{(\beta s)^2}{2} + \frac{(\beta s)^3}{6} + \cdots = \sum_{p=0}^{\infty} \frac{(\beta s)^p}{p!},$$

其中锐度 $\beta$ 决定给高次幂多大权重。下面是同一个实验在 $\beta = \sqrt{dk}$(自注意力使用的值)下的结果,分别取指数及其截断到 2、3、4 项的级数(transformer 是除以 $\sqrt{dk}$ 而不是乘,但它们的查询和键长度约为 $\sqrt{dk}$,所以配对相似度 $q^\top k \approx dk$;我们的键和查询是单位长度,配对相似度为 1,因此这里按 $\beta = \sqrt{d_k}$ 来缩放):

截断到 2 项时,容量约 40,低于线性存储器,因为常数项给每个键大约 1 的权重;3 项时约 450;4 项时约 3,100,接近平方 ReLU;完整指数远低于虚线,容量超出图表范围。

为了求指数的容量,用一个存好的键 $kj$ 去查询:目标记忆相似度为 1,权重 $wj = e^{\beta}$。其他每条记忆的权重是 $wi = e^{\beta si}$;对随机单位键,相似度 $si$ 近似均值为 0、方差为 $1/dk$ 的高斯分布。若值随机且长度相近,

$$ \begin{aligned} \frac{\|\text{干扰}\|}{\|\text{信号}\|} &\approx \sqrt{\sum{i\neq j} \left(\frac{wi}{wj}\right)^2} && \text{干扰项像随机游走一样叠加} \ &= \sqrt{\sum{i\neq j} e^{2\beta (si - 1)}} && wi / wj = e^{\beta si} / e^{\beta} \ &\approx \sqrt{M\, e^{-2\beta}\, \mathbb{E}[e^{2\beta s}]} && \text{对 } M \text{ 条其他记忆取平均} \ &= \sqrt{M\, e^{-2\beta}\, e^{2\beta^2/dk}} && \mathbb{E}[e^{ts}] = e^{t^2/(2dk)} \text{(当 } s \sim \mathcal{N}(0, 1/dk) \text{)} \ &= \sqrt{M}\, e^{\beta^2/dk - \beta}. \end{aligned} $$

令比值为 1,得到容量

$$M \approx e^{2\beta(1 - \beta/d_k)},$$

只要 $\beta$ 远小于 $dk$,容量就随 $\beta$ 指数增长,而不像之前那样只是 $dk$ 的多项式!取 $\beta = \sqrt{d_k} = 8$,容量约为 $e^{14} \approx 120$ 万条记忆,接近线性存储器的 20,000 倍。更长时间的同样实验也把容量测在约 120 万。

实践中我们可能不想直接对数字取指数,因为小数会下溢、大数会上溢。好在干扰只依赖权重之间的比值,如上所示,因此可以把每个权重除以它们的和,这不会改变干扰—信号比,同时保证数值稳定:

$$f(x) = \sum{i=1}^{M} vi\,\frac{\exp(\beta\,ki^\top x)}{\sumj \exp(\beta\,k_j^\top x)} = V^\top \operatorname{softmax}(\beta K x).$$

这就是自注意力。(在 transformer 的记号里,相似度是 $ki^\top q$,其中 $q = WQ x$,并除以 $\sqrt{dk}$;我把 $WQ$ 折进键里。Transformer 的键和查询长度约为 $\sqrt{dk}$,所以那个缩放对应我们单位长度键下的 $\beta = \sqrt{dk}$。)

和 MLP 不同,MLP 的键和值是训练出来的权重,而自注意力从上下文的 token 里算出键和值。每个 token 存一条记忆,所以记忆数 $M$ 就是上下文长度。这正是自注意力非参数的原因:它的记忆不是参数,存储器随上下文增长。

再来看条形图(从 softmax 开始)。在 $\beta = 8$ 时,滑块范围内召回从不失败;把 $\beta$ 降到 2 并提高 $M$,召回会在几十条记忆后失败。$M$ 每翻倍,都需要稍微增大 $\beta$ 才能维持召回,这就是下一节想法。

处理长上下文中的大量键值对

Image 1

既然 $\beta$ 决定我们多强硬地压低不太相似的键,就可以随键值对数量 $M$ 增加而增大 $\beta$。为什么不直接把 $\beta$ 设得极大?因为当 $\beta \to \infty$ 时,softmax 会变成硬 argmax,只挑最相似的键,这不可导;而且很大的 $\beta$ 已经会让训练变差,因为 softmax 饱和后到其他所有键的梯度都消失了。所以我们只按 $M$ 的需要来提高 $\beta$。用 $\log M$ 缩放注意力 logits 就是针对长上下文的一种技巧。它有几种版本,都把 $\beta$ 相对于一个固定参考长度 $L$(通常是训练长度)来设定,使得 $M = L$ 时 $\beta$ 保持训练时的值:

  • Su(2021)从“随 $M$ 增长保持注意力熵不变”推导出 $\log M$ 的缩放,并归一化到 $M = L$ 时和标准注意力一致:在每个长度上把 logits 乘以 $\log M / \log L$。Scalable-Softmax 形式相同,把 logits 乘以 $s \log M$,其中 $s$ 是学出来的。
  • 最初的 Qwen 模型使用 LogN-Scaling,只在上下文长于 $L$ 之后才应用同样的因子。
  • Qwen2.5-1M 使用 YaRN 的注意力缩放,把 logits 乘以 $(0.1 \log(M/L) + 1)^2$,因此增长得像 $(\log M)^2$。

在我们的实验中($L = 1024$ 条记忆,且 $M = L$ 时 $\beta = \sqrt{d_k} = 8$),各种规则的表现是:过了参考长度 $L$ 后,Qwen 的规则和 Su 的规则重合,干扰—信号比随存储器增大而下降,到 200 万条记忆时约为 0.004。YaRN 增长更快的缩放把比值压到约 $10^{-4}$。每种情形下,让 $\beta$ 随 $\log M$ 缩放,都能存下键互不相同的记忆,数量实际上无上限。

结语

我们看过的记忆存储器,以及用存好的键查询、且键和值都随机时的容量如下:

| 记忆存储器 | $f(x)$ | 容量 | $dk = 64$ 时的容量 | | --- | --- | --- | --- | | 外积 | $V^\top K x$ | $dk$ | 64 | | 最优线性 | $V^\top K (K^\top K)^{-1} x$ | $2dk$ | 128 | | ReLU MLP | $V^\top \operatorname{ReLU}(Kx)$ | $2dk$ | 128 | | 平方 ReLU(GLU MLP) | $V^\top \operatorname{ReLU}(Kx)^2$ | $2dk^2/3$ | 约 2,700 | | SwiGLU MLP | $V^\top (\operatorname{Swish}(Kx) \odot Kx)$ | 约 $2dk^2/3$ | 约 2,900 | | 立方 ReLU | $V^\top \operatorname{ReLU}(Kx)^3$ | $2dk^3/15$ | 约 35,000 | | 自注意力,$\beta = \sqrt{dk}$ | $V^\top \operatorname{softmax}(\beta K x)$ | $e^{2\sqrt{d_k} - 2}$ | 约 120 万 | | 自注意力,$\beta \propto \log M$ | $V^\top \operatorname{softmax}(\beta K x)$ | 实验中未达到 | 超过 200 万 |

我们从启发式的记忆存储器——外积记忆——出发,逐步搭建到今天现代 transformer 里的各种标准层。这个视角也让我们能估计它们在容量(即作为向量值键值存储器的能力)上的差异。

需要说明的是,这个容量估计只是看待现代神经网络架构的一种方式。它只统计单层在干扰淹没信号之前能召回多少随机向量;事实上我们完全没考虑训练数据,而训练数据会影响键和值里究竟表示什么!也有其他工作针对训练好的层,以比特为单位衡量存储的信息:Morris 等人估计 GPT 类模型每个参数记住约 3.6 比特,并发现一旦模型填满容量,就开始泛化,对每个训练样本记住的内容变少;Allen-Zhu 与 Li 发现语言模型每个参数存储约 2 比特的事实知识,即便量化到 int8 也是如此。

评论

讨论整体偏正面,但主轴是“数学表达是否合适”:较多人认可文章价值,其中有人明确认为从线性代数进入并不算难、甚至说底层 LLM 与优化论文更难,少数软件背景读者则抱怨符号密集、想要伪代码和具体数据结构。还有少数人把它联系到智能即压缩,并追问从记忆模型到 LLM 的键值映射到底怎么落地。

认为文章整体值得看,数学入口并不算劝退

  • 不少读者给出正面评价:有人觉得文章很棒,有人即使没完全理解数学也认为它很好地演示了记忆、关系和连接,还有人称赞其中的动画和细节;为文章辩护的一方强调,从线性代数进入高维语义空间本就是正确路径。(较多人)
  • > 从线性代数出发,才是建立高维语义空间直觉的正确方式。(@kooi)

认为文章让人联想到智能接近压缩,或用权重存知识

  • 有读者把文章和“智能是否类似压缩”这个老问题连起来:记忆也许就是把知识存进权重、关系与连接里,再从这些连接中生成东西;即便没完全看懂数学,这种演示也让人觉得有趣。(少数人)
  • > 它让人联想到智能也许类似于压缩,或把知识存进权重里。(@sailfast)

认为文章对软件开发者不友好,应该改用伪代码和具体数据结构

  • 有软件背景读者觉得文章对开发者不友好:符号太密,没有说清数学对象的类型,也没有把“往记忆库存一个值、再查询它”的数据结构走一遍;他们希望像解释 RAG 那样落地成“字符串到浮点数列表的函数”和“找相近浮点数列表”,用伪代码一步步演示。(少数人)
  • > 对软件开发者来说,用伪代码一步步走具体例子,会比一串复杂希腊字母清楚得多。(@craftkiller)

认为从记忆模型到 LLM 的键值映射还没讲清楚

  • 有人被文章结尾难住:前面讲记忆还能跟上,但接到 LLM 时断了;大家能理解上下文里的词元似乎是键,却不清楚对应的值到底是什么,只好求懂的人解释。(少数人)
  • > 文章最后把记忆连到 LLM 时断掉了:上下文词元当作键,那值到底是什么?(@dullcrisp)

有价值的补充

  • Transformer 可被视作 Hopfield 网络,而且有一个反直觉点:它记忆能力很强,往往一步就能检索到合适记忆,传统 Hopfield 网络则要迭代多步。
  • 文章里的“干扰信号比”“容量”等说法,其实是通信或电子工程语言;把 AI 看成“带记忆的信道”时,通信工程师关于信道容量和吞吐量的经验可能也能迁移过来。
  • 同主题下有人贴出 NNCP 这一用神经网络做无损数据压缩的旧工作或讨论,可作为“记忆—压缩—神经网络”的延伸阅读。