第一章 绪论
本章主要介绍大规模语言模型基本概念、发展历程和构建流程。
大规模语言模型(Large Language Models,LLM),也称大语言模型 或大型语言模型。
1.1 大规模语言模型基本概念
1.语言模型(Language Model,LM) 目标就是建模自然语言的概率分布。
2.统计语言模型--平滑
尽管n 元语言模型能缓解句子概率为 0 的问题,但语言是由人和时代创造的,具备无尽的可能性,再庞大的训练语料也无法覆盖所有的 n-gram,而训练语料中的零频率并不代表零概率。因此,需要使用平滑技术(Smoothing)来解决这一问题,对所有可能出现的字符串都分配一个非零的概率值,从而避免零概率问题。平滑处理的基本思想是提高低概率,降低高概率, 使整体的概率分布趋于均匀。这类方法通常称为统计语言模型(Statistical Language models,SLM) 。
3.神经语言模型
基于稀疏表示的n 元语言模型仍然有三个较为明显的缺点:(1)无法建模长度超过 n 的上下文;(2)依赖人工 设计规则的平滑技术;(3)当 n 增大时,数据的稀疏性随之增大,模型的参数量更是指数级增加,并且模型受到数据稀疏问题的影响,其参数难以被准确的学习。此外,n 元文法中单词的离散表示也忽略了单词之间的相似性。神经网络方法可以在一定程度上避免数据稀疏问题,有些模型还可以避免对历史长度的限制,从而更好的建模长距离依赖关系。这类方法通常称为神经语言模型(Neural Language Models,NLM)。
4.预训练语言模型(Pre-trained Language Models,PLM)
ImageNet、GPT 和 BERT 为代表的基于 Transformer 模型的大规模预训练语言模型的出现,使得自然语言处理全面进入了预训练微调范式新时代。
5.指令微调语言模型
由于大规模语言模型的参数量巨大,如果在不同任务上都进行微调需要消耗大量的计算资源,因此预训练微调范式不再适用于大规模语言模型。但是研究人员发现,通过语境学习(Incontext Learning,ICL)等方法,直接使用大规模语言模型就可以在很多任务的少样本场景下取得很好的效果。此后,研究人员们提出了面向大规模语言模型的提示词(Prompt)学习方法、模型即服务范式(Model as a Service,MaaS)、指令微调(Instruction Tuning)等方法,在不同任务上都取得了很好的效果。
1.2 大规模语言模型发展历程
1.3 大规模语言模型构建流程
主要包含四个阶段:预训练、有监督微调、奖励建 模、强化学习。这四个阶段都需要不同规模数据集合以及不同类型的算法,会产出不同类型的模 型,同时所需要的资源也有非常大的差别。
预训练(Pretraining)阶段需要利用海量的训练数据,完成深度神经网络参数训练,构建基础语言模型 (Base Model)。基础大模型构建了长文本的建模能力,使得模型具有语言生成能力,根据输入的 提示词(Prompt),模型可以生成文本补全句子。
有监督微调(Supervised Finetuning),也称为指令微调(Instruction Tuning),利用少量高质量数 据集合,包含用户输入的提示词(Prompt)和对应的理想输出结果。用户输入包括问题、闲聊对 话、任务指令等多种形式和任务。得到有监督微调模型(SFT 模型)
奖励建模(Reward Modeling)阶段目标是构建一个文本质量对比模型,对于同一个提示词,SFT模型给出的多个不同输出结果的质量进行排序。如果 RM 模型的目标是针对 所有提示词系统所生成输出都能够高质量的进行判断,该问题所面临的难度在某种程度上与文本 生成等价,因此如何限定 RM 模型应用的泛化边界也是本阶段难点问题。
强化学习(Reinforcement Learning)阶段根据数十万用户给出的提示词,利用在前一阶段训练的 RM 模型,给出 SFT 模型对用户提示词补全结果的质量评估,并与语言模型建模目标综合得到更好的效果。使用强化学习,在 SFT 模型基础上调整参数,使得最 终生成的文本可以获得更高的奖励(Reward)。由于强化学习方法稳定性不高,并且超参数众多,使得模型收敛难度大,再叠加 RM 模型的准确率问题,使得在大规模 语言模型如何能够有效应用强化学习非常困难。
第二章 大语言模型基础
2.1Transformer
细节拉满,全网最详细的Transformer介绍(含大量插图)! - 知乎 (zhihu.com)
1.transformer的输入输出是什么
输入:使用词嵌入算法(embedding algorithm),将每个词转换为一个词向量。那么整个输入的句子是一个向量列表 。
输出:Decoder 最终的输出是一个向量,其中每个元素是浮点数。由 Softmax 层后面的线性层来把这个向量转换为单词。
2.与RNN相比他的优点有哪些
Transformer使用自注意力机制(Self-Attention Mechanism)来建模序列中的依赖关系。在自注意力机制中,每个输入元素都会与序列中的其他元素进行交互,并根据交互结果来调整自身的表示。这种交互是并行的,因为每个元素在计算时都可以同时访问序列中的其他元素,而不需要按照顺序逐步处理。具体来说,自注意力的计算包括查询(Query)、键(Key)和值(Value)的线性变换,以及相似度计算和加权求和。这些步骤都可以通过矩阵运算来实现,而矩阵运算是高度并行化的,因此可以大大提高计算效率。相比之下,RNN则通过迭代地处理序列中的每个元素来建模序列。在RNN中,当前位置的输出和隐藏状态是由当前位置的输入和前一时刻的隐藏状态共同决定的。这意味着RNN在处理序列时必须按照顺序逐步进行,因为每个时刻的输出都依赖于前一个时刻的隐藏状态。这种顺序处理特性使得RNN无法进行有效的并行计算。
此外,Transformer还通过位置编码(Positional Encoding)来保留序列中的顺序信息。位置编码是一个可学习的向量,它会与输入序列的每个元素进行相加,从而在表示中包含位置信息。这种方式使得Transformer能够在并行计算的同时保持对序列顺序的敏感性。
3.self-attention的原理
Query 矩阵负责提出查询需求,Key 矩阵提供匹配的信息线索,而 Value 矩阵则包含了具体的信息内容。
Q矩阵与K矩阵的转置进行点积运算再除以K矩阵向量的维度并进行softmax归一化后得到了attention-score,这些分数决定了在编码当前位置的词时,对所有位置的词分别有多少的注意力。将attention-score与对应的值向量相乘,并将结果相加,以得到最终的输出向量。这个输出向量包含了当前单词在考虑所有其他单词影响后的综合表示。这个输出向量现在可以作为单词在当前上下文中的表示,并用于后续的神经网络层中进行进一步的处理。
4.为什么需要multi-attention
(1)增加模型的学习能力和表达力
通过多个注意力头,模型可以学习到更丰富的上下文信息。每个头可能关注输入的不同特征,这些特征综合起来可以更全面地理解和处理输入序列。
代码
(2)并行化计算提高效率
Multi-head Attention的计算是高度并行化的,因为每个注意力头都可以独立地进行计算,而不需要等待其他头的输出。这种并行化特性使得Multi-head Attention在处理长序列或大规模数据集时具有更高的效率。
5.位置编码的作用和实现
由于 Transfomer 模型不再使用基于循环的方式建模文本输入,序列中不再有任何信息能够提示模型单词之间的相对位置关系。在表示序列中单词顺序和距离。
位置编码的代码:构建一个矩阵存储位置编码,然后加入到单词嵌入向量中。
6.解码器部分的注意力
交叉注意力、掩码注意力
Encoder-Decoder Attention层是使用前一层的输出来构造 Query 矩阵,而 Key 矩阵和 Value 矩阵来自于解码器最终的输出。
7.残差连接和归一化的作用
使得信息流动更加高效,有利于模型的稳定优化。
2.2生成式预训练语言模型 GPT
生成式预训练:生成式预训练的核心想法是学习如何产生数据,此时模型的输入和输出都是数据本身,因此不需要任何的人工标注。然而,在不加约束的情况下,模型有可能学到一些平凡解(如恒等映射),这对于下游的任务显然是没有用的。因此,生成式预训练的目标是学到高维数据在低维空间的一个有效表示(representation)。这个过程通常会约束模型将数据映射到一个低维的特征空间,并会对模型的输入进行一定的扰动,以增加生成任务的难度,防止模型学到平凡解。
自回归模型:根据过去时刻的数据生成未来时刻的数据。这在自然语言处理(NLP)中也被称为语言模型(Language Modeling,LM)任务。给定文本序列x1:T=[x1,x2,...,xT],语言模型的学习目标是最大化序列的出现概率。
自编码模型:目标是学习输入数据的紧凑表示,也称为编码(encoding)。它试图通过编码器和解码器的组合,将输入数据映射到一个低维的潜在空间表示,然后再从这个表示中重建出输入数seq2Seq模型:核心思想是将一个输入序列转换成一个输出序列。它常用于机器翻译、文本摘要和对话系统等需要内容理解和生成的任务。
GPT模型是基于 Transformer 架构构造的仅由解码器组成的网络结构,采用自回归的方式构建语言模型。这主要是因为GPT模型的设计初衷是为了生成文本,而解码层在生成任务中起着关键作用,保证了输入文本每个位置只能依赖过去时刻的信息。
2.2.1 无监督预训练
给定文本序列,GPT首先将其映射为稠密的向量(词向量+位置向量)然后放入Transformer Block中进行编码,GPT模型的输出层基于最后一层的输出,预测每个位置上的条件概率。
2.2.2 有监督下游任务微调
下游任务在微调过程中,针对任务目标进行优化,很容易使得模型遗忘预训练阶段所学习到 的通用语义知识表示,从而损失模型的通用性和泛化能力,造成灾难性遗忘(Catastrophic Forgetting) 问题。因此,通常会采用混合预训练任务损失和下游微调损失的方法来缓解上述问题。
2.2.3 基于 HuggingFace 的预训练语言模型实践
连不上HuggingFace
Huggingface 超详细介绍 - 知乎 (zhihu.com)
1.数据集加载
2.训练词元分析器(Tokenizer)
3.预处理语料集合
4.模型训练
5.可以用pipline实现不同的任务
2.3 大语言模型结构
2.3.1 LLaMA 的模型结构
LLaMa系列模型详解(原理介绍、代码解读):LLaMa_llama模型-CSDN博客
万字长文详解LlaMA 3的前世今生 - 知乎 (zhihu.com)
采用了前置层归一化(Pre-normalization)并使用 RMSNorm 归一化函数 (Normalizing Function)、激活函数更换为 SwiGLU,并使用了旋转位置嵌入(RoP),整体 Transformer
架构与 GPT-2 类似
1. RMSNorm 归一化函数
Transformer使用的是layer norm(层归一化)
RMSNorm:通过计算输入向量的均方根(RMS)进行归一化,避免了计算均值和标准差的过程,从而简化了计算。
LayerNorm:需要计算输入向量的均值和标准差,相对RMSNorm来说计算过程更复杂。
2.SwiGLU 激活函数
Swish 激活函数在参数 β 不同取值下的形状,可以看到当 β 趋近于 0 时,Swish 函数趋近于线性函数 y = x,当 β 趋近于无穷大时,Swish 函数趋近于 ReLU 函数,β 取值为 1 时,Swish 函数是光滑且非单调。在 HuggingFace 的 Transformer 库中Swish函数使用 silu 函数代替。
3.旋转位置嵌入(RoPE)
通过绝对位置编码的形式实现相对位置编码,其目标是给q、k添加绝对位置信息。
绝对位置编码:在序列中每个位置上都固定地分配一个唯一的编码。这种编码通常是基于正弦和余弦函数的周期性函数生成的,也可以是可学习的参数。
相对位置编码:根据元素之间的相对位置关系来动态地生成位置信息。这种编码允许模型在处理序列时考虑元素之间的相对距离。
Rotary Position Embedding (RoPE, 旋转式位置编码) | 原理讲解+torch代码实现_旋转位置编码-CSDN博客
复数的矩阵表示 - Invo1 - 博客园 (cnblogs.com)
4.MQA多查询注意力
lama1是Meta在2023年2月发布的大语言模型,是当时性能非常出色的开源模型之一,参数量分别有7B(十亿)、13B、30B和65B四个版本。Llama的各个参数量版本都在超过1T(万亿) token的语料上进行了预训训练,其中,最大的65B参数的模型在2048张80G显存的A100上训练了近21天,甚至在大多数基准测试中都超越了具有175B参数的GPT-3。
在大数据和机器学习的语境下,数据量通常指的是用于训练或测试模型的数据的大小。数据量的单位可以是字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)等。
字节(Byte):是数据存储的基本单位。一个字节由8个比特(bit)组成。
千字节(KB):等于1024个字节。
兆字节(MB):等于1024个千字节,也常用于表示文件或数据的大小。
吉字节(GB):等于1024个兆字节,是较大的数据存储单位。
在大模型中,由于模型参数通常是以浮点数(如float32)存储的,因此可以通过模型参数量来计算模型所需的存储空间大小。例如,如果一个模型有1.1亿个参数,并且每个参数用float32表示(即每个参数占4个字节),那么该模型所需的存储空间大约为44MB(1.1亿×4字节/1024/1024)。
LLama2
MHA改成GQA:整体参数量会有减少
FFN模块矩阵维度有扩充:增强泛化能力,整体参数量增加
上下文长度是llama两倍(长度从2048->4096) 训练语料增加约 40%,体现在1.4T->2.0T的Tokens
LLama3
2.3.2 注意力机制优化
1. 稀疏注意力机制
通过限制 Query-Key 对的数量来减少计算复杂度。这类方法就称为稀疏注意力。可以将稀疏化方法进一步分成两类:基于位置信息和基于内容。
基于内容的稀疏注意力是是根据输入数据来创建稀疏注意力,其中一种很简单的方法是选择 和给定查询(Query)有很高相似度的键(Key)。
2. FlashAttention
FlashAttention图解(如何加速Attention) - 知乎 (zhihu.com)
Flash Attention原理详解(含代码讲解) - 知乎 (zhihu.com)
计算机原理课程复习:计算机组成原理、计算机网络、数据库、操作系统、数据结构与算法
计算机组成原理:最详细笔记-CSDN博客
【计算机网络】学计算机的正确顺序千万别弄反了,到时候后悔就来不及了_哔哩哔哩_bilibili
3.多查询注意力 (MQA)
在多查询注意力中不同的注意力头共享一个键和值的集合,每个头只单独保留了一份查询参数。因此 键和值的矩阵仅有一份,这大幅度减少了显存占用,使其更高效。
第三章 语言模型训练数据
3.1数据来源
分为通用数据和专业数据
3.2数据处理
词元分析(Tokenization)目标是将原始文本分割成由词元(Token)序列的过程。词元切分也是数据预处理中至关重要的一步。
字节对编码(Byte Pair Encoding,BPE)模型。BPE 尽量将词序列中的词切分成已知的词元。
3.3数据影响分析
数据规模影响
模型参数规模、训练数据量以及总计算量
模型参数规模是指模型中参数的数量,这些参数通常用于表示权重和偏差,决定了模型对输入数据的响应方式。参数规模的大小可以影响模型的性能、计算效率和内存需求。
训练数据量是指用于训练模型的数据集的大小。训练数据的特性和数量是决定一个模型性能好坏的最主要因素。
总计算量通常指的是模型在训练和推理过程中所需的计算资源总量,这包括CPU、GPU等处理器的使用时间以及内存和存储的访问次数等。总计算量的多少取决于多个因素,如模型的复杂度、输入数据的规模以及所使用的硬件设备等。
研究发现,如果模型训练要达到计算最优(Compute-optimal),模型大小和训练词元数量应该等比例缩放,即模型大小加倍则训练词元数量也应该加倍。
数据质量影响、数据多样性影响
3.4开源数据集合
Pile、ROOTS、RefinedWeb、SlimPajama