HeadlinesBriefing HeadlinesBriefing.com

变压器如何存储记忆:从线性层到自注意力

Hacker News •
×

大型语言模型可以回忆世界各地的冷知识,但它们究竟是如何记住这么多的?本文探讨线性映射、MLP和自注意力作为不同类型的记忆存储。

关键属性是一个好的记忆存储能够回忆起它存储的内容。我们存储的记忆越多,试图回忆其中之一时,它们之间的干扰就越多。干扰-信号比衡量在回忆过程中其他记忆干扰了多少。它能存储的记忆数量在干扰增长到与信号相当之前的容量。我们将展示如何从线性层开始,转向更好的 MLP,它能提高容量和回忆能力,然后转向自注意力,后者回忆能力极好,可以存储潜在无限数量的记忆。使用 64 维键,这是从大约 64 条记忆跃升到约 2,700 条,再到超过 100 万条的飞跃。

记忆存储是一个保持 M 条记忆的函数 f,其中 i = 1, ..., M。每条记忆都是一个键值对:一个用于基于相似性查找的键 k_i ∈ ℝ^{d_k},以及一个我们想要检索的值 v_i ∈ ℝ^{d_v}。要使用 f,我们用输入 x 查询它,它会回忆出输出 f(x)。一个好的记忆存储在我们用 k_i 或与 k_i 相似的向量查询时会回忆出 v_i。在文献中,通过相似性回忆的记忆存储称为关联记忆。最基础的记忆存储是外积记忆存储:它仅通过外积累记忆,W = ∑_{i=1}^{M} v_i k_i^T = V^T K,其中 K ∈ ℝ^{M×d_k} 的行是键 k_i^T,V ∈ ℝ^{M×d_v} 的行是值 v_i^T。要存储一个新记忆 (k, v),我们只需将 vk^T 添加到现有权重中。用输入 x 查询记忆存储时,我们将输入乘以矩阵:f(x) = V^T K x = ∑_{i=1}^{M} v_i (k_i^T x)。所以回忆是通过相似性查找存储的键:我们将查询与每个键比较,并返回相似度加权的值之和。回忆会拾取干扰:存储记忆很容易,但当我们尝试回忆其中一条时会发生什么?假设简单起见,我们假设每个键都归一化为长度 1,即 k_j^T k_j = 1。那么 f(k_j) = v_j + ∑_{i≠j} v_i (k_i^T k_j)。第一项是我们想要的信号,第二项是其他记忆的干扰。

来源: Hacker News · 由HeadlinesBriefing整理摘要