与大模型相关的问题
- 大预言模型(LLM )相关
- 结构类型
- 损失函数
- 为什么大模型设计的参数量都是7B,13B,72B这种?
- 大模型中的位置编码方式
- 觉得当下的大模型相对于之前初代的bert等模型主要解决了什么样的问题?从原理上来讲,为什么现代大模型在生成式任务的能力要强于以前的MLM类的大模型?
- 现在大模型为了达到规模扩增,主要做了哪些技术上的优化?旋转位置编码相比于绝对位置编码好在哪儿?为什么不用绝对位置编码?
- 谈谈为什么MoE机制会成为主流?如何解决MoE训练过程中出现的路由偏爱(路由失效)现象?负载均衡是作用在模型上面的。
- 大语言模型(LLM)分布式训练框架
- 高效微调算法 (Parameter-Efficient Fine-tuning, PEFT)
- 优势
- 实现方式
大预言模型(LLM )相关
大预言模型的本质是进行续写,根据前文预测下一个token。
结构类型
- causal decoder: LLama、GPT等后续基本全是
定义:Causal LM是一种自回归模型,它在生成文本时只能依赖于之前已经生成的文本,而不能利用未来信息。
注意力机制:这种模型使用一种掩码(masking),确保在生成每个词时,只能考虑它之前(包括当前)的词,而不能“看”到未来的词。
优点:可以生成灵活的文本,适应各种生成任务;
缺点:无法访问未来的信息,可能生成不一致或有误的内容。 - prefix Decoder: Prefix LM,即前缀语言模型,是一种在给定一个文本前缀的情况下,模型能够基于这个前缀生成接下来的文本内容。
特点:decoder only结构。输入部分没有进行mask,后续部分沿着对角线mask。
优点:是可以减少对预训练模型参数的修改,降低过拟合风险
Prefix LM 通过插入可学习前缀可隐式引导注意力聚焦到任务相关模式,而不是改变模型原有的注意力计算机制等核心部分,只是在输入部分添加前缀来引导模型的注意力,从而减少对模型主体的改动。
Prefix Tuning 是 Prefix LM 的一种常见方法,它只训练一个小的连续 “前缀”。在训练时,预训练模型的大部分参数保持冻结,只对前缀向量进行优化。例如在一个输入序列前添加一个长度为 10、维度为 1024 的前缀向量,仅需优化这 10×1024 = 10240 个参数,相比对整个模型的参数进行微调,大大减少了需要修改的参数数量。
缺点:可能受到前缀表示长度的限制,无法充分捕捉任务相关的信息 - Encoder-Docoder: Flan-T5、BART
定义:Encoder-Decoder包括一个编码器(Encoder)和一个解码器(Decoder)。编码器使用双向注意力,每个输入元素都可以关注到序列中的其他所有元素。解码器使用单向注意力,确保生成的每个词只能依赖于之前生成的词。
特点:Encoder-Decoder结构能够将输入数据编码成一个固定维度的向量,然后通过解码器将这个向量解码成目标输出。这种结构能够有效地处理变长序列的转换问题,并且具有较强的通用性和灵活性。
优点:可以处理输入和输出序列不同长度的任务,如机器翻译
缺点:模型结构较为复杂,训练和推理计算量较大。
损失函数
- 预训练pretrain
假设原始数据是三个token序列 S1, S2, S3。
则输入构建为: S1 S2 S3 (表示句子开始)
然后位移这些序列作为标签(shift-labels): S1 S2 S3 (表示句子结束)
这样训练模型时,仅需一次forward,模型会给出 时去预测 S1;在给出和 S1 时去预测 S2;在给出 、S1 和 S2 时去预测 S3,以此类推,loss是这几个预测损失的和。
同一个batch中,我们需要确保所有的序列长度相等,以用于模型训练。这里 用于在训练批次中对齐序列到同样的长度,而token 不会用于损失计算
S1 S2 - SFT(Supervised Fine-Tuning)
在sft过程中,sft本身是由QA对组成的,而输入input是QA的拼接,标签labels中Q的部分的被token填充(mask掉),以便后续计算loss时,Q不纳入计算
多轮/packed_sft
为什么大模型设计的参数量都是7B,13B,72B这种?
i. 从推理的角度出发,为了适配常见的显卡。比如,采用半精度(一个数字占两个字节)的话。7B 的模型参数占14G, 可以放到16G 的 T4 上。13B 的模型参数占26G,可以放到 32G 的 V100 上
ii. 从历史传承的角度出发:最初OpenAI在gpt-3就是这么干的
大模型中的位置编码方式
绝对位置编码、相对位置编码、旋转位置编码
i. 绝对位置编码 (Absolute Positional Encoding):通过为序列中每个位置生成一个唯一的向量,将位置信息显式地加入到输入表示中。
- 优点:简单易实现、显式顺序信息
- 缺点:难以处理长序列、难以推广到变长序列
ii. 相对位置编码:相对位置编码旨在捕捉序列中元素之间的相对顺序,而不是绝对位置。这种方法在处理序列间依赖关系时更加灵活。
3. 在自注意力机制中,这种编码可以通过调整注意力权重来实现。例如,模型可能会使用两个元素间的位置差值来影响它们的注意力得分。
4. 优点:处理长距离依赖更有效、对变长序列更灵活
5. 缺点:实现更复杂、计算量大
iii. 旋转位置编码:是一种改进的相对位置编码,利用旋转变换将位置信息直接嵌入到词向量中,能够更好地处理长序列的相对位置信息。
6. RoPE 将每个向量通过一个旋转矩阵来变换,将位置编码与词嵌入结合,使得向量之间的角度变化反映它们的相对位置。
7. 具体来说,通过对每个向量进行旋转,使得在不同位置的向量之间产生相位差。
8. 优点:更有效的相对位置编码、与 Transformer 兼容性高:
9. 缺点“复杂度增加
觉得当下的大模型相对于之前初代的bert等模型主要解决了什么样的问题?从原理上来讲,为什么现代大模型在生成式任务的能力要强于以前的MLM类的大模型?
i. Masked Language Model(掩蔽语言模型,MLM):在 BERT 等模型中广泛使用。其核心思想是将输入句子中的一些词随机“掩蔽”掉(通常用一个特殊的标记如 [MASK]),然后让模型基于上下文去预测这些被掩蔽的词。通过这种方式,模型能够学习到词与词之间的关系和上下文信息。例如,给定句子:“我喜欢吃[MASK]”,模型会根据上下文预测 [MASK] 处应该填入哪个词,比如“苹果”或“披萨”。
ii. BERT类模型(如BERT、RoBERTa等)是基于掩蔽语言建模(Masked Language Modeling, MLM)的,它们通常用于上下文理解、分类任务和句子对比等。BERT通过在输入句子中随机掩蔽一些词汇并训练模型去预测这些被掩蔽的词汇,擅长处理编码任务,但生成能力相对较弱。
iii. 现代的大模型(例如GPT系列)采用了基于自回归的语言建模方法,即通过逐词生成(一个词接着一个词生成),它们不仅能理解文本,还能生成连贯的文本,这使得它们可以应用到生成式任务,如文本生成、对话、文章写作等。
iv. 现代的大模型在生成式任务上的优势,主要源于:
- 采用自回归训练目标,能够逐步生成文本;
- 更强的多任务学习能力,能够处理多种任务(包括理解和生成)
- 更大的训练数据和更复杂的模型架构
- 在更强大的计算资源支持下,可以捕捉更加复杂的语言规律。
现在大模型为了达到规模扩增,主要做了哪些技术上的优化?旋转位置编码相比于绝对位置编码好在哪儿?为什么不用绝对位置编码?
i. 规模扩增(Scaling up) 是指在模型设计和训练过程中,通过增加模型的参数、数据量或计算资源,以提升模型的能力和性能。技术上的优化主要集中在 计算效率、模型容量的增加、多任务学习以及长序列建模等方面。以下是一些关键的技术优化和改进:
- 扩展计算资源与优化计算效率:模型并行与数据并行、混合精度训练
- 优化模型架构:稀疏化与剪枝、知识蒸馏(Knowledge Distillation)和Transformer架构的变种
- 在长序列建模中采用局部注意力、稀疏注意力和旋转位置编码
ii. 旋转位置编码捕捉相对位置关系、扩展性更强、无固定长度限制,能够处理更长的序列
iii. 绝对位置编码不能处理超长序列、无法充分表达相对位置
谈谈为什么MoE机制会成为主流?如何解决MoE训练过程中出现的路由偏爱(路由失效)现象?负载均衡是作用在模型上面的。
MoE机制的核心思想是将网络分为多个专家(experts),每个专家负责特定任务,而在每次输入时,路由机制(Routing)会根据输入决定激活哪些专家。这使得模型可以在不显著增加计算成本的情况下,通过选择性地激活一部分专家来处理输入。
i. MoE 机制优点
- MoE 可以大大提高计算效率。通常,在一个 MoE 网络中,只有一部分专家被激活,这减少了每次前向传播时需要执行的计算量,尤其是在大规模模型中,通过路由机制使得每次计算都相对高效。
- 模型的稀疏激活
- MoE 通过拥有多个专家来增加模型的多样性。每个专家可以专注于学习任务的某一方面,基于输入特征的不同,可以选择最合适的专家进行处理,从而能够处理更复杂的任务。
- MoE 使得模型能够在不显著增加计算开销的情况下,拥有更多的参数。
- MoE 允许为不同的输入选择不同的专家,使得它在多任务学习(multi-task learning)中具有天然的优势。它能够根据任务的需求激活特定的专家,而不需要为每个任务训练一个全新的模型。
ii. MoE 机制缺点
6. 复杂性增加:MoE模型的设计、训练和调优都更为复杂。
7. 训练难度与资源消耗:虽然推理时MoE显著提高了效率,但训练这些模型需要更多的计算资源,因为所有专家在训练时都需更新。
8. MoE 训练过程中出现的路由偏爱(路由失效)现象:在训练过程中,模型会倾向于选择某些专家,从而导致其他专家不被激活,甚至没有参与计算
iii. MoE 训练过程中出现的路由偏爱(路由失效)现象及其解决方案
路由(Routing)是决定每个输入会激活哪些专家的关键步骤。路由偏爱(routing bias)指的是在训练过程中,模型会倾向于选择某些专家,从而导致其他专家不被激活,甚至没有参与计算。这种现象被称为路由失效(Router failure)
9. 负载均衡机制(Load Balancing):负载均衡的目标是确保每个专家的负载大致相同,即使某些专家频繁被激活,也不至于完全忽略其他专家。一种常见的策略是通过硬性约束来限制每个专家的激活次数,或者采用软约束(例如正则化)来鼓励路由机制均匀地分配输入给各个专家。具体的负载均衡方法可能包括:
a) 平衡激活次数:限制每个专家被激活的次数,避免某些专家被过度使用,而其他专家几乎没有被激活。
b) 使用负载均衡损失函数:引入负载均衡的正则化项,使得模型在选择路由时尽量保证各个专家之间的计算负载平衡。
c) 动态路由:根据当前的负载情况动态调整路由策略,以防止某些专家一直被偏爱。
10. 路由函数的设计优化:优化路由函数,例如可以使用软路由(soft routing)来避免硬性选择某一个专家,而是允许多个专家同时参与计算,以降低过度偏向某些专家的情况。
11. 专家选择多样化:在每次路由时,多样化专家选择的方式,可以通过加入随机性或使用温度参数等方法,增加模型在专家选择上的多样性,减少路由失效的概率。
大语言模型(LLM)分布式训练框架
i. 概述:将机器学习或深度学习模型训练任务分解成多个子任务,并在多个计算设备上并行地进行训练
ii. 分布式训练并行策略:分布式训练系统目标就是将单节点模型训练转换成等价的分布式并行模型训练。对于大语言模型来说,训练过程就是根据数据和损失函数,利用优化算法对神经网络模型参数进行更新的过程。
- 数据并行:在数据并行系统中,每个计算设备都有整个神经网络模型的完整副本(Model Replica),进行迭代时,每个计算设备只分配了一个批次数据样本的子集,并根据该批次样本子集的数据进行网络模型的前向计算。前向计算完成后,每个计算设备都会根据本地样本计算损失误差得到梯度Gi(i 为加速卡编号),并将本地梯度Gi 进行广播。所有计算设备需要聚合其他加速度卡给出的梯度值,然后使用平均梯度(ΣNi=1Gi)/N 对模型进行更新,完成该批次训练。
- 模型并行
a) 流水线并行(Pipeline Parallelism,PP):将模型的各个层分段处理,并将每个段分布在不同的计算设备上,使得前后阶段能够流水式、分批进行工作。
b) 张量并行(Tensor Parallelism,TP):需要根据模型的具体结构和算子类型,解决如何将参数切分到不同设备,以及如何保证切分后数学一致性两个问题。
- 混合并行:是将多种并行策略如数据并行、流水线并行和张量并行等进行混合使用。通过结合不同的并行策略,混合并行可以充分发挥各种并行策略的优点,以最大程度地提高计算性能和效率。
高效微调算法 (Parameter-Efficient Fine-tuning, PEFT)
优势
i. 参数效率 (Parameter Efficiency): PEFT 算法仅微调少量 (甚至极少量) 模型参数
ii. 存储效率 (Storage Efficiency): 只需要存储少量的微调参数,原始预训练模型参数保持冻结
iii. 避免灾难性遗忘:由于 PEFT 算法冻结了大部分预训练模型参数, 模型能够更好地保留预训练阶段学习到的通用知识, 从而有效缓解灾难性遗忘问题。
iv. 即插即用: PEFT 算法通常以模块化的方式集成到预训练模型中, 例如, Adapter 模块可以方便地插入到 Transformer 模型的每一层。 微调后的 PEFT 模块可以即插即用, 方便模型部署和迁移。
实现方式
i. Prefix Tuning:通过在模型输入层之前添加可训练的前缀嵌入(prefix embeddings)来影响模型的输出。这些前缀嵌入与原始输入拼接后一起输入到模型中,而模型的其他部分保持不变。
ii. LoRA:通过在原始模型权重矩阵附近添加一个低秩矩阵来近似模型参数的更新。这种方法通过优化这个低秩矩阵来实现微调,而不需要修改原始模型参数。
iii. Adapter Tuning:通过在模型的每个层之间插入小型神经网络(称为adapters)来实现微调。这些adapters包含可训练的权重,而模型的原始参数保持不变。
• Feedforward down-project:将原始输入维度d(高维特征)投影到m(低维特征),通过控制m的大小来限制Adapter模块的参数量,通常情况下,m<<d;
• Nonlinearity:非线性层;
• Feedforward up-project:还原输入维度d,作为Adapter模块的输出。通时通过一个skip connection来将Adapter的输入重新加到最终的输出中去(残差连接)