从头开始了解使用 Transformer 的生成式 AI 架构

本文将从头开始介绍生成式 AI 的工作原理,包括嵌入、Transformer 编码器架构、模型训练/微调等。

本文将详细解释生成式 AI 的工作原理,从基础到生成式 Transformer 架构。重点在于直观理解,而非严谨性。当然,一些技术细节被简化了。这是一篇入门介绍,而非科学文章。

我们将将其分解为两个部分:第一部分解释 AI 如何理解自然语言。这包括嵌入、语言模型、Transformer 编码器、自注意力机制、用于 AI 搜索和 NLP 的微调。第二部分将在此基础上解释 AI 如何利用这种理解来生成文本,例如对自然语言提示的回复和翻译,包括仅解码器和完整的 Transformer 架构、大型语言模型 (LLM) 和检索增强生成 (RAG),Elastic 擅长的突出生成模式。由于我们将讨论的语言模型涉及神经网络,因此在学习过程中,某些部分假设对神经网络基础知识有一定的了解。

生成式 AI 的语义阶段:理解自然语言

1. 理解嵌入、向量相似性和语言模型

AI 理解语言的基本结构是向量。向量表示单词,仅仅是长长的数值数组。从技术上讲,向量也可以表示单词序列或子词部分,因此我们用标记这个术语来抽象它(这对我们的讨论来说并不重要,我们将交替使用单词和标记这两个术语)。

在最简单的层面上,语言中的每个单词(或标记)都有一个向量表示,即一个学习到的数值的长数组。你可能会遇到诸如“数千维向量”甚至“数万维向量”这样的说法,但实际上并没有什么奇特之处,请避免钻牛角尖去理解“数千维”可能意味着什么。对于每个单词,每个维度只是该单词向量中的一个特定位置,就是这样。我们很快就会直观地说明这意味着什么,它会变得清晰明了。

根据用于表示文本的模型架构,稀疏模型将使用高维向量(具有 10,000 到 100,000+ 维的向量),其中只有少量非零值,这些值被称为稀疏向量。在稀疏向量中,每个维度对应于词汇表中的一个单词。词汇表是模型可以接受的所有唯一单词的集合,即它们存在于模型训练所使用的自然语言语料库中(我们将在接下来的部分中了解模型是如何训练的)。因此,稀疏向量拥有与词汇表中单词数量相同的维度,即数万或数十万个维度。为了简化讨论,我们将假设词汇表中有 30,000 个单词(这大约是英语母语人士的平均词汇量)。在稀疏向量中,大多数维度都为零,只有少数几个是非零的。

相比之下,密集向量只有几百到几千个维度,这些维度通常都包含非零值。在密集表示中,这些数值是计算出来的,以便语义相关的单词具有相似的向量表示,即它们在对应位置具有相似的数值(换句话说,它们在每个维度上都具有相似的值)。现在你已经得到了一个入门级语言模型的最基本描述:一个简单的语言模型就是为语言中的每个单词分配向量值,以便语义相关的单词具有相似的表示。单词的相关性越高,它们的向量就越相似。向量相似性是 AI 的核心。

向量的一个便利之处在于我们可以测量它们的相似性。我们使用距离函数来做到这一点,但在接下来的讨论中,我们将直观地探索向量相似性,以便概念变得清晰明了。因此,继续前面的推理,语言模型在向量空间中生成单词的表示,使得相关的单词具有相似的向量,即在向量空间中彼此之间距离较小的向量。如果这段话读起来有点晦涩,请放心,我们将在接下来的段落中使用直观的现实可视化来解释它。

生成向量表示的最基本方法之一,也是一个自然的起点,是一种称为 word2vec 的算法(我们将在下一节中详细研究 word2vec)。在 word2vec 实现中,每个向量都有 300 个维度。300 个向量位置中的每一个都包含一个介于 -1 和 +1 之间的数值。由于相对于词汇表中单词的数量,维数较低,并且向量的大部分位置都包含非零值,因此 word2vec 向量是密集的。这些密集向量也称为单词嵌入,生成它们的 word2vec 嵌入算法称为嵌入模型

现在是时候按照承诺可视化这些密集向量了。为了快速、直观地观察向量相似性,我们将用颜色表示数值。蓝色表示 -1,白色表示 +1,以及介于 -1 和 +1 之间的所有值的相应蓝色阴影。

在接下来的可视化中,我们只显示了 300 个总位置中的前 50 个,以便更容易地视觉比较向量。请注意它们之间的相似性。

这是第一个关键点:向量相似性捕捉了语义相关性。在第一个示例中,‘fruit’ 和 ‘pear’ 相关,‘man’ 和 ‘woman’ 相关。它们不像同义词那样相似。相关性更广泛。

它也更加细致。这是第二个关键点:AI 解决单词和概念之间的关系。它不理解含义,但它模拟了含义之间的关系!关系越密切,向量就越相似,同义词位于光谱的末端。

关于语言的一个快速说明:这就是任何关于“AI 理解语言”的参考文献都应该被解读的视角,在本篇文本和其他地方也是如此。这种说法不应暗示人类水平的理解。这一事实被称为“意义的障碍”。

让我们深入一层:你可能想知道这些值(向量元素)是如何计算出来的,因为肯定有无数种方法可以让相关的单词具有相似的向量表示。密集向量元素在训练过程中被计算出来,以捕捉单词之间的关系(训练语言模型是我们接下来要讨论的重要内容)。例如,女孩之于女人,如同男孩之于男人,因此,希望‘woman’ 和 ‘girl’ 之间的差异与‘man’ 和 ‘boy’ 之间的差异相似。

再扩展一点,如果你从 ‘father’ 中减去 ‘man’ 并加上 ‘woman’,你就会得到一个类似于 ‘mother’ 的向量。

事实上,使用 Gensim 的 most_similar,我们可以确认与 ‘father-man+woman’ 向量最相似的向量实际上是 ‘mother’。

同样地,如果你从 ‘France’ 中减去 ‘Paris’ 并加上 ‘Rome’,最相似的向量是 'Italy'。

主要直觉是语义关系反映在密集向量中的某些模式中。当你训练一个语言模型时,你是在塑造向量空间以反映语言中单词之间的关系,以便这些关系通过你最终获得的所有密集向量的元素分配来捕捉。

为了强化这种直觉,让我们可视化一个语义上“中性”的词,比如 ‘the’,并将其与一个更具体的词进行比较。在本例中,让我们可视化所有 300 个位置(在 300 维表示中)。我们观察到 ‘the’ 的向量更加平滑(所有维度上的值几乎相等)。它与许多概念(或不相关)的关系相同。相比之下,一个具体的单词会激活不同维度到不同程度,编码该单词与单词和概念的语言关系(其他与技术相关的单词可能会显示出类似的模式)。

让我们继续了解嵌入是如何计算出来的。

1.1 学习密集向量

“你应该根据一个词所处的语境来认识它”,这是英国语言学家约翰·弗斯在 1957 年说过的一句话。这种根据单词出现的上下文来定义单词的旧思想正是你将在本节中看到的实际应用。

Word2vec 模型(及其变体、改进和扩展,用于表示句子而不是单词等)是我们起点的两个原因

  • 这是捕获和表示自然语言中关系的最流行的基本方法之一,就像我们之前看到的那些。
  • 因此,它的嵌入通常用作我们感兴趣的现代 AI Transformer 架构的输入。

训练这种语言模型的策略包括向其提供大量自然语言,同时在某些上下文中屏蔽(隐藏)单词并要求它预测这些单词。为了能够成功,它需要学习预测输入序列中被屏蔽的单词,并且在此过程中,它学习单词的语义一致的向量表示。让我们看看它是如何做到的。

Word2vec 是一种浅层神经网络,其输入和输出神经元层的神经元数量与语言词汇表中的单词数量相同(即数万个,我们将坚持使用讨论中的 30,000 个值)。输入层接收序列。这些序列是独热编码的,即如果一个单词存在于序列中,则相应的输入神经元接收 1,否则接收 0。

大量自然语言来自对新闻和文章的网络爬取。为了将其转换为训练示例,我们使用滑动窗口。从第一个文档的开头开始,在每一步中,窗口包含文本中固定数量的单词,这些单词成为单个训练示例。下一步是将窗口向右移动一个单词以捕获下一个训练示例。滑动窗口移动,在每一步都创建一个训练示例,直到到达训练数据集的末尾。

在滑动窗口的每一步,我们都可以隐藏滑动窗口内的某个单词位置。例如,如果窗口有 5 个单词,我们可以在每一步都隐藏中间的那个。

我们将其他四个单词以我们讨论过的独热方式馈送到 word2vec 网络的输入层,并将被屏蔽的单词用作神经网络预测的目标。这种配置称为连续词袋 (CBOW)。总而言之,CBOW 将每个单词周围的上下文馈送到网络中,并根据上下文预测缺失的单词。

第二种 word2vec 配置称为跳字模型 (skip-gram):跳字模型隐藏窗口中除一个单词之外的所有单词,并预测其周围的单词(仍在窗口内)。所以跳字模型是 CBOW 的镜像:我们在窗口中隐藏某个单词并预测其周围的上下文。正如你可能怀疑的那样,跳字模型执行一项更具挑战性的任务:你在每一步都提供给它更少的信息,并要求它预测更多信息。因此,跳字模型的语言学习更深入,训练速度也更慢。结果,在跳字模型中,向量相似性主要表示语义相似性,即语义相关的单词获得相似的向量。相反,在 CBOW 中,向量相似性大多表示句法相似性(更浅层的关系,例如“dog”、“dogs”等)。上一节中的嵌入是使用跳字模型获得的。

但是,在此过程中嵌入来自哪里,以及相似的单词如何获得相似的向量?让我们深入了解 word2vec,特别是更有趣的跳字模型的下一层理解。

在下图中,你可以看到一个神经网络的描述,它有一个大小为 30,000 的输入层,等于词汇表中的单词数量。在训练期间,它接收窗口内跳字模型的中心词。输出层是一个 softmax 层,它产生词汇表中每个单词在输入单词上下文中出现的概率。

隐藏层包含与我们想要学习的嵌入的维度一样多的神经元。我们检查的嵌入有 300 个维度,因此生成它们的网络有一个 300 个神经元的隐藏层。

word2vec 嵌入,即每个单词的向量,是训练结束时输入层的权重。隐藏层充当瓶颈,将信息压缩成 300 维的密集向量。

让我们把所有内容放在一起:语义相关的单词获得相似的密集向量,因为它们在相似的上下文中占据位置。因为,正如我们讨论的那样,跳字模型预测每个单词最可能的上下文,这意味着两个语义相关的单词将学会产生相似的 softmax 结果。为了实现这一点,相应的输入权重(成为我们词汇表的密集向量)必须相似,别无选择。

在这一点上,我们知道了现代 NLP 的基本构建块,即密集向量是如何计算的。

最近的生成式 AI 革命发生在我们能够产生更多高度上下文化的嵌入的能力。回想一下我们本节开头提出的旧观点和引用。最近 NLP 引擎处理上下文的能力的增强是推动了最近的进步和优越的 AI 能力的原因。Transformer 在输入中使用静态嵌入(如 word2vec)来生成编码更丰富、更细粒度上下文的密集向量。

2. 上下文:生成式 AI 的血液

生成式 AI 和语义 AI 搜索是同一条脉络,它们的“血液”是上下文化嵌入,即 Transformer 实现的对自然语言的更深入理解。我们将在本讨论的其余部分详细解释 Transformer 架构。

Transformer 由 Google 研究人员在 2017 年通过著名的“Attention is all you need”论文 [1] 引入。Transformer 的引入是当今 AI 热潮的催化剂,它是 ChatGPT(GPT 代表“生成式预训练 Transformer”)和其他病毒式应用的架构。

考虑以下关于静态嵌入(如 word2vec)的问题

我们如何捕获在不同上下文中具有不同含义的单词?例如:“Fly”:动词与昆虫,“like”:动词与介词(“类似于”),“Apple”:水果与品牌等。

此外,我们如何处理指代对象或人的代词?在以下示例中,我们希望“it”由一个与“robot”或“road”相似的向量表示,具体取决于上下文,而不是代词“it”的一般“中性”表示。

引入 Transformer 编码器。BERT(来自 Transformer 的双向编码器表示)是最突出的编码器架构。它于 2018 年推出,并通过在自然语言理解和搜索方面优于大多数基准而彻底改变了 NLP。像 BERT 这样的编码器是现代 AI 的基础:翻译、AI 搜索、生成式 AI 和其他 NLP 应用。

随着 BERT 的推出,Google 取得了搜索突破。如今的 Google 搜索由 BERT 提供支持。

理解搜索查询中的上下文意味着

  • 我们可以显示使用同义词而不是精确查询词的文档。它超越了同义词,并考虑了相关词。正如我们在开头讨论的那样,相关性比单纯的同义词更强大。
  • 我们可以更好地理解用户的意图:我们现在可以关注静态嵌入和简单的词语匹配忽略的词语。否定词(如“no”或“without”)以及涉及某种方向关系的词语(如“to”和“for”)在捕获用户意图方面可能非常重要,并有助于显示最相关的结果。例如,在查询“最佳摄影智能手机”中,重点应该放在相机方面。在查询“从欧洲前往美国旅行所需的证件”中,我们不应该显示讨论欧洲国家/地区所需证件的资源。
  • 相反,我们可以降低或忽略那些作为文档中复合词的一部分匹配的词语的权重,但在查询中的独立含义完全不同。例如:包含“stand”的查询不应显示您正在阅读的文档,尽管其中包含“stand-alone”一词。

如果您好奇想查看更多关于 BERT 突破的搜索示例,请查看 Google 的这篇博文:[2]。

同样的上下文理解也为当今的生成式 AI 提供了动力,两者密不可分。从本质上讲,交互模型通过以自然语言而不是基于词语和文档列表的方式形成查询和结果而发生了变化。其基础是对自然语言的这种更深层次的语义理解。

3. Transformer 编码器架构

可以认为 BERT 从根本上做了两件事

  1. 生成上下文化嵌入。
  2. 根据上下文预测一个单词。我们将在接下来的关于训练的部分详细介绍这一点,但从根本上说,BERT 是一种掩码语言模型。它可以预测给定序列中被掩码的单词(也可以滚动回图 10)。

BERT 接收自然语言序列,以静态文本嵌入(如 word2vec)的形式,并输出上下文化嵌入。因此,我们正在从每个单词的单个固定向量转向唯一的自定义表示,根据上下文进行调整。BERT 由 12 个编码器块(BERT Large 为 24 个)堆叠在一起组成。

在输入中,静态嵌入与位置信息结合在一起。请记住,在 word2vec 训练期间,CBOW 和跳字模型,每个序列都被视为一个词袋,即每个单词在序列中的位置被忽略。但是,单词的顺序是重要的上下文信息,我们希望将其馈送到 Transformer 编码器中。

让我们双击一个编码器块(图 15 中的 12 个或 24 个块中的一个)。每个编码器层接收来自其下方前一个编码器层的输入嵌入,并将嵌入输出到下一个编码器层。编码器本身由一个**自注意力**子层和一个前馈神经网络子层组成。

Transformer 架构中上下文化的核心是注意力机制。具体来说,在编码器中,它是自注意力子层。在编码器中,每个自然语言嵌入序列都通过自注意力子层,然后是前馈子层。本节的其余部分将主要详细介绍自注意力,包括其名称的由来。

3.1 自注意力

自注意力通过“融合”输入文本中的上下文信息来增强嵌入。对于给定文本中的每个单词,它识别出序列中与其最相关的单词,并更新其嵌入以包含上下文信息。

术语“自注意力”指的是能够关注输入序列本身内的不同单词(与关注输入序列外部上下文的注意力系统相反,我们将在接下来的第二部分中看到)。

这样,上下文影响每个单词的表示,静态嵌入被转换为针对特定上下文定制的向量。上下文化的嵌入也是密集向量。

从一个低严谨度的概念图开始直观理解(参见下面的图 17),我们将逐步展示自注意力如何产生真实的上下文化嵌入。

它是如何做到的?当然是通过向量相似性:相关的单词具有相似的向量,这就是自注意力识别它们的方式。因此,对于文本中给定的每个单词 X,自注意力识别其上下文中与其最相关的单词。然后,它需要一种方法让已识别的相关单词影响给定单词 X 的嵌入。

上下文单词通过为 X 的上下文化向量做出贡献来影响嵌入。X 的向量通过其上下文中相关单词的组合效果进行更新。它们的相关性越高,贡献就越大。

到目前为止,我们已经从视觉上探讨了向量相似性,现在是时候更严谨地讨论它了(它仍然非常简单)。我们将使用点积作为相似性的度量。点积是两个向量逐元素相乘之和。两个相似的向量具有较高的点积。两个不相似的向量具有较低的点积。

让我们计算“band”在两种不同上下文中的上下文嵌入:作为音乐组合和作为头发饰品,在以下序列中

  • “The blues band played their best songs”
  • “The blue band held her hair”

首先,我们将计算点积。

由于点积取任意值,因此我们对其进行归一化以使其加起来等于 1。我们通过缩放和 Softmax 来做到这一点。归一化的点积就是**注意力权重**。

每个单词的上下文化嵌入是将上下文中的所有向量(包括自身)加权求和的结果,其中权重为相应的注意力权重。请注意,查询词本身是最终向量中的主要成分,因为与自身的点相似性产生了最高的得分。直观地说,您可以说我们根据上下文“调整”了原始向量。

在前面的示例中,“band”这个词看起来是这样的,请参见下面的图 20

上下文中的所有其他单词也适用,我们只是为了简单起见展示了其中一个。

因此,序列中第 ii 个单词的上下文化向量 YiY_i 计算如下:

th 个单词计算如下:

Yi=j(wijXj)Y_i = \sum_j (w_{ij} \cdot X_j)

其中 wijw_{ij} 是单词 jj 的注意力权重,而 XjX_j 是单词 jj 的输入向量。

此操作后,实际向量看起来是这样的。在本例中,我们将使用三色代码(-1 为蓝色,0 为白色,+1 为红色,介于两者之间的实际值为颜色渐变)。此选择夸大了差异(使用两种颜色更容易发现的差异稍微微妙一些),以便更容易注意到自注意力的效果。

请注意,在音乐示例中,向量调整得更剧烈,因为存在更多相关的上下文,并且单词相对于自身的分量接收的权重较小(在头发饰品示例中为 0.52 对 0.74)。

现在我们有了同一个单词的两种不同的表示,具体取决于上下文。现在您了解了自注意力的基本机制。

此时,您要么已经满意,要么已经在想

“等等。‘band’ 的两种完全不同的含义的向量非常相似,以至于您不得不突出显示差异。为什么?”

捕捉得好!首先,请注意我们使用的输入是静态的 Word2Vec 嵌入,即我们实际上是在最底层的编码器层上进行操作。回想一下,BERT 有 12 个编码器层,BERT Large 有 24 个。每一层都会进一步改变嵌入。其次,我们还没有在我们的叙述中包含**相同**编码器块内的第二个子层:前馈网络(我们将在下一部分讨论)。

但这还不是全部。我们讨论的核心机制通过两种方式进行了增强,以便自注意力能够充分发挥其威力,正如您在谷歌搜索、Elastic 的 AI 搜索和生成式 AI 应用中所见的那样。

所以,第三点是,我们迄今为止讨论的自注意力系统还没有引入任何学习参数。到目前为止,所有值都是基于现有向量计算的。一个学习系统需要在训练期间学习的参数,以便进行泛化。

为此,自注意力采用了参数矩阵系统及其上的操作。我们不会深入细节,因为它们并不十分有趣,但由于在阅读其他资源时很可能会在这一点上感到困惑,因此我们将在此处描述其要点。您可以随意跳过这一点(当然不要纠结于此)。

我们有机会在迄今为止描述的自注意力操作的以下几个点引入参数。

  • 在计算点积时,我们可以对向量XiX_i和向量XjX_j进行参数化。我们为这些向量的每个位置引入一个独立的参数。您将在此时遇到以下术语:我们将向量XiX_i(我们希望为其生成上下文嵌入的序列位置)的参数化结果向量称为“查询”向量。我们将序列中单词的向量(向量XjX_j参数化后的结果)称为“”向量。
  • 在通过将注意力权重(作为上一步的结果)与每个位置jj的向量XjX_j相乘,然后对序列的所有位置求和来计算上下文嵌入时,我们使用新变量(独立于我们在上一步中赋予它的变量)对XjX_j进行参数化。在自注意力术语中,我们将此步骤中向量XjX_j的参数化版本称为“”向量。

在训练编码器期间引入这些参数并学习它们,可以优化上下文嵌入的创建。

然后是多头自注意力。

3.2 多头自注意力

我们刚才讨论的参数是架构中的一个基本部分,因为如果没有它们,自注意力就不会成为语言模型核心所依赖的学习系统。更进一步,我们通过增加更多的自由度来增强它:更多并行学习的参数。毕竟我们正在构建一个大型语言模型,“大型”意味着数亿个参数(BERT 大约有 1.1 亿个参数,BERT Large 大约有 3.4 亿个参数,GPT-3 大约有 1700 亿个参数),我们之所以能够做到这一点,是因为我们在巨大的语料库上对其进行训练。

以下是我们想要这样做的原因:考虑输入文本长度超过我们迄今为止使用的玩具句子的情况。上下文越长,相关单词对上下文嵌入的影响就越弱(想想归一化的注意力权重,单词越多,每个单词的影响就越小)。

为了缓解这个问题,我们通过在称为自注意力的结构中使用独立的参数并行执行多次来复制我们迄今为止描述的机制。结果,我们将刚才引入的参数乘以自注意力头的数量。每个头都独立于所有其他头执行我们迄今为止描述的算法。特别是 BERT Base 部署了 12 个注意力头(BERT Large 部署了 16 个)。

使用一个头,自注意力可能能够或不能够专注于长序列中的相关项。多个头可以做到这一点。

让我们从我们的介绍性设置开始,使用Bertviz可视化实际 BERT 的多头自注意力。在下图中,每个头都由顶部数组中的颜色之一表示。连接器显示每个头关注的关系。在我们之前介绍的自注意力术语中,左列是“查询”向量,用于检查它关注右列中的哪些“键”(为了更清晰地可视化自注意力,同一序列显示在两列中)。颜色越深,注意力权重越高。

有一些有趣的事情需要注意。

多头自注意力能够捕获远程关系(此示例适合展示此类关系)。请注意,在第二个自注意力头(橙色)中,“ceo”关注“company”和“shareholders”,两者都相隔几个词。同样,对于“company”,多个头关注“shareholders”和“strategic”,所有这些都相隔几个词。这一点值得注意,因为以前的技术无法有效地捕获此类远程关系。

将此行为与第 5 个头(在下一个可视化中左侧为紫色)进行对比。它错过了“ceo”的重要关系,受到了我们在长序列中可能发生的注意力分散效应的影响。多头的附加价值在此处得到了体现,因为单个头可能会陷入类似于第 5 个头的行为。

此外,请注意,右侧可视化中自注意力能够捕获其他句法关系,例如动词“appointed”的时间信息(尽管这更具争议性,因为这些词在附近)。

围绕多头自注意力以及它能够(或不能够)捕获句法/语言现象的程度,目前正在进行积极的研究。如果您好奇,“BERT 看什么?”[3] 和“评估 BERT 的句法能力”[4] 论文是良好的起点。它们的作者分析了自注意力如何捕获不同的语言关系,例如直接宾语与其动词的关系、名词修饰语与其名词的关系、介词与其宾语的关系等。

最后,请注意,每个头都会为输入序列的每个单词计算其自己的上下文嵌入。但是,编码器为每个单词输出一个嵌入,因此我们需要一种方法将每个头的输出组合成一个。在这一点上,您不会惊讶地发现,为此,我们向模型引入了更多参数,其作用是创建正确的组合。

3.3 前馈神经网络

每个编码器层中的第二个组件是前馈神经网络(简称 FFN),请参阅图 16。这是一个全连接神经网络,应用于序列的每个位置。在原始的 Transformer 架构中,FFN 内部层的维度是嵌入维度的四倍,而 BERT Base 的嵌入维度为 768,BERT Large 为 1024,完整 Transformer 为 512。

首先要注意的是,在自注意力层中,序列中的输入嵌入相互交互以产生子层的输出,而在 FFN 子层中,它们则并行独立地进行传递。

其次要注意的是,相同的 FFN,即具有相同权重的 FFN,应用于每个序列位置。这就是为什么在文献中将其称为逐步 FFN 的原因。但是,虽然 FFN 在同一编码器层中跨位置具有相同的权重,但在不同的编码器层中却具有不同的权重。

为什么做出这些选择?当然,在不同层使用不同的 FFN 可以让我们引入更多参数,构建更大更强大的模型。另一方面,为什么我们要在同一层使用相同的 FFN 的原因就不那么明显了。这里有一个直觉:如果我们在 FFN 子层中输入一系列相同的重复嵌入(例如,相同的单词),则子层的输出嵌入在序列的所有位置也应该相同。如果我们允许在同一子层中使用多个具有不同学习权重的 FFN,则情况并非如此。

在架构阐明之后,并且考虑到自注意力作用于合成上下文嵌入,下一个重要的问题是:FFN 在 Transformer 中的作用是什么?

在最高层次上,请注意,正如我们在前面章节中描述的那样,自注意力子层仅涉及线性变换。FFN 子层引入了非线性,这对于学习最佳上下文嵌入是必需的。我们将在本文的第二部分中尝试更深入地探讨这意味着什么,在完整的 Transformer 架构的背景下,通过解开该活跃领域研究提供的一些直觉。

让我们总结一下本节,概括 BERT 架构。

4. 训练和微调用于 AI 搜索和 NLP 的语言模型

我们已经了解了 Transformer 编码器和 BERT 的工作原理,现在是时候更详细地研究它们的训练过程了。

训练涉及学习我们在自注意力和前馈子层中讨论的所有这些参数(参见图 16),并且如前所述,是基于掩码的(参见图 10):编码器接收一个庞大的语料库。在每个训练序列中,单词可能会被掩码。

具体来说,BERT 在整个维基百科和 BookCorpus 上进行训练,通过掩码 15% 的输入并要求它预测被掩码的单词。15% 是掩码过多的(这使得训练非常昂贵)和掩码过少的(这会去除训练期间有用的上下文)之间的最佳点。

对于训练,我们使用 BERT 输出处的掩码语言模型“头”(简称 MLM)。MLM 头是预测被掩码单词的神经网络。它具有与 BERT 密集输入中可能单词数量一样多的输入神经元(BERT Base 为 768),以及与词汇表单词一样多的输出神经元。对于训练期间的每个掩码序列,头部接收序列的上下文嵌入(BERT 的输出),并产生词汇表中每个单词成为掩码单词的概率(使用典型的 Softmax)。

计算预测与实际单词表示之间的差异,并且梯度反向传播到整个架构,调整我们在前面章节中讨论的每个编码器的自注意力和前馈网络子层参数(以及头部本身)的值。参考文献 [5] 是反向传播的复习(如开头所述,我们假设您熟悉神经网络的基础知识)。

训练完成后,我们丢弃 MLM 掩码,编码器就可以为任何输入序列生成上下文嵌入。

4.1 训练模式和语言模型迁移学习

从高层次来看,训练模型包括三个阶段

预训练:架构被训练为大型数据集上的掩码语言模型,并使用 MLM 头部,就像我们迄今为止所看到的。这种方法的优势在于,使用像滑动窗口这样的策略进行掩码,我们可以预训练模型而无需任何标记数据。

领域适应:为了获得最佳结果,我们在领域内数据上重新训练预训练模型。为此,我们必须使用来自目标领域的语料库,即模型将用于的主题领域或知识领域,以帮助它获取特定领域的术语和语言模式。我们可能拥有较小的领域内数据语料库,但事实上我们在大型语料库上预训练了模型,这使得它在领域内重新训练后能够表现良好。领域适应也可以使用 MLM 头部完成,无需标记数据。

微调:除了搜索之外,像 BERT 这样的编码器还用于许多 NLP 任务,包括情感分析和其他文本分类、命名实体识别 (NER)、问答等。在最后阶段,我们在 Transformer 编码器之上采用特定于任务的头部,该头部专为手头的特定任务而设计。例如,对于情感分析任务,头部是一个小型前馈神经网络,经过训练可以输出每个类别的概率。在此阶段,编码器用作特征提取器:它生成用作 NLP 头部输入的上下文嵌入。这种策略称为迁移学习,它之前已应用于训练计算机视觉模型,然后应用于 NLP。此阶段需要标记数据。

请注意,使用迁移学习,我们可以使用预训练的 Transformer 编码器仅训练其顶部的文本分类头部。与选择在训练期间调整整个架构中的权重相比,这极大地简化了我们需要执行的机器学习工作。在实践中,这意味着获取现有的预训练 BERT 模型,“冻结”其所有参数,向其添加输出层,并仅将最后一层训练到手头的任务。这样,我们只需要调整最后一层的权重,而不是 BERT 包含的数亿个权重。迁移学习非常强大,因为通过冻结 BERT 的数百万个参数,训练时间、资源和领域内数据需求都大大降低了。

Elastic Machine Learning 使您能够极其轻松地上传和部署来自 HuggingFace 的受支持的预训练 Transformer 编码器 NLP 模型或来自您环境的自定义模型,以与您的 Elastic 数据一起使用。

4.2 AI 障碍

训练、领域内适应和微调语言模型带来了重大障碍:它们需要大量的人力和计算资源:一方面,机器学习专业知识需要远远超出传统软件工程的科学人才。另一方面,训练模型需要大量资源,通常需要 GPU 硬件和数周或数月的处理时间,所有这些都会产生可观的成本。

这还远非全部:在将模型部署到生产环境之前,您还需要离线和在线验证和测试模型。

微调需要标记数据,这意味着您需要花费人力进行数据标注或将数据标注外包,或者构建能够以非常高的准确率自动标注数据的系统。

为了适应训练数据预处理,您的生产数据管道可能需要发生重大变化。此外,如果您的生产数据与测试环境数据不同步(这种情况很常见),这可能会导致更深层次的数据工程和运营工作。

此外,模型和数据不是静态的,您可能需要构建模型漂移和数据漂移检测来缓解任何训练服务偏差。

由于特殊的硬件和软件要求,您的 MLOps 很可能需要与其余软件不同的发布周期。您需要构建与其余软件的适当集成。

由于所有这些原因以及更多原因,AI 驱动的自然语言理解和搜索对大多数组织来说都是一个非常高的障碍。

5. Elastic Learned Sparse Encoder 开箱即用的 AI 搜索

Elastic Learned Sparse Encoder (ELSER) 为搜索用例解决了这个问题。它建立在 BERT 的基础上,提供了卓越的开箱即用 AI 搜索 [6]。您可以下载 ELSER 并只需点击几下即可从 Elastic UI 中部署它。ELSER 真正无需任何 ML 工作:它让您完全免受上一节中简要描述的 AI 障碍的影响。它也不需要任何外部组件即可开始使用熟悉的 Elastic 搜索 API。

有了它,Elastic 现在提供了两个选项

  • 它自己的开箱即用、专有的 AI 搜索模型。
  • 部署第三方向量模型以与 Elastic 数据一起使用。

以下是 ELSER 的工作原理。

正如我们所讨论的,在预训练(以及如果执行了领域适应)之后,我们通常会丢弃 MLM 掩码,因为编码器的主要目的是为任何输入序列生成上下文嵌入(如果我们的用例不涉及特定于任务的微调)。

但是,在训练过程结束时,MLM 头部是一个经过训练的神经网络,它会为任何输入句子中的每个掩码输入项(由于 BERT 在幕后发挥作用而具有上下文)生成词汇表上的概率分布。

在搜索用例中,输入序列是我们的查询。输入序列/查询的每个位置都会通过不同程度地激活不同的单词,在词汇表上产生不同的此类分布。

ELSER 背后的理念是,不要丢弃 MLM 头部,而是使用它来为序列/查询中的每个单词生成这些分布。因为 MLM 头部在设计上不是稀疏的,所以我们对其进行了适当的修改并调整了训练目标,使其变得稀疏并针对检索进行了优化。

如果我们将每个单词的分布聚合到整个序列/查询的一个分布中,我们将生成一个向量,该向量的值表示词汇表中的每个单词被输入查询激活的程度。

因为该向量的尺寸等于词汇表的尺寸,并且激活的(非零)维度只占一小部分,所以它是一个稀疏向量

然后我们不仅基于查询词进行搜索,还使用整个词汇表中的激活词进行搜索。此功能称为文本扩展。文本扩展是指即使文档中不存在查询词,也能在搜索结果中显示语义相关文档的能力。可以将其理解为“扩展”超出使用的精确搜索查询词的查询,以激活文档中存在但查询本身不存在的相关词。这被称为词汇不匹配问题,ELSER 减轻了这个问题。

图 28 显示了 ELSER 实际应用中的文本扩展。输入序列(“the blues band played their best songs”)激活英语中相关的单词(例如,“album”、“artist”、“concert”、“favorite”、“jazz”、“piano” 等)。ELSER 的 MLM 头用于扩展查询。

然后使用扩展后的查询代替原始的较短查询进行搜索。该向量是稀疏的,包含英语中每个单词的位置及其与查询的相关性得分。

文本扩展比使用同义词更强大,因为它可以基于语言级别和规模上的细粒度“相关性连续体”对结果进行排序,而不是在文档语料库级别上使用与传统基于词项的 TF-IDF 结合使用的同义词。

Elastic Learned Sparse Encoder 处于最先进水平:在不进行领域自适应的情况下,它优于简单的基于词项的搜索(BM25)和密集向量语义搜索,它是目前开箱即用 AI 搜索的最佳模型 [7]。

因为它生成稀疏的上下文向量,所以您可以开箱即用地将其与熟悉的 Elastic 搜索 API 配合使用,而无需任何机器学习专业知识或 MLOps 工作。出于同样的原因,并且由于 Elastic 的向量数据库功能,它也比密集向量更节省资源,具有更小的 RAM 占用空间。

通过 Elastic UI 一键部署并开始利用 AI 搜索的卓越相关性,正如我们在“GenAI 的血流”部分中所解释的那样。

结论

我们希望这篇文章能帮助您很好地理解 AI 语言模型以及突破性架构背后的直觉。所以恭喜您,您已经走得很远,现在您已经了解了理解生成式 LLM 所需的一切,这将是本文第二部分的主题。您已经完成了最难的部分,敬请关注。

参考文献

  1. Attention is all you need
  2. Understanding searches better than ever before
  3. What does BERT look at? An analysis of self-Attention
  4. Assessing BERT’s syntactic abilities
  5. How the Backpropagation algorithm works
  6. Elastic Learned Sparse Encoder: Elastic’s AI model for semantic search
  7. Improving information retrieval in Elastic

Elasticsearch 充满了新功能,可以帮助您为您的用例构建最佳的搜索解决方案。深入了解我们的示例笔记本 以了解更多信息,开始免费云试用,或立即在您的本地机器 上尝试 Elastic。

准备好构建最先进的搜索体验了吗?

充分先进的搜索并非一蹴而就。Elasticsearch 由数据科学家、ML Ops 工程师、软件工程师等等许多同样热爱搜索的人提供支持,他们与您一样热衷于搜索。让我们联系起来,共同构建神奇的搜索体验,让您获得想要的结果。

亲身体验