本文根据视频整理而来,有听错或理解不当之处欢迎在评论区指出。
向大模型输入「Michael Jordan plays the sport of _____(迈克尔・乔丹从事的体育运动是……)」,然后让其预测接下来的文本,那么大模型多半能正确预测接下来是「basketball(篮球)」。
这说明在其数以亿计的参数中潜藏了有关这个特定个人的相关知识。用户甚至会感觉这些模型记忆了大量事实。
但事实究竟如何呢?
近日,3Blue1Brown 的《深度学习》课程第 7 课更新了,其中通过生动详实的动画展示了 LLM 存储事实的方式。视频浏览量高达 18 万次。
去年 12 月,谷歌 DeepMind 的一些研究者发布了一篇相关论文,其中的具体案例便是匹配运动员以及他们各自的运动项目。
虽然这篇论文并未完全解答有关 LLM 事实存储的问题,但也得到了一些颇为有趣的结果,其中的一个重点是:事实保存在网络中的一个特定部分,这个部分也就是我们熟知的多层感知器(MLP)。
在 3Blue1Brown 刚刚更新的这期视频中,他们用 23 分的视频演示了大型语言模型如何存储和处理信息,主要包括以下部分:
视频地址:https://www.youtube.com/watch?v=9-Jl0dxWQs8
在演示视频中,3b1b 的作者口齿清晰、语言标准,配合着高清画面,让读者很好地理解了 LLM 是如何存储知识的。
很多用户在看完视频后,都惊讶于 3Blue1Brown 教学质量:
还有网友表示,坐等更新这期视频已经很久了:
接下来我们就深入 MLP 的细节吧。在这篇文章中,机器之心简要介绍了核心内容,感兴趣的读者可以通过原视频查看完整内容。
MLP 在大模型中的占比不小,但其实结构相比于注意力机制这些要简单许多。尽管如此,理解它也还是有些难度。
为了简单,下面继续通过「乔丹打篮球」这个具体示例进行说明吧。
首先,我们先简单了解一下 Transformer 的工作流程。Transformer 的训练目标是基于已有 token 预测下一个 token(通常表示词或词组),而每个 token 都关联了一个高维向量。
这些向量会反复通过两类运算:注意力(允许向量之间彼此传递信息)与多层感知器(MLP)。当然,它们之间还存在一个特定的归一化步骤。
在向量经过多次如此迭代之后,我们希望每个向量都已经吸收了足够多的信息。这些信息有的来自训练模型时植入模型权重的一般性知识,也有的来自上下文。这些知识就是模型预测下一 token 的依据。
需要注意的是,这些向量编码的并不仅仅是单个词汇,而是会在信息在网络中流动时根据周围的环境和模型的知识吸收更加丰富的含义。
总之,每一个向量编码的信息都远远超过了单个词汇的含义,如此模型才能预测接下是什么。而存储这些信息就是 MLP(注意力的作用是将上下文结合在一起),也因此大模型的大多数参数都在 MLP 中(约三分之二)。
继续「乔丹打篮球」这个示例。MLP 是如何存储这一事实的。
首先我们做一些假设:在高维空间中有这样三个不同的向量,它们分别定义了乔丹的姓 Jordan 和名 Michael 以及篮球 Basketball。
现在,如果该空间中有一个向量与 Michael 向量的乘积为 1,则我们认为该向量编码了 Michael 这一概念;而如果这个乘积为 0 甚至负数,则认为该向量与 Michael 没有关联。
同样,我们可以计算该向量与 Jordan 或 Basketball 的乘积,以了解其与这两个概念的关联程度。
而通过训练,可让该向量与 Michael 和 Jordan 的乘积均为 1,此时就可以认为该向量编码了 Michael Jordan 这个整体概念。
当这个编码了上述文本的向量序列穿过一个 MLP 模块时,该序列中的每个向量都会经历一系列运算:
之后,会得到一个与输入向量同维度的向量。然后再将所得向量与输入向量相加,得到输出向量。
序列中的每个向量都会经历这样的操作,此时这些操作都是并行执行的,彼此之间互不影响。
对于「乔丹打篮球」,我们希望对于输入的「Michael Jordan」,经过一系列运算之后,能得到「Basketball」的向量。
首先来看这个过程的第一步。这个线性投射过程就相当于让输入向量乘以一个大型矩阵。这个矩阵里面的数据就是所谓的模型参数(model parameter)。你可以将其视为一个布满控制旋钮的仪表盘 —— 通过调整这些参数,我们就能控制模型的行为。
对于矩阵乘法,视频中分享了一个视角。我们可以将矩阵乘法看作是将矩阵的每一行都视为一个向量,然后将这些行与被处理的向量(这里用 E 表示,意为 embeding,即嵌入)进行一系列点乘。
如果我们假设该矩阵的第一行刚好编码了「First Name Michael」且被处理向量也编码了它,那么所得的点积就约为 1。
而如果它们同时编码了姓和名,那么所得的结果应该约等于 2。
你可以认为该矩阵的其它行正在并行地处理其它问题。
另外,通常来说,这一步还会向输出添加另一个向量,也就是所谓的偏置向量,其中的参数是从数据中学习得到的。
在这个例子中,我们可以看到这个偏置向量的第一个元素为 -1。也就是说在最终的输出向量中,之前得到的相关点积减去了 1。为什么要这样操作?这是因为这样一来,当且仅当向量编码了全名「Michael Jordan」时,所得向量的第一项为正数,否则就为 0 或负数。
在实践中,模型矩阵的规模非常大,比如 GPT-3 的矩阵有 49152 行和 12288 列(这个列数就是嵌入空间维度)。
事实上,这个行数恰好是嵌入空间维数的四倍。其实这只是一种设计选择,你可以让它更多,也可以让它更少。
接下来我们用更简洁的方式表示这个矩阵和向量,如下动图所示:
经过上述线性过程之后,需要对输出向量进行整理。这里通常会用到一个非常简单的函数:整流线性单元(ReLU)。
深度学习社区传统上喜欢使用过于花哨的名字,这个非常简单的函数通常被称为整流线性单元(ReLU)。
继续我们的例子,中间向量的第一个元素在当且仅当全名是 Michael Jordan 时才为 1,否则为零或负数,在将其通过 ReLU 后,会得到一个非常干净的值,其中所有零和负值都被截断为零。因此对于全名 Michael Jordan,该输出为 1,否则为 0。这个行为和「与门」非常相似。另外 ReLU 还有一个相对平滑的版本 GeLU。
接下来又是一个线性投射步骤,这一步与第一步非常相似:乘以一个大型矩阵,加上偏置,得到输出向量。
但这一次,对于这个大型矩阵,我们不再以行的思路来思考它,而是以列的思路来看。这些列的维度与向量空间一样。
如果第一列表示的是「Basketball」且 n_0 为 1(表示该神经元已激活),则该结果就会被添加到最终结果中;否则就不会影响最终结果。当然,这些列也可以表示任何概念。
类似地,我们将这个大矩阵简化表示为 W ↓,将偏置表示为 B↓,并将其放回到图中。
举例来说,如果输入向量中同时编码了名字 Michael 和姓氏 Jordan,那么触发操作序列后,便会得到指向 Baskerball 方向的输出向量。
这个过程会并行地针对所有向量执行
这就是 MLP 的运算过程:两个矩阵乘积,每个都添加了偏置。此前这种网络曾被用来识别手写数字,效果还算不错。
在接下来的章节中,作者介绍了如何计算 GPT-3 中的参数,并了解它们的位置。
对于 GPT-3 来说,嵌入空间的大小是 12288,将它们相乘,仅该矩阵就有六亿多个参数,而向下投影(第二个矩阵)具有相同数量的参数,只是形状进行了转置,所以它们加起来大约有十二亿参数。
此外,作者表示还需要考虑另外几个参数,但这只占总数的很小一部分,可忽略不计。嵌入向量序列流经的不是一个 MLP,而是 96 个不同的 MLP,因此用于所有这些块的参数高达 1000 多亿,这约占网络中总参数的三分之二。
最后,将注意力块、嵌入和 unembedding 等组件的所有参数加起来,总计可以得到 1750 亿参数。
另外值得一提的是,还有另一组与归一化步骤相关的参数,不过视频示例中跳过了这些参数,它们只占总数的很小一部分。
视频最后介绍了叠加(Superposition)这一概念。证据表明,单个神经元很少像迈克尔・乔丹那样代表某个单一特征,实际上可能有一个很好的理由,这与目前在可解释性研究人员中流传的一个想法有关,称为 Superposition,这是一个假设,可能有助于解释为什么这些模型特别难以解释,以及为什么它们的扩展性出奇地好。
感兴趣的读者可以参考原视频,了解更多内容。
3blue1brown 是一个专门制作可视化讲解视频的频道,其内容覆盖数学、人工智能等领域,每门课都配有直观生动的动画演示,帮助观众加深对概念定理的理解。
除了 YouTube 上 640 万订阅者之外,3b1b 在 B 站上还有官方账号,粉丝数量超过 215 万,每个视频都是 10 万以上播放量,甚至有老师在课堂上播放该频道的视频。对于一个硬核教学 UP 主来说,这样的成绩几乎是无人可及了。
作为一直以来都十分受欢迎的理解数学概念的网站,3blue1brown 的可视化一直都做得非常好。在本期视频中,我们可以直观感受到了。
3b1b 的创立者 Grant Sanderson,毕业于斯坦福大学数学系,他的大部分视频和动画引擎是独立完成的,这是他此前在斯坦福学习时的业余项目。
在斯坦福,Grant「走了点计算机科学的弯路」,随后毕业加入了 Khan Academy 并担任了两年的数学讲师,在 2016 年之后,他开始全身心投入 3b1b 的工作中。
如果你对自己的学习能力信心不足,或许看看 3b1b 的内容会是一个好主意,全程动画演示,让你对知识点明白的彻彻底底。
参考链接:https://www.youtube.com/watch?v=9-Jl0dxWQs8
文章来源“机器之心”,作者“Panda W、陈陈”
【开源免费】n8n是一个可以自定义工作流的AI项目,它提供了200个工作节点来帮助用户实现工作流的编排。
项目地址:https://github.com/n8n-io/n8n
在线使用:https://n8n.io/(付费)
【开源免费】DB-GPT是一个AI原生数据应用开发框架,它提供开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单、更方便。
项目地址:https://github.com/eosphoros-ai/DB-GPT?tab=readme-ov-file
【开源免费】VectorVein是一个不需要任何编程基础,任何人都能用的AI工作流编辑工具。你可以将复杂的工作分解成多个步骤,并通过VectorVein固定并让AI依次完成。VectorVein是字节coze的平替产品。
项目地址:https://github.com/AndersonBY/vector-vein?tab=readme-ov-file
在线使用:https://vectorvein.ai/(付费)
【开源免费】graphrag是微软推出的RAG项目,与传统的通过 RAG 方法使用向量相似性作为搜索技术不同,GraphRAG是使用知识图谱在推理复杂信息时大幅提高问答性能。
项目地址:https://github.com/microsoft/graphrag
【开源免费】Dify是最早一批实现RAG,Agent,模型管理等一站式AI开发的工具平台,并且项目方一直持续维护。其中在任务编排方面相对领先对手,可以帮助研发实现像字节扣子那样的功能。
项目地址:https://github.com/langgenius/dify
【开源免费】RAGFlow是和Dify类似的开源项目,该项目在大文件解析方面做的更出色,拓展编排方面相对弱一些。
项目地址:https://github.com/infiniflow/ragflow/tree/main
【开源免费】phidata是一个可以实现将数据转化成向量存储,并通过AI实现RAG功能的项目
项目地址:https://github.com/phidatahq/phidata
【开源免费】TaskingAI 是一个提供RAG,Agent,大模型管理等AI项目开发的工具平台,比LangChain更强大的中间件AI平台工具。
项目地址:https://github.com/TaskingAI/TaskingAI