《深入浅出LLM基础篇》(三):大模型结构分类

导读:本篇为《深入浅出LLM基础篇》系列第三篇,《深入浅出LLM基础篇》(三):大模型结构分类主要讨论大型语言模型是如何构建的,章节将着重讨论模型架构,主要讨论Transformer架构及编码、解码器组成结构及原理,这是真正实现大型语言模型的建模创新。

3.1 大模型概括

为了更好的了解整体的功能结构(而不从一开始就陷入局部的结构细节),我们一开始先将语言模型(model)的看作一个黑箱(black box)(在后续的内容中再逐步的拆解),从形象化的概念理解上来说当前大语言模型(大:体现中模型的规模上)的能力,其可以根据输入需求的语言描述(prompt)生成符合需求的结果(completion),形式可以表达为:

prompt⇝modelcompletion or model(prompt)=completionprompt \overset{model}{\leadsto} completion \ \ or \ \ model(prompt) = completionprompt⇝modelcompletion or model(prompt)=completion

接下来我们将从大语言模型的训练数据(traning data)分析开始接下来的内容,首先给出如下的形式化描述

training data⇒p(x1,…,xL).training\ data \Rightarrow p(x_{1},…,x_{L}).training data⇒p(x1,…,xL).

3.2 模型架构

到目前为止,我们已经将语言模型定义为对词元序列的概率分布 p(x1,…,xL)p(x_{1},…,x_{L})p(x1,…,xL),我们已经看到这种定义非常优雅且强大(通过提示,语言模型原则上可以完成任何任务,正如GPT-3所示)。然而,在实践中,对于专门的任务来说,避免生成整个序列的生成模型可能更高效。

上下文向量表征 (Contextual Embedding): 作为先决条件,主要的关键发展是将词元序列与相应的上下文的向量表征:

[the,mouse,ate,the,cheese]⇒ϕ[(10.1),(01),(11),(1−0.1),(0−1)].[the, mouse, ate, the, cheese] \stackrel{\phi}{\Rightarrow}\left[\left(\begin{array}{c} 1 \ 0.1 \end{array}\right),\left(\begin{array}{l} 0 \ 1 \end{array}\right),\left(\begin{array}{l} 1 \ 1 \end{array}\right),\left(\begin{array}{c} 1 \ -0.1 \end{array}\right),\left(\begin{array}{c} 0 \ -1 \end{array}\right)\right]. [the,mouse,ate,the,cheese]⇒ϕ[(10.1),(01),(11),(1−0.1),(0−1)].

正如名称所示,词元的上下文向量表征取决于其上下文(周围的单词);例如,考虑mouse的向量表示需要关注到周围某个窗口大小的其他单词。

  • 符号表示:我们将 ϕ:VL→Rd×Lϕ:V{L}→ℝ{d×L}ϕ:VL→Rd×L 定义为嵌入函数(类似于序列的特征映射,映射为对应的向量表示)。
  • 对于词元序列 x1:L=[x1,…,xL]x1:L=[x_{1},…,x_{L}]x1:L=[x1,…,xL],ϕϕϕ 生成上下文向量表征 ϕ(x1:L)ϕ(x_{1:L})ϕ(x1:L)。

3.3 大模型分类

在这里插入图片描述

基于Transformer结构的模型又可以分为编码端(Encoder-Only),解码端(Decoder-Only)和编码-解码端(Encoder-Decoder)三类,具体如下图所示。

在这里插入图片描述

1.Encoder-Only架构:

定义与特点:这类模型仅包含编码器部分,主要用于从输入数据提取特征或表示。例如,在BERT (Bidirectional Encoder Representations from Transformers) 中,它是一个双向Transformer编码器,被训练来理解文本上下文信息,并输出一个固定长度的向量表示,该表示包含了原始输入序列的丰富语义信息。 用途:主要用于预训练模型,如BERT、RoBERTa等,常用于各种下游任务的特征提取,比如分类、问答、命名实体识别等,但不直接用于生成新的序列。

仅编码器架构(Encoder-only)自编码模型(破坏一个句子,然后让模型去预测或填补),更擅长理解类的任务,例如:文本分类、实体识别、关键信息抽取等。典型代表有:Bert、RoBERTa等。

2.Decoder-Only架构:

定义与特点:解码器仅架构专注于从某种内部状态或先前生成的内容生成新的序列,通常用于自回归式预测任务,其中每个时刻的输出都依赖于前面生成的所有内容。 优点:强大的序列生成能力,能够按顺序逐个生成连续的元素(如单词、字符),适用于诸如文本生成、自动摘要、对话系统等生成性任务。典型的Decoder-Only模型包括GPT系列(如GPT-3)。

仅解码器架构(Decoder-only)自回归模型(将解码器自己当前步的输出加入下一步的输入,解码器融合所有已经输入的向量来输出下一个向量,所以越往后的输出考虑了更多输入),更擅长生成类的任务,例如:文本生成。典型代表有:GPT系列、LLaMA、OPT、Bloom等。

3.Encoder-Decoder架构:

定义与特点:这种架构由两个主要部分组成:编码器和解码器。编码器负责将输入序列转换为压缩的中间表示,解码器则基于这个中间表示生成目标输出序列。这种结构非常适合翻译、摘要生成、图像描述等任务,需要理解和重构输入信息后生成新序列的任务。 工作原理:编码器对源序列进行处理并生成上下文向量,解码器根据此上下文向量逐步生成目标序列。例如,经典的Seq2Seq(Sequence-to-Sequence)模型和Transformer中的机器翻译模型就采用了这样的结构。

编码器-解码器架构(Encoder-Decoder):序列到序列模型(编码器的输出作为解码器的输入),主要用于基于条件的生成任务,例如:翻译,概要等。典型代表有:T5、BART、GLM等。

3.3.1 结构详细介绍

编码端(Encoder-Only)架构

编码端架构的著名的模型如BERT、RoBERTa等。这些语言模型生成上下文向量表征,但不能直接用于生成文本。可以表示为, x1:L⇒ϕ(x1:L)x_{1:L}⇒ϕ(x_{1:L})x1:L⇒ϕ(x1:L) 。这些上下文向量表征通常用于分类任务(也呗称为自然语言理解任务)。任务形式比较简单,下面以情感分类/自然语言推理任务举例:

情感分析输入与输出形式:[[CLS],他们,移动,而,强大]⇒正面情绪情感分析输入与输出形式:[[CLS], 他们, 移动, 而, 强大]\Rightarrow 正面情绪情感分析输入与输出形式:[[CLS],他们,移动,而,强大]⇒正面情绪

自然语言处理输入与输出形式:[[CLS],所有,动物,都,喜欢,吃,饼干,哦]⇒蕴涵自然语言处理输入与输出形式:[[CLS], 所有, 动物, 都, 喜欢, 吃, 饼干, 哦]⇒蕴涵自然语言处理输入与输出形式:[[CLS],所有,动物,都,喜欢,吃,饼干,哦]⇒蕴涵

该架构的优势是对于文本的上下文信息有更好的理解,因此该模型架构才会多用于理解任务。该架构的有点是对于每个 xix{i}xi ,上下文向量表征可以双向地依赖于左侧上下文 (x1:i−1)(x_{1:i−1})(x1:i−1) 和右侧上下文 (xi+1:L)(x_{i+1:L})(xi+1:L) 。但是缺点在于不能自然地生成完成文本,且需要更多的特定训练目标(如掩码语言建模)。

解码器(Decoder-Only)架构

解码器架构的著名模型就是大名鼎鼎的GPT系列模型。这些是我们常见的自回归语言模型,给定一个提示 x1:ix_{1:i}x1:i ,它们可以生成上下文向量表征,并对下一个词元 xi+1x_{i+1}xi+1 (以及递归地,整个完成 xi+1:Lx_{i+1:L}xi+1:L) 生成一个概率分布。 x1:i⇒ϕ(x1:i),p(xi+1∣x1:i)x_{1:i}⇒ϕ(x_{1:i}),p(x_{i+1}∣x_{1:i})x1:i⇒ϕ(x1:i),p(xi+1∣x1:i) 。我们以自动补全任务来说,输入与输出的形式为, [[CLS],他们,移动,而]⇒强大[[CLS], 他们, 移动, 而]⇒强大[[CLS],他们,移动,而]⇒强大 。与编码端架构比,其优点为能够自然地生成完成文本,有简单的训练目标(最大似然)。缺点也很明显,对于每个 xixixi ,上下文向量表征只能单向地依赖于左侧上下文 (x1:i−1x_{1:i−1}x1:i−1) 。

编码-解码端(Encoder-Decoder)架构

编码-解码端架构就是最初的Transformer模型,其他的还有如BART、T5等模型。这些模型在某种程度上结合了两者的优点:它们可以使用双向上下文向量表征来处理输入 x1:Lx_{1:L}x1:L ,并且可以生成输出 y1:Ly_{1:L}y1:L 。可以公式化为:

x1:L⇒ϕ(x1:L),p(y1:L∣ϕ(x1:L))。x1:L⇒ϕ(x1:L),p(y1:L∣ϕ(x1:L))。x1:L⇒ϕ(x1:L),p(y1:L∣ϕ(x1:L))。

以表格到文本生成任务为例,其输入和输出的可以表示为:

[名称:,植物,∣,类型:,花卉,商店]⇒[花卉,是,一,个,商店]。[名称:, 植物, |, 类型:, 花卉, 商店]⇒[花卉, 是, 一, 个, 商店]。[名称:,植物,∣,类型:,花卉,商店]⇒[花卉,是,一,个,商店]。

该模型的具有编码端,解码端两个架构的共同的优点,对于每个 xix_{i}xi ,上下文向量表征可以双向地依赖于左侧上下文 x1:i−1x_{1:i−1}x1:i−1 ) 和右侧上下文 ( xi+1:Lx_{i+1:L}xi+1:L ),可以自由的生成文本数据。缺点就说需要更多的特定训练目标。

总结:

Encoder-Only用于理解输入并生成其抽象表示,不涉及序列生成。 Decoder-Only专门用于根据之前的信息自动生成新序列,不接收外部输入。 Encoder-Decoder结合了两者的功能,首先对输入进行编码,然后基于编码结果解码生成新序列。

3.3.2 语言模型理论

下一步,我们会介绍语言模型的模型架构,重点介绍Transformer架构机器延伸的内容。另外我们对于架构还会对于之前RNN网络的核心知识进行阐述,其目的是对于代表性的模型架构进行学习,为未来的内容增加知识储备。

深度学习的美妙之处在于能够创建构建模块,就像我们用函数构建整个程序一样。因此,在下面的模型架构的讲述中,我们能够像下面的函数一样封装,以函数的的方法进行理解:

TransformerBlock(x1:L)TransformerBlock(x_{1:L})TransformerBlock(x1:L)

为了简单起见,我们将在函数主体中包含参数,接下来,我们将定义一个构建模块库,直到构建完整的Transformer模型。

3.3.2.1 基础架构

首先,我们需要将词元序列转换为序列的向量形式。 EmbedTokenEmbedTokenEmbedToken 函数通过在嵌入矩阵 E∈R∣v∣×dE∈ℝ^{|v|×d}E∈R∣v∣×d 中查找每个词元所对应的向量,该向量的具体值���是从数据中学习的参数:

def EmbedToken(x1:L:VL)→Rd×LEmbedToken(x_{1:L}:V{L})→ℝ{d×L}EmbedToken(x1:L:VL)→Rd×L :

  • 将序列 x1:Lx_{1:L}x1:L 中的每个词元 xixixi 转换为向量。
  • 返回[Ex1,…,ExL]。

以上的词嵌入是传统的词嵌入,向量内容与上下文无关。这里我们定义一个抽象的 SequenceModelSequenceModelSequenceModel 函数,它接受这些上下文无关的嵌入,并将它们映射为上下文相关的嵌入。

defSequenceModel(x1:L:Rd×L)→Rd×Ldef SequenceModel(x_{1:L}:ℝ{d×L})→ℝ{d×L}defSequenceModel(x1:L:Rd×L)→Rd×L :

  • 针对序列 x1:Lx_{1:L}x1:L 中的每个元素xi进行处理,考虑其他元素。
  • [抽象实现(例如, FeedForwardSequenceModelFeedForwardSequenceModelFeedForwardSequenceModel , SequenceRNNSequenceRNNSequenceRNN , TransformerBlockTransformerBlockTransformerBlock )]

最简单类型的序列模型基于前馈网络(Bengio等人,2003),应用于固定长度的上下文,就像n-gram模型一样,函数的实现如下:

def FeedForwardSequenceModel(x1:L:Rd×L)→Rd×LFeedForwardSequenceModel(x_{1:L}:ℝ{d×L})→ℝ{d×L}FeedForwardSequenceModel(x1:L:Rd×L)→Rd×L :

  • 通过查看最后 nnn 个元素处理序列 x1:Lx_{1:L}x1:L 中的每个元素 xixixi 。

  • 对于每个

    i=1,…,Li=1,…,Li=1,…,L

    • 计算 hih_{i}hi=FeedForward(xi−n+1,…,xi)FeedForward(x_{i−n+1},…,x_{i})FeedForward(xi−n+1,…,xi) 。
  • 返回[ h1,…,hLh_{1},…,h_{L}h1,…,hL ]。

3.3.2.2 递归神经网络

第一个真正的序列模型是递归神经网络(RNN),它是一类模型,包括简单的RNN、LSTM和GRU。基本形式的RNN通过递归地计算一系列隐藏状态来进行计算。

def SequenceRNN(x:Rd×L)→Rd×LSequenceRNN(x:ℝ{d×L})→ℝ{d×L}SequenceRNN(x:Rd×L)→Rd×L :

  • 从左到右处理序列 x1,…,xLx_{1},…,x_{L}x1,…,xL ,并递归计算向量 h1,…,hLh_{1},…,h_{L}h1,…,hL 。

  • 对于

    i=1,…,Li=1,…,Li=1,…,L

    • 计算 hi=RNN(hi−1,xi)h_{i}=RNN(h_{i−1},x_{i})hi=RNN(hi−1,xi) 。
    • 返回 [h1,…,hL][h_{1},…,h_{L}][h1,…,hL] 。

实际完成工作的模块是RNN,类似于有限状态机,它接收当前状态h、新观测值x,并返回更新后的状态:

def RNN(h:Rd,x:Rd)→RdRNN(h:ℝd,x:ℝd)→ℝ^dRNN(h:Rd,x:Rd)→Rd :

  • 根据新的观测值x更新隐藏状态h。
  • [抽象实现(例如,SimpleRNN,LSTM,GRU)]

有三种方法可以实现RNN。最早的RNN是简单RNN(Elman,1990),它将hhh和xxx的线性组合通过逐元素非线性函数 σσσ (例如,逻辑函数 σ(z)=(1+e−z)−1σ(z)=(1+e−z)−1σ(z)=(1+e−z)−1 或更现代的 ReLUReLUReLU 函数 σ(z)=max(0,z)σ(z)=max(0,z)σ(z)=max(0,z) )进行处理。

def SimpleRNN(h:Rd,x:Rd)→RdSimpleRNN(h:ℝd,x:ℝd)→ℝdSimpleRNN(h:Rd,x:Rd)→Rd :

  • 通过简单的线性变换和非线性函数根据新的观测值 xxx 更新隐藏状态 hhh 。
  • 返回 σ(Uh+Vx+b)σ(Uh+Vx+b)σ(Uh+Vx+b) 。

正如定义的RNN只依赖于过去,但我们可以通过向后运行另一个RNN来使其依赖于未来两个。这些模型被ELMo和ULMFiT使用。

def BidirectionalSequenceRNN(x1:L:Rd×L)→R2d×LBidirectionalSequenceRNN(x_{1:L}:ℝ{d×L})→ℝ{2d×L}BidirectionalSequenceRNN(x1:L:Rd×L)→R2d×L :

  • 同时从左到右和从右到左处理序列。
  • 计算从左到右: [h→1,…,h→L]←SequenceRNN(x1,…,xL)[h→_{1},…,h→_{L}]←SequenceRNN(x_{1},…,x_{L})[h→1,…,h→L]←SequenceRNN(x1,…,xL) 。
  • 计算从右到左: [h←L,…,h←1]←SequenceRNN(xL,…,x1)[h←_{L},…,h←_{1}]←SequenceRNN(x_{L},…,x_{1})[h←L,…,h←1]←SequenceRNN(xL,…,x1) 。
  • 返回 [h→1h←1,…,h→Lh←L][h→_{1}h←_{1},…,h→_{L}h←_{L}][h→1h←1,…,h→Lh←L] 。

注:

  • 简单RNN由于梯度消失的问题很难训练。
  • 为了解决这个问题,发展了长短期记忆(LSTM)和门控循环单元(GRU)(都属于RNN)。
  • 然而,即使嵌入h200可以依赖于任意远的过去(例如,x1),它不太可能以“精确”的方式依赖于它(更多讨论,请参见Khandelwal等人,2018)。
  • 从某种意义上说,LSTM真正地将深度学习引入了NLP领域。

3.4 Transformer组成

Transformer是一种由谷歌在2017年提出的深度学习模型,主要用于自然语言处理(NLP)任务,特别是序列到序列(Sequence-to-Sequence)的学习问题,如机器翻译、文本生成等。Transformer彻底改变了之前基于循环神经网络(RNNs)和长短期记忆网络(LSTMs)的序列建模范式,并且在性能上取得了显著提升。Transformer模型将其分解为Decoder-Only(GPT-2,GPT-3)、Encoder-Only(BERT,RoBERTa)和Encoder-Decoder(BART,T5)模型的构建模块。Transformer结构如下图所示:

在这里插入图片描述

Transformer的核心创新点包括:

自注意力机制(Self-Attention Mechanism):Transformer模型摒弃了传统RNN结构的时间依赖性,通过自注意力机制实现了对输入序列中任意两个位置之间的直接关联建模。每个词的位置可以同时关注整个句子中的其他所有词,计算它们之间的相关性得分,然后根据这些得分加权求和得到该位置的上下文向量表示。这种全局信息的捕获能力极大地提高了模型的表达力。

多头注意力(Multi-Head Attention):Transformer进一步将自注意力机制分解为多个并行的“头部”,每个头部负责从不同角度对输入序列进行关注,从而增强了模型捕捉多种复杂依赖关系的能力。最后,各个头部的结果会拼接并经过线性变换后得到最终的注意力输出。

位置编码(Positional Encoding):由于Transformer不再使用RNN那样的顺序处理方式,为了引入序列中词的位置信息,它采用了一种特殊的位置编码方法。这种方法对序列中的每个位置赋予一个特定的向量,这个向量的值与位置有关,确保模型在处理时能够区分不同的词语顺序。

编码器-解码器架构(Encoder-Decoder Architecture):Transformer采用了标准的编码器-解码器结构,其中编码器负责理解输入序列,将其转换成高级语义表示;而解码器则依据编码器的输出并结合自身产生的隐状态逐步生成目标序列。在解码过程中,解码器还应用了自注意力机制以及一种称为“掩码”(Masking)的技术来防止提前看到未来要预测的部分。

残差连接(Residual Connections):Transformer沿用了ResNet中的残差连接设计,以解决随着网络层数加深带来的梯度消失或爆炸问题,有助于训练更深更复杂的模型。

层归一化(Layer Normalization):Transformer使用了层归一化而非批量归一化,这使得模型在小批量训练时也能获得良好的表现,并且有利于模型收敛。

总结:

Transformer架构的核心组成:

  • 自注意力机制(Self-Attention)和前馈神经网络(Feedforward Neural Networks),自注意力机制允许模型在处理每个单词时同时考虑到句子中的其他单词,从而捕捉更复杂的语言关系
  • Layer Normalization和残差连接ADD,防止在深层网络中出现的梯度消失问题
  • 位置编码:由于Transformer模型本身不处理序列中的位置信息,位置编码可以添加位置信息,对于理解文本顺序和语言结构至关重要。

关于Transformer的学习资源有很多:

强烈建议您阅读这些参考资料。该课程主要依据代码函数和接口进行讲解。

注意力机制

Transformer的关键是注意机制,这个机制早在机器翻译中就被开发出来了(Bahdananu等人,2017)。可以将注意力视为一个“软”查找表,其中有一个查询 yy y,我们希望将其与序列 x1:L=[x1,…,xL]x_{1:L}=[x_1,…,x_L]x1:L=[x1,…,xL] 的每个元素进行匹配。我们可以通过线性变换将每个 xix_{i}xi 视为表示键值对:

(Wkeyxi):(Wvaluexi)(W_{key}x_{i}):(W_{value}x_{i})(Wkeyxi):(Wvaluexi)

并通过另一个线性变换形成查询:

WqueryyW_{query}yWqueryy

可以将键和查询进行比较,得到一个分数:

scorei=xi⊤Wkey⊤Wqueryyscore_{i}=x{⊤}_{i}W{⊤}{key}W{query}yscorei=xi⊤Wkey⊤Wqueryy

这些分数可以进行指数化和归一化,形成关于词元位置1,…,L{1,…,L}1,…,L的概率分布:

[α1,…,αL]=softmax([score1,…,scoreL])[α_{1},…,α_{L}]=softmax([score_{1},…,score_{L}])[α1,…,αL]=softmax([score1,…,scoreL])

然后最终的输出是基于值的加权组合:

∑i=1Lαi(Wvaluexi)\sum_{i=1}^L \alpha_i\left(W_{value} x_i\right)i=1∑Lαi(Wvaluexi)

我们可以用矩阵形式简洁地表示所有这些内容:

def Attention(x1:L:Rd×L,y:Rd)→RdAttention(x_{1:L}:ℝ{d×L},y:ℝd)→ℝ^dAttention(x1:L:Rd×L,y:Rd)→Rd :

  • 通过将其与每个xix_{i}xi进行比较来处理yyy。
  • 返回 Wvaluex1:Lsoftmax⁡(x1:L⊤Wkey⊤Wqueryy/d)W_{value} x_{1: L} \operatorname{softmax}\left(x_{1: L}^{\top} W_{key}^{\top} W_{query} y / \sqrt{d}\right)Wvaluex1:Lsoftmax(x1:L⊤Wkey⊤Wqueryy/d)

我们可以将注意力看作是具有多个方面(例如,句法、语义)的匹配。为了适应这一点,我们可以同时使用多个注意力头,并简单地组合它们的输出。

def MultiHeadedAttention(x1:L:Rd×L,y:Rd)→RdMultiHeadedAttention(x_{1:L}:ℝ{d×L},y:ℝ{d})→ℝ^{d}MultiHeadedAttention(x1:L:Rd×L,y:Rd)→Rd :

  • 通过将其与每个xi与nheads个方面进行比较,处理y。
  • 返回 Woutput[[Attention⁡(x1:L,y),…,Attention⁡(x1:L,y)]⏟nheadstimesW_{output}[\underbrace{\left[\operatorname{Attention}\left(x_{1: L}, y\right), \ldots, \operatorname{Attention}\left(x_{1: L}, y\right)\right]}{n{heads}times}Woutput[nheadstimes[Attention(x1:L,y),…,Attention(x1:L,y)]

对于自注意层,我们将用xix_{i}xi替换yyy作为查询参数来产生,其本质上就是将自身的xix_{i}xi对句子的其他上下文内容进行 AttentionAttentionAttention 的运算:

def SelfAttention(x1:L:Rd×L)→Rd×L)SelfAttention(x_{1:L}:ℝ_{d×L})→ℝ_{d×L})SelfAttention(x1:L:Rd×L)→Rd×L) :

  • 将每个元素xi与其他元素进行比较。
  • 返回 [Attention(x1:L,x1),…,Attention(x1:L,xL)][Attention(x_{1:L},x_{1}),…,Attention(x_{1:L},x_{L})][Attention(x1:L,x1),…,Attention(x1:L,xL)] 。

自注意力使得所有的词元都可以“相互通信”,而前馈层提供进一步的连接:

def FeedForward(x1:L:Rd×L)→Rd×LFeedForward(x_{1:L}:ℝ{d×L})→ℝ{d×L}FeedForward(x1:L:Rd×L)→Rd×L :

  • 独立处理每个词元。

  • 对于

    i=1,…,Li=1,…,Li=1,…,L

    • 计算 yi=W2max(W1xi+b1,0)+b2y_{i}=W_{2}max(W_{1}x_{i}+b_{1},0)+b_{2}yi=W2max(W1xi+b1,0)+b2 。
  • 返回 [y1,…,yL][y_{1},…,y_{L}][y1,…,yL] 。

对于Transformer的主要的组件,我们差不多进行介绍。原则上,我们可以只需将 FeedForward∘SelfAttentionFeedForward∘SelfAttentionFeedForward∘SelfAttention 序列模型迭代96次以构建GPT-3,但是那样的网络很难优化(同样受到沿深度方向的梯度消失问题的困扰)。因此,我们必须进行两个手段,以确保网络可训练。

残差连接和归一化

残差连接:计算机视觉中的一个技巧是残差连接(ResNet)。我们不仅应用某个函数f:

f(x1:L),f(x1:L),f(x1:L),

而是添加一个残差(跳跃)连接,以便如果fff的梯度消失,梯度仍然可以通过 x1:Lx_{1:L}x1:L 进行计算:

x1:L+f(x1:L)。x_{1:L}+f(x_{1:L})。x1:L+f(x1:L)。

层归一化:另一个技巧是层归一化,它接收一个向量并确保其元素不会太大:

def LayerNorm(x1:L:Rd×L)→Rd×LLayerNorm(x_{1:L}:ℝ{d×L})→ℝ{d×L}LayerNorm(x1:L:Rd×L)→Rd×L :

  • 使得每个 xix_{i}xi 既不太大也不太小。

我们首先定义一个适配器函数,该函数接受一个序列模型fff并使其“鲁棒”:

def AddNorm(f:(Rd×L→Rd×L),x1:L:Rd×L)→Rd×LAddNorm(f:(ℝd{×L}→ℝ{d×L}),x_{1:L}:ℝ_{d×L})→ℝ^{d×L}AddNorm(f:(Rd×L→Rd×L),x1:L:Rd×L)→Rd×L :

  • 安全地将f应用于 x1:Lx_{1:L}x1:L 。
  • 返回 LayerNorm(x1:L+f(x1:L))LayerNorm(x_{1:L}+f(x_{1:L}))LayerNorm(x1:L+f(x1:L)) 。

最后,我们可以简洁地定义Transformer块如下:

def TransformerBlock(x1:L:Rd×L)→Rd×LTransformerBlock(x_{1:L}:ℝ{d×L})→ℝ{d×L}TransformerBlock(x1:L:Rd×L)→Rd×L :

  • 处理上下文中的每个元素 xix_{i}xi 。
  • 返回 AddNorm(FeedForward,AddNorm(SelfAttention,x1:L))AddNorm(FeedForward,AddNorm(SelfAttention,x_{1:L}))AddNorm(FeedForward,AddNorm(SelfAttention,x1:L)) 。
位置嵌入

最后我们对目前语言模型的位置嵌入进行讨论。您可能已经注意到,根据定义,词元的嵌入不依赖于其在序列中的位置,因此两个句子中的𝗆𝗈𝗎𝗌𝖾将具有相同的嵌入,从而在句子位置的角度忽略了上下文的信息,这是不合理的。

css 代码解读复制代码[𝗍𝗁𝖾,𝗆𝗈𝗎𝗌𝖾,𝖺𝗍𝖾,𝗍𝗁𝖾,𝖼𝗁𝖾𝖾𝗌𝖾]
[𝗍𝗁𝖾,𝖼𝗁𝖾𝖾𝗌𝖾,𝖺𝗍𝖾,𝗍𝗁𝖾,𝗆𝗈𝗎𝗌𝖾]

为了解决这个问题,我们将位置信息添加到嵌入中:

def EmbedTokenWithPosition(x1:L:Rd×L)EmbedTokenWithPosition(x_{1:L}:ℝ^{d×L})EmbedTokenWithPosition(x1:L:Rd×L) :

  • 添加位置信息。
  • 定义位置嵌入:
    • 偶数维度:Pi,2j=sin(i/100002j/dmodel)P_{i,2j}=sin(i/10000^{2j/dmodel})Pi,2j=sin(i/100002j/dmodel)
    • 奇数维度:Pi,2j+1=cos(i/100002j/dmodel)P_{i,2j+1}=cos(i/10000^{2j/dmodel})Pi,2j+1=cos(i/100002j/dmodel)
  • 返回 [x1+P1,…,xL+PL][x_1+P_1,…,x_L+P_L][x1+P1,…,xL+PL] 。

上面的函数中, iii 表示句子中词元的位置, jjj 表示该词元的向量表示维度位置。

最后我们来聊一下GPT-3。在所有组件就位后,我们现在可以简要地定义GPT-3架构,只需将Transformer块堆叠96次即可:

GPT−3(x1:L)=TransformerBlock96(EmbedTokenWithPosition(x1:L))GPT-3(x_{1:L})=TransformerBlock^{96}(EmbedTokenWithPosition(x_{1:L}))GPT−3(x1:L)=TransformerBlock96(EmbedTokenWithPosition(x1:L))

架构的形状(如何分配1750亿个参数):

  • 隐藏状态的维度:dmodel=12288
  • 中间前馈层的维度:dff=4dmodel
  • 注意头的数量:nheads=96
  • 上下文长度:L=2048

这些决策未必是最优的。Levine等人(2020)提供了一些理论上的证明,表明GPT-3的深度太深,这促使了更深但更宽的Jurassic架构的训练。

不同版本的Transformer之间存在重要但详细的差异:

  • 层归一化“后归一化”(原始Transformer论文)与“先归一化”(GPT-2),这影响了训练的稳定性(Davis等人,2021)。
  • 应用了丢弃(Dropout)以防止过拟合。
  • GPT-3使用了sparse Transformer(稀释 Transformer)来减少参数数量,并与稠密层交错使用。
  • 根据Transformer的类型(Encdoer-Only, Decoder-Only, Encdoer-Decoder),使用不同的掩码操作。

那么,如何系统的去学习大模型LLM?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

篇幅有限,部分资料如下:

👉LLM大模型学习指南+路线汇总👈

💥大模型入门要点,扫盲必看!
在这里插入图片描述
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
在这里插入图片描述

👉大模型入门实战训练👈

💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉国内企业大模型落地应用案例👈

💥《中国大模型落地应用案例集》 收录了52个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
在这里插入图片描述
💥《2024大模型行业应用十大典范案例集》 汇集了文化、医药、IT、钢铁、航空、企业服务等行业在大模型应用领域的典范案例。

在这里插入图片描述

👉LLM大模型学习视频👈

💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
在这里插入图片描述

👉640份大模型行业报告👈

💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

👉获取方式:

这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值