《大语言模型》综述学习笔记
《A Survey of Large Language Models》英文版综述最近出了中文版书——《大语言模型》,本博客作为阅读笔记记录一下,综述主页:https://github.com/RUCAIBox/LLMSurvey
关于LLM的一些概述和理解
记录一些有启发性的说法:
1、当前大语言模型的技术路线图:“解码器架构+预测下一个词”,即通过在海量文本上进行下一个词预测的优化,使得模型能够学习到丰富的语义知识信息,进而通过文本补全的方式解决各种下游任务。
在这种通用的预训练范式下,模型能力本质上是来源于所见过的训练数据,因此数据工程就变得极为重要,不是简单的扩大数据规模就能够实现的。目前来说,数据工程主要包括三个方面。首先,需要对于数据进行全面的采集,拓宽高质量的数据来源;其次,需要对于收集到的数据进行精细的清洗,尽量提升用于大模型训练的数据质量;第三,需要设计有效的数据配比与数据课程,加强模型对于数据语义信息的利用效率。这三个方面的数据工程技术直接决定了最后大语言模型的性能水平。
2、大语言模型,泛指具有超大规模参数或者经过超大规模数据训练所得到的语言模型。
3、一般来说,指令微调很难教会大语言模型预训练阶段没有学习到的知识与能力,它主要起到了对于模型能力的激发作用,而不是知识注入作用。
4、涌现能力:当模型扩展到一定规模时,模型的特定任务性能突然出现显著跃升的趋势,远超过随机水平
5、大语言模型发展时间线
6、开源模型
- LLaMA 和LLaMA-2:Meta AI
- ChatGLM:智谱AI 和清华大学联合开
- Falcon:是阿布扎比的技术创新研究院(TII)
- Baichuan 和Baichuan-2:百川智能
- InternLM 和InternLM-2:上海人工智能实验室
- Qwen:阿里
- Mistral:Mistral AI
- DeepSeek LLM:幻方公司
- Mixtral:全称为Mixtral 8X7B,Mistral AI
- Gemma:谷歌
- MiniCPM:面壁智能与清华大学共同研发
- YuLan-Chat:中国人民大学
预训练
数据准备
1、数据收集
从下图中我们可以看到,绝大多数的大语言模型都选用了网页、书籍和对话文本等通用语料作为预训练数据。除了这些通用文本外,还有专门文本,例如语言文本、科学文本(如arXiv 论文、科学教材)、代码等
2、数据预处理
当收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚可能有害的数据。如:
质量过滤
质量过滤——基于简单统计指标的过滤:使用语料中标点符号分布、符号与单词比率、句子长度等特征来衡量文本质量。
质量过滤——基于关键词的过滤:
质量过滤——基于分类器的过滤:目前常用来实现分类器的方法包括轻量级模型(如FastText 等)、可微调的预 训练语言模型(如BERT、BART 或者LLaMA 等)以及闭源大语言模型API(如 GPT-4、Claude 3)
敏感内容过滤
除了去除低质量内容,收集到的数据还可能包括有毒内容或隐私信息,需要进一步进行更为细致的过滤和处理。
数据去重
由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对于这些模式的过度学习。
去重可以在句子级别、文档级别和数据集级别等多种粒度上进行。在去重过程中,可以使用精确匹配算法或近似匹配算法。对于精确匹配来说,通常使用后缀数组来匹配最小长度的完全相同子串。对于近似匹配来说,可以采用局部敏感哈希(Locality-Sensitive Hashing, LSH)算法,如最小哈希(MinHash)来实现。
3、词元化(分词)
BPE分词
字节级别的BPE(Byte-level BPE, B-BPE):如括GPT-2 、BART 和LLaMA都采用这种分词方法
WordPiece分词
BERT模型使用
Unigram 分词
T5 和mBART使用
4、数据调度
完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据,进而用于训练大语言模型。通常来说,数据调度(Data Scheduling)主要关注两个方 面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程)。
模型架构
1、归一化的位置
- Post-Norm
Post-Norm 是在原始Transformer 模型中所使用的一种归一化技 术。其中,归一化模块被放置于残差计算之后。其计算公式如下:
其中,Norm 表示任意一种归一化方法。在原理上,后向归一化具有很多优势。首先,有助于加快神经网络的训练收敛速度,使模型可以更有效地传播梯度,从而减少训练时间。其次,后向归一化可以降低神经网络对于超参数(如学习率、初始 化参数等)的敏感性,使得网络更容易调优,并减少了超参数调整的难度。然而, 由于在输出层附近存在梯度较大的问题,采用Post-Norm 的Transformer 模型在训 练过程中通常会出现不稳定的现象。因此,现有的大语言模型中,Post-Norm 很少被单独使用,通常是与其他策略相结合应用。例如,GLM-130B 将Post-Norm 与DeepNorm 结合使用。
- Pre-Norm
Post-Norm 不同,Pre-Norm 将归一化模块应用在每个子 层之前。其计算公式如下:
此处的Norm 泛指任意一种归一化方法。此外,Pre-Norm 在最后一个Transformer 层后还额外添加了一个LayerNorm。相较于Post-Norm,Pre-Norm 直接把每个子层加在了归一化模块之后,仅仅对输入的表示进行了归一化,从而可以防止模型的 梯度爆炸或者梯度消失现象。虽然使用了Pre-Norm 的Transformer 模型在训练过程中更加稳定,但是性能却逊色于采用了Post-Norm 的模型。尽管对于性能有一定的影响,但由于其能够有效维持训练的稳定性,很多主流的大语言模型仍然采 用Pre-Norm。
- Sandwich-Norm
在Pre-Norm 的基础上,Sandwich-Norm 在残差连接之前增加了额外的LayerNorm,旨在避免Transformer 层的输出出现数值爆炸的情况。 具体的实现方式如下所示:
本质上,Sandwich-Norm 可以看作是Pre-Norm 和Post-Norm 两种方法的组合,理 论上具有更加灵活的表达能力。但是研究人员发现,Sandwich-Norm 有时仍然无 法保证大语言模型的稳定训练,甚至会引发训练崩溃的问题。
2、激活函数
激活函数主要是为神经网络中引入非线性变化,从而提升神经网络的模型能力。
3、位置编码
- 绝对位置编码
- 相对位置编码
- 旋转位置编码(Rotary Position Embedding, RoPE)
- ALiBi 位置编码
4、注意力机制
- 完整自注意力机制
对于序列长度为𝑇 的序列需要𝑂(𝑇2) 的计算复杂度。
- 稀疏注意力机制
为了降低注意力机制的计算复杂度,使用最多的是滑动窗口注意力机制:滑动窗口注意力设置了一个大小为𝑤 的窗口,对每个词元𝑢𝑡,只对窗口内的词元[𝑢𝑡−𝑤+1, . . . , 𝑢𝑡 ] 进行注意力计算,从而将复杂度降低到𝑂(𝑤𝑇)。进一步,通过信息的逐层传递,模型实现了随着层数线性增长的感受野,从而获取远处词元的信息。
- 多查询/分组查询注意力
为了提升注意力机制的效率,多查询注意力(Multi- Query Attention, MQA)提出针对不同的头共享相同的键和值变换矩阵。(PaLM采用)
为了结合多查询注意力机制的效率与多头注意力机制的性能,研究人员进一步提出了分组查询注意力机制(Grouped-Query Attention, GQA)。GQA 将全部的头划分为若干组,并且针对同一组内的头共享相同的变换矩阵。(LLaMA-2采用)
5、混合专家模型
大语言模型能够通过扩展参数规模实现性能的提升。然而,随着模型参数规模的扩大,计算成本也随之增加。为了解决这一问题,研究人员在大语言模型中引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE),旨在不显著提升计算成本的同时实现对于模型参数的拓展。
在混合专家架构中,每个混合专家层包含𝐾 个专家组件,记为[𝐸1, 𝐸2, . . . , 𝐸𝐾],其中每个专家组件𝐸𝑖 都是一个前馈神经网络。对于输入的每个词元表示𝒙𝑡,模型通过一个路由网络(或称为门控函数)𝐺 来计算该词元对应于各个专家的权重。在路由函数中,首先通过线性层 映射为𝐾 个专家的得分,并基于此选择出概率最高的𝑘 个专家进行激活。随后,这𝑘 个专家的得分将被送入softmax函数计算出它们的权重𝐺(𝒙𝑡 ) = [𝐺(𝒙𝑡 )1, . . . ,𝐺(𝒙𝑡 )𝑘],没有被选择的专家权重将被置为0。上述路由网络的计算过程如下式所示:
之后,每个被选择的词元的输出的加权和将作为该混合专家网络层的最终输出𝒐𝑡:
6、主流架构
在预训练语言模型时代,自然语言处理领域广泛采用了预训练+ 微调的范式,并诞生了以BERT为代表的编码器(Encoder-only)架构、以GPT 为代表的解码器(Decoder-only)架构和以T5 为代表的编码器-解码器(Encoder-decoder)架构的大规模预训练语言模型。随着GPT 系列模型的成功发展,当前自然语言处理领域走向了生成式大语言模型的道路,解码器架构已经成为了目前大语言模型的主流架构(decoder-only架构成为主流的一些分析https://www.zhihu.com/question/588325646/answer/2940298964)。进一步,解码器架构还可以细分为两个变种架构,包括因果解码器(Causal Decoder)架构和前缀解码器(Prefix Decoder)架构。值得注意的是,学术界所提到解码器架构时,通常指的都是因果解码器架构。
7、长上下文模型
在实际应用中,大语言模型对于长文本数据的处理需求日益凸显,给定一个预训练后的大语言模型,如何有效拓展其上下文窗口以应对更长的文本数据成为当前学术界的研究焦点。目前,增强大语言模型长文本建模能力的研究主要集中在两个方向:一是扩展位置编码,二是调整上下文窗口。
扩展位置编码
在基于Transformer 架构的大语言模型中,模型的上下文建模能力通常受到训练集中文本数据长度分布的限制。一旦超出这个分布范围,模型的位置编码往往无法得到充分训练,从而导致模型处理长文本的性能下降。因此,当大语言模型面临超出其最大训练长度的任务时,需要对于位置编码进行扩展,以适应更长的绝对或相对位置。
调整上下文窗口
采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模。
- 并行上下文窗口
并行上下文窗口方法采用了一种分而治之的策略来处理输入文本。具体来说,该方法将输入文本划分为若干个片段,每个片段都进行独立的编码处理, 并共享相同的位置编码信息。在生成阶段,通过调整注意力掩码,使得后续生成的词元能够访问到前序的所有词元。然而,该方法无法有效地区分不同段落之间的顺序关系,在某些特定任务上可能会限制模型的表现能力。
- Λ 形上下文窗口
在处理长文本时,大语言模型有时会表现出一种不均匀关注的现象:它们倾向于对序列起始位置以及邻近的词元赋予更高的注意力权重。基于这一观察,StreamingLLM [182] 等工作引入了“Λ 形” 注意力掩码方法,能够有选择性地关注每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。在给定的有限内存资源下,这种方法能够生成几乎无限长的流畅文本。然而,由于无法有效利用被忽略的词元信息,这种方法无法充分利用所有的上下文信息。
- 词元选择
在Transformer 的注意力模块中,对于每个词元的预测,并非所有先前词元都提供等量的贡献。实际上,小部分紧密相关词元的注意力分数总和就能够接近所有词元的注意力分数总和。基于这样的一个实践观察,相关研究工作提出了词元选择方法,旨在挑选出最重要的𝑘 个词元,以实现对于完整注意力的有效拟合。词元选择方法可以通过查询与词元相似度和查询与词元所在分块的相似度实现。
8、新型模型架构
Transformer 的自注意 力机制在计算每个词元时都需要利用到序列中所有词元的信息,这导致计算和存储复杂度随输入序列长度的平方级别增长。在处理长序列时,这种复杂性会消耗大量的计算资源与存储空间。为了解决这个问题,研究人员致力于新型模型架构的设计。这些新型模型大多基于参数化状态空间模型(State Space Model, SSM)进行设计,在长文本建模效率方面相比Transformer 有了大幅改进,同时也保持了较好的序列建模能力。
关于SSM的公式推算没看懂。。。
模型预训练
1、预训练任务
在进行模型的大规模预训练时,往往需要设计合适的自监督预训练任务,使得模型能够从海量无标注数据中学习到广泛的语义知识与世界知识。目前,常用的预训练任务主要分为三类,包括语言建模(Language Modeling, LM)、去噪自编码(Denoising Autoencoding, DAE)以及混合去噪器(Mixture-of-Denoisers, MoD)。
- 语言建模:“预测下一个词元”
- 去噪自编码:在去噪自编码任务中,输入文本经过一系列随机替换或删除操作,形成损坏的文本。模型的目标是根据这些损坏的文本恢复出被替换或删除的词元片段。
2、优化参数设置
- 动态批次
现在很多工作都采用了动态批次调整策略,即在训练过程中逐渐增加批次大小,最终达到百万级别。
较小的批次对应反向传播的频率更高,训练早期可以使用少量的数据让模型的损失尽快下降;而较大的批次可以在后期让模型的损失下降地更加稳定,使模型更好地收敛。
- 学习率
学习率调整一般包括预热阶段和衰减阶段:
微调与对齐
指令微调
指令微调是指使用自然语言形式的数据对预训练后的大 语言模型进行参数微调,这一术语由谷歌研究员在2022 年的一篇ICLR 论文中正式提出。在另外一些参考文献中也被称为有监督微调(Supervised Fine-tuning)或多任务提示训练(Multitask Prompted Training)。
指令数据组成:一个经过指令格式化的数据实例包括任务描述(也称为指令)、任务输入-任务输出以及可选的示例。
基于现有的NLP数据集构建指令数据:
1、指令微调的训练策略
多阶段指令数据微调
三种常用的指令微调数据,包括NLP 任务数据、日常对话数据和合成数据。
YuLan-Chat-3 采用了“多阶段指令微调”策略:首先使用大规模NLP任务指令数据对模型进行微调,然后再使用相对多样的日常对话指令和合成指令进一步微调。为了避免能力遗忘问题,可以在第二阶段中添加一些NLP 指令数据。
结合预训练数据与指令微调数据
为了使得微调过程更加有效和稳定,可以在指令微调期间引入了预训练数据和任务,这可以看作是对于指令微调的正则化。在另一方面,将指令数据引入到预训练阶段也成为了一种常见的训练技术。通过提前使用指令微调数据,有可能会帮助模型在预训练阶段更好地感知下游任务,从而更为针对性地从预训练数据中学习知识与能力。
2、参数高效的模型微调
旨在减少需要训练的模型参数量,同时保证微调后的模型性能能够与全量微调的表现相媲美。
- 低秩适配(Low-Rank Adaptation, LoRA)微调技术
大语言模型中包含大量的线性变换层,其中参数矩阵的维度通常很高。研究人员发现模型在针对特定任务进行适配时,参数矩阵往往是过参数化(Over-parametrized)的,其存在一个较低的内在秩。为了解决这一问题,LoRA提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。给定一个参数矩阵𝑾,其更新过程可以一般性地表达为以下形式:
其中,𝑾0是原始参数矩阵,Δ𝑾是更新的梯度矩阵。LoRA的基本思想是冻结原始矩阵,通过低秩分解矩阵和来近似参数更新矩阵,其中𝑅 ≪ 𝐻 是减小后的秩。在微调期间,原始的矩阵参数𝑾0会被更新,低秩分解矩阵𝑨 和𝑩 则是可训练参数用于适配下游任务。在前向传播过程中,原始计算中间状态𝒉 = 𝑾0 . 𝒙 的公式修改为:
在训练完成后,进一步将原始参数矩阵𝑾0 和训练得到的权重𝑨 和𝑩 进行合并: ,得到更新后的参数矩阵。因此,LoRA 微调得到的模型在解码过 程中不会增加额外的开销。
- 适配器微调
适配器微调(Adapter Tuning)在Transformer 模型中引入了小型神经网络模块 (称为适配器)。为了实现适配器模块,研究者提出使用瓶颈网络架构:它首先将原始的特征向量压缩到较低维度,然后使用激活函数进行非线性变换,最后再将其恢复到原始维度。
- 前缀微调
前缀微调(Prefix Tuning)在语言模型的每个多头注意力层中都添加了一组前缀参数。这些前缀参数组成了一个可训练的连续矩阵,可以视为若干虚拟词元的嵌入向量,它们会根据特定任务进行学习。在前缀微调过程中,整个模型中只有前缀参数会被训练,因此可以实现参数高效的模型优化。
- 提示微调
与前缀微调不同,提示微调仅在输入嵌入层中加入可训练的提示向 量。提示微调首先在输入文本端插入一组连续嵌入数值的提示词元,这些提示词元可以以自由形式或前缀形式来增强输入文本,用于解决特定的下游任务。在具体实现中,只需要将可学习的特定任务提示向量与输入文本向量结合起来一起输入到语言模型中。
人类对齐
尽管大语言模型在下游任务中表现出优秀的性能,这些模型有时会出现错误或具有危害性的行为,例如无法正确遵循指令、生成虚假信息、以及产生有害、有误导性以及带有偏见的表达。在大语言模型的预训练和有监督微调的过程中,主要训练目标是根据上下文内容来预测下一个词元。但是,这一过程并未充分考虑人类的价值观或偏好,可能导致大语言模型从数据中学习到不符合人类期望的生成模式。为了规避这些潜在风险,研究人员提出了“人类对齐”这一关键概念,旨在保证大语言模型的行为与人类期望和价值观相一致。
三个具有代表性的对齐标准:有用性(Helpfulness)、诚实性(Honesty)和无害性(Harmlessness)
1、基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)
RLHF 首先需要收集人类对于不同模型输出的偏好,然后使用收集到的人类反馈数据训练奖励模型, 最后基于奖励模型使用强化学习算法(例如Proximal Policy Optimization, PPO ) 微调大语言模型。
2、代表性监督对齐算法DPO
直接偏好优化(Direct Preference Optimization, DPO)是一种不需要强化学习的对齐算法。
大模型使用
解码与部署
大语言模型是通过文本生成的方式进行工作的。在自回归架构中,模型针对输入内容(即提示文本)逐个单词生成输出内容的文本。这个过程一般被称为解码。
1、解码策略
贪心搜索在每个生成步骤中都选择概率最高的词元。
贪心搜索的改进策略:
- 束搜索. 在解码过程中,束搜索(Beam Search)会保留前𝑛 个具有最高概率的句子,并最终选取整体概率最高的生成回复
- 长度惩罚.如果没有长度惩罚,传统的束搜索会倾向于生成较短的句子,因为每生成一个单词,都会乘以一个小于1的概率,使得句子的生成概率逐渐变小。因此,可以在生成概率的计算中引入长度惩罚,通过将句子概率除以其长度的指数幂𝛼,对于句子概率进行归一化处理,从而鼓励模型生成更长的句子。
- 重复惩罚. 为了缓解贪心搜索重复生成的问题
除了贪心搜索外,另一种可选的解码策略是概率采样(Probability Sampling)。 该方法根据模型建模的概率分布采样得到下一个词元,旨在增强生成过程中的随机性和结果的多样性。
随机采样的改进策略:
- 温度采样.
其中,𝑙 𝑗′ 表示每个候选词元的logit,𝑡 是温度系数。具体来说,降低温度系数𝑡 会 使得概率分布更加集中,从而增加了高概率词元的采样可能性,同时降低了低概 率词元的采样可能;当温度系数𝑡 设置为1 时,该公式退化为标准的随机采样方 法;而当𝑡 趋近于0 时,实际上等同于贪心搜索,即总是选择概率最高的词。此 外,当𝑡 趋近于无穷大时,温度采样会退化为均匀采样。
- Top-𝑘 采样:直接剔除概率较低的词元,限制模型从概率最高的前𝑘 个词元中进行采样
- Top-𝑝 采样:该方法的核心思想是从一个符合特定概率条件的最小词元集合中进行采样,要求其中包含的所有词元累积概率大于或等于预设阈值𝑝
几个代表性的大语言模型的解码设置:
- T5. T5 默认采用贪心搜索策略。在翻译和摘要任务中,它使用束搜索(束大小为4)并结合长度惩罚(惩罚因子为0.6)来优化生成结果。
- GPT-3. GPT-3 在所有生成任务中都使用束搜索(束大小为4)和长度惩罚(惩罚因子为0.6)。
- Alpaca. Alpaca 主要面向开放式生成任务,因此使用了基于采样的策略,包括top-𝑘 采样(𝑘 = 50)和top-𝑝 采样(𝑝 = 0.9),并将温度参数设置为0.7,在保证结果可靠的同时促进生成结果的多样性。
- LLaMA. LLaMA 根据具体任务的不同采用了多样化的解码策略。例如,在问答任务中使用了贪心搜索策略;而在代码生成任务中,分别采用了温度设置为0.1(针对pass@1)和0.8(针对pass@100)的采样策略。
2、解码加速算法
键值缓存优化
总体来说,解码算法 主要可以分为两个阶段:(1)全量解码阶段,对于输入序列,一次性地计算其状 态并缓存键值矩阵(算法3 第1 至3 行);(2)增量解码阶段,只计算上一步新生成词元的状态,并不断地以自回归方式生成新词元并对应更新键值缓存,直到生 成结束(算法3 第4-9 行)。
定量评估指标
GPU算力:GPU 每秒能够进行的浮点运算次 数,单位是FLOP/s
GPU带宽:该显卡每秒能够进行的显存读写量,单位是byte/s
算力和带宽的比值被称为该GPU 的计算强度上限𝐼𝑚𝑎𝑥,单位为FLOP/byte。
同样地,模型在运行时也有相应的两个性能指标为:
- 运算量:运行该模型需要的总浮点计算数,单位为FLOP
- 访存量:运行该模型的过程中所需的显存读写量,单位为byte
运算量和访存量的比值被称为该模型的计算强度𝐼,单位为FLOP/byte
当模型的计算强度𝐼 小于GPU 的计算强度上限𝐼𝑚𝑎𝑥 时,这说明GPU 的理论最高显存读写速度低于实际运算所需速度,因此模型实际的运行效率将主要受到显存读写速度的影响,这种情况称为带宽瓶颈;反之,当𝐼 大于𝐼𝑚𝑎𝑥 时,说明GPU 的理论最高浮点运算速度低于实际运算所需速度,因此模型的运行效率将主要受到算力的影响,这种情况称为计算瓶颈。
3、模型量化
模型量化(Model Quantization):减少大模型的显存占用,从而使得能够在资源有限的环境下使用大模型。
在神经网络压缩中,量化通常是指从浮点数到整数的映射过程,目前比较常用的是8比特整数量化,即INT8 量化。针对神经网络模型,通常有两种类型的数据需要进行量化,分别为权重量化(也称为模型参数量化)和激活(值)量化,它们都以浮点数形式进行表示与存储。
一个一般的量化函数:
通过上述数学变换,量化算法将浮点数向量𝒙 转化为量化值𝒙𝒒。其中,𝑆 表示缩放因子,用于确定裁剪范围,𝑍 表示零点因子,用于确定对称或非对称量化,𝑅(.)表示将缩放后的浮点值映射为近似整数的取整操作
权重量化
主流的权重量化方法通常是基于逐层量化的方法进行设计的,旨在通过最小化逐层的重构损失来优化模型的量化权重
代表性方法:GPTQ、AWQ
权重和激活值量化
- 细粒度量化.
举例来说,对权重量化,可以从每个张量改为对每一个通道使用一套量化参数。对于激活值量化来说,则是从每个张量改为对每个词元使用一套量化参数
- 混合精度分解.
其他量化方法
QLoRA
现有研究结论
- INT8 权重量化通常对于大语言模型性能的影响较小,更低精度权重量化的 效果取决于具体的量化方法。在实际使用中,在相同显存开销的情况下,建议优先使用参数规模较大的语言模型,而不是表示精度较高的语言模型。
- 对于语言模型来说,激活值相对于模型权重更难量化
-
轻量化微调方法可以用于补偿量化大语言模型的性能损失
4、模型蒸馏
模型蒸馏(Model Distillation)的目标是将复杂模型(称为教师模型)包含的知识迁移到简单模型(称为学生模型)中,从而实现复杂模型的压缩。一般来说,通常会使用教师模型的输出来训练学生模型,以此来传递模型知识。以分类问题为例,教师模型和学生模型在中间每一层会输出特征表示(特指神经网络模型),在最后一层会输出针对标签集合的概率分布。模型蒸馏的核心思想是,引入额外的损失函数(称为蒸馏损失函数),训练学生模型的输出尽可能接近教师模型的输出。在实际应用中,蒸馏损失函数通常与分类损失函数(交叉熵损失函数)联合用于训练学生模型。下面首先介绍传统的知识蒸馏方法,再介绍其在大语言模型中的应用。
传统的知识蒸馏方法
- 基于反馈的知识蒸馏
这种方法主要关注教师模型最后一层输出的logits,这些logits 经过softmax 变换后,可以用作学生模型的“软标签”来进行学习。蒸馏损失函数可以形式化表示为:
其中L𝑅 往往使用KL 散度作为衡量指标,𝒍𝑡 , 𝒍 𝑠 分别表示教师模型和学生模型的输出logits,𝑝𝑡 (.) 和𝑝𝑠 (.) 分别表示教师模型和学生模型的logits 经过softmax函数所获得的预测标签概率分布。从公式9.14 可以看出,优化的核心目标是让学生模型输出的logits 去近似教师模型输出的logits,进而通过这种方式让学生模型学习到教师模型的特有知识。
- 基于特征的知识蒸馏
与基于预测分布的蒸馏相比,基于中间特征表示的蒸馏关注于教师模型的中间层输出的激活值,并使用这些激活值作为监督信息训练学生模型。例如,在基于多层Transformer 架构的大语言模型 中,每一层输出的特征表示都可以用作知识。相应的蒸馏损失函数可以表示为:
其中𝑓𝑡 (𝑥) 和𝑓𝑠 (𝑥) 分别表示教师模型和学生模型的中间层输出特征,Φ(.) 表示变换函数用于处理输出形状不匹配的情况,L𝐹 (.) 是一个相似度函数,用于衡量教师模型的中间层特征与学生模型的中间层特征的相似度。相较于最终的预测分布,中间层特征提供了更为丰富的模型信息,有助于在模型蒸馏过程中实现更为有效的知识迁移。然而,这种方法也存在一些技术难点,如消除架构不一致的影响、目标层自动化选择等。
大语言模型的知识蒸馏方法
- 白盒模型蒸馏方法
可以获取模型的权重来指导学生模型,典型的方法为MINILLM,其最大可将基于LLaMA 结构的13B参数模型蒸馏到7B;
- 黑盒模型蒸馏方法
无法获得模型权重,只能使用其输出信息来训练小模型。比较典型的工作主要关注于蒸馏大模型的关键能力,如上下文学习能力、思维链推理能力以及指令遵循能力
5、模型剪枝
模型剪枝(Model Pruning)的目标是,在尽可能不损失模型性能的情况下,努力消减模型的参数数量,最终有效降低模型的显存需求以及算力开销。
传统模型剪枝方法
- 结构化剪枝
结构化剪枝(Structured Pruning)旨在去除对于性能影响较小 的模型组件,可以删除神经元、通道甚至中间层。
- 非结构化剪枝
非结构化剪枝(Unstructured Pruning) 主要关注去除模型权重矩阵中不重要的数值。与结构化剪枝不同,非结构化剪枝并不修改模型的结构。一般来说,模型权重都是以矩阵形式进行表示与存储的,非结构化剪枝通过创建一个包含0/1 的掩码矩阵,并将这一矩阵与原始的权重相乘, 其中0所在位置的权重则不会在模型的计算中产生作用。当剪枝完成后,那些被剪枝掉的位置只会存储数值0,从而节省了存储空间。
总体来说,在实际应用中,非结构化剪枝一般可以实现更高的剪枝比率,但是不会显著加速模型的计算过程,因为被掩码的部分可能仍然需要参与计算。要想实现加速,则需要特定软件和硬件的支持。而结构化剪枝通过去除结构单元,可以显著减少所需的矩阵乘法次数,实现模型的压缩和加速。
提示学习
1、上下文学习(In-context learning, ICL)
2、思维链(Chain-of-Thought, CoT)
规划与智能体
1、基于大语言模型的规划
虽然上下文学习和思维链提示方法形式上较为简洁且较为通用,但是在面对诸如几何数学求解、游戏、代码编程以及日常生活任务等复杂任务时仍然表现不佳。为了解决这类复杂任务,可以使用基于大语言模型的规划(Planning)。该方法的核心思想在于将复杂任务分解为若干相关联的子任务,并围绕这些子任务制定包含一系列执行动作(Action)的解决方案,从而将复杂任务的求解转换为一系列更为简单的子任务依次求解,进而简化了任务难度。
大语言模型作为任务规划器,其主要职责是生成目标任务的解决方案,既可以一次性生成包含所有子步骤的详尽动作序列,也可以迭代地生成下一步骤所需执行的动作
2、基于大语言模型的智能体
智能体(Agent)是一个具备环境感知、决策制定及动作执行能力的自主算法系统。研发智能体的初衷在于模拟人类或其他生物的智能行为,旨在自动化地解决问题或执行任务。
发展:基于规则-> 基于模型(尤其是强化学习算法)->基于大语言模型
大语言模型智能体的三个基本组件:记忆组件(Memory)、规划组件(Planning)和执行组件(Execution)
- 记忆组件分长期记忆和短期记忆
-
规划组件为智能体引入了类似于人类解决任务的思考方式,将复杂任务分解为一系列简单的子任务,进而逐一进行解决
-
执行组件的主要职责是执行由规划组件制定的任务解决方案。在技术实现上,执行组件可以通过语言模型自身来完成预定规划,或者通过集成外部工具来增强其执行能力