一、背景介绍
我们关注大模型中的两个主流:大语言模型和预训练的基础模型。
01 大语言模型(LLMs)
语言建模是许多自然语言处理任务的基础,而大语言模型(LLMs)的初衷是为了提高语言建模的性能。与传统的神经语言模型(NLMs)和小型预训练的语言模型(PLMs)相比,LLMs以其在解决各种复杂任务时的突发能力、上下文学习能力而为人所知,并重塑了我们使用AI的方式。
随着多模态大语言模型(MLLMs)的发展,LLMs的下游任务远远超出了传统的自然语言范围,小型PLMs无法轻易解决这些问题。在最近的使用LLMs对时间序列和时空数据进行建模的过程中,我们将其分为两大类:可见嵌入型LLMs和不可见嵌入型LLMs。前者通常开源,具有公开可访问的内部状态,典型的例子包括BLOOM、Llama、Alpaca、Vicuna和Falcon等,这些模型通常可以在不同的目标任务上进行微调,并显示出有前途的少样本和零样本能力,无需额外的再训练。后者通常是闭源的,没有公开的内部状态,如PaLM、ChatGPT1和GPT-4,它们通常通过API调用中的提示进行推断。
下图提供了一个关于大模型的简要路线图,概述了它们的发展历程和研究焦点,清晰地揭示了大语言模型和预训练基础模型之间的联系和差异。
二、LLM4TS and LLM4STD
见证了多模态大语言模型(MLLMs)的巨大成功后,我认为主要的研究兴趣之一是如何调整LLMs来解决时间序列和时空数据分析任务。在现有的文献中,这通常可以通过多模态再利用或基于API的提示来实现。
这种方法通常用于激活嵌入可见LLMs的任务相关功能,通过在目标和预训练(源)任务中对齐不同的模态来实现。这与LLMs的微调密切相关,例如适配器调谐和低秩适应,以及模型重编程,这取决于在适应过程中LLMs是微调还是冻结。这种方法允许更深入地利用LLMs的内部状态和任务相关功能,但可能需要更多的计算资源和访问权限。
另一方面,这种方法更直接,将目标模态包装成自然语言提示,并将其输入到LLMs中进行生成推理。这类似于语言模型即服务(LMaaS)的黑盒调优。证据表明,这种方法在跨多个领域的不同目标任务中都适用,并显示出有希望的结果,包括时间序列和时空数据的学习。
01 时间序列和时空数据
时间序列和时空数据作为时间相关的数据类别,在无数现实世界应用中作为基础数据出现。时间序列通常被定义为按时间顺序排列的数据点序列。这些序列可以是单变量的,也可以是多变量的。例如,一个城市每天的温度读数将形成一个单变量时间序列,而结合每天的温度和湿度数据将创建一个多变量时间序列。
-
时间序列数据:这是按时间顺序排列的数据,通常用于分析和预测某一现象随时间的变化情况。代表任务包括时间序列预测、异常检测等。
- 时空数据:这类数据不仅包含时间信息,还包含空间信息。它们被广泛用于地理位置相关的研究和应用中。代表任务包括时空数据插补、时空预测等。
1. 时间序列任务
这个领域通常包括四个主要的分析任务:预测、分类、异常检测和填充。在预测中,目标是预测时间序列的未来值,根据预测范围,可以进一步分为短期和长期预测。在分类中,目标是将输入的时间序列分类到不同的类别中。时间序列的异常检测也可以被理解为一种特殊的分类任务,我们的目标是从正常的时间序列中识别出异常的时间序列。在填充任务中,目标是填充时间序列中的缺失值。
2. 时空图任务
时空图的主要下游任务是预测,该任务旨在通过参考历史属性和结构信息来预测未来的节点特征。典型的例子包括交通预测和一些按需服务。其他常见任务包括链接预测和节点/图分类,其中链接预测的目标是基于历史信息预测边的存在,而节点/图分类的目标是将节点或图分类到不同的类别中。
3. 时间知识图任务
时间知识图中有两个重要任务:补全和预测。前者主要旨在填充图中的缺失关系,而后者关注预测未来的关系。
4. 视频任务
在计算机视觉领域,视频数据包含几个核心任务,如检测、标注、预测和查询。检测的目的是识别视频中的特定物体或动作。标注试图为视频内容生成自然语言描述。预测涉及预测视频序列中的未来帧。最后,查询的目的是检索与特定查询相关的视频片段。值得注意的是,这些任务经常跨越多种模态,与前面提到的数据类型相比,它们受到了相当大的关注。
02 LLM4TS
近年来,大语言模型在时间序列分析中的应用取得了显著的进展。这些模型具有强大的学习能力和表示能力,能够有效地捕捉时间序列数据中的复杂模式和长期依赖关系。
1. 通用模型
随着时间的推移,大语言模型(LLMs)逐渐在时间序列分析领域展现出其潜力。作为从LLM角度处理通用时间序列预测的早期努力之一,有研究正式引入了一个新任务:基于提示的时间序列预测——PromptCast。由于输入和输出都是自然语言句子,PromptCast为时间序列预测提供了一种新颖的“无代码”解决方案,这提供了一个全新视角,而不仅仅是专注于设计复杂的架构。此外,为了应对缺乏大规模训练数据的挑战,有研究提出了一个基于部分冻结LLMs的统一框架,即只微调嵌入和归一化层,同时保持自注意力和前馈层不变。这种方法在所有主要的时间序列分析任务中都达到了最先进或可比的性能,包括时间序列分类、短期/长期预测、插补、异常检测、少样本和零样本预测。
其他研究则更专注于时间序列预测的特定方面。例如,TEMPO专注于时间序列预测,但结合了额外的时间序列分解和软提示等精细设计。还有研究利用LLMs进行时间序列预测,采用两阶段的微调过程:首先使用有监督的微调引导LLM朝向时间序列数据,随后转向针对时间序列预测的下游微调。另有研究通过新的嵌入方法激活了LLM在时间序列上的能力,该方法通过实例、特征和文本原型对齐的方式进行数据的token化和编码,然后创建提示传递给LLMs来执行任务。
2. 特定领域模型
交通运输领域:时间序列预测在智能交通系统(Intelligent Transportation Systems,简称ITS)中发挥着关键作用。为了充分发掘大语言模型在交通运输领域的应用潜力,有研究提出了一种新颖的AuxMobLCast管道,利用LLM进行交通数据挖掘,例如人类移动性预测任务。AuxMobLCast将人类移动性数据转化为自然语言句子,使得预训练的LLM可以直接应用于微调阶段来预测人类移动性。这项工作是首次尝试微调现有的LLM,以预测交通运输领域的数据,为LLM在交通运输领域的应用提供了新的思路和方法。
金融领域:近年来,一些专注于金融领域的大语言模型(LLMs)的研究已在文献中报道。其中一项研究提出了一种简单而有效的指令调优方法,用于金融领域的情感分析。通过这种方法,基于分类的情感分析数据集被转化为生成任务,从而使LLMs能够更有效地应用其广泛的训练和卓越的分析能力。除了NLP任务外,利用LLMs的卓越知识和推理能力进行金融时间序列预测也很吸引人。有研究使用GPT-4进行零样本/少样本推理,以及使用Llama进行基于指令的微调来进行可解释的预测,尽管与GPT-4相比性能相对较差,但仍取得了合理的性能。还有研究使用了类似的方法来基于文本数据预测股票价格变动。这些研究展示了LLMs在金融领域的潜力和多样性,为未来的金融应用和研究提供了新的视角和工具。
事件预测:与具有相等采样间隔的同步(规则)时间序列数据不同,事件序列是具有不规则时间戳的异步时间序列。事件序列在现实世界中扮演着重要角色,如金融、在线购物、社交网络等。时间点过程(Temporal Point Processes,简称TPPs)已成为建模此类数据的标准方法。事件预测旨在根据过去预测未来的时间和事件类型。例如,在在线购物领域,作者想要建立用户的时间戳访问序列模型,并根据他们过去的购物评价来预测他们未来的购物行为。大语言模型(LLMs)在这种设置中潜在地有用,因为事件序列通常伴有丰富的文本信息,而LLMs擅长处理这些信息。
医疗健康领域:医疗健康领域是事件序列中最重要的领域之一,临床模型可帮助医生和行政人员在日常实践中做出决策。基于结构化数据的临床模型使用受限,但GatorTron和NYUTron等临床LLM的扩展和改进,为医学提供了与医生一起阅读和在护理点提供指导的潜力。LLMs还可以通过少样本提示调优,将来自可穿戴设备和临床级传感设备的数值时间序列数据作为基础,在健康任务上带来大的改进。
03 LLM4STD
探讨了大模型在时空数据分析中的进步,这些进步跨越了三个主要的数据类别:时空图、时间知识图和视频。每一种都具有广泛的现实世界应用。
1. 时空图
在深度学习的时代,时空图神经网络(STGNNs)已经成为时空图预测事实上最受欢迎的方法。它们主要利用图神经网络捕捉顶点之间的空间相关性,并利用其他模型(如RNN和CNN)学习不同时间步之间的时间依赖性。
近年来,LLM(大语言模型)的出现为时空表示学习领域的STGNN(时空图神经网络)提供了宝贵的支持。这些模型在处理和上下文化文本数据方面表现出色,使它们具备从各种文本来源(包括新闻文章、社交媒体内容到报告)中提取洞察力的能力。这些洞察力可以无缝地整合到时空结构中,提高其上下文的丰富性。此外,它们促进了多种模态的融合,包括文本、图像和结构化数据,从而扩大了时空理解的深度和广度。这些模型具有生成人类可解释解释的能力,提高了透明度和可靠性,特别是在城市规划或灾害应对等应用中。此外,它们通过简洁表示编码高级信息,促进了计算效率,简化了训练和推理过程。
(1). 大语言模型在时空图中的应用
利用LLMs增强STGNNs学习能力的文献相对较少。第一种方法是使用LLMs学习顶点之间的关系。早期的一项研究提出了一个新颖的框架,利用LLM令人赞叹的图推理能力来增强STGNNs对股票价格变动的预测。在这种方法中,ChatGPT被用来从每日财经新闻中提取不断演变的网络结构,这些推断出的图结构然后被无缝集成到GNNs中,为每个公司生成节点嵌入。这些嵌入证明了对提高与股票变动相关的下游任务的性能是有帮助的。
此外,第二系列研究利用LLMs的先验知识来支持STGNNs的下游应用,如用于人类行为识别的LA-GCN。在LA-GCN中,LLM衍生的知识被转化为先验全局关系(GPR)拓扑和先验类别关系(CPR)拓扑,定义了节点之间的互联。GPR作为生成新颖骨骼表示的指导框架,其主要目标是突出从基础数据中提取的关键节点信息。
- 一般领域的预训练基础模型:
对比学习是一种在图像和文本领域被广泛应用的表示学习方法,它在时空图学习领域也被证明是非常有效的。其中一种代表性方法是STGCL,它通过对比正样本对与负样本对,从复杂的时空图数据中提取丰富和有意义的表示。这种方法使得对比学习在诸如交通预测和电力消耗预测等多样化领域的实际应用中变得可行。为了学习顶点间的有信息量的关系,SPGCL最大化了正邻居和负邻居之间的区分边界,并用一种自我步调策略生成了最优图。
- 气象领域的预训练基础模型:
考虑到计算效率的迫切需求以及及时气候预测的需求,Pathak等人引入了FourCastNet,这是一个利用自适应傅里叶神经算子实现高分辨率预测和快速推断的气候预训练基础模型。它的训练过程包括两个阶段——预训练和微调。在预训练期间,FourCastNet接受监督训练,以获得从前一步到后一步的映射。在微调阶段,它基于预训练模型进行构建,将其优化为以自回归方式预测接下来的两个时间步。
PanGu通过多时间尺度模型组合方法,展示了比FourCastNet更强的中期预测能力,利用新颖的3D地球特定Transformer。这个3D深度网络,增强了地球特定先验,有效地处理复杂的气象数据模式。
ClimaX是一个适应性强的深度学习模型,应用于气候和天气科学,训练于多样化数据集。它扩展了Transformer架构,带有创新组件,优化了计算效率。最初在CMIP6气候数据上进行预训练,ClimaX可以针对各种气候和天气任务进行微调,甚至涉及未见过的变量和时空尺度。
W-MAE将自监督预训练方法(即Masked Autoencoder)整合到气候预测任务中。这种整合使得模型能够从大量的无标签气象数据中提取关键的气象相关特征和通用知识,有助于改善对多样化数据源的处理。与上述方法不同,FengWu通过多模态和多任务方法解决中期气候预测问题。它采用了一种深度学习架构,具有模型特定的Transformer和跨模态融合策略。这种设计精心制作,纳入了不确定性损失,用于各种预测器的区域自适应优化。
- 交通运输领域
在交通运输领域,CPPBTR是一个基于Transformer的新框架,用于人群流量预测,其特点是两阶段的解码过程。在第一解码阶段,生成一个初步序列。随后,在第二解码阶段,系统地遮蔽这个初始序列的每一个时间步,并将其输入到Transformer编码器中,以预测每个遮蔽位置的精细流量。
在交通流量预测领域,TrafficBERT利用了受BERT启发的关键特征。它采用与BERT类似的双向Transformer结构,可以预测整体交通流量,而不是单个时间步。与需要对每条特定道路进行单独训练的常规模型相比,TrafficBERT通过使用来自多条道路的数据进行预训练,增强了模型的泛化能力。
此外,Wang等人引入了交通基础模型(TFM),它将交通模拟纳入到交通预测的领域中。TFM利用图结构和动态图生成算法,巧妙地捕获交通系统内参与者之间的复杂动态和交互。这种数据驱动和无模型的模拟方法有效地解决了传统系统在结构复杂性和模型精度方面长期存在的问题,为使用真实世界数据解决复杂的交通问题奠定了坚实的基础。
2 .时间知识图
结构化知识推理的应用,如搜索引擎、问答系统、对话系统和社交网络等一系列应用都需要对基础结构化知识进行推理。特别是,知识图谱 (KGs) 、作为研究这类知识的复杂多关系设置的重要模型,已经引起了广泛关注。KGs以三元组(s, p, o)的形式表示事实(事件),通常从文本数据中提取,其中s和o分别表示主体和客体实体,p作为关系类型表示谓词。然而,在现实世界中,知识是不断发展的,这激发了时间知识图谱 (TKGs) 的构建和应用,其中事实从三元组(s, p, o)扩展到带有时间戳t的四元组,即(s, p, o, t)。通过有效捕获事实之间的时间依赖性和结构依赖性,TKGs有助于更好地理解实体的行为以及它们如何随着时间的推移促成事实的生成。因此,TKGs的应用和改进对于提高这些系统的性能和准确性具有重要的意义。
由于近年来LLMs在许多文本推理任务中表现出惊人的性能,因此很自然地会主动研究LLMs在TKGs中的有效性。根据所执行的任务,基于LLM的TKG模型可分为两类:预测和补全。
3.视频
视频是视觉信息的数字表示,通常由一系列图像或帧组成,共同传达动作和时间变化。这些数据在各种实际应用中变得无处不在,包括监控系统、娱乐平台、社交媒体和驾驶员辅助系统。对于视频理解的常规深度学习方法主要涉及两个关键范式:
(1) 2D CNNs:在这个范式中,每个视频帧通过2D卷积分别处理,然后在网络顶部沿时间轴聚合。这种方法主要关注空间特征,时间特征的处理较为简单。
(2) 3D CNNs:这种方法通过学习3D卷积来聚合空间和时间特征,从而学习视频的时空表示。与2D CNNs相比,3D CNNs能够更好地捕获视频中的时间动态。
近年来,Transformers也因其捕获长距离依赖的能力而被广泛应用于建模视频的时空依赖,进行视频识别。这种方法不依赖于卷积操作,而是通过自注意力机制来捕获全局的时空依赖关系。
然而,近年来LLMs(大语言模型)和PFMs(多模态模型)的发展为利用视频固有的多模态性质增强视频理解铺平了道路。这些模型,如OpenAI的CLIP和DALL-E,能够通过联合处理视觉和文本模态,有效地从视频数据中提取丰富的上下文信息,实现对复杂场景和事件的更全面理解。此外,这些模型有潜力促进不同领域之间的有效迁移学习,提高视频分析任务的泛化能力和鲁棒性。
三、大模型上的隐私和对抗性攻击
时序数据可能具有高度敏感性,尤其是在医疗和金融等应用场景中。当LLMs在此类数据上进行训练或微调时,它们可能会记住训练数据中的特定细节,从而带来泄露私有数据的风险。因此,如何利用隐私保护技术,如差分隐私和联邦学习,在确保数据隐私的同时,仍然受益于LLMs在时间序列和时空分析上的强大能力,存在大量的研究机会。
四、模型泛化与脆弱性
LLMs通常在通用数据上进行预训练,然后在特定任务上进行微调。如果微调数据中包含对抗性或噪声样本,这个过程可能会引入脆弱性。如果用于微调的时序数据没有得到仔细的处理,模型可能会从这些数据中继承偏见或脆弱性,导致在现实应用中的鲁棒性受损。此外,尽管LLMs在庞大的数据集上进行训练,但它们可能无法很好地泛化到未见过的或分布外的数据。时间序列和时空数据可能会表现出突然的变化或趋势。如果LLM在训练过程中没有遇到过类似的模式,它可能会产生不可靠的输出,这就强调了对鲁棒泛化的需求
五、大模型微调与推理
01大模型消耗的显存简介
在详细说明大模型需要消耗的显存大小之前我们需要先明确几个概念。
一个就是大模型在不同阶段对显存的消耗是不同的。但是大致可以分为三个阶段或者说三个场景。即大模型预训练阶段、大模型微调阶段和大模型推理阶段。
在预训练阶段,大模型通常选择较大规模的数据集获取泛化能力,因此需要较大的批次等来保证模型的训练强大。而模型的权重也是从头开始计算,因此通常也会选择高精度(如32位浮点数)进行训练。需要消耗大量的GPU显存资源。
在微调阶段,通常会冻结大部分参数,只训练小部分参数。同时,也会选择非常多的优化技术和较少的高质量数据集来提高微调效果,此时,由于模型已经在预训练阶段进行了大量的训练,微调时的数值误差对模型的影响通常较小。也常常选择16位精度训练。因此通常比预训练阶段消耗更低的显存资源。
在推理阶段,通常只是将一个输入数据经过模型的前向计算得到结果即可,因此需要最少的显存即可运行。
下面是针对大模型在不同阶段消耗的显存的详细估算。
1.大模型预训练阶段的显存消耗
大模型在预训练阶段需要加载完整的模型结构和大量预训练数据,所以显存需求很大,通常需要几十GB到上百GB。常见的预训练数据集如ImageNet图片数据集、维基百科文本corpus等都比较大。
预训练大模型的显存消耗估算涉及多个因素。以下是一个简化的步骤来估算显存消耗:
模型参数
每个参数通常是一个32位浮点数(float32),需要4字节的存储空间。
如果模型有P个参数,那么参数的总大小为:P×4字节
中间激活
对于每一层,都会有一些中间的激活值。这些激活值的数量通常与模型的宽度和输入数据的大小有关。
假设每层的激活需要A个浮点数,那么激活的总大小为:A×4字节
梯度
每个模型参数在反向传播时都会有一个对应的梯度。
梯度的总大小与模型参数的总大小相同:P×4字节
优化器状态
一些优化器(如Adam)为每个参数存储额外的状态信息。例如,Adam存储每个参数的动量和梯度的平方值。
对于Adam,状态的总大小为:2×P×4字节
批次大小
批次大小会影响中间激活的数量。假设批量大小为B,那么激活的总大小为:B×A×4字节
其他因素
正则化、Dropout、Batch Normalization等可能需要额外的显存。
一些特殊的操作或层(如特殊的卷积)可能有额外的显存需求。
综上所述,预训练大模型的显存消耗估算可以通过以下公式得到:
总显存=(P+B×A+P+2×P)×4字节
这只是一个简化的估算。实际的显存消耗可能会受到其他因素的影响,如模型的具体结构、使用的库和框架、显卡的架构等。为了更准确地估算显存消耗,建议使用专门的工具或在实际环境中进行测试。
进一步简化一下只考虑模型的参数和批次大小,那么大约是4倍批次大小乘以参数的关系。
总结一下就是,大模型预训练阶段需要高精度数值来保证训练过程的准确性,需要大规模数据让模型获得泛化和涌现能力,也会一次使用较大批次加速训练,因此需要大量显存消耗。
2.大模型微调阶段的显存消耗
第二个场景就是大模型微调阶段需要的显存。大模型微调是指在一个预训练大模型的基础上,对模型进行细微的调整,使其适应特定的任务。这通常涉及在新的、特定任务的数据集上进行额外的训练。
在深度学习中,预训练和微调是两个常见的阶段。预训练通常涉及在大型数据集上从头开始训练模型,而微调则是在预训练模型的基础上,使用特定的任务数据进行进一步的训练。通常情况下,微调阶段的显存消耗通常远低于预训练阶段:
-
数据集大小:预训练通常使用的是大型的数据集,如Wikipedia、Common Crawl等,这些数据集包含数十亿的单词。而微调时使用的数据集通常针对特定任务,相对较小。处理更小的数据集时,显存的需求通常会减少。
-
批次大小:由于预训练数据集的大小,通常会使用更大的批次来加速训练。大的批次会消耗更多的显存。而在微调时,由于数据集较小,可以使用较小的批次,从而减少显存使用。
-
模型结构:虽然预训练和微调通常使用相同的模型结构,但在微调时,有时会冻结模型的某些部分(例如,不训练预训练模型的某些层),这可以减少显存的使用。
-
累积梯度:在预训练阶段,由于使用大型数据集和大批次,可能需要累积多个批次的梯度来进行一次参数更新,这会增加显存的使用。而在微调阶段,由于数据集和批次大小都较小,这种需求会减少。
-
正则化和技巧:预训练阶段可能会使用更多的正则化技巧,如Dropout、Layer Normalization等,这些技巧可能会增加显存的使用。而在微调阶段,这些技巧可能会被减少或调整。
-
优化器:某些优化器,如Adam,会为每个参数保存额外的状态信息,从而增加显存使用。在预训练阶段,可能会使用这些优化器,而在微调阶段,可能会选择不同的优化策略。
总之,虽然预训练和微调都是深度学习训练的重要阶段,但由于它们的目标、数据集和策略的差异,微调阶段的显存消耗通常会远低于预训练阶段。这里也没有一个统一的公式估算,主要还是依赖于微调选择的技术和参数。尤其是如果我们冻结了很多参数的话,微调所需要的显存资源也会很低。
简单来说,大模型微调阶段不需要大幅度更新模型权重,因此可以以较低精度来实现,也只需要在较小规模的高质量数据集上进行小批次的输入,因此比大模型预训练阶段消耗更低的GPU显存资源。
3.大模型推理阶段的显存消耗
大模型在推理阶段的显存估计相对简单,主要考虑以下几点:
- 模型参数量:这个与训练阶段相同,决定了模型本身的显存占用量。
- 单次输入数据:推理只需要加载单次输入,而不是像训练时的 batch 数据。所以输入数据量很小。
- 激活复用:推理阶段可以重用激活数据,不需要像训练时存储多个步骤的激活,大幅减少激活显存。
- 无需保存梯度:推理阶段不需要计算和保存梯度信息,减少消耗。
- 优化器状态:推理阶段不需要优化器状态,减少消耗。
所以一个粗略的估计方式是:参数数量×2字节数。例如,一个7B大小的模型,推理阶段通常需要的显存约7*2=14GB。原因是推理阶段通常使用16位精度,一个参数占用2个字节,7b的参数规模是70亿,二者相乘再换算到GB,也就是14GB左右了。
类似的,13B通常需要26GB显存,65B通常需要130GB显存左右才能推理。
不过也有一个需要考虑的是量化,在某些时候,大模型可以继续将16位精度量化成INT8或者INT4的精度,那么量化后的大模型在推理阶段所需要的显存大小可以进一步降低。例如,7B模型的INT4量化可能只需要3.5GB就行。如果模型是混合精度量化,则介于全精度和完全量化之间了。
相比训练阶段,推理阶段显存需求可以降低10倍以上。这使得很大的模型也可以部署到资源受限的环境中进行推理。
总之,推理阶段显存需求远低于训练阶段,原因在于推理只需要前向传播而不需要计算图的反向传播过程。这大大减少了激活和梯度的存储需求。
02 大模型微调
从参数规模的角度,大模型的微调分成两条技术路线:
-
一条是对全量的参数,进行全量的训练,这条路径叫全量微调FFT(Full Fine Tuning)。
-
一条是只对部分的参数进行训练,这条路径叫PEFT(Parameter-Efficient Fine Tuning)。
FFT的原理,就是用特定的数据,对大模型进行训练,将W变成W`,W`相比W ,最大的优点就是上述特定数据领域的表现会好很多。
但FFT也会带来一些问题,影响比较大的问题,主要有以下两个:
-
一个是训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的;
-
一个是叫灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。
PEFT主要想解决的问题,就是FFT存在的上述两个问题,PEFT也是目前比较主流的微调方案
接下来介绍几种比较流行的PEFT微调方案。
1.Prompt Tuning
Prompt Tuning的出发点,是基座模型(Foundation Model)的参数不变,为每个特定任务,训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。
Prompt Tuning的基本原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率。
具体来说,就是将X = [x1, x2, ..., xm]变成,X` = [x`1, x`2, ..., x`k; x1, x2, ..., xm], Y = WX`。
Prompt Tuning是发生在Embedding这个环节的。
如果将大模型比做一个函数:Y=f(X),那么Prompt Tuning就是在保证函数本身不变的前提下,在X前面加上了一些特定的内容,而这些内容可以影响X生成期望中Y的概率。
Prompt Tuning的具体细节,可以参见:The Power of Scale for Parameter-Efficient Prompt Tuning[1]。
2.Prefix Tuning
Prefix Tuning的灵感来源是,基于Prompt Engineering的实践表明,在不改变大模型的前提下,在Prompt上下文中添加适当的条件,可以引导大模型有更加出色的表现。
Prefix Tuning的出发点,跟Prompt Tuning的是类似的,只不过它们的具体实现上有一些差异。
Prompt Tuning是在Embedding环节,往输入序列X前面加特定的Token。
而Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀。
具体来说,就是将Y=WX中的W,变成W` = [Wp; W],Y=W`X。
Prefix Tuning也保证了基座模型本身是没有变的,只是在推理的过程中,按需要在W前面拼接一些参数。
Prefix Tuning的具体细节,可以参见:Prefix-Tuning: Optimizing Continuous Prompts for Generation[2]。
3.LoRA
LoRA是跟Prompt Tuning和Prefix Tuning完全不相同的另一条技术路线。
LoRA背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。
通俗讲人话:大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。
LoRA的基本思路,包括以下几步:
-
首先, 要适配特定的下游任务,要训练一个特定的模型,将Y=WX变成Y=(W+∆W)X,这里面∆W主是我们要微调得到的结果;
-
其次,将∆W进行低维分解∆W=AB (∆W为m * n维,A为m * r维,B为r * n维,r就是上述假设中的低维);
-
接下来,用特定的训练数据,训练出A和B即可得到∆W,在推理的过程中直接将∆W加到W上去,再没有额外的成本。
-
另外,如果要用LoRA适配不同的场景,切换也非常方便,做简单的矩阵加法即可:(W + ∆W) - ∆W + ∆W`。
关于LoRA的具体细节,可以参见LoRA: Low-Rank Adaptation of Large Language Models。
4.QLoRA
LoRA 效果已经非常好了,可以媲美全量微调的效果了,那为什么还要有个QLoRA呢?
这里先简单介绍一下,量化(Quantization)。
量化,是一种在保证模型效果基本不降低的前提下,通过降低参数的精度,来减少模型对于计算资源的需求的方法。
量化的核心目标是降成本,降训练成本,特别是降后期的推理成本。
QLoRA就是量化版的LoRA,它是在LoRA的基础上,进行了进一步的量化,将原本用16bit表示的参数,降为用4bit来表示,可以在保证模型效果的同时,极大地降低成本。
论文中举的例子,65B的LLaMA 的微调要780GB的GPU内存;而用了QLoRA之后,只需要48GB。效果相当惊人!
关于QLoRA的具体细节,可以参见:QLoRA: Efficient Finetuning of Quantized LLMs。
PEFT 的微调方法,还有很多种,比如说还有指令微调Instruction-Tuning,,思维链微调Chain-of-Thought等,以及其他微调方式,感兴趣可以阅读这篇论文:Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning。
附:具体显存消耗
但如果要进行微调,来自北航博士生Yaowei Zheng开源的LLaMA-Factory是一个大模型一键微调平台。主要是用可视化的方式让大家可以一键微调很多业界主流的模型。包括Baichuan、ChatGLM、Mixtral(就是Mistral 8×7B MoE)等模型。这其中还公布了一个数据,即不同参数规模的大模型在不同微调方法下所需的显存大小,十分有参考意义:
微调方法 | 模型精度 | 70亿参数模型 | 130亿参数模型 | 300亿参数模型 | 650亿参数模型 | 8x7B(MoE) |
---|---|---|---|---|---|---|
Full | 16 | 160GB | 320GB | 600GB | 1200GB | 1000GB |
Freeze | 16 | 20GB | 40GB | 120GB | 240GB | 200GB |
LoRA | 16 | 16GB | 32GB | 80GB | 160GB | 120GB |
QLoRA | 8 | 10GB | 16GB | 40GB | 80GB | 80GB |
QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 32GB |
这里的微调方法含义如下:
- Full:全参数微调(Full-Parameter Fine-Tuning),即更新模型的所有参数;
- Freeze:表示冻结部分参数进行微调
- LoRA:Low-Rank Adaptation,微软提出的高效参数微调方法,引入低秩矩阵可以在资源有效的场景下获得较好的效果。
- QLoRA:华盛顿大学提出量化+LoRA方法,资源要求更低,详情参考:华盛顿大学提出QLoRA及开源预训练模型Guanaco:将650亿参数规模的大模型微调的显存需求从780G降低到48G!单张显卡可用!
从上表中我们可以看到,全参数微调其实显存要求很高,如果推理显存如果约等于模型参数的2倍(单位是10亿,例如7B大模型最少需要14G显存才能推理),那么全参数微调几乎是参数的20倍还要多。而使用LoRA则比推理显存大小略高一点。
这里比较重要的参考是8×7B的MoE模型。这个显然就是前段时间刚刚发布的Mixtral大模型(即Mistral 8×7B MoE,详情参考:MistralAI的混合专家大模型Mistral-7B×8-MoE详细介绍,效果超过LLaMA2-70B和GPT-3.5,推理速度快6倍)。这个模型实际参数450亿,每次推理只会激活120亿的参数。这个模型在微调的时候需要的显存大小和450亿参数规模的模型相当。也就是说,MoE最大的优点应该是提升推理速度。推理现存与微调显存实际上不会有什么优势(根据实际测试,Mixtral 8×7B MoE推理最少也要90多G的显存)。如果使用QLoRA方法,那么显存大小会显著降低。不过,这也会降低一点精度。
所以如果要进行微调,比如说要进行LoRA微调或者QLoRA微调,建议使用2-4张80G A100
03 大模型推理
我们可以看出,在有限的GPU情况下,我们可以使用大模型进行推理和微调,如果使用一个7B的大模型进行推理(例如llama2-7b),所使用到的显存大概是7B * 2 = 14GB(假设参数为float16),我用一张40G的A100就可以很轻松进行推理,如果参数精度比float16更小,或者使用混合精度,则使用到的显存更少;
大概看看各个模型都需要什么样的内存,以下只是推理,不包括微调,如果使用微调,大概需要再加20%(LORA)。
LLaMA-7B
建议使用至少6GB VRAM的GPU。适合此模型的GPU示例是RTX 3060,它提供8GB VRAM版本。
LLaMA-13B
建议使用至少10GB VRAM的GPU。满足此要求的gpu包括AMD 6900 XT、RTX 2060 12GB、3060 12GB、3080和A2000。这些gpu提供了必要的VRAM容量来有效地处理LLaMA-13B的计算需求。
LLaMA-30B
建议使用VRAM不低于20GB的GPU。RTX 3080 20GB、A4500、A5000、3090、4090、6000或Tesla V100都是提供所需VRAM容量的gpu示例。这些gpu为LLaMA-30B提供了高效的处理和内存管理。
LLaMA-65B
LLaMA-65B在与至少具有40GB VRAM的GPU。适合此型号的gpu示例包括A100 40GB, 2x3090, 2x4090, A40, RTX A6000或8000。
对于速度来说:
用RTX 4090和Intel i9-12900K CPU的推理速度示例
对于CPU来说,LLaMA也是可以用的,但是速度会很慢,而且最好不要进行训练,只能进行推理,下面是,13B模型在不同CPU上推理速度列表
六、大模型微调之Adapter Tuning
这也是微调中的一种,我觉得这种方式值得详细说明一下,所以在这里介绍一下
Adapter Tuning(论文:Parameter-Efficient Transfer Learning for NLP),该方法设计了Adapter结构,并将其嵌入Transformer的结构里面,针对每一个Transformer层,增加了两个Adapter结构(分别是多头注意力的投影之后和第二个feed-forward层之后),在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调,从而保证了训练的高效性。
每当出现新的下游任务,通过添加Adapter模块来产生一个易于扩展的下游模型,从而避免全量微调与灾难性遗忘的问题。
01 Adapter结构具体细节
每个 Adapter 模块主要由两个前馈(Feedforward)子层组成,第一个前馈子层(down-project)将Transformer块的输出作为输入,将原始输入维度d(高维特征)投影到m(低维特征),通过控制m的大小来限制Adapter模块的参数量,通常情况下,m<<d。然后,中间通过一个非线形层。在输出阶段,通过第二个前馈子层(up-project)还原输入维度,将m(低维特征)重新映射回d(原来的高维特征),作为Adapter模块的输出。同时,通过一个skip connection来将Adapter的输入重新加到最终的输出中去,这样可以保证,即便 Adapter 一开始的参数初始化接近0,Adapter也由于skip connection的设置而接近于一个恒等映射,从而确保训练的有效性。
通过实验发现,只训练少量参数的Adapter方法的效果可以媲美全量微调,这也验证了Adapter是一种高效的参数训练方法,可以快速将语言模型的能力迁移到下游任务中去。同时,可以看到,Adapter 最佳的中间层特征维度m视数据集的大小而异,如:MINI数据集为256,最小的RTE数据集为8。如果始终将维度限制在64,将导致平均准确率略微下降。
总之,Adapter通过引入0.5%~5%的模型参数可以达到不落后全量微调模型1%的性能
02 AdapterFusion
1.背景
为了整合来自多个任务的知识,传统的两个方法是按一定顺序微调(Sequential fine-tuning)或者多任务学习(multi-task learning)。前者的一大问题是需要先验知识来确定顺序,且模型容易遗忘之前任务学到的知识,后者的问题是不同的任务会互相影响,也难以平衡数据集大小差距很大的任务。
而之前的工作,Adapter Tuning的一个优势就是不用更新预训练模型的参数,而是插入比较少的新的参数就可以很好地学会一个任务。此时,Adapter 的参数某种程度上就表达了解决这个任务需要的知识。
作者受此启发,如果想要把来自多个任务的知识结合起来,是否可以考虑把多个任务的Adapter的参数结合起来?基于此,作者提出了 AdapterFusion,这是一种新的两阶段学习算法,可以利用来自多个任务的知识。
2.技术原理
Adapter Fusion(论文:AdapterFusion:Non-Destructive Task Composition for Transfer Learning),一种融合多任务信息的Adapter的变体,在 Adapter 的基础上进行优化,通过将学习过程分为两阶段来提升下游任务表现。
- 知识提取阶段:在不同任务下引入各自的Adapter模块,用于学习特定任务的信息。
- 知识组合阶段:将预训练模型参数与特定于任务的Adapter参数固定,引入新参数(AdapterFusion)来学习组合多个Adapter中的知识,以提高模型在目标任务中的表现。
对于第一阶段,有两种训练方式,分别如下:
- Single-Task Adapters(ST-A):对于N个任务,模型都分别独立进行优化,各个任务之间互不干扰,互不影响。
- Multi-Task Adapters(MT-A):N个任务通过多任务学习的方式,进行联合优化。
对于第二阶段,为了避免通过引入特定任务参数而带来的灾难性遗忘问题,AdapterFusion提出了一个共享多任务信息的结构。针对特定任务m,AdapterFusion联合了第一阶段训练得到的N个Adapter信息。固定语言模型的参数跟N个Adapter的参数,新引入AdapterFusion的参数,目标函数也是学习针对特定任务m的AdapterFusion的参数。
3.AdapterFusion结构:
AdapterFusion具体结构就是一个Attention,它的参数包括query,key, value的矩阵参数,在transformer的每一层都存在,它的query是transformer每个子模块的输出结果,它的key跟value则是N个任务的adapter的输出。通过AdapterFusion,模型可以为不同的任务对应的adapter分配不同的权重,聚合N个任务的信息,从而为特定任务输出更合适的结果。
通过对全量微调、Adapter Tuning、AdapterFusion这三种方法在各个数据集上进行对比实验可以看出,AdapterFusion在大多数情况下性能优于全模型微调和Adapter Tuning,特别在MRPC与RTE数据集中,性能显著优于另外两种方法。
同时,还可以看到第一阶段采用ST-A+第二阶段AdapterFusion是最有效的方法,在多个数据集上的平均效果达到了最佳。而第一阶段采用MT-A+第二阶段AdapterFusion没有取得最佳的效果,在于第一阶段其实已经联合了多个任务的信息了,所以AdapterFusion的作用没有那么明显,同时MT-A这种多任务联合训练的方式需要投入较多的成本,并不算一种高效的参数更新方式。另外,ST-A的方法在多个任务上都有提升,但是MT-A的方法则不然,这也表明了MT-A虽然可以学习到一个通用的表征,但是由于不同任务的差异性,很难保证在所有任务上都取得最优的效果。
总之,通过将适配器的训练分为知识提取和知识组合两部分,解决了灾难性遗忘、任务间干扰和训练不稳定的问题。但是,Adapter模块的添加也导致模型整体参数量的增加,降低了模型推理时的性能。
文献参考:
需要多少GPU显存才能运行预训练大语言模型?大语言模型参数规模与显存大小的关系估算方法~
Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型-腾讯云开发者社区-腾讯云
不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)
实际案例说明AI时代大语言模型三种微调技术的区别——Prompt-Tuning、Instruction-Tuning和Chain-of-Thought | 数据学习者官方网站(Datalearner)
需要多少GPU显存才能运行预训练大语言模型?大语言模型参数规模与显存大小的关系估算方法~ | 数据学习者官方网站(Datalearner)
通俗解读大模型微调(Fine Tuning)