如果你向大模型输入“玩_____运动”并要求它预测下一个文本,大模型很可能会正确预测下一个文本是“(篮球)”。
这意味着它的数十亿个参数中蕴含着关于这个特定个体的知识。用户甚至会觉得这些模型已经记住了大量的事实。
但事实到底是什么?
最近,深度学习课程第 7 课更新,通过生动细致的动画展示了 LLM 如何存储事实,视频观看次数已达 18 万次。

去年12月,谷歌的研究人员发表了相关论文,其中一个具体的例子就是将运动员与各自的运动项目进行匹配。

虽然这篇论文没有完全回答 LLM 事实存储的问题,但它确实提供了一些有趣的结果,其中一个关键点是事实存储在网络的特定部分,这就是我们所知的多层感知器 (MLP)。
在这个刚刚更新的视频中,他们用23分钟的视频演示了大型语言模型如何存储和处理信息,主要包括以下几个部分:
视频地址:
在演示视频中,3b1b的作者讲话清晰,语言标准,结合高清的图片,让读者很好的了解到LLM是如何存储知识的。
很多用户看完视频后都对教学质量感到惊讶:
也有网友表示,已经等待这条视频的更新很久了:
接下来我们来深入了解一下 MLP 的细节。在这篇文章中, 简单介绍了核心内容。感兴趣的读者可以通过原视频观看完整内容。
MLP 在大型模型中占比很大,但其结构比注意力机制简单得多,尽管如此,理解起来仍然有些困难。
为了简单起见,我们还是通过“乔丹打篮球”这个具体的例子来继续解释吧。
首先我们来简单了解一下的工作流程,的训练目标是根据现有的token预测下一个token(通常代表一个单词或者短语),每个token都与一个高维向量相关联。

这些向量反复经过两种类型的操作:注意力(允许向量相互传递信息)和多层感知器(MLP),中间有一个特殊的标准化步骤。
当向量经过多次迭代之后,我们希望每个向量都吸收了足够多的信息,这些信息一部分来自于训练模型时嵌入在模型权重中的常识,一部分来自于上下文,这些知识是模型预测下一个 token 的基础。

值得注意的是,这些向量不仅仅编码单个单词,而且在信息流经网络时根据周围的环境和模型的知识吸收更丰富的含义。
简单来说,每个向量编码的信息远比单个单词的含义多得多,这样模型才能预测接下来的内容。而存储这些信息的就是 MLP( 的作用就是结合上下文),因此大型模型的大部分参数都在 MLP 中(大约三分之二)。

继续“乔丹打篮球”的例子,以下是 MLP 存储这一事实的方式。

首先我们做一些假设:高维空间中有三个不同的向量,分别定义乔丹的名字和姓氏以及篮球。

现在,如果这个空间中存在一个向量,它与 向量的乘积为 1,那么我们就认为这个向量编码了这个概念;如果这个乘积为 0 甚至为负,那么我们就认为这个向量与 没有任何关联。
同样,我们可以计算该向量与或的乘积,看看它与这两个概念的关系有多密切。

通过训练,可以使得向量与和的乘积为1,此时可以认为向量编码了整体概念。
MLP 的内部细节

当对上述文本进行编码的向量序列通过 MLP 模块时,序列中的每个向量都会经历一系列操作:

之后,您将得到一个与输入向量具有相同维度的向量。然后将结果向量添加到输入向量以获得输出向量。
序列中的每个向量都经过这样的操作,这些操作并行执行,互相不影响。

对于“乔丹打篮球”来说,我们希望对输入的“ ”经过一系列的运算之后,能够得到“ ”这个向量。
我们先来看这个过程的第一步。这个线性投影过程相当于将输入向量乘以一个大矩阵。这个矩阵中的数据就是所谓的模型参数(模型)。你可以把它想象成一个布满控制旋钮的仪表板——通过调整这些参数,我们可以控制模型的行为。

对于矩阵乘法,视频分享了一个观点。我们可以将矩阵乘法视为将矩阵的每一行视为一个向量,然后对这些行与正在处理的向量进行一系列点积运算(此处用 E 表示,即嵌入)。

如果我们假设矩阵的第一行恰好编码“First Name”,并且处理后的向量也对其进行编码,则得到的点积约为 1。
如果他们同时对名字和姓氏进行编码,那么结果应该大约等于 2。

您可以将矩阵的其他行视为并行处理其他问题。

此外,通常这一步还会在输出中添加另一个向量,即所谓的偏差向量,其参数是从数据中学习到的。

在这个例子中,我们可以看到这个偏置向量的第一个元素是 -1。这意味着在最终的输出向量中,之前得到的相关点积减去了 1。为什么这样做呢?这是因为这样,当且仅当向量编码了全名“ ”时,结果向量的第一项才是正数,否则就是 0 或负数。
在实际应用中,模型矩阵的规模非常大,例如GPT-3的矩阵就有49152行、12288列(这个列数就是空间维度)。

事实上,这个行数正好是嵌入空间维数的四倍。这只是一个设计选择,你可以让它多一些或少一些。

接下来我们用更简洁的方式来表示这个矩阵和向量,如下面的动画所示:

经过上面的线性处理之后,需要对输出向量进行排序,这里通常用到一个非常简单的函数: Unit(ReLU)。
深度学习社区传统上喜欢使用过于花哨的名称,而这个非常简单的函数通常被称为整流线性单元(ReLU)。
继续我们的例子,中间向量的第一个元素当且仅当全名是时才为 1,否则为零或负数。经过 ReLU 之后,我们得到一个非常干净的值,其中所有零和负值都被截断为零。因此对于全名,输出为 1,否则为 0。这种行为与“与门”非常相似。此外,ReLU 还有一个相对平滑的版本 GeLU。

接下来是另一个线性投影步骤,它与第一个步骤非常相似:乘以一个大矩阵,添加一个偏差,并得到输出向量。

但这次,我们不再从行的角度来考虑这个大矩阵,而是从列的角度来考虑。这些列的维数与向量空间的维数相同。

如果第一列代表“”,并且n_0为1(表示该神经元被激活),那么这个结果就会被添加到最终结果中;否则不会影响最终结果。当然,这些列也可以代表任何概念。

类似地,我们将这个大矩阵简化为 W↓,将偏差简化为 B↓,然后将其放回图中。

例如,如果名字和姓氏都编码在输入向量中,则触发操作序列将导致指向某个方向的输出向量。

该过程对所有向量并行执行

MLP 的工作原理如下:两个矩阵乘积,每个矩阵都添加一个偏差。这种类型的网络以前曾用于识别手写数字,效果不错。

GPT-3中的1750亿个参数是如何计算的?
在以下章节中,作者描述了如何计算 GPT-3 中的参数并了解它们的位置。

对于 GPT-3,嵌入空间的大小为 12288,将它们相乘,仅该矩阵就有超过 6 亿个参数,而向下投影(第二个矩阵)具有相同数量的参数,只是形状被转置了,因此它们加起来大约有 12 亿个参数。

此外,作者指出,还有几个参数需要考虑,但这些参数在总数中微不足道。嵌入向量序列流经的不是一个,而是 96 个不同的 MLP,因此所有这些块的参数数量超过 1000 亿,约占网络中总参数的三分之二。


最后,将注意力块、嵌入等组件的所有参数加起来,总共得到 1750 亿个参数。

还值得一提的是,还有另一组与标准化步骤相关的参数,尽管这些参数在视频示例中被跳过,并且它们仅占总数的很小一部分。

视频最后介绍了叠加的概念()。有证据表明,单个神经元很少像迈克尔·乔丹那样代表单一特征,而这实际上可能有充分的理由,这与目前在可解释性研究人员中流传的一种名为的想法有关,这种假设可能有助于解释为什么这些模型特别难以解释,以及为什么它们的可扩展性出奇地好。



