从组成结构上看
从计算复杂上看
从参数规模上看
从训练规模上看
从小模型走向大模型,模型的规模与性能不断变化。如今,随着大模型技术的跃迁,各种各样的大模型实现层出叠见。"大"意味着大结构、大算力、大参数和大数据量,以GPT为例整个规模的变大过程如下所示。
结构之大
首先模型是什么?
我们知道机器学习本质就是通过输入和输出,学习它们直接的映射关系,而这个映射关系就是以模型的形式出现。
从不同的角度来看,模型的分类方式有很多。
比如从应用领域角度来分,模型主要有分类模型、生成模型、回归模型等
根据学习方式分类,则有监督学习模型、无监督学习模型、半监督学习模型;
根据模型结构分类:线性回归、支 持向量机 、决策树、神经网络等;
神经网络结构的应用广泛且种类繁杂,以BERT、GPT为代表大模型,仍然是神经网络的升级或者演化,它们都基于Transformer架构,采用了预训练和微调的策略,加入了上下文理解的机制。
Transformer模型的结构通常会包含多个层级的神经元,通过权重连接和激活函数对输入数据进行非线性变换和特征提取。它的结构包括自注意力机制、多头注意力机制、位置编码、编码器-解码器结构等。这些结构使得它能够处理长序列数据、捕捉全局依赖关系,提高模型的表达能力和泛化能力。
核心构造
标准的Transformer主要有两个模块构成,即编码器、解码器两部分。
- 编码器(Encoder)
- 解码器(Decoder)
通常情况下这两个模块在需要的场景下也可以单独作为独立模型使用,比如如果只需要理解输入类的分类、识别问题,可以单独使用Encoder模型。如果只关心输出类的任务比如文本生成则可以仅使Decoder模型, 而如果是翻译、摘要类的任务则会构建Encoder-Decoder 或Seq2Seq 这种堆叠模型。
实际中Transformer架构通常会使用一堆编码器和解码器。
编码器
每个Encoder的结构类似,主要包含4部分
- 输入嵌入(Input Embedding) :
-
- 将输入序列中的每个词或符号映射为高维向量表示。
- 加上位置编码,以便模型能够区分不同位置的词。
- 多头自注意力层(Multi-Head Self-Attention Layer) :
-
- 允许模型在计算输入序列表示时同时考虑序列中所有位置的信息。
- 通过计算注意力权重,确定每个位置对当前位置的重要性。
- 前馈神经网络层(Feed-Forward Network Layer) :
-
- 包括两个全连接层和激活函数,用于对隐藏表示进行非线性变换。
- 残差连接和层归一化(Residual Connection and Layer Normalization) :
-
- 残差连接用于将输入直接传递到输出,有助于缓解深度神经网络训练中的梯度消失和梯度爆炸问题。
- 层归一化用于加速训练过程,提高模型的泛化能力。
解码器
每个解码器同样类似,结构如下:
- 目标嵌入(Target Embedding) :
-
- 将目标序列中的每个词或符号映射为高维向量表示。
- 加上位置编码,以便模型能够区分不同位置的词。
- 编码器-解码器注意力层(Encoder-Decoder Attention Layer) :
-
- 允许解码器在生成序列时参考编码器的输出,帮助模型对输入序列和输出序列之间的关系进行建模。
- 多头自注意力层(Multi-Head Self-Attention Layer) :
-
- 允许解码器内部的信息交互,帮助模型捕捉目标序列中的长距离依赖关系。
- 前馈神经网络层(Feed-Forward Network Layer) :
-
- 包括两个全连接层和激活函数,用于对隐藏表示进行非线性变换。
- 残差连接和层归一化(Residual Connection and Layer Normalization) :
-
- 类似于编码器中的结构,用于缓解深度神经网络训练中的梯度消失和梯度爆炸问题。
总体结构
由此可见Transformer堆叠了大量的Encoder、Decoder,而Encoder、Decoder内部又堆叠了多层分别处理不同的功能。
计算之大
我们已经知道Transformer的整体结构,从input embedding到多重Encoder,又到多重Decoder,最后Out Embedding,整个过程每一个模块都会涉及到大量的运算,且是大量的向量运算,每个向量可能都是万级维度。
按照整个Transformer运行的流程,它主要包含以下几个步骤上的关键运算:
输入嵌入
输入文本通常是以token的形式输入的。在将文本输入GPT模型之前,需要对文本进行分词(tokenization)处理,将文本分解为词或子词级别的token。每个token都会被映射为对应的词嵌入向量,然后作为模型的输入。
位置编码(Positional Encoding)
为了在模型中引入序列的位置信息,Transformer 使用位置编码来表示输入序列中每个位置的位置信息。
位置编码通常是通过正弦和余弦函数计算得到的,从而可以将每个位置的位置信息嵌入到输入表示中,它的表示公式如下:
其中:
-
pos 是输入序列中的位置索引,从1开始计数。
-
i 是位置编码的维度索引,从0开始计数。
-
dmodel 是输入表示的维度,也是位置编码的维度。
公式来源于ChatGPT,核心其实就是
(1)正弦和余弦函数的周期性特性可以帮助模型学习序列中位置之间的关系
(2)通过指数项中的 10000^2i /dmodel控制着不同位置之间的相对间隔。
最终的位置编码(n=100 和 d=4 的短语"I am a robot")
最后词嵌入向量还需要与位置编码向量做运算相加,作为最终输入到编码器的内容。
自注意力机制层计算
自注意力机制是 Transformer 模型的核心组成部分,用于计算输入序列中每个位置与所有其他位置的注意力权重。这包括以下几个关键的运算:
- 计算查询(Q)、键(K)和数值(V)向量(一种计算注意力的方法/策略)
-
- 查询向量(Q,Query) :查询向量用于衡量当前位置与其他所有位置的相似度,即确定当前位置应该关注序列中的哪些部分。查询向量是通过对输入向量进行线性变换得到的。
- 键向量(K,Key) :键向量用于表示序列中各个位置的重要性,即确定其他位置对当前位置的影响程度。键向量也是通过对输入向量进行线性变换得到的。
- 数值向量(V,Value) :数值向量包含了序列中各个位置的信息,用于计算加权平均值以生成最终的输出。数值向量同样是通过对输入向量进行线性变换得到的。
- 计算注意力分数(决定了模型在进行自注意力计算时每个位置对其他位置的重要性,影响最终的表示学习和模型性能)
- 计算查询(Q)和键(K)的相似度
- 缩放相似度
- Softmax 归一化
- 计算加权和
多头注意力计算
多头注意力计算(增强模型对不同表示空间的关注能力,提高模型的表征学习能力,即多组注意力计算)
-
这种技巧扩展了模型关注不同位置的能力,上图结果中的Z矩阵中的Z1主要包含了一点其他的编码成分,但是主要的关注点还在自己身上,这样对于一句话的翻译就很有作用了,比如说"The animal didn't cross the street because it was too tired",我们应该最需要的是it指代哪些单词.
-
多头的技术可以带来复合的"子空间表示",我们下一步要看到,利用多头的attention我们可以获得很多的KVQ矩阵(Transformer框架中使用了8个自注意力Heads)每一个这些矩阵的初始化都是随机的,训练结束后,每一个头所蕴含的含义都可以表示成一个子空间,流程如下:
计算出多头之后,还需要再压缩成一个,因为前向网络层只能接收一个,压缩的方式就是再构造一个权重矩阵,然后把八个矩阵拼接起来与构造的矩阵做乘法,结果得到一个需要维度的矩阵。
前馈神经网络层计算
Transformer 模型中的每个位置都会经过两个全连接层,这是为了增强特征表达能力。前馈神经网络包括以下运算:
-
线性变换,Z =XW +b
-
激活函数(通常是ReLU),A =f (Z),其中f为激活函数
-
第二次线性变换
残差连接和层归一化计算过程
也是模型中还有一个重要的结构,连接在self-Attention与FF层之间,在每个子层的输出上应用残差连接和层归一化,有助于减轻梯度消失和加速训练过程。
残差连接的运算是简单的加法操作,将输入信号与经过某些变换后的输出信号相加,得到残差块的最终输出。数学表达式为:
输出=输入+变换后的输出输出=输入+变换后的输出
层归一化是一种正则化技术,用于加速神经网络的训练过程,提高模型的泛化能力。层归一化通过对每个样本在特征维度上进行归一化,使得每个特征的均值为0,方差为1,从而有助于网络学习更稳定的表示。
层归一化的运算包括对每个样本的特征进行归一化操作,计算公式为:
其中,ϵ 是一个很小的数值,γ 和 β 是可学习的缩放和偏移参数。
解码器中的运算
解码器(Decoder)和编码器(Encoder)在结构上虽然有相似之处,但是计算过程中存在一些重要的不同之处。
编码器-解码器注意力层的计算
主要帮助解码器聚焦到输入序列的适当位置,这个步骤会一直重复,直到一个特殊符号(EOS)表示输出完成的时候终止。
自注意力掩码(Self-Attention Masking)
解码器中每个输出的单词在下一轮输出中是被放置到解码器的底层作为输入,并且解码器将结果一层一层的向上输出,同时位置编码也会添加到解码器的输入当中。这个过程主要使用掩码(masking)来确保模型在生成每个输出标记时只能依赖于已生成的标记,而不能依赖于后续的标记。这种遮掩机制有助于确保模型在生成序列时保持自洽性,具体流程如下:
输出时线性变换和 Softmax 操作
解码器最终会输出一个浮点数向量,这之后要涉及到的核心计算工作就是怎么把它变成一个词。这主要通过线性层上的线性变换及softmax层上的softmax计算。
线性层是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影成一个更大的向量,称为logits向量。
然后softmax层将这些分数转换为概率(所有分数都是正的,加起来都是1.0)。选择概率最高的单元格,并生成与之关联的单词作为此时间步骤的输出。
参数之大
首先,参数是什么?
参数指的是模型中需要学习和调整的权重值。这些参数是模型在训练过程中通过反向传播算法学习得到的,用于捕捉输入数据的特征和模式,以便进行有效的预测和推理。
在Transformer模型中,参数主要包括以下几种类型:
- 嵌入层参数:通常包括输入嵌入层和位置编码层,这些层的参数决定了输入序列中的单词和位置信息如何映射到连续向量空间。
- 编码器参数:编码器由多个编码器层组成,每个编码器层包括自注意力机制和前馈神经网络,其中自注意力机制和前馈神经网络的权重矩阵和偏置项都是参数。
- 解码器参数:解码器由多个解码器层组成,每个解码器层也包括自注意力机制、编码器-解码器注意力机制和前馈神经网络,这些层的权重矩阵和偏置项也是参数。
- 注意力机制参数:查询、键、值的权重矩阵以及注意力权重等都是参数。
- 前馈神经网络参数:包括两个线性变换和激活函数,它们的权重矩阵和偏置项也是参数。
- 其他参数:除了上述主要参数外,模型中还可能包括一些额外的参数,如残差连接和层归一化中的缩放参数等。
在训练过程中,模型会通过最小化损失函数来调整这些参数,使得模型能够更好地拟合训练数据,并在测试阶段进行准确的预测和推理。参数的学习和调整是深度学习模型训练的关键步骤,直接影响模型的性能和泛化能力。
因为Transformer复杂的结构设计,堆叠大量的编码器和解码器组件,每一个组件中都包含注意力层、前馈神经网络层、残差层等组件,而每一层中都会涉及大量的参数。这使得Transformer中的参数都是数以亿计,比如BERT有百亿个参数,GPT3.0中有千亿个参数,GPT-4 比 GPT-3 大六倍左右,具有 1 万亿个参数。
训练规模之大
这主要体现在两个方面,一个是算力,一个是训练语料规模。
一个模型的训练规模通常取决于具体的任务和数据集大小,受限于训练数据的质量和数量,一般来说Transformer模型在大规模数据集上进行训练时,需要更大的模型规模和更长的训练时间才能取得更好的性能和效果。另外,大规模训练数据集可以帮助Transformer模型更好地学习数据中的模式和规律,从而提高模型泛化能力、避免过拟合。
在实际应用中,为了训练大规模的Transformer模型,通常需要大量的计算资源,包括高性能的GPU或TPU加速器以及大规模的数据集。根据数据,训练GPT-3这样规模庞大的模型可能需要数千个GPU或者TPU进行并行训练,以加快训练速度和提高效率。同时,为了支持这种大规模的训练,需要强大的计算基础设施和高速的通信网络来处理数据和参数更新。
另外,在训练大模型的过程中,通常使用互联网上的大规模文本数据集,如维基百科、网页文本、书籍、新闻文章、论坛帖子等等,以提高模型的语言理解能力和生成能力。通过在大规模数据集上进行预训练,大模型可以学习到更加通用和智能的语言表示,从而在各种自然语言处理任务中表现出色。
参考: