Google 研究员 François Chollet 是一位在机器学习和深度学习领域具有重要影响力的一线工程师。他以创建流行的开源机器学习库Keras而闻名, 同时也是流行的机器学习实战书籍《Deep Learning with Python (使用 Python 来深度学习)》 的作者。不久前他发表博文:“How I think about LLM prompt engineering (大模型的提示工程之我见)”,深入地探讨了大模型提示工程。Chollet 从语言模型架构、学习机制和能力的演进来理解大模型的提示工程。他特别指出大模型实际上是一个 (向量) 程序数据库,而且该数据库是连续的和内插的,因而对大模型的提示是对其中某个程序(通过内插)来查询,所以提示工程实际上是在向量程序空间内的搜索。提示学习是当今大模型应用的主要方式; 这样的探讨对于大模型理解和应用都是有益的。我们特将该内容编译出来和各位客户、合作伙伴朋友分享。
在 2013 年,谷歌的Mikolov 等人注意到了一些令人瞩目的现象。
他们当时正在构建一个将词汇中的单词嵌入到向量空间的模型——这个问题在当时已经有着悠久的学术历史,可以追溯到上世纪 80 年代。他们的模型使用了一种优化目标,旨在将单词之间的相关关系转化为嵌入空间中的距离关系:每个单词被分配一个向量,这些向量被优化,使得经常一起出现的单词的向量点积(余弦相似度)接近 1,而很少一起出现的单词的向量点积接近 0。
他们发现,由此产生的嵌入空间不仅能够捕捉语义相似性,还具有某种涌现学习的能力——它能够进行“词算术”,而这并不是它被训练去做的事情。在空间中存在一个向量,当它加到任意一个表示男性的名词上时,得到的点会接近于它的女性对应词。比如:V(国王) - V(男人) + V(女人) = V(王后)。一个“性别向量”。非常酷!似乎有几十个这样的神奇向量——一个复数向量,一个将野生动物名称转化为其对应的宠物名称的向量等等。
图示:一个二维嵌入空间,使得将“狼”与“狗”链接的向量与将“虎”与“猫”链接的向量相同。
Word2Vec 和大语言模型:Hebbian 学习类比
时间快进十年——我们现在已经进入了大语言模型的时代。从表面上看,现代大语言模型与原始的 word2vec 模型似乎完全不同。它们能够生成流畅的语言——这是 word2vec 完全无法做到的——并且似乎对任何话题都有一定的了解。然而,它们实际上与古老的 word2vec 有很多共同之处。
两者都是关于将 token(单词或子词)嵌入到向量空间中。两者都依赖于相同的基本原理来学习这个空间:一起出现的 token 在嵌入空间中会更接近。用于比较 token 的距离函数在两种情况下是相同的:余弦距离。甚至嵌入空间的维度也相似:大约在 10e3 或 10e4 的数量级上。
你可能会问——等等,我被告知大语言模型是自回归模型,通过基于之前的单词序列预测下一个单词来进行训练。这与 word2vec 最大化共存 token 点积的目标有什么关系呢?
实际上,大语言模型似乎确实将相关的 token 编码在相近的位置,所以两者之间一定存在某种联系。答案是自注意力机制。
自注意力是 Transformer 架构中最重要的组成部分。它是一种通过线性组合先前空间中的 token 嵌入来学习新的 token 嵌入空间的机制,这种组合会给已经“更接近”的 token(即点积更高的 token)更大的权重。它会倾向于将已经接近的向量拉得更近——随着时间的推移,相关关系会转化为嵌入空间中的接近关系(以余弦距离衡量)。Transformer 通过学习一系列逐步改进的嵌入空间来实现,每个空间都是基于对前一个空间的元素进行重新组合。
自我注意力是如何工作的:在这里,注意力分数是在“站”和序列中的所有其他单词之间计算的,然后它们被用来加权成为新的“站”向量的词向量的总和。
自注意力赋予了 Transformer 两个关键属性:
1. 它们学习的嵌入空间在语义上是连续的,即在嵌入空间中移动一点只会使相应 token 的语义稍微改变一点。word2vec 空间也具有这个属性。
2. 它们学习的嵌入空间在语义上是可插值的,即在嵌入空间中的两个点之间取中间点会产生一个表示相应 token “中间含义”的点。这是因为每个新的嵌入空间都是通过在前一个空间的向量之间进行插值构建的。
请注意,这与大脑的学习方式非常相似。大脑中的关键学习原则是Hebbian 学习——简而言之就是“一起激活的神经元会连接在一起”。神经激活事件之间的相关关系(可能代表动作或感知输入)转化为大脑网络中的距离关系,就像Transformer(和 word2vec)将相关关系转化为向量距离关系一样。两者都是信息空间的映射。
从涌现词算术到涌现向量程序
当然,word2vec 和大语言模型之间也存在显著的差异。word2vec 并不是为生成文本而设计的。大语言模型要大得多,能够编码复杂得多的变换。问题是,word2vec 确实是一个玩具模型:它之于语言建模,就像对 MNIST 图像像素进行逻辑回归之于最先进的计算机视觉模型一样。基本原理大致相同,但玩具模型缺乏任何有意义的表示能力。word2vec 甚至不是一个深度神经网络——它具有浅层、单层的架构。与此同时,大语言模型具有任何人训练过的任何模型的最高表示能力——它们具有几十个 Transformer 层,总共几百层,参数数量达到数十亿。
就像 word2vec 一样,大语言模型通过将 token 组织到向量空间中来学习有用的语义函数。但由于表示能力的提高和更精细的自回归优化目标,我们不再局限于像“性别向量”或“复数向量”这样的线性变换。大语言模型可以存储任意复杂的向量函数——实际上,将它们称为向量程序比函数更准确。
word2vec 使你能够进行一些基本操作,比如 plural(猫) → 猫们,或者 male_to_female(国王) → 女王。而大语言模型则可以进行纯粹的魔法操作——比如 write_this_in_style_of_shakespeare(“...你的诗...”) → “...新诗...”。它们包含了数百万这样的程序。
大语言模型作为程序数据库
你可以将大语言模型视为类似于数据库:它存储信息,你可以通过提示来检索这些信息。但大语言模型和数据库之间有两个重要的区别。
第一个区别是,大语言模型是一种连续的、可插值的数据库。数据不是以一组离散的条目存储,而是存储在一个向量空间——一条曲线上。你可以在曲线上移动(它是语义连续的,正如我们所讨论的)来探索附近的相关点。你可以在不同的点之间进行插值,以找到它们的中间点。这意味着你可以从数据库中检索到比你输入的更多的信息——但并不是所有的信息都是准确的或有意义的。插值可能导致泛化,但也可能导致幻觉。
但是,这些程序并不是你所习惯处理的那种。你可能会想到确定性的Python 程序——一系列符号语句逐步处理数据。但并不是这样。相反,这些向量程序是高度非线性的函数,它们将潜在的嵌入空间映射到其自身。类似于 word2vec 的神奇向量,但要复杂得多。
要从大语言模型中获取信息,你必须提示它。如果大语言模型是一个包含数百万向量程序的数据库,那么提示就像是在该数据库中的搜索查询。提示的一部分可以被解释为“程序键”,即你想要检索的程序的索引,另一部分可以被解释为程序的输入。
考虑以下提示示例:“用莎士比亚的风格重写以下诗歌:...我的诗...”
“用 ... 风格重写”是程序键。它指向程序空间中的特定位置。
“莎士比亚”和“...我的诗...”是程序输入。
大语言模型的输出是程序执行的结果。
现在,请记住,大语言模型作为程序数据库的类比只是一种思维模型——还有其他模型可以使用。一个更常见的模型,但不太具有启发性,是将大语言模型视为自回归文本生成器,根据训练数据分布输出最有可能跟随提示的单词序列——即关注大语言模型被优化的任务。如果你在思考大语言模型的工作方式时,能记住多种模型,你会更好地理解它们——希望你会发现这个新的模型有用。
提示工程作为程序搜索过程
记住,这个“程序数据库”是连续的和可插值的——它不是一个离散的程序集。这意味着一个稍微不同的提示,比如“用 x 的风格从歌词上重新表述这段文本”,仍然会指向程序空间中非常相似的位置,得到的程序行为会非常接近但不完全相同。
你可以使用数千种不同的变体,每个变体都会导致一个相似但不完全相同的程序。这就是为什么需要提示工程。你的第一次尝试、直觉上的程序键没有理由在目标任务上产生最佳的程序。大语言模型不会“理解”你的意思,然后以最佳方式执行它——它只会检索你的提示所指向的程序,而你的提示可能指向了众多可能的位置中的一个。
提示工程是一个在程序空间中搜索的过程,目标是找到在你的目标任务上表现最佳的程序。这与你在谷歌搜索软件时尝试不同的关键词没有什么不同。
如果大语言模型真的理解你告诉它们的内容,那么就不需要这个搜索过程了,因为关于你的目标任务的信息量不会因为你的提示中使用“重写”而不是“重新表述”,或者你是否在提示前加上“逐步思考”而改变。永远不要假设大语言模型第一次就“理解”了——记住,你的提示只是无限程序海洋中的一个地址,它们都是通过自回归优化目标将 token 组织到向量空间中的副产品。
一如既往,理解 LLM 最重要的原则是你应该抵制将它们拟人化的诱惑。
本文转载自,作者: