接上文:大模型从基础到入门——大模型文件-CSDN博客

本文主要记录入门大模型学习的相关知识,以期为后续工作学习提供帮助。(除了我自己截图外,引用的我尽量标注来源,有些忘记来源了请告诉我orz)

目录

一、大模型基础知识

1.1 专业名词

1.2 Transformer模型

1.3 自注意力机制

1.4 输入处理

1.4.1 Tokenizer

1.4.2 位置编码

1.5 Encoder

1.5.1 激活函数

1.5.2 全连接层

1.6 Decoder

1.7 GPT系列decoder-only

1.7.1 pre-norm与post-norm

1.7.2 KVcache

1.7.3 MHA、MQA、GQA

参考:


一、大模型基础知识

我们先从一些专业名词开始:

1.1 专业名词
  1. 大模型:一般指参数规模很大的深度学习模型,现在主流为Transformer改进的GPT系列decoder-only模型;
  2. 模型参数:模型中可调节的数值,与模型权重文件有关,以参数个数计数,大模型参数规模一般以10亿为单位(Bilion),从计算机存储方面简单来看1B=1G;
  3. AGI——Artificial General Intelligence:通用人工智能,AI邻域的理想研究目标;
  4. AIGC:利用AI技术生成的内容;
  5. Prompt:提示词,引导大模型生成特定输出的上下文指令或信息;
  6. Token:分词的基本单位,可以简单认为一个中文文字对应一个token,一个英文字符对应一个token(具体划分按使用算法为准,可以看看tokenizer.json文件);
  7. 推理:大模型根据输入,生成输出结果的过程;
  8. 涌现:是大模型训练中的一种现象,在模型规模达到一定阈值后,在多任务中表现能力显著提升,可能是多个简单小组件构成一个大组件,而大组件具备小组件所没有的解决复杂问题的能力;
  9. Agent:智能体,可以在环境中感知、思考、采取行动的AI系统;
  10. 幻觉:大模型生成内容看似合理,但实际上不准确、无对应来源,与大模型按概率生成输出的性质有关;
  11. 预训练——Pre-training:在大规模无标准数据上训练模型,学习通用语言规律;
  12. 微调——Fine Tuning:基于预训练模型,在特定领域的小规模数据上继续训练模型;
  13. 监督微调——Supervised Fine Tuning:SFT,使用有标注数据集训练模型;
  14. 人类反馈的强化学习——Reinforcement Learning from Human Feedback:RLHF,通过人类反馈优化模型输出,使其与人类偏好对齐,属于强化学习邻域;
  15. 知识蒸馏/模型蒸馏:压缩模型大小的技术,通过训练小模型拟合大模型输出结果,达到减少资源、时间的目的。在deepseek前,蒸馏要求大小模型训练时有计算loss的交互,在deepseek出现后,可以用大模型生成数据集微调小模型,这种叫黑盒蒸馏;
  16. 在线学习:指模型能实时更新参数以适应不断变化的数据环境,适用于数据流持续到达的场景;
  17. prefix LM (前缀语言模型):在输入序列的开头添加一个可学习的任务相关的前缀,然后使用这个前缀和输入序列一起生成输出。这种方法可以引导模型生成适应特定任务的输出。优点是可以减少对预训练模型参数的修改,降低过拟合风险;缺点是可能受到前缀表示长度的限制,无法充分捕捉任务相关的信息。

  18. causal LM (因果语言模型):也称为自回归语言模型,它根据之前生成的 token 预测下一个token。在生成文本时,模型只能根据已经生成的部分生成后续部分,不能访问未来的信息。优点是可以生成灵 活的文本,适应各种生成任务;缺点是无法访问未来的信息,可能生成不一致或有误的内容。

基础专业名词就先到这里,接下来我们看看大模型的基础知识。

1.2 Transformer模型

由论文《Attention is All You Need》提出,其结构图如下:

这张图可以分为左右两个部分:左边部分为编码器,是N个Encoder模块的堆叠,负责将处理输入为编码;右边部分为解码器,是N个Decoder模块的堆叠,负责生成输出。

Encoder和Decoder共同点:都由多头注意力、前馈神经网络层组成;

Encoder和Decoder不同点:Decoder中处理输入的是带掩码的多头注意力,即当前词与后续词无关,防止未来信息泄露。

基于Transformer模型,我们再深入一点到注意力机制、输入处理中。

1.3 自注意力机制

如图所示,对输入X进行线性变换,得到QKV三个矩阵,再根据这三个矩阵计算注意力attn,其公式为:

Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k})})V

其中d为向量维度,除以d的平方根是类似归一化操作,防止QK内积过大导致梯度消失,将其缩小到softmax的敏感区间。

输入长度为n,QK得到的是n*n的矩阵,每一个数值代表了当前词与其他n-1个词的关系。

而其中矩阵乘法的点积操作有以下作用:衡量两个向量的语义关联性、关联每个参数、建立长距离依赖。

所以注意力机制可以减轻梯度消失问题,为大模型提供一些可解释性。

1.4 输入处理

为了将输入转化为可以计算的数值,我们要将每一个词映射到向量空间中,这就是tokenizer的作用,将输入划分为多个token,每个token都有对应的ID数值,根据这个ID由嵌入矩阵映射到统一维度的向量空间中,这个过程就叫Embedding。

从自注意力机制中可以发现,如果只对输入embedding为向量,那么对于不同位置的同一个词,他们的向量是一样的,在此基础上直接计算注意力数值attn,那么这个注意力数值只与不同词之间的关系有关,相同词之间的数值是一样的,这导致计算没有记录不同词之间的位置关系,所以我们不仅仅要对输入的词做embedding,还要对词的位置信息也做embedding:

那这里又引入了两个知识点:tokenizer的算法和位置信息的编码方式。

1.4.1 Tokenizer

来源于NLP对输入进行处理的过程,目的是将输入划分为一个个独立的字串,且每个子串都有完整语义,按划分粒度来看有三种划分维度:字符、子词、词。

按字符划分导致划分后序列很长,每个字符包含语义过大,训练困难;按词划分在遇到不在词表中词时会出现OOV(out of vocab)问题,而过大的词表又会导致内存爆炸的问题;子词划分则介于前两个的中间,可以平衡词汇量和语义独立性问题。

BPE(Byte Pair Encoding,子词算法)便是目前最常用的算法,其流程为:

  1. 准备足够大的训练语料
  2. 确定期望的subword词表大小
  3. 将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么我们将其改写为“ l o w </ w>”:5
  4. 统计每一个连续字节对的出现频率,选择最高频者合并成新的subword
  5. 重复第4步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1
1.4.2 位置编码

位置编码一般分为两种:绝对位置编码和相对位置编码。

绝对位置编码:在每个输入序列元素上添加一个位置向量,表示该元素在序列中的位置,通常用固定函数生成即可,实现简单,如BERT用正余弦函数计算编码,但外推性较差(长距离位置关系、未见过的长度序列等情景下的性能);

相对位置编码:关心各元素间相对位置关系,通常用一个位置编码矩阵计算实现,可以建立长距离语义关系,能更好处理序列局部结构信息,但需要额外空间保存矩阵参数(学习参数方式实现),且计算效率低(因为每一层都要计算相对位置),同时kvcache也会更复杂(新输入token会影响已经生成的值)。

1.4.3 RoPE

目前大模型常用的是旋转位置编码RoPE,一种通过绝对位置编码的形式实现相对位置编码的方法,简单来说就是通过复数实现

从上面的图片可以看出,其计算过程与线性代数中旋转矩阵类似,我们可以使用矩阵R_m将二维向量x绕原点旋转m弧度:

R_m \cdot x = \begin{bmatrix} cos m & -sin m \\ sinm & cosm \end{bmatrix} \cdot x

那么我们只需要将注意力中向量Q和K按其位置索引旋转,便可以将位置信息加入向量中进行计算了,为了将上面二维向量的公式推广到d维度,我们可以对向量进行分组,将相邻两个维度作为一组,共d/2组,每组旋转m \cdot \theta_i弧度,其中:

\theta_i = 10000^{-2i/d}

该设置沿用了Transformer中sinusoid位置编码设置,具有远程衰减特性。

所以,RoPE对输入序列长度没有限制,可以接受未训练长度的输入,这种方式叫直接外推。但事实证明,直接外推得到的输出性能下降严重:

当时模型预训练最大序列长度为2048,而当i=d/2时,序列长度62,832表示旋转一圈,而超过模型预训练长度的部分在这种情况下旋转弧度不匹配,效果便不好。

为解决该问题,线性内插方法被提出,该方法核心思想就是将输入序列长度与预训练最大序列长度做一个映射:

\theta_i = 10000^{-2i/d} \cdot k^{-1}

其中,k为推理最大长度 除以 预训练最大长度,这样只需再增量训练1000步就可以达到很好的效果。

1.4.4 RoPE的改进

a.NTK-aware Scaled RoPE

上面的方法虽然解决了外推的问题,但都需要进行额外的训练,NTK-aware Scaled RoPE将向量靠前维度直接外推,靠后的线性内插:

\theta_i = 10000^{-2i/d} \cdot k^{-2i/(d-2)}

其中,由于i实际取不到d/2,为保证最后一组仍是线性内插,我们将k的缩放改到d/2-1。

在Transformer库中的LLaMa模型就基于此提出一种更一般的公式:

\theta_i = 10000^{-2i/d} \cdot (\alpha k-\alpha+1)^{-2i/(d-2)}

原理就是将最后一组的索引映射尽可能缩小,以接近预训练索引长度,提高性能。

b.ReRoPE

该方法参考ReLU函数思想,对向量超过长度w的部分进行截断,或类似Leaky ReLU进行平滑处理。

该方法可以适用于任意长度,且性能优于第一种方法,但由于引入分段函数,导致运算规则变化,增加了推理成本。

在预训练使用Leaky RoPE,推理时采用原始RoPE,则可以实现以小博大的效果。


1.5 Encoder

回到Transformer模型,我们可以发现一层encoder由一个注意力层和一个前馈神经网络层组成,他们后面都有一层残差连接和层归一化。

  1. Add:残差连接,解决多层网络训练中梯度消失问题,可以让网络只关注输入间差异;
  2. Norm:指层归一化,将输入转化为均值方差都一样的形式,可以加速收敛;
  3. Feed Forward:前馈神经网络,这里一般指一个两层的全连接层,第二层没有激活函数,其公式为:max(0,XW_1 + b_1)W_2 +b_2

多个这样的encoder block叠加起来就是Encoder,这里引入一个知识点:激活函数。

1.5.1 激活函数

激活函数可以为神经网络引入非线性变化,使模型能学习复杂的数据,主流的激活函数有ReLU、GELU、swish函数:

  1. ReLU函数很简单,其公式为ReLU(x) = max(0,x),但会导致输出为负数的神经元节点死亡,在反向梯度传播时不会更新这些节点;
  2. GELU则是ReLU的改进,使函数变得平滑,处处可导,但计算复杂度很高;
  3. Swish函数也是这个意思,即大于0的部分导数相对固定,而小于0的部分导数趋近于0,同时使函数处处可导,其公式为:

    swish(x)=sigmoid(\betax)×x

    sigmoid(x)=\frac{1}{1+e^{-x}}

  4. SwiGLU,其实是Swish函数+门控机制,SwiGLU(x)=Swish(xW)⊗(xV),门控机制用于控制通过信息的多少,这样会引入更多权重矩阵,通常会对隐藏层大小做缩放,保证整体参数量不变。

1.5.2 全连接层

前馈神经网络/全连接/多层感知机MLP层,Transformer全连接层通常包括简单的两个线性变换层+一个激活函数(从深度学习角度来看,二层线性变换就可以逼近任意非线性函数):

MLP(X) = Dropout(Linear_2(Activation(Linear_1(X))))

在后续大模型中(如LLaMa、MoE结构)引入门控机制,本质不变,但可以过滤冗余信息,在不减少计算效率的同时提高模型表达能力。:

MLP(x) = down_{proj}(SiLU(gate_{proj}(x)) * up_{proj}(x))

1.6  BERT的Decoder-only

相似的,decoder block中也包含了类似的结构,只是改变了encoder几个地方,这里只重点说明变化的地方:

  1. 第一个多头注意力层采用掩码形式,防止未来信息泄露;
  2. 第二个多头注意力层中K、V用encoder得到的编码信息矩阵C来计算得到,只有Q用decoder的输出;
  3. 在decoder结尾使用了softmax计算下一个token的概率

Transformer中的掩码Mask让当前输出的token只和自己、前面的token有关,和未来token都无关(工程实现是加一个很大的负数,单纯置零会导致增加无效位置权重,和softmax特性有关):

综上,这就是Transformer模型结构,而当今主流大模型根据使用Transformer结构的改进,可以分为三种:

  1. 只使用encoder,比如BERT;
  2. 只使用decoder,比如GPT、LLaMA;
  3. 两个都使用,比如T5、GLM;

BERT在此基础上进行了三个创新:

双向编码器架构:只使用encoder结构,比起输出,更强调理解输入序列;

掩码语言建模MLM:通过随机掩码输入中15%的标记,再让模型预测这些被屏蔽的标记,实现双向上下文理解;

下一句预测NSP:通过判断两个句子是否为连续句子,增强句子间关系理解。

后续我们以当前最热门的GPT系列来说明。

1.7 GPT系列decoder-only

可以看看开源模型LLaMA模型的结构:

相比于传统Transformer,llama做了几个改进:

  1. RMS-norm归一化操作前置,叫pre-norm;
  2. 激活函数由ReLU改为SiLU;
  3. 使用分组查询注意力机制GQA,减少kvcache占用显存,提高计算效率;
  4. 使用MLP(多层感知机)代替简单两层全连接层,引入门控机制,MLP(x) = down_proj(SiLU(gate_proj(x)) * up_proj(x)),过滤冗余信息,在不减少计算效率的同时提高模型表达能力。

我们可以看看Meta-Llama-3.1-8B-Instruct/model.safetensors.index.json文件:

  1. 其中lm_head.weight用于处理输出,得到下一个token概率;
  2. model.embed_tokens.weight是将输出转化为向量的矩阵;
  3. input_layernorm就是pre-norm,这个权重代表对归一化后的数值进行缩放;
  4. post_layernorm其实就是pre-norm,不过换个角度来看,就是attention层的post-norm。

输入x的计算流程为:x → input_layernorm → Self-Attention → Residual Add → post_attention_layernorm → MLP → Residual Add → Output

这里又引入几个知识点:

1.7.1 pre-norm与post-norm

相比于传统的post-norm(先计算,再加残差,最后归一化),pre-norm则先进行归一化操作,再计算的流程,可以避免梯度消失问题,并加快训练速度(但上限低于post-norm,因为归一化会降低模型表征能力)。

同时,采用RMS归一化,省略层归一化的均值减法,提高计算效率

1.7.2 KVcache

虽然前面也提到了KVcache,这里详细说明一下。大模型推理可以分为两个阶段:prefill和decode。

prefill:对输入tokens一次性并行计算,最终输出第一个输出token;

docode:每次输入上次生成的token,生成一个token,直到生成EOS,拼接起来得到最终response。

现在再看看decode第一次的计算过程

上图为输入到输出的过程,step0先输入‘你好’,计算部分为红色矩阵,得到输出‘啊’,再把输出‘啊’与step0输入拼接起来,作为step1的输入‘你好啊’,此时新增的计算部分为白色矩阵,我们可以发现,红色矩阵部分数值是不受影响的,只需要计算新输入‘啊’的部分即可,为避免重复计算,我们可以只保存前面步骤计算得到的K、V矩阵,再与新输入计算后的向量拼接即可。

这个简化计算的方法就叫KVcache

1.7.3 MHA、MQA、GQA

现在已知KVcache会随着输入输出序列长度增加而增大,保存和加载KVcache成为一个挑战,所以提出了一些优化KVcache的方法。这里我们先只关心MHA、GQA、MQA方法:

如图最左边,MHA作为最开始的注意力机制方法,对每一个Q头,都有一个KV与之对应;

如图最右边,MQA就是为了减少KVcache提出的,对所有的Q头,都有且只有一个相同的KV与之对应,这样我们只用一份KVcache就可以,但效果会大打折扣;

如图中间部分,GQA是一个折中的办法,即多个Q头共享一个KV,平衡了存储成本和最终效果。

至此,普通大模型的基础知识就介绍完成,但要想更深入理解大模型相关理论知识,入门大模型还需要更进一步。

参考:

大模型基础知识汇总(非常详细)零基础入门到精通-CSDN博客

Transformer模型详解(图解最完整版) - 知乎

NLP中Tokenizers总结(BPE、WordPiece、Unigram和SentencePiece)-CSDN博客

让研究人员绞尽脑汁的Transformer位置编码 - 科学空间|Scientific Spaces

探秘Transformer系列之(9)--- 位置编码分类 - 罗西的思考 - 博客园

十分钟读懂旋转编码(RoPE)

旋转式位置编码 (RoPE) 知识总结 - 知乎

大模型基础|激活函数|从ReLU 到SwiGLU - 知乎

多层感知机(MLP):从数学原理到实战应用-腾讯云开发者社区-腾讯云

大模型LLMs组件系列:全连接网络FCN与典型代表MLP - 知乎

注意力机制进化史:从MHA、MQA、GQA、MLA到NSA、MoBA!_nsa mla-CSDN博客

注意力模型---Attention Model_加性注意力-CSDN博客

Transformer两大变种:GPT和BERT的差别(易懂版)-2更

大模型 LLM 架构对比,DeepSeek、Llama、Qwen、Kimi、Mistral、Gemma-腾讯云开发者社区-腾讯云

图解LLM训练和推理的秘密-1 - 知乎

十分钟读懂旋转编码(RoPE)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐