系列目录-大模型学习篇
问题场景(Problems)
为了把大模型相关的预训练、微调、测试、量化、推理加速、评估等相关的知识点串联起来,我们先用一个章节来介绍LLMs应用。
假如,现在我们想要打造一个LLMs应用,我们可以考虑的路径和资源有哪些呢?
首先我们知道,大模型应用的三要素包括:
(1)算法:模型结构、训练方法
(2)数据:收集、清洗、过滤、组织/结构化、标注、分词等
(3)算力:GPU适配、模型量化、推理加速等
针对这三者之间的关系,我们根据实际经验可以总结如下:
(1)当算力不受限制时,参数量和模型效果成正比,数据量和模型效果成正比,但是增长曲线呈现边际效益递减的趋势。
(2)当算力受限制时,参数量小的模型更快收敛,参数量大的模型更慢收敛。
(3)在训练时间小于某个阈值时,参数量小的模型优于参数量大的模型。超过该阈值后,参数量大的模型达到性能巅峰,而参数量小的模型达到性能瓶颈,参数量大的模型优于参数量小的模型。
(4)总结,针对大多数普通的对话任务,大模型的参数量在6B-10B之间即可满足要求。否则,会浪费时间、算力和人力成本。
因此,在实际应用场景中,理解模型训练成本和能力边界,找到LLMs能解决的合适问题和适配场景,是设计LLMs应用的最重要的第一步!!!
对于一个基于对话模型的系统架构,我们可以大概设计出这个流程:
假如我们把大模型当做一个人的话,当我们完成预训练以后,那么这个人就具有一个能力表。针对这个人的能力和需要解决的问题,我们需要使用不同的方法,提高他解决问题的能力。
(1)提示工程
场景:模型的能力足够,但是我们的问题不明确。
方法:提示模板,思维链提示(零样本、少样本、自动提示)
(2)外部知识&工具调用
需要配套大规模的额外资源,包括知识库,检索器,存储器等。
场景:模型的具备泛化能力,但是缺少领域知识或者最新的资料。
方法:检索增强生成(RAG),人工智能代理(AI Agent)
(3)微调
场景:模型的专业能力不足,缺乏解决某类专业问题的能力。
另外,也包括缺乏领域知识,但是场景不允许使用大规模资源的场景。例如,外部移动设备。
还有,包括对响应速度有高要求的场景,例如,对模型推理速度有极致性能要求。
方法:参数高效微调(PEFT)、冻结微调、全量微调、多任务微调(训练任务并行)、迁移学习(知识域迁移)、增量学习(训练任务串行、按难度梯度配置)、强化学习(PPO和DPO)
(4)继续训练(后训练)
场景:模型的预训练不足,导致通用能力有欠缺。
方法:模型再训练,数据扩充/增强、持续学习(需要避免灾难性遗忘)。
提示工程
(1)基于提示模板
角色包括:system(系统),assistant(助手),user(用户)
基于CR-I-S-P-E设计的提示模板:
作为一个专业研究气候变化的科学家(CR:能力与角色),请基于当前的科学共识和最新的研究数据(I:洞察),撰写一篇详细且科学严谨的报告(S:陈述),内容需涵盖气候变化的原因、影响以及可能的解决方案。请采用客观且权威的写作风格(P:个性),并提供几种不同的结构和论点供选择(E:实验)
(2)基于思维链
提示工程的变种,通过设计连续的几个思考过程,提高大模型的生成内容质量。
Few shot CoT方法(google):
通过手写一个规范示例,输入大模型作为思维链提示
缺点:需要人工操作。
Zero-shot CoT(google 和东京大学):
具体过程需要LLM两次生成
1.先使用 “Let’s think step by step.” 让模型自己给出推理过程。
2.把原始问题以及给出的推理过程再合在一起,让模型抽取出最终答案。
特点:在常识推理问题上,并没有太大的提升。数学推理问题上,有显著的提升。
Auto CoT 方法(Amazon和上海交通大学):
作者假设场景:有一大堆的待测试的问题(没有标注,不知道正确答案和推理过程),如何利用 LLM 和无标注问题集合,在不进行手工编写CoT的情况下,提升LLM回答这些模型的质量?
基本思路:
1.给定待测试的问题query,从无标注问题集合中,采样一批问题;
2.使用 GPT-3 作为产生推理过程的工具,即直接使用 “Let’s think step by step.” 咒语,来对这一批采样的问题产生推理过程;
3.把产生的这些问题和推理过程,构成In-Context-Learning的上文加入到prompt中,再让LLM对问题query进行回答。
采样过程:
1.假设需要在In-Context-Learning的时候加入k个示例,则对问题集合聚k类
2.对于每个
c
l
u
s
t
e
r
cluster
cluster中的问题,按照每个问题跟
c
l
u
s
t
e
r
cluster
cluster中心点的相似度来排序
3.每个
c
l
u
s
t
e
r
cluster
cluster采样一个问题,距离中心点越近的越优先采样,但是得符合一些规则:问题不超过60个token,通过Zero-shot-CoT产生的推理步骤不超过5步(也是前人的经验,简单原则)
外部知识or工具调用
其实关于这一部分,主要我想介绍的是RAG和Agent。但是由于AI Agent的概念正在快速更新和迭代,实际上AI Agent的概念和功能,已经超越或覆盖了传统的LLMs应用。因此,咱们单独开一个章节来学习AI Agent的相关知识。这里主要简单介绍一下传统的RAG框架:
针对RAG的各个环节,我们应该思考的问题如下:
(1)领域数据/内部数据:非结构化和结构化的文件如何存储和利用
(2)文档切分:如何切分文档,保证内容完整,知识独立
(3)向量数据库:读取、存储性能
(4)提问:如何分析用户的真实意图,匹配对应模板
(5)数据库查询:如何设计高效的检索算法,应对高并发,高性能、高可用的场景
(6)向量匹配:如何匹配最合适的向量知识
(7)拼接:如何拼接向量知识和原始提问
(8)效果评估和合规过滤:如何保证模型的输出是有效的,且没有不合规内容
(9)溯源/分析:如果模型评估不通过,如何定位问题发生在哪个环节
(10)用户:模型的结果如何展示给用户
针对这么多问题,RAG的各种改进也层出不穷,从各个维度去优化RAG的性能,所以我们得单独开一章节来详细讲RAG改进的内容。(都记不清挖了多少坑了,唉大模型真难学呀)
大模型微调
(1)提示微调(prompt fine tuning)
软提示微调(soft prompt):
将一个可训练张量与输入文本的 embeddings 拼接起来,这个可训练张量可以通过反向传播来优化,进而提升目标任务的模型效果。冻结大模型原始的参数,只训练这个新增加的 prompt 张量。prompt tuning 随着基座模型参数量的增大效果会变好。
硬提示微调(hard):
直接修改输入 prompt,输入 prompt 是不可导的。例如,指令微调(Instructional Fine-tuning)。
(2)前缀微调(prefix fine tuning)
将一个特定任务的张量添加到输入,这个张量是可训练的,保持预训练模型的参数不变。
主要区别如下:
1)prefix tuning 将 prefix 参数(可训练张量)添加到所有的 transformer 层,而 prompt tuning 只将可训练矩阵添加到输入 embedding。具体地,prefix tuning 会将 prefix 张量作为 past_key_value (即预先计算好的键值对)添加到所有的 transformer 层。
2)用一个独立的 FFN 来编码和优化 prefix 参数,而不是直接优化 soft prompt,因为直接优化可能造成训练不稳定并损害模型性能。一旦soft prompt被优化完毕,独立的FFN就会被移除或停止更新,这样最终的模型只包含固定的prefix张量。
问题:选择合适的prefix长度、初始化策略以及如何有效地训练仍然是开放性的问题。
(3)自适应微调(adapter tuning)
adapter在某种设计思想上与 prefix tuning 是类似的,都是想把额外的可训练参数添加到每个transformer 层。但是不同之处是:prefix tuning 是把 prefix 添加到每个transformer层的输入 embedding上,而 adapter 在原始的两个位置处插入了 adapter 层作为新的组件,包含新的可训练参数。在微调时,冻结大模型的其他层参数,只训练这个adapter里面的参数。
(4)LoRA微调(low rank adaption)
ransformer 模型中包含了很多进行矩阵乘法的稠密层。有论文认为预训练语言模型存在一个低秩,即使映射到更小的子空间中,依然可以高效地学习。基于这个理论,LoRA(Low-Rank Adaptation)假设模型在适应/微调过程中的权重参数更新也存在一个低的内在维度。
对于一个预训练好的模型权重参数,我们可以将权重更新限制为 低秩矩阵分解。即:
h
=
W
X
+
△
X
h=WX+\triangle{X}
h=WX+△X
针对LoRA的改进,可以围绕如何使得参数更新无限接近原始权重的问题展开,关于LoRA改进的章节在这里。
继续训练
(1)强化学习(PPO和DPO)
PPO(近端策略优化)是一种广泛使用的强化学习(RL)算法,以简单、稳定和高效著称。它通过平衡探索(尝试新事物)和利用(使用已有知识)来不断改进智能体的策略。
PPO的关键概念:
1)基于策略:PPO 是一种直接优化策略的算法,即智能体根据观察采取的行动序列。
2)截断目标函数:为了避免策略发生太大变化,PPO 限制每次迭代策略的更新幅度,从而比旧方法(如TRPO)更加稳定。
3)优势函数:PPO 通过计算优势函数来指导更新,优势函数衡量了某个动作比智能体在当前状态下平均动作要好多少。
PPO的工作原理:
数据收集:智能体与环境交互,收集观察数据、动作和奖励。
计算优势:基于观察结果,PPO 计算每个动作相对于当前策略的好坏程度。
策略更新:PPO 使用梯度上升法更新策略,但会截断过大的更新,以防止学习不稳定。
循环进行:这一过程不断循环,策略随着时间逐渐改进。
PPO的性能:
稳定性:PPO 的截断更新防止策略变化过大,从而提升训练过程的稳定性。
效率:PPO 在实际应用中效果很好,适用于像 OpenAI Gym 这样的环境。
简单性:与旧方法相比,PPO 的实现和调整相对简单。
DPO(直接偏好优化)
DPO 是一种较新的方法,专门用于微调大型语言模型(LLMs)。与 PPO 不同,DPO 侧重于利用人类反馈来训练模型,尤其是处理人类偏好相关的语言任务(如生成更连贯的文本)。
关键概念:
基于偏好学习:DPO 通过输出结果的对比学习,而不是简单的奖励值,来优化模型。模型通过学习生成更符合人类偏好的输出。
直接优化:DPO 不依赖复杂的奖励设计,而是使用人类反馈来直接指导训练。
工作原理:
人类反馈:收集模型生成的输出对(如对同一输入的两个不同回答),并询问人类选择更好的输出。
成对比较:模型根据人类的反馈学习更偏好的输出,而非基于数值奖励进行优化。
损失最小化:DPO 通过最小化损失函数,来衡量模型输出与人类偏好的一致性。
DPO特点:
以人为中心:DPO 适用于需要人类反馈的场景,如微调语言模型。
训练简单:DPO 跳过了复杂的奖励设计,直接通过偏好反馈来指导模型优化。
适合大型语言模型:DPO 高效地微调大型模型,如 GPT,通过直接利用人类反馈。
模型推理加速
(1)模型量化(Model Quantization)
通过将模型权重和激活从高精度(如32位浮点数)转换为低精度(如8位整数),减少计算和存储的需求,从而加速推理。
优点:显著减少内存占用和计算复杂度。
常用方法:
1)Post-training quantization:在模型训练完成后对模型进行量化。
2)Quantization-aware training (QAT):在训练过程中考虑量化对模型的影响,保持精度。
量化类型:
1)8-bit (INT8) 量化:较为常见的量化方式,能显著加速推理。
2)4-bit (INT4) 量化:更激进的量化,能进一步减少内存,但可能影响精度。
(2)模型剪枝(Model Pruning)
定义:通过移除神经网络中的冗余连接或不重要的参数来减少模型大小和计算量,从而加速推理。
优点:减少计算需求、降低存储开销,特别适用于稀疏性较高的网络。
常用方法:
1)权重剪枝(Weight Pruning):移除对最终输出影响较小的权重。
2)结构化剪枝(Structured Pruning):移除整个通道或神经元层,从而使硬件加速器更容易优化。
(3)模型蒸馏(Knowledge Distillation)
定义:通过将一个复杂模型(教师模型)的知识转移到一个较小、较轻量化的模型(学生模型),从而加快推理速度。
优点:蒸馏后的学生模型保留了教师模型的大部分知识,但推理速度更快,适合资源受限的场景。
常用方法:
1)Soft Label Distillation:使用教师模型的输出概率分布来训练学生模型。
(4)TensorRT 优化
定义:使用 NVIDIA 提供的 TensorRT 库对深度学习模型进行优化,通过对模型的计算图进行重新排列和融合操作来提高推理速度。
优点:在 NVIDIA GPU 上实现极大的推理加速,特别适用于卷积神经网络(CNN)和 Transformer 模型。
常用方法:
图层融合(Layer Fusion)、精度转换(Precision Calibration)、内存优化等。
(5)并行:张量并行和模型并行(Tensor Parallelism & Model Parallelism)
定义:将模型的参数或计算划分到多个 GPU 或计算节点上并行执行推理。
优点:适合处理超大规模模型,能够充分利用硬件资源进行加速。
常用方法:
张量并行(Tensor Parallelism):将单层神经网络的张量运算分布在多个 GPU 上。
模型并行(Model Parallelism):将不同的神经网络层分配到不同的 GPU 上计算。
(6)混合精度推理(Mixed Precision Inference)
定义:通过将一部分计算以低精度(如16位浮点数,FP16)进行,而保留关键计算以高精度(如32位浮点数,FP32),从而在保持模型精度的同时加速推理。
优点:通过降低计算精度减少推理时间,特别适用于支持混合精度计算的硬件(如 NVIDIA Volta 和 Ampere 架构的 GPU)。
常用方法:使用库如 NVIDIA Apex 或原生支持混合精度的框架进行推理。
(7)深度缓存与张量共享(Deep Caching & Tensor Sharing)
定义:通过缓存重复计算的张量或共享内存中的张量来避免重复计算和内存拷贝。
优点:特别适合处理批量推理任务和计算密集型任务。
常用方法:
1)深度缓存重复访问的张量,以减少重复计算。
2)张量共享技术可以在多次推理过程中减少内存的使用。
(8)高效Transformer架构
定义:在大规模语言模型(如 GPT、BERT)中使用高效的 Transformer 架构改进,例如 Sparse Attention、Linformer、Reformer 等,这些架构在保持模型性能的同时降低了计算复杂度。
优点:适用于大规模语言模型,显著减少计算量,特别是在长序列输入的情况下。
示例:
1)Sparse Transformer:通过稀疏注意力机制减少不必要的计算。
2)Linformer:通过对注意力矩阵进行低秩近似加速计算。
模型评估
1.性能评估(Performance Evaluation)
性能评估主要关注模型在特定任务中的准确性、精度、召回率、F1分数等。常用的方法包括:
1)对于分类问题,常用的评估指标包括准确率(Accuracy)、精度(Precision)、召回(Recall)、F1分数等。对于情感分析模型,可以评估其在不同类别(如积极、消极、中立)上的分类准确性。
2)回归任务:对回归问题使用均方误差(MSE)、均方根误差(RMSE)等指标。在语言生成任务中,预测数值数据或连续数据时可使用这些评估指标。
自然语言处理(NLP)任务的评估指标:
BLEU:用于评估机器翻译、文本生成的质量。
ROUGE:用于评估文本摘要任务的性能。
Perplexity:用于语言模型评估,衡量模型对序列数据的预测不确定性。
Exact Match (EM) 和 F1 Score:在问答任务中评估模型答案与标准答案的匹配情况。
2.推理效率评估(Inference Efficiency Evaluation)
评估模型在不同硬件环境下的推理速度和资源消耗,特别是在大模型部署时。
1)推理时间(Latency):衡量模型从输入到输出的响应时间。通常用来评估模型在实际应用场景中的实时性表现。例如,在对话系统中,快速响应是关键,推理时间必须足够短。
2)吞吐量(Throughput):每秒处理的样本数量(如每秒处理的图像或句子数量)。这是评估大规模任务时的重要指标。
3)内存占用(Memory Footprint):评估模型在运行时的内存需求,特别是大模型在资源有限的设备上的部署情况。
4)模型大小:模型参数量和存储大小也是评估模型推理效率的重要指标,特别是对移动设备或边缘设备的部署。
3.泛化能力评估(Generalization Evaluation)
衡量模型在未见过的数据上的表现,常用的方法包括:
1)测试集表现:使用从未见过的测试集评估模型的泛化能力。
2)交叉验证(Cross-Validation):通过将数据集划分为多个子集,多次训练并测试模型,评估其稳定性和泛化能力。
3)Out-of-Distribution (OOD) 测试:评估模型在数据分布与训练数据不同的情况下的表现,衡量其应对“不可预测情况”的能力。
4.鲁棒性评估(Robustness Evaluation)
考察模型在面对输入扰动、噪声、对抗样本等情况下的表现。
1)对抗攻击评估(Adversarial Evaluation):通过生成对抗样本,测试模型对细微输入扰动的敏感性。
2)噪声测试:通过向输入数据加入噪声,评估模型在处理不完整或嘈杂数据时的表现。
3)可解释性和透明度:评估模型的预测是否可以解释,是否可以合理地解释其决策过程,尤其是对于关键应用领域(如医疗、法律)尤为重要。
5.公平性评估(Fairness Evaluation)
评估模型是否对某些群体或属性(如性别、种族、年龄等)产生偏见。
1)分组公平性(Group Fairness):评估不同群体在模型中的表现是否一致,是否存在系统性的偏见。
2)个体公平性(Individual Fairness):对于相似的个体,模型是否给出类似的预测结果。
3)偏见评估工具:IBM 的 AI Fairness 360 或 Google 的 What-If 工具,可以帮助识别和减少模型中的不公平性。
6.可解释性评估(Interpretability Evaluation)
衡量模型预测结果是否易于理解,是否能够解释模型做出预测的原因。
1)可视化方法:如 Grad-CAM 等技术,用于可视化深度学习模型在图像分类任务中的决策依据。
2)特征重要性评估:使用 SHAP、LIME 等方法评估特征对模型预测的重要性。
7.可扩展性评估(Scalability Evaluation)
考察模型在面对更大规模数据或更多计算资源时的性能。
1)分布式训练效率:评估模型在多GPU或多节点环境下的扩展性能,通常通过衡量训练时间加速比或资源利用率。
2)横向和纵向扩展:横向扩展指增加更多节点,纵向扩展指增加单个节点的计算能力,评估模型在这两种情况下的性能。
8.持续学习能力评估(Continual Learning Evaluation)
持续学习能力评估模型在动态学习新知识时能否保持之前学到的知识。
1)遗忘评估(Catastrophic Forgetting):测试模型在学习新任务时,是否会遗忘之前学过的任务。
2)任务间迁移:评估模型在学习新任务时,能否提高在旧任务上的表现,即任务间知识共享能力。
9.用户体验评估(User Experience Evaluation)
这类评估关注模型在实际应用场景中对用户的影响,尤其是交互式系统。
1)响应时间:评估模型响应的及时性,特别是对于对话系统、搜索引擎等实时应用。
2)输出质量:评估模型生成的输出是否符合用户预期、语言流畅性等。
3)用户满意度:通过用户调研或 A/B 测试,直接评估用户对模型输出的满意度。
10.安全性评估(Security Evaluation)
安全性评估模型在面对恶意输入时的表现,避免出现安全漏洞或被利用。
1)对抗攻击检测:评估模型抵抗对抗攻击的能力。
2)输入验证和过滤:评估模型在处理恶意或无效输入时的反应。