前面我们已经学习多头注意力机制,这是大语言模型的核心组件之一。现在,我们将了解大语言模型的其他构建块。最后,将它们组装成一个类GPT模型。
大语言模型,比如 GPT(生成式预训练 Transformer),是一次生成一个词(或词元)的大型深度神经网络架构。下面是类 GPT 大语言模型的的示意图。

GPT 模型除了嵌入层,还包含一个或多个 Transformer 块,这些块中包括掩码多头注意力模块。
由于梯度消失或梯度爆炸等问题,训练深层神经网络有时会导致训练过程不稳定,使网络难以有效地调整权重,从而使学习过程难以找到一组最小化损失函数的参数(权重)。换句话说,网络难以学习数据中的潜在模式,从而无法进行准确预测或决策。
现在我们将实现层归一化,以提高神经网络训练的稳定性和效率。层归一化的主要思想是调整神经网络层的激活(输出),使其均值为 0 且方差(单位方差)为 1。这种调整有助于加速权重的有效收敛,并确保训练过程的一致性和可靠性。
下面是层归一化的图示,其中层的6个输出(激活值)被调整为均值为0且方差为1。

ReLU 是神经网络中的一种标准激活函数。 ReLU可以这样来理解:它只是简单地将负输入值设为 0,从而确保层的输出值都是正。
层归一化操作具体方法是减去均值,并将结果除以方差的平方根(也就是标准差)。层归一化可以确保每个层的输出具有一致的均值和方差,从而稳定训练过程。
从历史上看,ReLU 激活函数因其在各种神经网络架构中的简单性和有效性而被广泛应用于深度学习。然而,在大语言模型中,除了传统的 ReLU,还有其他几种激活函数,其中两个值得注意的例子是 GELU(Gaussian Error Linear Unit)和 SwiGLU(Swish-gated Linear Unit)。
GELU 和 SwiGLU 是更为复杂且平滑的激活函数,分别结合了高斯分布和 sigmoid 门控线性单元。与较为简单的 ReLU 激活函数相比,它们能够提升深度学习模型的性能。

从图的结果可以看到,ReLU(右)是一个分段线性函数,当输入为正数时直接输出输入值,否则输出 0。GELU(左)则是一个平滑的非线性函数,它近似 ReLU,但在几乎所有负值(除了在 x 约等于-0.75 的位置外)上都有非零梯度。
GELU 的平滑特性可以在训练过程中带来更好的优化效果,因为它允许模型参数进行更细微的调整。相比之下,ReLU 在零点处有一个尖锐的拐角(参见上图的右图),有时会使得优化过程更加困难,特别是在深度或复杂的网络结构中。此外,ReLU 对负输入的输出为 0,而 GELU对负输入会输出一个小的非零值。这意味着在训练过程中,接收到负输入的神经元仍然可以参与学习,只是贡献程度不如正输入大。
接下来,如代码清单所示,我们将使用 GELU 函数来实现小型神经网络模块 FeedForward。
如你所见,FeedForward 模块是一个小型神经网络,由两个线性层和一个 GELU 激活函数组成。
下图展示了当输入传递给这个小型前馈神经网络时,嵌入维度是如何**作的。

上图是前馈神经网络层之间连接的总体概览。该神经网络能够处理不同的批次大小和输入词元数量。然而,每个词元的嵌入维度在初始化权重时是确定并且固定的。
FeedForward 模块在提升模型学习和泛化能力方面非常关键。虽然该模块的输入和输出维度保持一致,但它通过第一个线性层将嵌入维度扩展到了更高的维度,如下图所示。扩展之后,应用非线性 GELU 激活函数,然后通过第二个线性变换将维度缩回原始大小。这种设计允许模型探索更丰富的表示空间。

另外,输入维度和输出维度的一致性简化了架构,使我们在后续堆叠多个层时无须调整维度,从而增强了模型的扩展能力。
插入在神经网络不同层之间的快捷连接,对于提升深度神经网络架构的训练性能非常重要。快捷连接(也称为“跳跃连接”或“残差连接”)的目的是缓解梯度消失问题。
快捷连接通过跳过一个或多个层,为梯度在网络中的流动提供了一条可替代且更短的路径。这是通过将一层的输出添加到后续层的输出中实现的。这也是为什么这种连接被称为跳跃连接。在反向传播训练中,它们在维持梯度流动方面扮演着至关重要的角色。
快捷连接通过确保各层之间梯度的稳定流动来帮助实现更有效的训练。
快捷连接是通过将一层的输出直接传递到更深层来跳过一个或多个层的连接,它能缓解在训练深度神经网络(如大语言模型)时遇到的梯度消失问题。
现在,我们将实现 Transformer 块,这是 GPT 和其他大语言模型架构的基本构建块。
Transformer 块的核心思想是,自注意力机制在多头注意力块中用于识别和分析输入序列中元素之间的关系。相比之下,前馈神经网络则在每个位置上对数据进行单独的修改。这种组合不仅提供了对输入更细致的理解和处理,而且提升了模型处理复杂数据模式的整体能力。

Transformer 块示意图。输入的词元被嵌入到 768 维的向量中。每一行对应一个词元的向量表示。Transformer 块的输出是与输入具有相同维度的向量,这些向量可以传递到大语言模型的后续层中
GPT模型的整体架构如下图所示,其中包括了我们到目前为止讨论的所有概念。可以看到,Transformer 块在 GPT 模型架构中被多次重复。

GPT 模型架构概览。该图展示了 GPT 模型的数据流。从底部开始,词元化文本首先被转换成词元嵌入,然后用位置嵌入进行增强。这些组合信息形成一个张量,然后通过中间所示的一系列 Transformer 块(每个块都包含多头注意力和前馈神经网络层,并带有 dropout 和层归一化功能),这些块相互堆叠并重复 12 次。
最终 Transformer 块的输出会经过最后一步的层归一化处理,然后传递到线性输出层。这个层会将 Transformer 的输出映射到一个高维空间(在本例中为 50 257 维,对应模型的词汇表大小),以预测序列中的下一个词元。
类GPT大语言模型的文本生成能力涉及根据给定的输入上下文来逐个预测词元,然后将输出张量解码为人类可读的文本。
将 GPT 模型的张量输出转换成文本。

通过显示词元生成过程中的一次迭代,详细介绍了在gpt模型中生成文本的机制。该过程从将输人文本编码成词元id开始,然后将这些id输人到了gpt模型中。模型的输出结果随后被转换回文本,并附加到原始输人文本中。
展示的下一词元生成过程说明了 GPT 模型如何在给定输入的情况下生成下一个词元。在每一步中,模型输出一个矩阵,其中的向量表示有可能的下一个词元。将与下一个词元对应的向量提取出来,并通过 softmax 函数转换为概率分布。在包含这些概率分数的向量中,找到最高值的索引,这个索引对应于词元 ID。然后将这个词元 ID 解码为文本,生成序列中的下一个词元。最后,将这个词元附加到之前的输入中,形成新的输入序列,供下一次迭代使用。
模型生成了无意义的内容,完全不像连贯的文本。模型不能生成连贯文本的原因是我们还没有对其进行训练。到目前为止,我们只是实现了 GPT 架构,并用初始随机权重初始化了 GPT 模型实例。
在没有训练的情况下,GPT 模型生成的文本是不连贯的,这显示了模型训练对于生成连贯文本的重要性。
如果熟悉批归一化(神经网络中一种常用且传统的归一化方法),你可能会想知道它与层归一化的区别。与在批次维度上进行归一化的批归一化不同,层归一化是在特征维度上进行归一化。大语言模型通常需要大量的计算资源,训练或推理时的批次大小可能会受到硬件条件或具体用例的影响。由于层归一化是对每个输入独立进行归一化,不受批次大小的限制,因此在这些场景中它提供了更多的灵活性和稳定性。这在分布式训练或在资源受限的环境中部署模型时尤为重要。
在深度学习和像 GPT 这样的大语言模型中,“参数”指的是模型的可训练权重。这些权重本质上是模型的内部变量,在训练过程中通过调整和优化来最小化特定的损失函数。这种优化使模型能够从训练数据中学习。
例如,在一个由 2048 维×2048 维的权重矩阵(或张量)表示的神经网络层中,矩阵中的每个元素都是一个参数。由于矩阵有 2048 行和 2048 列,因此该层的参数总数为 2048×2048,即 。
梯度消失问题指的 是在训练过程中,梯度在反向传播时逐渐变小,导致早期网络层难以有效训练。
numel()(“number of elements”的缩写)方法可以统计模型参数张量的总参数量。
将模型设置为.eval()模式,这将禁用诸如 dropout 等只在训练期间使用的随机组件。
《从零构建大模型》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/232695.html