大语言模型(LLM)入门级选手初学教程 II

模型架构


5.1

  1. 输入编码:
    i. 词元序列编码 Input Embedding Module
    ii. 位置编码(Position Embedding, PE),Transformer 的编码器结构本身无法识别序列中元素的顺序。
    𝒙𝑡 = 𝒗𝑡 + 𝒑𝑡
    ** 绝对位置编码局限于建模训练样本中出现的位置,无法建模训练数据中未出现过的位置,因此极大地限制了它们处理长文本的能力
  2. 多头自注意力机制
    i. 能够直接建模任意距离的词元之间的交互关系,进而有效捕获长程依赖关系,具有更强的序列建模能力,支持大规模参数的高效优化

  3. 前馈网络层(Feed Forward Netwok, FFN)
    前馈网络层通过激活函数引入了非线性映射变换,提升了模型的表达能力,从而更好地捕获复杂的交互关系
  4. 编码器:在注意力和前馈网络后,模型使用层归一化和残差连接来加强模型的训练稳定度(残差连接(Residual Connection)将输入与该层的输出相加,实现了信息在不同层的跳跃传递,从而缓解梯度爆炸和消失的问题。而LayerNorm 则对数据进行重新放缩,提升模型的训练稳定性)
  5. 解码器,自回归生成

  1. 归一化方法-加强神经网络训练过程的稳定性

    a. LayerNorm: Batch Normalization, BN,难以处理可变长度的序列数据和小批次数据,对batch内数据样本做计算,因此,提出层归一化-计算每一层(对每个样本内)中所有激活值的均值𝝁 和方差𝝈,从而重新调整激活值的中心和缩放比例:

    b. 均方根层归一化(Root Mean Square Layer Normalization, RMSNorm):仅利用激活值总和的均方根RMS(𝒙) 对激活值进行重新缩放,使模型在训练速度和性能上均具有一定优势

    c. DeepNorm:稳定深层Transformer的训练,在LayerNorm 的基础上,在残差连接中对之前的激活值𝒙 按照一定比例𝛼 进行放缩,层数可以被成功地扩展至1,000 层,进而有效提升了模型性能与训练稳定性。GLM-130B使用

  2. 归一化模块位置

    通常有三种选择,分别是层后归一化(Post-Layer Normalization, Post-Norm)、层前归一化(Pre-Layer Normalization, Pre-Norm)和夹心归一化(Sandwich-Layer Normalization, Sandwich-

    Norm)

    a. Post-Norm:归一化模块被放置于残差计算之后 ,优点:有助于加快神经网络的训练收敛速度,使模型可以更有效地传播梯度,从而减少训练时间;以降低神经网络对于超参数(如学习率、初始化参数等)的敏感性,使得网络更容易调优,并减少了超参数调整的难度。缺点:在输出层附近存在梯度较大的问题,不稳定 。通常与其他策略联合使用

    b. Pre-Norm:将归一化模块应用在每个子层之前 ,在最后一个Transformer层后还额外添加了一个LayerNorm。仅仅对输入 的表示进行了归一化,从而可以防止模型的梯度爆炸或者梯度消失现象,稳定 但性能却逊色于采用了Post-Norm 的模型。

    c. Sandwich-Norm:在Pre-Norm 的基础上,在残差连接之前增加了额外的LayerNorm,避免Transformer 层的输出出现数值爆炸的情况。但仍然会引发训练崩溃,不如pre-norm稳定

  3. 激活函数 - 引入非线性变化,从而提升神经网络的模型能力

    a. ReLU(Rectified Linear Unit)激活函数,神经元失效的问题,被置为0 的神经元将学习不到有用的信息

    b. 其他

    c. GLU(Gated Linear Unit):引入了两个不同的线性层,性能更好

  4. 位置编码 - 自注意力模块具有置换不变性,无法捕捉序列中的顺序关系

    a. 绝对位置编码

    b. 相对位置编码: 根据键和查询之间的偏移量计算得,通常应用于注意力矩阵的计算中,而不是直接与词元本身的位置编码进行相加。r_j引入相对位置信息,全局参数u和v衡量语义信息和相对位置信息本身的重要程度

    r表示查询和键之前偏移的可学习标量

    c. 旋转位置编码(Rotary Position Embedding, RoPE):根据绝对位置信息的旋转矩阵来表示注意力中的相对位置信息

    根据位置信息为序列中每个词元所对应的设置了独有的旋转矩阵,并和对应的查询Q和键K进行相乘进行融合,位置t的旋转矩阵可定义为:

    位置索引为𝑖 的旋转矩阵和位置索引为𝑗 的旋转矩阵的转置的乘积等同于位置索引为它们相对距离𝑖− 𝑗 的旋转矩阵。注意力公式可以调整如下:

    RoPE 在处理查询和键向量的时候,将每对连续出现的两个元素视为一个子空间。因此,对于一个长度为𝐻 的向量来说,将会形成𝐻/2 个这样的子空间。每一个子空间𝑖 ∈ {1, . . . , 𝐻/2} 所对应的两个元素都会根据一个特定的旋转角度𝑡 · 𝜃𝑖 进行旋转,其中𝑡 代表位置索引,而𝜃𝑖 为该子空间中的基。b=10000

    每个子空间定义了波长𝜆𝑖,即在该子空间上完成一个完整周期(2𝜋)旋转所需的距离,b越大,波长越大,具有良好的外推性以及长期衰减的特性。

    代码实现如下:

    d. ALiBi位置编码: 通过在键和查询之间的距离上施加相对距离相关的惩罚来调整注意力分数

    𝑖 − 𝑗 是查询和键之间的位置偏移量,𝑚 是每个注意力头独有的惩罚系数,惩罚分数是预先设定的,不需要引入任何可训练的参数,优秀的外推性能,能够对于超过上下文窗口更远距离的词元进行有效建模。

  5. 注意力机制

    a. 完整自注意力机制:对于序列长度为𝑇 的序列需要𝑂(T^2) 的计算复杂度

    b. 稀疏注意力机制:

    * 滑动窗口注意力机制(Sliding Window Attention, SWA):滑动窗口注意力设置了一个大小为𝑤 的窗口,对每个词元𝑢𝑡,只对窗口内的词元[𝑢𝑡−𝑤+1, . . . , 𝑢𝑡 ] 进行注意力计算,从而将复杂度降低到𝑂(𝑤𝑇)。通过信息的逐层传递,模型实现了随着层数线性增长的感受野 ,从而获取远处词元的信息。

    c. 多查询/分组查询注意力(Multi-Query Attention, MQA/ Grouped-Query Attention, GQA):MQA针对不同的头共享相同的键和值变换矩阵,减少了访存量,提高了计算强度,从而实现了更快的解码速度,且对于模型性能产生的影响也比较小;GQA 将全部的头划分为若干组,并且针对同一组内的头共享相同的变换矩阵。这种注意力机制有效地平衡了效率和性能,被LLaMA-2 模型所使用。

    d. 硬件优化的注意力机制:FlashAttention 通过矩阵分块计算以及减少内存读写次数的方式,提高注意力分数的计算效率;PagedAttention 则针对增量解码阶段,对于KV 缓存进行分块存储,并优化了计算方式,增大了并行计算度,从而提高了计算效率。

  6. 混合专家模型

  • 随着模型参数规模的扩大,计算成本也随之增加。引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE),旨在不显著提升计算成本的同时实现对于模型参数的拓展。
  • 每个混合专家层包含𝐾 个专家组件,记为[𝐸1, 𝐸2, . . . , 𝐸𝐾],每个E为一个前馈神经网络。对于输入的每个词元,通过路由网络(或称为门控函数)𝐺 来计算该词元对应于各个专家的权重。在路由函数中,首先通过线性层𝑾𝐺 ∈ R^𝐻×𝐾 映射为𝐾 个专家的得分,并基于此选择出概率最高的𝑘 个专家进行激活。随后,这𝑘 个专家的得分将被送入softmax函数计算出它们的权重𝐺(𝒙𝑡 ) = [𝐺(𝒙𝑡 )1, . . . ,𝐺(𝒙𝑡 )𝑘],没有被选择的专家权重将被置为0。

Mixtral 每一层都配备了8 个专家(7B),并对每个词元选择2 个专家进行后续计算。在每次计算被激活的参数仅仅有13B的情况下,其性能超越了更熟规模更大的LLaMA-2 (70B),代码如下:

  1. LLaMA 的详细配置

5.2 主流架构

  1. 编码器-解码器架构
  2. 因果解码器架构:绝大部分主流的大语言模型采用了单向的掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元
  3. 前缀解码器架构:GLM-130B和U-PaLM,输入(前缀)部分使用双向注意力进行编码,于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。在编码和解码过程中是共享参数

5.4 长上下文模型

给定一个预训练后的大语言模型,如何有效拓展其上下文窗口以应对更长的文本数据成为当前学术界的研究焦点

  1. 扩展位置编码:训练集数据长度分布范围外的位置编码无法充分训练,导致处理长文本性能下降,所以要对位置编码进行扩展,超出原始上下文窗口的文本上,也能够表现出较好的建模能力,即外推(Extrapolation)能力。RoPE 在未经特殊修改的情况下并不具备良好的外推能力,旋转角度超过其训练中的角度分布范围需要进行改进,旨在提升其在不经过训练或继续训练的情况下对于长文本的建模能力。
  • 在RoPE 的每个子空间𝑖 上,对于相对位置𝑡,旋转角度𝑓 (𝑡, 𝑖) = 𝑡 · 𝜃𝑖 的修改可以分解为对距离𝑡 的修改𝑔(𝑡) 和对基𝜃𝑖 的修改ℎ(𝑖)

  • 直接微调:不修改RoPE,使用相应的长文本数据对于模型进行微调,但旋转角度增大可能导致收敛缓慢,并需要大量数据进行继续预训练

  • 位置索引修改:修改位置索引𝑔(𝑡) 来调整所有子空间的旋转角度,从而保证其不超过原始上下文窗口所允许的最大值

    • 位置内插:对于位置索引进行特定比例的缩放,保证旋转角度不会超过原始上下文窗口的最大值,优点是训练代价小,缺点是在处理较短的文本时,由于位置索引的缩放,可能会对模型的性能产生一定的负面影响。

    • 位置截断: 针对不同距离采用了不同的处理方式。对模型中近距离敏感的位置索引进行保留,同时截断或插值处理远距离的位置索引。先设定一个小于原始上下文窗口长度的窗口大小𝑤 (𝑤 ≤ 𝑇max)。窗口内位置索引不变,超出部分截断或者线性插值(将目标上下文窗口长度的位置索引映射回原始上下文窗口长度)

  • 基修改:每个子空间𝑖 都有一个对应的波长𝜆𝑖,表示在该子空间上旋转一周所需要的距离。某些子空间的波长可能会超过上下文窗口的长度(𝜆𝑖 > 𝑇max),导致模型在这些子空间上无法对完整的旋转周期进行训练(关键子空间),面临长文本时旋转角度对应的正余弦函数值并没有在训练阶段出现过,注意力值会出现异常。所以需要对子空间的基ℎ(𝑖) 进行缩放,可以通过对基的底数修改以及对基的截断实现

    • 底数调整:𝛼 是一个大于等于放缩比例的数,通过对底数进行增大,实现缩小基来处理更长文本的能力

    • 基截断:修改关键子空间来避免产生过大的旋转角度

  1. 调整上下文窗口
    采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模
  • 并行上下文窗口:分而治之,将输入文本划分为若干个片段,每个片段都进行独立的编码处理,共享位置编码,无法有效地区分不同段落之间的顺序,可能会限制模型的表现能力
  • Λ 形上下文窗口:有选择性地关注每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。无法充分利用所有的上下文信息。
  • 词元选择:挑选出最重要的𝑘 个词元,以实现对于完整注意力的有效拟合
    • 查询与词元相似度:可以首先选定若干层,针对这些层从外部存储中检索到最相关词元的键值对,进一步将其送入注意力计算模块中,为模型补充远程语义信息;而在其他层中,模型仍然针对上下文窗口内的词元进行注意力计算。
    • 查询与分块相似度:从分块序列中选择出最相关的部分分块,所有的隐状态压缩为一个键向量表示,然后利用𝑘 近邻方法选出与查询最相关的𝑘 个分块,并保证这些块中的总词元数目至多为𝑇max
  1. 长文本数据
  • 长文本数据量:采用少量长文本数据进行轻量化的继续预训练,仅需使模型适应更长的上下文窗口,只需在约1B 级别的词元上执行数百步的训练,就可以将7B 或者13B 大小的LLaMA 系列模型的上下文窗口至100K 词元以上的长度,并具有较好的长上下文利用能力
  • 长文本数据混合:长文本的领域分布和长文本的类型,长文本数据的领域应尽可能多样化,并且与预训练数据集的分布保持相似。整体型(完整的有意义的长文)、聚合型(多篇相关文本的聚合)和杂乱型(杂乱无章的文本),去除杂乱型可以提升模型能力
  1. 新型模型架构
  • 参数化状态空间模型

模型预训练

一、预训练任务

  1. 语言建模(Language Modeling, LM)
  • 前缀语言建模

  • 中间填充任务

  1. 去噪自编码(Denoising Autoencoding, DAE)

    输入文本经过一系列随机替换或删除操作,形成损坏的文本,根据这些损坏的文本恢复出被替换或删除的词元片段

  2. 混合去噪器(Mixture-of-Denoisers, MoD)

  • S-去噪器与前缀语言建模的目标相同
  • R-去噪器和X-去噪器与去噪自编码任务的优化目标更为相似,在被掩盖片段的跨度和损坏比例上有所区别(15%,50%)
  • 实现上,输入句子会以特殊词元(如[R], [S], [X])作为开头,辨别使用哪一个去噪器

二、优化参数设置

  1. 基于批次数据的训练
    通常Batch size设置为较大的数值,例如1M 到4M 个词元,从而提高训练的稳定性和吞吐量。动态批次调整策略,即在训练过程中逐渐增加批次大小,最终达到百万级别,可以有效地稳定大语言模型的训练过程。较小的批次对应反向传播的频率更高,训练早期可以使用少量的数据让模型的损失尽快下降;而较大的批次可以在后期让模型的损失下降地更加稳定,使模型更好地收敛。
  2. 学习率
    预热阶段和衰减阶段
  • 预热阶段一般占整个训练步骤的0.1% 至0.5%,预热阶段使用较小的学习率使得训练较为稳定,通常使用线性预热逐步调整学习率,最大阈值通常设定在5 × 10^−5 到1 × 10^−4 之间。
  • 然后学习率便开始进行衰减,一般会衰减到其最大阈值的10%
  1. 优化器
    Adam & 其变种AdamW,Adam 优化器使用梯度的"动量"作为参数的更新方向
  2. 稳定优化技术
  • 梯度裁剪(Gradient Clipping):损失的突增,当梯度的模长超过给定的阈值后,便按照阈值(通常为1.0)进行截断
  • 训练恢复:每隔固定的步数设置一些模型存档点,便于异常恢复
  • 权重衰减:AdamW在更新模型参数的时候引入衰减系数,这个系数通常设置为0.1。稳定训练过程,提高模型的泛化能力
  • Dropout:考虑到大规模的训练数据和模型中存在的归一化结构,已有工作很少用Dropout技术。

三、可扩展的训练技术

提高训练效率 & 如何将庞大的模型有效地加载到不同的处理器中

  1. 3D 并行训练,包括数据并行(DataParallelism)、流水线并行(Pipeline Parallelism)和张量并行(Tensor Parallelism)。
  • 数据并行:提高训练吞吐量,将模型参数和优化器状态复制到多个GPU 上,然后将训练数据平均分配到这些GPU 上,每个GPU 只需要处理分配给它的数据,然后执行前向传播和反向传播以获取梯度。所有GPU 都执行完毕后,该策略会将不同GPU 的梯度进行平均,以得到整体的梯度来统一更新所有GPU 上的模型参数
  • 流水线并行:将大语言模型不同层的参数分配到不同的GPU 上,配合梯度累积(Gradient Accumulation)技术进行优化,计算一个批次的梯度后不立刻更新模型参数,而是累积几个批次后再更新,这样便可以在不增加显存消耗的情况下模拟更大的批次
  • 张量并行:与流水线并行是两种将大模型参数加载到多个GPU 上的训练技术,张量并行的分配粒度更细,它进一步分解了模型的参数张量(即参数矩阵),以便更高效地利用多个GPU 的并行计算能力,𝑾𝑯拆为[𝑾1𝑯,𝑾2𝑯]。常见的张量并行策略是分解模型注意力层的𝑾𝑄,𝑾𝐾,𝑾𝑉,𝑾𝑂 矩阵参数和前馈网络层的𝑾𝑈,𝑾𝐷 矩阵参数
  1. 零冗余优化器(Zero Redundancy Optimizer, ZeRO)
    主要用于解决数据并行中的模型冗余问题,即每张GPU 均需要复制一份模型参数。仅在每个GPU 上保留部分模型参数和优化器参数,当需要时再从其它GPU 中读取。如上图所示,模型被均分在两张GPU 上,当需要使用第一层计算时,两张卡分别从对方获取相应的模型参数进行计算,使用完之后便可以释放相应显存,从而降低了显存冗余度完全分片数据并行(Fully Sharded Data Parallel, FSDP)。
  2. 激活重计算(Activation Recomputation)
    即梯度检查点(Gradient Checkpointing),是一种用于优化反向传播时显存占用的技术。常见方法是将Transformer 的每一层的输入保存下来,然后在反向传播时计算对应层内的激活值。
  3. 混合精度训练
    早期模型使用单精度浮点数(FP32)表示模型参数并进行优化计算,同时使用半精度浮点数(2 个字节)和单精度浮点数(4 个字节)进行运算,以实现显存开销减半、训练效率翻倍的效果。
    在训练过程中,会先将这些32 位参数转换为16 位参数,随后以16 位精度执行前向传播和反向传播等操作,最后在参数更新时再对32 位模型进行优化。
  • 半精度浮点数表示方式FP16:1 位符号位、5 位指数位和10 位尾数位,表示范围为−65504 到65504
  • 半精度浮点数表示BF16:1 位符号位、8 位指数位和7 位尾数位,表示范围可以达到10^38 数量级

四、模型参数量计算与效率分析

  1. 参数量计算
    词表V,L层,维度H,前馈网络H'
  • 输入嵌入层:V*H
  • 多头注意力层:QKV矩阵共3HH个参数,线性变换H*H
  • 前馈网络层:三个线性变换,3 × 𝐻𝐻′
  • 归一化层:自注意力和前馈网络前各一个归一化,2*H,最后一层输出H
  • 输出层:V*H

  1. 训练运算量估计
    模型在训练过程中,需要进行的浮点运算次数(Floating Point Operations, FLOP)。模型总参数量为𝑃,批处理大小为𝐵,输入序列长度为𝑇,因此训练词元总数为𝐶 = 𝐵𝑇;多头注意力机制包含𝑁 个头,每个头的维度为𝐷,因此和中间状态维度𝐻 满足关系𝐻 = 𝑁𝐷。
  • 多头注意力:𝑸′𝑲′⊺ 的矩阵乘法+放缩+softmax+𝑽′ 矩阵乘法,后向传播的运算量大致为前向传播的两倍

  • 线性变换:四个映射+前馈网络层的变换+输出层映射

    多头注意力的运算量约为线性变换运算量的𝑇/6𝐻 ,考虑到大模型训练场景下序列长度𝑇 小于等于中间状态维度𝐻,因此多头注意力运算量最多为线性变换运算量的1/6,线性变换的参数量通常占总参数量的95% 以上

  • 参数量为𝑃 的模型在𝐶 个词元上进行预训练的总体运算量可以按照下式进行估计:

  1. 训练时间估计

    主要包括浮点数运算、数据读写以及多进程同步等,GPU 每秒浮点运算数通常是GPU 理论浮点运算能力的30% 到70%

  2. 训练显存估计

    模型参数与优化器、训练中需要保存的激活值和其他显存占用

  • 模型参数与优化器的显存占用
  • 训练激活值的显存占用

    激活重计算:激活重计算在前向传播时仅保存Transformer 每一层的输入和最后层softmax 函数的输入,在反向传播时按需重新计算激活值来减少显存使用
  • 其他显存占用:代码库内核. PyTorch 框架在加载其自身的代码库内核时,大约会占用0.8GB至1GB 的显存。这是框架运行所必需的基本开销。ZeRO 优化技术实现:用于优化训练过程中的显存管理和通信效率,1-4G。训练过程中的中间结果和显存碎片:0.5GB 到1GB

    在实践中,至少需要有16倍参数数量的显存资源,才能进行全量的参数训练。
相关推荐
IT古董6 分钟前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
mahuifa8 分钟前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐9 分钟前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
蓝天星空23 分钟前
Python调用open ai接口
人工智能·python
睡觉狂魔er23 分钟前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf1 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零11 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
爱喝热水的呀哈喽1 小时前
《机器学习》支持向量机
人工智能·决策树·机器学习
minstbe1 小时前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机