LLM(一)——LLM简介

一、语言模型的发展历程

语言模型的发展历程从最初的简单统计模型到如今的复杂神经网络模型,经历了多个重要阶段。

1. 统计语言模型(Statistical Language Model, SLM)

统计语言模型使用马尔可夫假设(Markov Assumption)来建立语言序列的预测模型,通常是根据词序列中若干个连续的上下文单词来预测下一个词的出现概率,即根据一个固定长度的前缀来预测目标单词。具有固定上下文长度的统计语言模型通常被称为N元(N-gram)语言模型。

N-gram模型

  • 概念:N-gram模型通过假设一个词只依赖于前面固定数目的词来简化语言建模问题。常见的N-gram包括unigram(1-gram)、bigram(2-gram)和trigram(3-gram)。
  • 优点:实现简单,计算方便。
  • 缺点:上下文依赖性有限,无法捕捉长距离依赖关系;数据稀疏问题。

2. 神经网络语言模型(Neural Language Model, NLM)

神经语言模型使用神经网络来建模文本序列的生成

经典神经网络语言模型

  • 概念:Yoshua Bengio 等人(2003)提出了第一个神经网络语言模型,将词向量和前馈神经网络结合起来以捕捉上下文信息。
  • 架构:输入层接收固定窗口大小的词向量,经过隐藏层后输出下一个词的概率分布。
  • 优点:词向量使用低维稠密向量来表示词汇的语义,能够刻画更为丰富的隐含语义特征。同时,稠密向量的非零表征对于复杂语言模型的搭建非常友好,能够有效克服统计语言模型中的数据稀疏问题。
  • 缺点:依赖固定窗口,无法处理变长序列。

词向量又称为“词嵌入”(Word Embedding)。word2vec[1] [2]是一个具有代表性的词嵌入学习模型,它构建了一个简化的浅层神经网络来学习分布式词表示,所学习到的词嵌入可以用作后续任务的语义特征提取器,在自然语言处理任务中得到了广泛使用,取得了显著的性能提升。

标准RNN

  • 概念:RNN通过循环连接能够处理变长的序列,并保持历史信息。
  • 架构:每个时间步的隐藏状态取决于当前输入和前一时刻的隐藏状态。
  • 优点:能够捕捉序列中的依赖关系,适用于序列数据。
  • 缺点:梯度消失和梯度爆炸问题限制了其捕捉长距离依赖的能力。

长短期记忆网络(LSTM)

  • 概念:LSTM通过引入记忆单元和门控机制来缓解RNN的梯度问题。
  • 架构:包括输入门、遗忘门和输出门,用于控制信息流。
  • 优点:有效缓解梯度消失问题,能够捕捉长距离依赖。
  • 缺点:计算复杂度高,训练时间长。

3. 预训练语言模型(Pre-trained Language Model, PLM)

与词嵌入模型相比,预训练语言模型在训练架构与训练数据两个方面进行了改进与创新。

ELMo

  • 概念:使用大量的无标注数据训练双向 LSTM(Bidirectional LSTM, biLSTM)网络,预训练完成后所得到的 biLSTM 可以用来学习上下文感知的单词表示。
  • 架构:双向 LSTM(Bidirectional LSTM, biLSTM)网络。
  • 优点:ELMo 可以根据下游任务数据对 biLSTM 网络进行微调(Fine-Tuning),从而实现面向特定任务的模型优化。
  • 缺点:传统序列神经网络的长文本建模能力较弱,并且不容易并行训练。

Transformer

  • 概念:2017 年,谷歌提出了基于自注意力机制(Self-Attention)提出的Transformer完全基于注意力机制,摒弃了RNN和CNN结构,显著提高了并行计算能力。
  • 架构:包括编码器和解码器,每个编码器和解码器由多头自注意力机制和前馈神经网络组成。
  • 优点:高效处理长距离依赖,适合并行计算。
  • 缺点:对长序列的处理效率仍需改进,资源消耗大。

BERT(Bidirectional Encoder Representations from Transformers)

  • 概念:Google提出的BERT通过双向Transformer编码器捕捉上下文信息,使用掩码语言模型(MLM)和下一句预测(NSP)进行预训练。
  • 架构:基于Transformer编码器,采用双向注意力机制。
  • 优点:上下文感知能力强,预训练任务多样化,提高了在多种NLP任务上的表现。
  • 缺点:预训练和微调过程计算量大,资源消耗高。

GPT(Generative Pre-trained Transformer)

  • 概念:OpenAI提出的GPT通过在大规模文本上进行无监督预训练,然后在特定任务上进行微调。
  • 架构:基于Transformer解码器,采用自回归方式生成文本。
  • 优点:能够生成连贯自然的文本,适用于多种下游任务。
  • 缺点:自回归生成速度较慢。

编码器架构被认为更适合去解决自然语言理解任务(如完形填空等),而解码器架构更适合解决自然语言生成任务(如文本摘要等)。以 ELMo、BERT、GPT-1 为代表的预训练语言模型确立了“预训练-微调”这一任务求解范式。其中,预训练阶段旨在通过大规模无标注文本建立模型的基础能力,而微调阶段则使用有标注数据对于模型进行特定任务的适配,从而更好地解决下游的自然语言处理任务。

4. 大语言模型(Large Language Moddel,LLM)

研究人员发现,通过规模扩展(如增加模型参数规模或数据规模)通常会带来下游任务的模型性能提升,这种现象通常被称为“扩展法则”(Scaling Law)。

T5(Text-to-Text Transfer Transformer)

  • 概念:Google提出的T5将所有任务统一为文本到文本的形式,利用多任务学习提升模型泛化能力。
  • 架构:基于Transformer,统一编码器-解码器结构。
  • 优点:灵活适应多种NLP任务,简化了任务设计。
  • 缺点:需要大规模数据和计算资源进行训练。

GPT-3

  • 概念:GPT-3是OpenAI推出的第三代生成预训练模型,参数量达到了1750亿。
  • 优点:强大的生成和理解能力,少样本和零样本学习能力突出。
  • 缺点:训练成本极高,推理速度较慢,对计算资源要求极高。

这些大规模的预训练语言模型在解决复杂任务时表现出了与小型预训练语言模型(例如 330M 参数的 BERT 和 1.5B 参数的 GPT-2)不同的行为。例如,GPT-3 可以通过“上下文学习”(In-Context Learning, ICL)的方式利用少样本数据解决下游任务,而 GPT-2 则不具备这一能力。这种大模型具有但小模型不具有的能力通常被称为“涌现能力”(Emergent Abilities)。为了区分这一能力上的差异,学术界将这些大型预训练语言模型命名为“大语言模型”。

代表性的涌现能力

  • 上下文学习(In-context Learning, ICL):在提示中为语言模型提供自然语言指令和多个任务示例(Demonstration),无需显式的训练或梯度更新,仅输入文本的单词序列就能为测试样本生成预期的输出。上下文学习能力在 GPT-3 的论文中被正式提出。
  • 指令遵循(Instruction Following):指令遵循能力是指大语言模型能够按照自然语言指令来执行对应的任务。为了获得这一能力,通常需要使用自然语言描述的多任务示例数据集进行微调,称为指令微调(Instruction Tuning)或监督微调(Supervised Fine-tuning)。通过指令微调,大语言模型可以在没有使用显式示例的情况下按照任务指令完成新任务,有效提升了模型的泛化能力。相比于上下文学习能力,指令遵循能力整体上更容易获得,但是最终的任务执行效果还取决于模型性能和任务难度决定。
  • 逐步推理(Step-by-step Reasoning):大语言模型则可以利用思维链(Chain-of-Thought, CoT)提示策略 来加强推理性能。具体来说,大语言模型可以在提示中引入任务相关的中间推理步骤来加强复杂任务的求解,从而获得更为可靠的答案。思维链提示特别适合帮助大语言模型解决复杂数学问题,而具有思维链能力也是大语言模型能力的重要体现。

二、大模型架构

当前主流大LLM都基于Transformer模型进行设计的。

Transformer架构

2.1 归一化方法

2.1.1 LayerNorm

BatchNormalization难以处理可变长度的序列数据和小批次数据。因此,相关研究提出了LayerNorm,针对数据进行逐层归一化。具体而言,层归一化会计算每一层中所有激活值的均值和方差,从而重新调整激活值的中心和缩放比例:

2.1.2 RMSNorm

为了提高层归一化的训练速度,RMSNorm 仅利用激活值总和的均方根 对激活值进行重新缩放。使用 RMSNorm 的 Transformer 模型相比于之前 LayerNorm 训练的模型在训练速度和性能上均具有一定优势。采用RMSNorm 的代表性模型包括 GopherChinchilla。其计算公式如下所示:

Transformers代码库中LLaMA的RMSNorm实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class LlamaRMSNorm(nn.Module):
def __init__(self, hidden_size, eps=1e-6):
"""
LlamaRMSNorm is equivalent to T5LayerNorm
"""
super().__init__()
self.weight = nn.Parameter(torch.ones(hidden_size))
self.variance_epsilon = eps

def forward(self, hidden_states):
input_dtype = hidden_states.dtype
hidden_states = hidden_states.to(torch.float32)
variance = hidden_states.pow(2).mean(-1, keepdim=True)
hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
return self.weight * hidden_states.to(input_dtype)


2.1.3 DeepNorm

DeepNorm由微软的研究人员提出,旨在稳定深层Transformer的训练。具体而言,DeepNorm 在 LayerNorm 的基础上,在残差连接中对之前的激活值 按照一定比例进行放缩。通过这一简单的操作,Transformer 的层数可以被成功地扩展至 1000 层,进而有效提升了模型性能与训练稳定性。其计算公式如下:

其中, Sublayer 表示 Transformer 层中的前馈神经网络或自注意力模块。GLM-130B [162]采用了 DeepNorm 作为归一化技术。

2.2 归一化模块位置

2.2.1 Post-Norm

Post-Norm 是在原始 Transformer 模型中所使用的一种归一化技术。其中,归一化模块被放置于残差计算之后。其计算公式如下:

其中,Norm 表示任意一种归一化方法。在原理上,后向归一化具有很多优势。首先,有助于加快神经网络的训练收敛速度,使模型可以更有效地传播梯度,从而减少训练时间。其次,后向归一化可以降低神经网络对于超参数(如学习率、初始化参数等)的敏感性,使得网络更容易调优,并减少了超参数调整的难度。然而,由于在输出层附近存在梯度较大的问题,采用 Post-Norm 的 Transformer 模型在训练过程中通常会出现不稳定的现象。因此,现有的大语言模型中,Post-Norm很少被单独使用,通常是与其他策略相结合应用。例如,GLM-130B 将 Post-Norm与 DeepNorm 结合使用。

2.2.2 Pre-Norm

与 Post-Norm 不同,Pre-Norm将归一化模块应用在每个子层之前。其计算公式如下:

此处的 Norm 泛指任意一种归一化方法。此外,Pre-Norm 在最后一个 Transformer层后还额外添加了一个 LayerNorm。相较于 Post-Norm,Pre-Norm 直接把每个子层加在了归一化模块之后,仅仅对输入的表示进行了归一化,从而可以防止模型的梯度爆炸或者梯度消失现象。虽然使用了 Pre-Norm 的 Transformer 模型在训练过程中更加稳定,但是性能却逊色于采用了 Post-Norm 的模型。尽管对于性能有一定的影响,但由于其能够有效维持训练的稳定性,很多主流的大语言模型仍然采用 Pre-Norm。

2.2.3 Sandwich-Norm

在 Pre-Norm 的基础上,Sandwich-Norm 在残差连接之前增加了额外的 LayerNorm,旨在避免 Transformer 层的输出出现数值爆炸的情况。具体的实现方式如下所示:

本质上,Sandwich-Norm 可以看作是 Pre-Norm 和 Post-Norm 两种方法的组合,理论上具有更加灵活的表达能力。但是研究人员发现,Sandwich-Norm 有时仍然无法保证大语言模型的稳定训练,甚至会引发训练崩溃的问题。

2.3 激活函数

  • ReLU(Rectified Linear Unit):在原始的 Transformer 中采用了 ReLU(Rectified Linear Unit)激活函数。ReLU 可能会产生神经元失效的问题,被置为 0 的神经元将学习不到有用的信息。
  • Swish:针对 ReLU 存在的不足,研究人员进一步探索了 ReLU 函数的变种,以实现更好的性能。Swish 激活函数将神经元和该神经元的 sigmoid 激活的乘积作为新的激活函数。
  • GELU(Gaussian Error Linear Unit):GELU利用标准高斯累积分布函数作为激活函数,被很多的 Transformer 模型所采用。新的激活函数通常能够带来更好的性能并且收敛性更好,但是计算过程更为复杂。
  • GLU(Gated LinearUnit):大语言模型(例如 PaLM 和 LaMDA)也经常采用 GLU(Gated LinearUnit)激活函数以及它的变种,特别是 SwiGLU 和 GeGLU。不同于其他激活函数,GLU 激活函数引入了两个不同的线性层。其中一个线性层的输出将被输入到一个激活函数(例如,GeGLU 采用 GELU 激活函数)中,其结果将和另一个线性层的输出进行逐元素相乘作为最终的输出。相比于其他的激活函数,使用 GLU激活函数变体通常能够带来更佳的性能表现。SwiGLU 和 GeGLU 激活函数的计算公式如下所示:

2.4 位置编码

引入位置编码(Position Embedding, PE)对于序列信息进行精确建模,从而将绝对或相对位置信息整合到模型中。

  • 绝对位置编码: 在原始的 Transformer 模型中,为了处理序列数据的顺序信息,采用了绝对位置编码方法。在编码器和解码器的输入端,根据输入的词元在序列中的绝对位置生成唯一的位置嵌入,并与词元的嵌入表示进行相加来注入位置信息。

  • 相对位置编码:与绝对位置编码不同,相对位置编码是根据键和查询之间的偏移量计算得来的。计算得到的相对位置编码通常应用于注意力矩阵的计算中,而不是直接与词元本身的位置编码进行相加。

  • 旋转位置编码(Rotary Position Embedding, RoPE):RoPE巧妙地使用了基于绝对位置信息的旋转矩阵来表示注意力中的相对位置信息。RoPE 根据位置信息为序列中每个词元所对应的设置了独有的旋转矩阵,并和对应的查询和键进行相乘进行融合。

  • ALiBi 位置编码: ALiBi是一种特殊的相对位置编码,主要用于增强Transformer 模型的外推能力。具体来说,ALiBi 通过在键和查询之间的距离上施加相对距离相关的惩罚来调整注意力分数。

2.5 注意力机制

  • Self-Attention:在原始的 Transformer 模型中,注意力机制通过成对的方式进行序列数据的语义建模,充分考虑了序列中所有词元之间的相互关系。
  • 稀疏注意力机制:滑动窗口注意力机制(Sliding Window Attention, SWA)是大语言模型中使用最多的一种稀疏注意力机制。不同于完整的注意力机制,滑动窗口注意力根据词元位置,仅仅将位置索引上距离该词元一定范围内的词元考虑到注意力的计算中。

  • 多查询/分组查询注意力:为了提升注意力机制的效率,多查询注意力(Multi-Query Attention, MQA)提出针对不同的头共享相同的键和值变换矩阵。这种方法减少了访存量,提高了计算强度,从而实现了更快的解码速度。一些代表性的大语言模型,如 PaLMStarCoder,已经使用了多查询注意力机制。为了结合多查询注意力机制的效率与多头注意力机制的性能,研究人员进一步提出了分组查询注意力机制(Grouped-Query Attention, GQA)。GQA 将全部的头划分为若干组,并且针对同一组内的头共享相同的变换矩阵。这种注意力机制有效地平衡了效率和性能,被 LLaMA-2 模型所使用。

  • 硬件优化的注意力机制:除了在算法层面上提升注意力机制的计算效率,还可以进一步利用硬件设施来优化注意力模块的速度和内存消耗。其中,两个具有代表性的工作是 FlashAttentionPagedAttention。相比于传统的注意力实现方式,FlashAttention 通过矩阵分块计算以及减少内存读写次数的方式,提高注意力分数的计算效率;PagedAttention 则针对增量解码阶段,对于 KV 缓存进行分块存储,并优化了计算方式,增大了并行计算度,从而提高了计算效率。

2.6 混合专家模型

大语言模型能够通过扩展参数规模实现性能的提升。然而,随着模型参数规模的扩大,计算成本也随之增加。为了解决这一问题,研究人员在大语言模型中引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE),旨在不显著提升计算成本的同时实现对于模型参数的拓展。

在混合专家模型 (MoE) 中,将传统 Transformer 模型中的每个前馈网络 (FFN) 层替换为 MoE 层,其中 MoE 层由两个核心部分组成: 一个门控网络和若干数量的专家。

每个MoE 层包含个专家组件,记为,其中每个专家组件都是一个前馈神经网络。对于输入的每个词元表示,模型通过一个路由网络(或称为门控函数)来计算该词元对应于各个专家的权重。在路由函数中,首先通过线性层 映射为个专家的得分,并基于此选择出概率最高的个专家进行激活。随后,这个专家的得分将被送入函数计算出它们的权重 ,没有被选择的专家权重将被置为 0。上述路由网络的计算过程如下式所示:

之后,每个被选择的词元的输出的加权和将作为该混合专家网络层的最终输出:

目前具有代表性的混合专家模型是 Mixtral (8×7B),该模型在 Mistral (7B) 的基础上,使用了混合专家模块。

2.7 主流架构

在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-decoder)架构的大规模预训练语言模型。解码器架构还可以细分为两个变种架构,包括因果解码器(Causal Decoder)架构和前缀解码器(Prefix Decoder)架构。

  • Encoder-Decoder:此架构在编码器端采用了双向自注意力机制对输入信息进行编码处理,而在解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输出进行生成。
  • Causal Decoder:绝大部分主流的大语言模型采用了因果解码器架构。因果解码器采用了 Transformer 中的解码器组件,同时做出了几点重要改动。首先,因果解码器没有显式地区分输入和输出部分。该架构采用了单向的掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元。此外,由于不含有编码器部分,因果解码器删除了关注编码器表示的交叉注意力模块。经过自注意力模块后的词元表示将直接送入到前馈神经网络中。
  • Prefix Decoder:前缀解码器架构也被称为非因果解码器架构,对于因果解码器的掩码机制进行了修改。该架构和因果解码器一样,仅仅使用了解码器组件。与之不同的是,该架构参考了编码器-解码器的设计,对于输入和输出部分进行了特定处理。前缀解码器对于输入(前缀)部分使用双向注意力进行编码,而对于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。与编码器-解码器不同的是,前缀解码器在编码和解码过程中是共享参数的,并没有划分为独立的解码器和编码器。对于前缀解码器,也可以由现有的因果解码器继续预训练转换而来,进而加速该模型的训练。

大语言模型架构配置表,PE表示位置嵌入,L表示层数,H表示注意力头的数量,表示隐藏状态的大小,MCL表示训练期间的最大上下文长度。

Model Category Size Normalization PE Activation Bias L H MCL
GPT3 Causal decoder 175B Pre LayerNorm Learned GeLU 96 96 12288 2048
PanGU-~ Causal decoder 207B Pre LayerNorm Learned GeLU 64 128 16384 1024
OPT Causal decoder 175B Pre LayerNorm Learned ReLU 96 96 12288 2048
PaLM Causal decoder 540B Pre LayerNorm RoPE SwiGLU 118 48 18432 2048
BLOOM Causal decoder 176B Pre LayerNorm ALiBi GeLU 70 112 14336 2048
MT-NLG Causal decoder 530B - - - - 105 128 20480 2048
Gopher Causal decoder 280B Pre RMSNorm Relative - - 80 128 16384 2048
Chinchilla Causal decoder 70B Pre RMSNorm Relative - - 80 64 8192 -
Galactica Causal decoder 120B Pre LayerNorm Learned GeLU 96 80 10240 2048
LaMDA Causal decoder 137B - Relative GeGLU - 64 128 8192 -
Jurassic-1 Causal decoder 178B Pre LayerNorm Learned GeLU 76 96 13824 2048
LLaMA Causal decoder 65B Pre RMSNorm RoPE SwiGLU 80 64 8192 2048
LLaMA 2 Causal decoder 70B Pre RMSNorm RePE SwiGLU 80 64 8192 4096
Falcon Causal decoder 40B Pre LayerNorm RoPE GeLU 60 64 8192 2048
GLM-130B Prefix decoder 130B Post DeepNorm RoPE GeGLU 70 96 12288 2048
T5 Encoder-decoder 11B Pre RMSNorm Relative ReLU 24 128 1024 512

2.8 新型模型架构

  • Mamba:Mamba是一种状态空间模型的变种,主要思想是在状态空间模型的状态更新中引入了基于当前输入的信息选择(Selection)机制,来确定当前时刻状态如何从前一时刻状态以及当前输入中提取信息,从而提升其在语言建模上的性能。
  • RWKV:RWKV尝试将 RNN 和 Transformer 的优点进行结合,继承了Transformer 的建模优势和 RNN 的计算效率。作为一个主要技术创新,RWKV 在每层的计算中使用词元偏移(Token Shift)来代替词元表示。
  • RetNet:RetNet提出使用多尺度保留(Multi-scale Retention, MSR)机制来代替多头注意力模块,从而提升计算效率。多尺度保留机制是在标准状态空间模型的基础上,在状态更新的线性映射中引入了输入相关信息来提升序列建模能力。
  • Hyena:Hyena 提出使用长卷积模块(Long Convolution)来替换 Trans-former 架构中的注意力模块,从而借助卷积的快速傅里叶变换来提高计算效率。

不同模型的比较(表示序列长度,表示输入表示的维度,表示状态空间模型压缩后的维度,表示 Hyena每个模块的层数)

模型 可并行性 解码复杂度 训练复杂度
Transformer
标准 SSM
Mamba
RWKV
RetNet
Hyena

大语言模型族谱

三、预训练

预训练是指在大规模数据集上进行的一种先验训练,目标是训练一个通用的模型,在后续任务中进行微调或迁移学习。预训练通常可以分为两个阶段:无监督预训练和有监督微调。在无监督预训练阶段,模型通常被训练在一个大规模、未标记的数据集上,以学习通用的特征表示。在有监督微调阶段,模型使用标记数据集进行微调,以适应具体的任务。

预训练和训练之间的本质区别:

  • 阶段和目标:

    • 预训练阶段:在预训练阶段,模型使用大规模的数据集(通常是无标签数据集)进行训练,目标是学习通用的特征表示。这些通用特征可以应用于各种任务,因为它们反映了数据中的一般模式,而不是特定任务的信息。
    • 训练阶段:在训练阶段,模型使用特定任务的有标签数据集进行训练,目标是根据该任务的特定目标函数调整模型参数,使其在该任务上表现良好。
  • 数据集:

    • 预训练阶段:预训练通常使用大规模无标签数据集,因为其目标是学习通用特征表示,无需特定标签信息。
    • 训练阶段:训练使用特定任务的有标签数据集,因为需要根据任务的特定标签进行监督式学习,优化模型在该任务上的性能。
  • 特征表示:

    • 预训练阶段:预训练的目标是学习数据的通用特征表示,使得模型能够捕捉数据中的一般模式和结构。
    • 训练阶段:在训练阶段,预训练的模型参数(通用特征表示)可以作为初始化参数,然后根据特定任务的目标函数进一步微调模型参数,使其更适应该任务。
  • 任务目标:

    • 预训练阶段:预训练的目标是促使模型学习更加泛化的特征,使其能够在各种任务上有良好的表现。
    • 训练阶段:训练的目标是针对特定任务,最小化损失函数并优化模型参数,使其能够在该任务上达到最佳性能。

OLMo开源了预训练一个 LLM 的完整过程和数据集

LLM分布式训练框架

  • DeepSpeed 是一个深度学习优化库,让分布式训练变得简单、高效且有效。
  • Megatron-LM 是由 NVIDIA 的应用深度学习研究团队开发的大型、强大的 transformer 模型框架。
  • BigScience的Megatron-DeepSpeed基于原始 Megatron-DeepSpeed 代码库,结合了上述两种主要技术,在其上添加了不少代码。

千亿参数开源大模型 BLOOM 背后的技术,详细讲解了使用BigScience的Megatron-DeepSpeed进行LLM进行训练,并讲解了DeepSpeed和Megatron-LM的一些关键组件。

组件 DeepSpeed Megatron-LM
ZeRO 数据并行
张量并行
流水线并行
BF16 优化器
CUDA 融合核函数
DataLoader

四、微调

大型语言模型 (LLM) 微调是采用预训练模型并在较小的特定数据集上进一步训练它们以完善其功能并提高特定任务或领域的性能的过程。微调是将通用模型转变为专用模型。

大模型的SFT(Supervised Fine-Tuning)是指使用打好标记数据更新预训练的语言模型以执行特定任务。这与无监督方法不同,无监督方法无需检查数据。通常,语言模型的初始训练是无监督的,但微调是监督的。

Fine-tuning方法

  • 指令微调(Instruction fine-tuning):这种方法涉及通过提供特定于任务的指令或示例,对特定任务或任务集上的语言模型进行微调。微调过程侧重于更新模型的参数以使其适应新任务,同时尽量减少对预训练权重的更改。这使模型能够专注于执行新任务,而不会显著改变其预训练知识。例如,假设你微调模型以提高其总结技能。在这种情况下,你应该建立一个示例数据集,该数据集以总结指令开头,然后是文本或类似短语。在翻译的情况下,你应该包括“翻译此文本”之类的指令。这些提示完成对允许你的模型以新的方式“思考”并服务于给定的特定任务。

  • 全参数微调(Full Parameter Fine Tuning):指令微调时如果对模型所有权重进行更新就是全参数微调。全参数微调涉及对模型的所有权重进行调整,以使其完全适应特定领域或任务。这种方法适用于拥有大量与任务高度相关的高质量训练数据的情况,通过更新所有参数来最大程度地优化模型对新任务的理解和表现。可能带来更高的过度拟合训练数据的风险。
  • 参数高效微调(Parameter-efficient fine-tuning):参数高效微调策略仅选择性地更新模型中的某些权重,尤其是在需要保留大部分预训练知识的情况下。这包括:
    • LoRA(Low-Rank Adaptation):通过向模型权重矩阵添加低秩矩阵来进行微调,既允许模型学习新的任务特定模式,又能够保留大部分预训练知识,从而降低过拟合风险并提高训练效率。
    • P-tuning v2:这是一种基于prompt tuning的方法,仅微调模型中与prompt相关的部分参数(例如,额外添加的可学习prompt嵌入),而不是直接修改模型主体的权重。
    • QLoRA:指Quantized Low-Rank Adaptation或其他类似技术,结合了低秩调整与量化技术,以实现高效且资源友好的微调。

并非每个指令微调都是完全微调。在指令微调中,可以只更新模型权重的子集,同时保持其他权重不变。这允许更有针对性地适应新任务,而不会显著改变模型的预训练知识。在指令微调期间决定更新所有模型权重还是仅更新权重子集取决于任务的具体要求以及任务专业化与预训练知识保留之间的理想平衡。

五、RLHF

基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF),下图整体展示RLHF在ChatGPT中所处的位置。

OpenAI描述的RlHF过程。

RLHF 是一项涉及多个模型和不同训练阶段的复杂概念,按三个步骤分解:

  1. 对预训练语言模型 (LM)进行监督微调(SFT) ;
  2. 聚合问答数据并训练一个奖励模型 (Reward Model,RM) ;
  3. 用强化学习 (RL) 方式微调 LM。

5.1 预训练语言模型

预训练目标训练一个语言模型,可以用额外的文本或者条件对这个 LM 进行微调,微调并不是RLHF 必须的一步。

5.2 训练奖励模型

RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。可以用端到端的方式用 LM 建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。这一奖励数值将对后续无缝接入现有的 RL 算法至关重要。

关于模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM。关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。关于训练奖励数值方面,这里需要人工对 LM 生成的回答进行排名。

对具体的排名方式,一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。

5.3 用强化学习微调

近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。PPO 算法确定的奖励函数具体计算如下:将提示输入初始 LM 和当前微调的 LM,分别得到了输出文本,,将来自当前策略的文本传递给 RM 得到一个标量的奖励。将两个模型的生成文本进行比较计算差异的惩罚项,输出词分布序列之间的 Kullback–Leibler (KL) divergence 散度的缩放,即 。这一项被用于惩罚 RL 策略在每个训练批次中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值。此外,OpenAI 在 InstructGPT 上实验了在 PPO 添加新的预训练梯度,可以预见到奖励函数的公式会随着 RLHF 研究的进展而继续进化。

最后根据 PPO 算法,按当前批次数据的奖励指标进行优化 (来自 PPO 算法 on-policy 的特性) 。PPO 算法是一种信赖域优化 (Trust Region Optimization,TRO) 算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。

参考

  1. A Survey of Large Language Models
  2. Flash Attention
  3. 图解大模型计算加速系列:Flash Attention V2,从原理到并行计算
  4. 图解大模型计算加速系列:Flash Attention V1,从硬件到计算逻辑
  5. 混合专家模型 (MoE) 详解
  6. ChatGPT 背后的“功臣”——RLHF 技术详解
  7. 什么是 RLHF?
  8. ELI5: FlashAttention
  9. 大模型 SFT 经验帖
  10. 大语言模型的前世今生
  11. 从N-gram到GPT-4:探索语言模型的历史篇章
  12. 千亿参数开源大模型 BLOOM 背后的技术
  13. 预训练(Pre-train)
  14. PTMs: Pre-trained-Models in NLP
  15. 深入理解:什么是预训练?预训练有什么作用?预训练和训练的本质区别???
  16. 预训练和直接训练的区别
  17. PagedAttention
  18. 大语言模型
  19. LLM主流框架:Causal Decoder、Prefix Decoder和Encoder-Decoder
  20. 图解GPT-2 | The Illustrated GPT-2 (Visualizing Transformer Language Models)
  21. 预训练模型OLMo
  22. RLHF强化学习详解与应用
  23. ChatGPT 背后的“功臣”——RLHF 技术详解
  24. Supervised fine-tuning (SFT), instruction fine-tuning and full fine-tuning
  25. 一篇关于LLM指令微调的综述
  26. RLHF: Reinforcement Learning from Human Feedback
  27. Aligning language models to follow instructions
  28. Fine-tuning large language models (LLMs) in 2024
  29. Reinforcement learning with human feedback (RLHF) for LLMs

LLM(一)——LLM简介
https://mztchaoqun.com.cn/posts/D39_LLM/
作者
mztchaoqun
发布于
2024年9月27日
许可协议