突破LLM性能瓶颈:Meta记忆层增强Transformer架构详解

Meta提出“记忆层”增强Transformer架构,提升LLM性能,事实准确性翻倍,高效计算,挑战计算资源瓶颈。

原文标题:记忆层增强的 Transformer 架构:通过可训练键值存储提升 LLM 性能的创新方法

原文作者:数据派THU

冷月清谈:

Meta的研究团队提出了一种名为“记忆层”的创新技术,可以显著提升大语言模型(LLM)的性能,尤其在事实准确性方面提升了100%以上。

记忆层的工作原理类似于Transformer的注意力机制,但它的键值对是可训练的固定参数,且规模达到百万级别。给定查询,系统仅使用与查询最相似的前k个键及其对应值来计算输出,提高了计算效率。

为了优化大规模相似键搜索,研究团队采用了可训练乘积量化键技术,将键矩阵和查询向量分解成更小的子矩阵和子向量,从而降低计算复杂度。同时,他们还开发了专门的CUDA内核来优化GPU的内存带宽利用率,并引入了输入依赖门控机制和QK归一化技术来提升训练性能和稳定性。

实验结果表明,在多个Transformer层中引入并共享记忆层可以获得最佳效果,且在问答、科学知识、通用知识和编程能力等基准测试中,记忆层增强型LLM的性能均优于传统密集模型,甚至可以媲美使用数倍计算资源训练的模型。

怜星夜思:

1、文章提到记忆层的键值对是固定的,那模型如何学习新的知识呢?如果需要更新知识库,需要重新训练整个模型吗?
2、相比于传统的Transformer架构,记忆层增强型Transformer在实际应用中有哪些优势和劣势?
3、文章中提到的可训练乘积量化键技术,除了降低计算复杂度外,还会对模型的性能产生哪些影响?这种技术是否适用于所有类型的LLM?

原文内容

来源:DeepHub IMBA

本文约3500字,建议阅读5分钟

实验结果表明,记忆层技术在提升大语言模型性能方面具有显著优势。


大语言模型(LLM)通过其参数储存了大量信息,这些信息主要以密集层中线性矩阵变换的权重形式存在。然而,参数规模的扩大必然导致计算成本和能源消耗的显著增加。

这种参数存储方式是否可以通过更高效的键值查找机制来优化?

尽管此前已有多项相关研究,但在当前 AI 架构规模下的实践尚属首次。

Meta 研究团队通过开发记忆层技术,成功实现了对现有大语言模型的性能提升。该技术通过替换一个或多个 Transformer 层中的前馈网络(FFN)来实现功能。

实验数据显示,记忆层的引入使大语言模型在事实准确性方面提升了 100% 以上。同时其在代码生成和通用知识领域的表现可与使用 4 倍计算资源训练的传统大语言模型相媲美。

在事实性任务评估中,搭载记忆层的大语言模型的性能明显优于在相似计算资源和参数规模条件下训练的专家混合型(Mixture-of-experts)架构。

本文将深入探讨记忆层的技术原理及其对大语言模型性能的提升机制,这一技术创新对下一代 AI 架构的发展具有重要意义。

记忆层的技术原理

我们先看一下Transformer的基本机构:

记忆层在功能实现上与 Transformer 的注意力机制有相似之处。基本原理是:给定查询(Q)、键(K)和值(V),通过 softmax 函数计算查询与键之间的相似度,并据此对值(V)进行加权求和。

Image

记忆层与传统注意力机制的主要区别在于两个方面:

首先,传统注意力机制中的键和值是针对每个查询动态计算的,而记忆层中的键和值是可训练的固定参数。这意味着这些参数通过训练获得并持久保存。

其次,记忆层所使用的键值对规模达到百万级别

系统仅使用与查询最相似的前 k 个键及其对应值来计算输出,这种方法显著提高了大规模运算时的计算效率。记忆层的数学表达可以通过以下方程系统来描述:

首先,基于查询与键之间的相似度计算确定前 k 个键的索引(I):

Image

其中 q 表示查询向量,K 表示可训练的键矩阵。

随后,计算选定键的相似度得分(K(I)q),并通过 Softmax 函数进行归一化,得到权重向量(s):

Image

其中 q 表示查询向量,K(I) 表示已选择的前 k 个键矩阵。

最后,利用前 k 个值的加权和计算输出向量(y):

Image

其中 s 表示经过 softmax 归一化的权重向量,V(I) 表示选定的前 k 个值矩阵。在记忆层中,每个词元嵌入都进行独立的处理,这一点与传统 Transformer 中的前馈层处理方式相同。

大规模相似键搜索的优化策略

在大规模场景下查找最相似键值的计算开销较大。传统的最近邻搜索算法流程如下:

  • 计算查询向量与所有键之间的相似度(如余弦相似度),时间复杂度为 O(N ⋅ n),其中 N 为键的数量,n 为向量维度;
  • 对相似度进行排序,时间复杂度为 O(N log(N));
  • 选取相似度最高的前 k 个键;
  • 利用这 k 个键计算最终输出。

该方法的空间复杂度为 O(N ⋅ n),在处理百万级键值对时计算资源消耗过大。近似最近邻(ANN)搜索同样不适用于此场景,因为 ANN 需要预先构建静态索引。由于记忆层中的键是可训练参数且在训练过程中持续更新,这就要求不断重建索引。

那么,是否存在更优的解决方案?

研究团队采用了一种源自先前研究的可训练乘积量化键技术,下面将详细说明其实现原理。

键矩阵分解策略

该方法不直接使用完整的键矩阵(K),而是将其分解为两个较小的矩阵(K(1) 和 K(2))。

原始键矩阵的维度为 N × n,分解后的两个子矩阵维度均为 √N × n/2,其中 N 表示键的总数,n 表示向量维度。

完整的键矩阵可以通过这两个子矩阵的笛卡尔积表示:

_K = K(1) X K(2)_

这种设计避免了显式构建完整矩阵,从而实现了计算资源的优化。

查询向量分解

与键矩阵分解相对应,查询向量(Q)也被分解为两个子向量(Q(1) 和 Q(2))。原始查询向量的维度为 n,分解后的子向量维度各为 n/2。这两个子向量分别与对应的键子矩阵进行运算。

相似键的检索与相似度计算

对于 Q(1),系统在 K(1) 中检索前 k 个相似键,得到索引集合(I(1))。随后通过 Softmax 函数计算相似度得分(s(1))。Q(2) 与 K(2) 之间进行相同的操作。

全局最优解的获取

通过对索引和得分应用 Argmax 函数,可以得到全局最优的前 k 个索引和对应得分:

Image

这种方法的优势在于:

将查询与所有 N 个键的直接比较转化为与两个较小集合的比较,使得时间和空间复杂度从 O(N ⋅ n) 降低到 O(√N ⋅ n),大幅提升了计算效率。

GPU 并行计算的实现

记忆层包含数百万个可训练参数(键和值矩阵)。为了高效处理这些参数,系统采用了以下并行计算策略:

  1. 将参数沿嵌入维度分片;
  2. 在多个 GPU 上分布式存储;
  3. 每个 GPU 负责管理其分配到的参数分片;
  4. 通过进程组协调各 GPU 之间的运算。

查询操作的执行流程如下:

  1. 识别并分发相关索引至各 GPU;
  2. 各 GPU 在其负责的分片中检索对应嵌入;
  3. 收集并整合各 GPU 的部分结果,得到最终输出。

GPU 并行化的记忆层运算示意图

GPU 计算效率优化

PyTorch 提供的 EmbeddingBag 函数可用于计算记忆层中前 k 个嵌入的加权和。然而,其默认实现在 GPU 内存带宽利用率方面存在局限。

测试显示,默认实现的内存带宽利用率不足 400 GB/s,远未充分发挥现代 GPU 的性能潜力。为此研究团队开发了专门的 CUDA 内核,用于优化前向和反向传播的计算效率。

优化后的实现达到了 3 TB/s 的内存带宽,接近 NVIDIA H100 GPU 3.35 TB/s 的理论峰值,使得嵌入运算的端到端性能提升了约 6 倍。

此外通过引入基于 SiLU 非线性函数的输入依赖门控机制,进一步提升了记忆层的训练性能。

优化后的输出计算公式如下:

Image

其中各参数定义如下:

  • silu(x) = x ∗ σ(x),σ(x) 为 sigmoid 函数;
  • ⊙ 表示 Hadamard 积(逐元素乘法);
  • x 为记忆层输入;
  • y 为经门控机制调制后的输出;
  • W(1) 和 W(2) 为可训练权重矩阵。

上图为标准记忆层与引入输入依赖门控机制后的记忆层性能对比

在实践中发现,当小规模基础模型与大规模记忆层结合时,可能出现训练不稳定的问题。为解决这一问题,引入了 QK 归一化技术。该技术在计算点积之前对查询向量(Q)和键向量(K)进行归一化处理。

记忆层的最优配置策略

在深度神经网络中,浅层网络主要学习基础特征,而深层网络则负责提取复杂模式。实验表明,在多个层次中引入记忆层可以获得最佳效果。为了控制参数规模,在所有层间采用了共享内存池机制。这种设计使得多个层可以共享访问同一内存资源,提高了架构效率。

实验数据显示,在不超过 3 个层中使用记忆层可以持续提升模型性能,但过度替换密集前馈网络(FFN)层会导致性能下降。

这一现象表明,稀疏记忆层与密集前馈层各有其独特优势,最佳方案是将两者结合使用。

记忆层增强型大语言模型的性能评估

研究团队选择 Llama 系列模型(Llama2 和 Llama3)作为基准,将其一个或多个前馈层(FFN)替换为共享记忆层进行实验。

实验设置包括两种配置:基础记忆模型(使用单一记忆层)和增强型记忆模型("Memory +",使用三个记忆层并集成 Swilu 非线性函数)。

Image

SwiLU 非线性函数:其中 β 为可学习参数,σ(x) 为 sigmoid 函数

为进行对比分析,研究还包含了配置相当的专家混合模型(MoE,采用专家选择路由训练)和 PEER 模型。

实验结果分析

在问答(QA)任务评估中,记忆模型展现出显著优势:其性能超过了参数规模相当的密集模型,达到了参数数量两倍的密集模型的水平。

记忆增强型架构与基准模型在问答任务上的性能对比

增强型记忆模型("Memory +")的表现更为突出,其性能可与使用 2-4 倍计算资源训练的密集模型相匹敌。

各架构在问答任务中的准确率比较("Memory +"模型配置:100万记忆嵌入)

值得注意的是,PEER 模型在相同参数规模下的表现与基础记忆模型相当,但未能达到增强型记忆模型的水平。

同时,专家混合模型的性能显著低于记忆增强型模型。在固定基础模型参数的情况下扩展记忆参数规模时,模型在事实性问答任务上表现出显著的性能提升。

实验显示,配置 6400 万个键的 1.3B 参数记忆模型,仅使用 1/10 的计算量和一半的训练数据量,即可达到 Llama2 7B 模型的性能水平。

图表展示了 1.3B 参数模型在 NaturalQuestions(NQ)和 TriviaQA(TQA)基准测试中的性能指标:随着记忆规模扩大,事实性问答准确率提升,负对数似然(NLL)降低。虚线表示使用 10 倍计算资源、在 2 万亿词元上训练的 7B 模型的性能水平。

在 8B 规模模型的评估中,记忆模型在科学知识、通用知识和编程能力等基准测试上的表现明显优于传统密集模型。

特别值得一提的是,经过 1 万亿词元的训练,增强型记忆模型("Memory +")的性能已接近在 15 万亿词元(15 倍数据量)上训练的 Llama3.1 8B 模型。

总结

实验结果表明,记忆层技术在提升大语言模型性能方面具有显著优势。随着大语言模型逐渐接近计算资源和物理极限,这项技术的应用价值将愈发凸显。

论文:https://arxiv.org/abs/2412.09764

作者:Dr. Ashish Bamania

编辑:黄继彦
校对:梁锦程



关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。



新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU

优势很明显,就是性能提升和计算资源节省。劣势的话,我感觉可能在于记忆层的容量限制。毕竟它存储的是固定大小的键值对,如果需要处理的信息量超过了它的容量,可能会影响性能。另外,记忆层的更新机制也是一个需要考虑的问题。

这个技术很有趣,它将一个大矩阵分解成两个小矩阵,就像把一个大任务分解成多个小任务一样,可以并行处理,提高效率。但分解过程中 inevitably 会损失一些信息,这就像图像压缩一样,压缩率越高,图像质量越差。是否适用于所有类型的LLM,我个人觉得不一定,可能需要根据具体任务和模型结构进行调整。

降低计算复杂度是好事,但天下没有免费的午餐,这种技术可能会影响模型的表达能力,就像把一个高清图片转换成低分辨率一样,细节会丢失。至于适不适用于所有类型的LLM,我持保留意见,毕竟不同的LLM有不同的结构和应用场景。

优势:1. 性能提升,尤其在事实性问答方面;2. 计算资源节省,可以用更小的模型达到相同甚至更好的效果。劣势:1. 记忆层容量有限;2. 更新记忆层可能需要额外的操作;3. 目前的技术还不够成熟,可能存在一些未知的问题。

“记忆层”增强型Transformer架构最大的优势就是用更少的资源做更多的事,这在实际应用中非常重要,尤其是在资源受限的环境下。劣势嘛,就像硬盘一样,容量总是有限的,而且更新数据也需要时间。当然,技术在不断进步,这些问题未来可能会得到解决。

可训练乘积量化键技术,降低计算复杂度的同时,可能会损失一些信息,导致模型精度略微下降。当然,文章中也提到了一些优化方法,比如QK归一化,可以在一定程度上弥补精度损失。至于是否适用于所有类型的LLM,我觉得还需要更多的实验验证。

关于记忆层学习新知识的问题,我的理解是虽然键值对是固定的,但它们的值是通过训练学习得到的。所以学习新知识的过程,实际上是调整这些值的的过程,有点像我们调整数据库中某些字段的值一样。至于更新知识库,应该不需要重新训练整个模型,可以考虑采用增量学习或微调的方式,只更新记忆层相关的参数,这样效率会更高。

固定键值对不代表不能学习新知识。模型学习的过程体现在键值对的权重调整上,就像我们的大脑,神经元连接方式相对固定,但突触强度却在不断变化。至于知识更新,个人觉得可以参考外部知识库的更新机制,也许可以引入某种机制,定期用新数据微调记忆层,而不用重新训练整个模型。

我觉得可以这样理解,记忆层就像一个高速缓存,存储的是常用的知识。学习新知识,就是更新缓存内容。至于是否需要重新训练整个模型,我觉得要看新知识的量和与原有知识的相关性。如果新知识量不大,可以尝试微调;如果新知识与原有知识差异很大,或者量很大,可能就需要重新训练了。