大语言模型的常用微调方法
文章目录
- 数据构造与清洗
- 数据构造方法
- 1.基于 Self-Instruct 方法的数据构造
- 2.面向结构化知识的数据构造
- 数据清洗方法
- 1.IFD 指标法
- 2. MoDS 方法
- 2.2 分词器构造
- 2.2.1 分词器概述
- BPE 分词器
- WordPiece 分词器
- Unigram 分词器
- 2.3 大型语言模型的微调方法
- 前缀调优
- 提示调优
- P-Tuning v2
- LORA
- 2.3.5 DyLoRA
- 2.3.6 AdaLoRA
- 2.3.7 QLORA
- QA-LoRA
- LongLoRA
- 2.3.10 VeRA
大型预训练模型是一种在大规模语料库上预先训练的深度学习模型,它们可以通过大量无标注数据上进行训练来学习通用语言表示,并在各种下游任务中进行微调。预训模型的主要优势是可以在特定任务上进行微调,并且可以在多个任务上进行迁移学习,而提高了模型的训练速度和效率。
数据集的构造对于大型语言模型的微调至关重要。大型语言模型通常需要大量的数:来训练,以便更好地理解和处理复杂的任务。本章将通过分别介绍基于Self-Instruct 及结?化知识的数据构造方法来提升大型语言模型微调阶段的数据质量。
对于预训练模型,分词器(tokenizer)分词是非常重要的一步。分词器将输人的原始本转化为模型可以处理的数字序列,并且将这些数字序列分为 token(标记)和 segment(段)等。我们将从分词器入手,介绍大型语言模型预训练的常用分词方法,如 WordPiece BPE (Byte Pair Encoding,字节对编码)等。
随着模型参数规模的扩大,微调和推理阶段的资源消耗也在增加。在模型微调时,I 了加载训练参数外,还需要大量显存存储梯度和优化器信息。因此,资源消耗情况会随训练参数规模的扩大而不断增加。针对这一挑战,可以通过优化模型结构和训练策略来低资源消耗,本章也将详细介绍多种高效参数调优的方法。
最后我们将结合 LLaMA 预训练模型进行微调实战。
数据构造与清洗
数据构造是构建大模型过程中的关键环节,涵盖数据的获取、清洗、标注、预处理利模型评估等多个步骤。公开数据集、企业数据库、社交媒体平台以及网络爬虫都是非常重要的数据来源,而面向行业的专业研究和实验则为特定领域模型提供了专业数据。与此同时,数据清洗也十分重要,结合Meta发布的 LIMA (Less Is More for Aligoment)模型,在LLaMA-6SB的基础上,只用1000个精心准备的样本数据进行微调,不需要 RLHF (Re.inforcement Learning from Human Feedback,人类反馈强化学习)就达到了和 GPT-4 相媲美的程度。研究者从实验中得出结论:大型语言模型中几乎所有知识都是在预训练期间学习的,并且只需要有限的指令调整数据来教模型生成高质量的输出。因而,在整个过程中,对数据质量的不断监控和优化是保障大型语言模型高性能的不可或缺的环节。如何有效地从大量标注数据中通过合适的数据清洗方法获取“精选”数据也十分重要。
数据构造的方法有多种,我们将对基于 Self-Instruct方法的数据构造及面向结构化知识的数据构造进行介绍。同时,我们也将介绍面向数据清洗任务的 IFD 指标法及 MoDS方法。
数据构造方法
1.基于 Self-Instruct 方法的数据构造
大型的“指令微调”语言模型,即通过微调以响应指令的模型,已经展现出在将零样
本泛化到新任务方面的卓越能力。然而,这些模型在很大程度上依赖于人类编写的指令数据,而这些数据通常在数量、多样性和创造力方面存在一定的限制,从而阻碍了模型的通用性。为了解决这一问题,研究者引入了 Self-Instruct框架,利用指令微调技术可以提升大型语言模型应对信任的能力并提高模型泛化性。
在Self-Instruct 框架中,我们利用公开的大型语言模型 API进行数据收集,以提高预训练语言模型的指令跟随能力。首先利用一个任务种子集作为任务池的起点,随机采样出多个任务指令,利用大型语言模型生成新的指令内容;再利用大型语言模型判断指令任务是否为分类任务(分类任务与生成任务的要求有所不同);然后利用大型语言模型对新的指令内容进行补全,生成输出结果,并且判断如果需要额外输入文本,也进行同步生成;其进行数据过滤,将满足要求的数据加入任务池中;最后重复上面几步操作,直到数据达至数量要求。生成的数据不仅可用于语言模型本身的指令调整,还能让大型语言模型 API更好地遵循指令,从而提高其泛化能力和适应新任务的灵活性。这一自我引导的数据收集方法为大型语言模型的性能提升提供了创新性的途径。
2.面向结构化知识的数据构造
结构化知识数据指的是在一个记录文件中以固定格式存在的数据。在日常工作中,我们有大量的数据存储在数据库、表格以及知识图谱中。这部分数据大多来源于数据专家的收集,精准度较高,但由于这部分数据在使用时需要数据专家进行支撑或定制程序才能面向自然语言进行相关知识查询,因此如何有效地收集结构化数据中的知识数据变得十分重要。
结合前文所提及的 Self-Instruct 方法进行结构化数据的收集,是一种非常有效的数据收集方式——Self-Instruct 方法可以通过引导模型自行生成任务指导,从而实现数据的自动化收集和扩充。在处理结构化数据时,可以设计相应任务所需的提示语(prompt),要求模型根据已有的结构化数据生成类似的数据样本。例如,可以通过自动生成表格记录、数据库查询或图谱关系等方式,引导模型在结构化数据领域生成更多的样杰这样的自我引导方法有助于半富数据集,提高模型的泛化能力,同时球少了人工标注的工作量。下面我们格介绍如何使用表格数据及图谱知识进行结构化数据收集。
数据清洗方法
1.IFD 指标法
在论文“From Quantity to Quality: Boosting LLM Performance with Self.Guided Data Selec-tion for Instruction Tuning”中,研究者提出了一种可以从大量可用数据集中自动识别高质量数据的方法,并提出了一个指令跟随难度(Instruction-Following Difmculty, IFD)指标。
利用 IFD 指标自动筛选“精选数据”(Cherry Data),再利用精选数据进行模型指令微调,获取更好的微调模型,主要涉及以下3个步骤。
步骤1:利用少量数据进行模型初学,所选用的数据采用K-Means 算法对数据进行聚类,针对聚类结果,选取每个簇中的若千数据组成初学数据,并结合大型语言模型进行微调得到初学模型 (Brief Model)。
步骤2:利用初学模型计算原始数据中的所有 IFD 指标,IFD指标包含两个部分,即条件答案分数(Conditioned Answer Score, CAS)与直接答案分数(Direct Answer Score, DAS),其中,条件答案分数采用初学模型再结合指令生成答案阶段预测每个指令时的概率值组成交又熵。
步骤3:利用 IFD 指标对原数据集进行排序,选择分数靠前的数据作为精选数据,对原始模型进行指令微调、获取最终的精选模型。
利用 IFD指标对数据进行筛选,降低了大型语言模型对答案本身拟合能力的影响,可以直接衡量给定指令对模型生成答案的影响。较高的IFD分数表明模型无法将答案与给定的指令内容进行对齐,表明指令的难度更高,对模型调优更有利。
2. MoDS 方法
随着研究的不断深入,研究者在论文 “MoDS: Mode- oricnted Date Seetion for Instruction Tuning”中提业了一种面向模型的指令数据选择方法,MoDS方法。MoDS方法要通过数据质量、数据覆盖范围、数据必要性3个指标来进行数据的筛选。
1)数据质量。为确保数据质量、VoDS方法设计采用了一套奖励模型对数据进行打分。将原始数据的 Instrucion、Input、Output三个部分进行拼接,送入奖励模型,得到评分结果,当评分超过阅值时,则认为数据质量达标,从而构建并得到一份高质量数据集
2) 数据覆盖范围。为了避免所选数据高度相似,可通过K中心贪心(K-Center.Greedy)算法进行数据筛选,在最大化多样性的情況下,使指令数据集最小化,获取种子指令数据集(Seed Instruction Data, SID)。进一步地,确保所选数据中的指令足够多样、沙及知识范围更广。
3) 数据必要性。不同的大型语言模型在预训练过程中所学到的知识和具有的能力都不同,因此在对不同的大型语言模型进行指令微调时,所需的指令数据也需要不同。利用初始模型对数据质量阶段获取的高质量数据集进行预测,利用奖励模型对预测结果分别进行打分,当得分较低时,说明当前模型无法处理好该条数据,对评分低于阈值的数据进一步收集得到必要性数据集。
在模型训练阶段,针对必要性数据集进行结合K中心贪心算法的数据多样性筛选,最终得到增强指令数据集(Augmented Instruction Data, AID),利用 AID 与 SID 进行最终模型的微调。
2.2 分词器构造
分词器在大型语言模型中的作用是将原始文本转换为模型可理解的输人形式。它负责将文本分割成基本单位,并将其转换成模型词汇表中的索引或向量表示。分词器能够标准化输人、处理不同语言、处理待殊文本形式,并控制输人长度,直接影响模型的性能和效果。
2.2.1 分词器概述
在深人介绍分词器之前,我们需要先回答一个重要问题:为何需要对文本进行分词?
词在文本中是最小的独立单元,携带了一定的造又信息。在模型训练过程中,采用分词能够有效降低文本数据的维度,进而提高训练效率。分词器针对不同的粒度也有不同的分词方式,如字符级分词、单词级分词、子词级分词等。
例如针对以下文本:Let’s go to work tomorrow!
1)字符级分词:按照单字符进行分词,就是以char 为最小粒度。显然,该方法的词表中仅需存储字符级别的token,能够最大限度地缩减词表的大小,但分词后的结果仅是单个字符,会导致严重的缺失,如英文中仅采用字母表示,几乎失去了所有的词汇语义信息,使得在后续训练阶段失去重要意义。
2)单词级分词:按照词进行分词,在英文中可以采用空格进行分割。该方法能够用有效地为每个单词进行分词,从语义层面保留了词语信息,但是分词结果中的“Let’s" “tomorrow!”等词的分词结果,存在由于大小写、缩写或标点符号导致的冗余,且单词众多,导致词表不断扩大,如 Transformer XL° 使用基于空格和标点符号的规则分词方式,其词表中的词汇量超过 250 000个,这使得训练的代价非常高昂。同时,即使扩充了词表的规模,也依然存在词表外词(Out-Of-Vocabulary, OOV,又称未登录词)难以表征的情况。
3)子词级分词:按照词的子词进行分词,类似于利用词根和词源来学习一系列单词。通过这些共通的基本单元可以构造更多的词汇,每一个基本单元即是词表的组成部分。
需要指出的是,我们的分词器属于基于统计意义的分词器,而非基于语言学的分词器。然而,一旦经过大量训练数据的学习,这些基本单元也能够掌握语言学上的含义。子词级分词能够有效平衡字符级分词器与单词级分词的优缺点,在大模型预训练中的分词器中得到广泛应用,如BPE、WordPiece 和 Unigram等。
BPE 分词器
BPE 是由爱丁堡大学的Rico Sennrich 等学者于2015年在论文“Neural machine transla-tion of rare words with subword units”中提出的一种简单而高效的数据压缩形式。在研究神经网络机器翻译时,传综的外理方式是为机器翻译任务设定一个固定的词汇表。然而,器翻译面临的是未登录词问题,传统应对方法是对词汇表进行频繁更新,这无疑增加了理的复杂性和工作量。为了解决这二难縣、Rico Sennrich等人提出了一种更为简单且有好的解决方法,即通过将未登录词编码为子单词单元序列,使神经机器学习模型能够处理义登录词问题。这种方法便是BPE。其核心思想是在迭代过程中将原始序列中最频繁出现的字节替换为单个未使用过的字节。具体的算法逻辑如下。
1)采用任意分词方法(如空格分割方法)对所有文本进行分词。
2)统计所有词语的词频,将所有词语以字母形式进行分割,得到相关字符,并设置词库的上限。
3) 统计任意两个字符连续出现的总次数。
4)选取出现次数最高的一组字符对,替换2) 中获得的字符统计,并将该字符对加入词库中。
5)重复3)和4),直到词库规模达到预设上限。
BEP方法是一种高效的分词方法,可以显著缩短训练时间,在大语言模型的训练中体现尤为明显。
WordPiece 分词器
WordPiece 分词器最初由 Google提出,旨在解决神经机器翻译中的未登录词问题。该分词方法被广泛关注,特别是在深度学习领域得到了应用,如常用的预训练语言模型 BERT 尤采用了 WordPiece 分词。WordPiece 可以视作 BPE的一种变体。它首先将所有字符添加可词库中,并需要预先设定词库的规模。在不断添加子词的过程中,WordPiece 与 BPE最C的区别在于子词加入词库的方式。WordPiece 选择最大化训练数据的可能词对,而不考虑司频。这也意味着从初始构建的词库开始,在语言模型的训练过程中,不断更新词库,直词库达到所设规模为止。具体操作步骤如下。
1)对待训练语料进行字符拆分,并将拆分的字符加入初始词库中。
2)设置词库上限。
3) 开始训练语言模型。
4)结合训练的语言模型,将能够最大化训练数据概率的子词作为新的部分加入词库。
5)重复3)和4)直至词库的规模达到上限。
Unigram 分词器
众多研究已经验证,子词单元(Subword)是婴做量路机器翻泽中开放词汇问题的一种有效方法。尽管通常会将句子转换为独特的子后.后千子词的分词结果可能存在潜在的歧义。即使在使用相同词汇的情况下,业可能空振多种分词错果。为了应对这一挑战,Google公司的Kudo 提出了基于Unioram遇管程用的是干子词的分词算法。该算法利用简单的正则化方法来分制歧义,并将其视为陽声、以据育油经机器翻译的鲁棒性。在训练过程中,该算法使用多个概率抽样的基于子词的外词乘训练模型。这种分词方法被称为Unigram分词方法。Unigram分词方法也是一种经管秘采用的分词方式,与BPE、Word-Piece两种分词方式的主要区别是,Unigram在构建词库时基本每含了所有词语和符号,然后采用的逐步删除的方式得到最终的词库。具体步骤如下
- 构建基本包含所有词语和符号的词库。
2)设置词库规模。
3)开始训练语言模型。
4)删除具有最高损失x%的词对。
5)重复3)和4)直至词库规模达到预定规模。
2.3 大型语言模型的微调方法
大型语言模型已经让我们看到了模型的基础能力,与此同时,当个人用户或企业用户准备好数据后,针对模型的微调也能迅速看到模型的迁移能力。随着模型参数规模的不断扩大,使用全量参数规模的训练在模型微调和后续推理阶段必然会导致资源消耗。在模型微调时,不仅需要消耗资源在加载模型的训练参数方面,还需要大量显存资源用于存储训练这些参数的梯度及优化器信息,资源消耗的情况随着训练参数规模的扩大而不断增加。在模型推理时,多个模型的加载也会消耗大量算力资源。
结合上述两种情况,研究者的优化方向也从两个方面共同推进。一方面,针对训练参数过多导致资源消耗巨大的情况,可以考虑通过固定基础大型语言模型的参数,引人部分特定参数进行模型训练,大大减少了算力资源的消耗,也加速了模型的训练速度。比较常用的方法包括前缀调优、提示调优等。另一方面,还可以通过固定基础大型语言模型的架构,通过增加一个“新的旁路”来针对特定任务或特定数据进行微调,当前非常热门的LORA 就是通过增加一个旁路来提升模型在多任务中的表现。
上述各种在模型参数调优阶段进行的操作,开源社区 Hugging Face将其归纳为高效参数调优方法(Parameter-Efficient Fine-Tuning,PEFT)。 PEFT 方法能够在不微调所有模型参数的情况下,有效地让预训练语言模型适应各种下游应用。PEFT方法只微调了少量额外的模型参数,从而大幅降低了大模型训练和微调的计算与存储成本。通过合理使用 PEFT 方法,不但能提高模型的训练效率,还能在特定任务上达到大型语言模型的效果。
前缀调优
为了更好地结合大型预训练语言模型来执行下游任务,目前广泛采用的方法是针对大型语言模型进行微调来提升其表现。然而,微调的一个显著特点是修改了语言模型的所有参数,因此需要为每个任务存储一个完整的模型副本。在这种情况下,研究者提出了前缀调优( Prefix Tuning) 这二方法,这是一种轻量级的微调替代方法,专门用于自然语言生成任务。前缀调优的独特之处在于它不改变语言模型的参数,而是通过优化一系列连续的任务特定向量(即前缀)来实现优化任务。
前缀调优方法通过冻结LM参数并仅优化前缀模块来实现。因此,在训练中只需要为每个任务存储前缀即可,使得前缀调优具有模块化和高效利用空间的特点。
研究者表示,前级调优的灵感来自于语言模型提示,允许后续标记重点关注这个前级,就好像它们是“虚拟标记”二样。这种方法可在特定任务的上下文中引导模型生成文本,而无须修改庞大的语言模型。“前级调优的轻量级设计有望在 NLP任务中提供高效的解决方案,避免了存储和计算资源的浪费,同时保持了模型的性能。
提示调优
提示调优(Prompt Tuning)是一种简单而有效的机制,该方法采用“软提示”( Sor Prompt)的方式,赋予语言模型能够执行特定的下游任务的能力。该方法是由 Brian Leste 在论文“The Power of Scale for Parameter-Efficient Prompt Tuning”中提出的,相较于软护示中直接采用反向传播学习来优化模型参数,提示调优通过冻结整个预训练模型,只允认每个下游任务在输人文本前面添加k个可调的标记(Token)来优化模型参数。这里所使的“软提示”采用端到端的训练方法,并可以完整地学习参与训练的全量数据的参数信息使该方法在少样本提示方面表现出色。
相较于模型调整需要为每个下游任务制作一个任务特分的预训练模型副本,并需要在单独的批次中执行推理,提示调优只需要为每个任务存储-个小的任务特定提示,并允许使用原始的预训练模型进行混合任务推理。在论文的实验又比中,对于TS-XXL模型,每个经过调整的模型副本需要110亿个参数,相比之下,提方调优需要的参数规模仅为20480个参数。
P-Tuning v2
如前所述,提示调优采用连续提示的思想,在原始输人词嵌入序列中添加可训练的连续嵌入。尽管提示调优在相应任务上取得了一定的效果,但当底座模型规模较小,特别是小于1000亿个参数时,效果表现不佳。为了解决这个问题,清华大学的团队提出了 P-Tun-ing v2方法,该方法是一种针对深度提示调优的优化和适应性实现,最显著的改进是对预训练模型的每一层应用连续提示,而不仅仅是输人层。深度提示调优增加了连续提示的功能,并缩小了在各种设置之间进行微调的差距,特别是对于小型模型和困难的任务。此外,该方法还提供了一系列优化和实现的关键细节,以确保可进行微调的性能。P-Tuning v2 方法实际上是一种针对大型语言模型的软提示方法,主要是将大型语言模型的词嵌入层和每个Transformer网络层前都加上新的参数。实验表明,P-Tuning v2在30亿到100亿个参数的不同模型规模下,以及在提取性问题回答和命名实体识别等NLP任务上,都能与传统微调的性能相匹敌,且训练成本大大降低。
LORA
随着大型语言模型的不断推进与应用,对领域数据进行大规模预训练,然后通过微调来适应特定任务成为当前自然语言处理的一种重要范式。模型不断迭代,训练一个全量参数微调的模型需要的算力资源十分庞大。因此,如何制定有效的策略来进行大规模模型微调变得至关重要。微软公司在2021年提出了一种名为Low-Rank Adaptation (LoRA,低秩适配器)的方法。LoRA的核心思想是通过冻结预训练模型的权重,并将可训练的秩分解矩阵注人 Transformer 架构的每一层,从而显著减少下游任务中可训练参数的数量。在训练过程中,
2.3.5 DyLoRA
随着预训练模型规模的持续扩大,微调过程变得愈发耗时且资源密集。为应对此同LoRA 方法应运而生。该方法通过保持模型的主要预训练权重不变,仅引入可学习的薇断异值分解(即LORA块)模式,就可以提升参数效率。但随着研究的深人,LoRA 块存由大核心问题:首先,一且训练完成后, LoRA 块的大小便无法更改,若要调整 LoRA 块的明则需重新训练整个模型,这无疑增加了大量时间和计算成本;其次,LoRA 块的大小是松练前设计的固定超参,优化秩的过程需要精细的搜索与调优操作,仅设计单一的超参无法有效提升模型效果。
为解决上述问题,研究者引入了一种全新的方法—一DyLoRA(动态低秩适应)。D LoRA 的架构如图 2-6所示,研究者参考LoRA 的基本架构,针对每个 LORA 块设计了出影(W…) 和下投影(W…) 矩阵及当前LoRA 块的规模范围R。为确保增加或减少秩利明显阻碍模型的表现,在训练过程中通过对 LoRA 块对不同秩的信息内容进行排序,形
前向截断 DyLoRA 参数更新
预定义的随机分布中进行抽样,来对 LORA 块镜像上投影矩阵和下投影矩阵截断,最终确认单个 LoRA块的大小。
研究结果表明,与LoRA 相比,使用DyLoRA 训练出的模型速度可提升4~7倍,且性
能几乎没有下降。此外,与LoRA 相比,该模型在更广泛的秩范围内展现出了卓越的性能。
2.3.6 AdaLoRA
正如 DyLoRA 优化方法一样,提出 AdaLoRA的研究者也发现,当前LoRA存在的改
进方向:首先,由于权重矩阵在不同 LoRA 块和模型层中的重要性存在差异,因此不能提前制定一个统一规模的秩来约束相关权重信息,需要设计可以支持动态更新的参数矩阵;其次,需要设计有效的方法来评估当前参数矩阵的重要性,并根据重要性程度,为重要性高的矩阵分配更多参数量,以提升模型效果,对重要性低的矩阵进行裁剪,进一步降低计算量。根据上述思想,研究者提出了 AdaLoRA方法,可以根据权重矩阵的重要性得分,在权重矩阵之间自适应地分配参数规模。1
在实际操作中,AdaLoRA采用奇异值分解(SVD)的方法来进行参数训练,根据重要性指标剪裁掉不重要的奇异值来提高计算效率,从而进一步提升模型在微调阶段的效果。
2.3.7 QLORA
随着模型参数规模的不断扩大,如何在较小规模算力水平下镜像大模型训练引起了研究者的广泛关注,Tim Dettmers等研究者在论文“QLoRA: Eficient Finetuning of Quantized LLMS”中提出了一种高效的模型微调方法——QLoRA, 通过 OLORA 微调技术,可以有效降低模型微调时的显存消耗。QLoRA 的架构如图 2-7所示,从图中可以看出,QLoRA 是针对LoRA 的改进,而改进的主要模式是采用4bit精度和分页优化来共同减少模型的显存消耗
- 4bit NormalFloat (NF4)NF4是一种新型数据类型,
它对正态分布的权取来)
信息理论上的最优选择。
可”Qm保化没术浪少了平为内存份做用,CCdM已t化iomn
再量化来实现
务.分8化8有D于管理内有海值,防止排建前在热进和的使不是的n 实。2我米经者能够在单个48GB GPU上收洲s9亿个参数期。
模型、同的楼在的务性能。例如,在训练Guanaeo 楔型时,仅需在GPU上微调24h,即可达到与 ChatGPT相当的 99.3% 性能水平。
QA-LoRA
大型语言模型取得了讯猛发展,尽管在许多语言理解任务中表现强大,但由于巨大计算负担,尤其是在需要将它们部男到边缘设备时,应用受到了限制。在论文“QA-LoR Quantization-avare Low.rank A dantalion of laree language models”中,研究者提出了一量化感知的低秩适应(OA-LORA)算法。该方法来源于量化和适应的自由度不平衡的想。具体而言,预训练权重矩阵的每一列只伴随一个缩放和零参数对,但有很多 LoRA&数。这种不平衡不仅导致了大量的量化误差(对 LLM的准确性造成损害),而且使得将助权重整合到主模型中变得困难。因此,研究者提出采用分组运算符的方式,旨在增加量化自由度的同时减少适应自由度。QA-LoRA的实现简便,仅需几行代码,同时赋予原始的LoRA 两倍的能力:在微调过程中,LLM的权重被量化(如INT4), 以降低时间和内存的使用;微调后,LLM和辅助权重能够自然地集成到一个量化模型中,而不损失准确性。通过在 LLaMA 和 LLaMA2模型系列的实验中证明,QA-LoRA 在不同的微调数据集和下游场景中验证了其有效性。
LongLoRA
通常情况下,用较长的上下文长度训练大型语言模型的计算成本较高,需要大量的训
练时间和GPU资源。例如,对上下文长度为8192的自注意层进行训练需要的计算成本是
上下文长度为2048的16倍。为了在有限的计算成本下扩展预训练大型语言模型的上下文大小,研究者在论文“LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models”中提出了 LongLoRA的方法,
LongLoRA 在两个方面进行了改进:首先,虽然在推理过程中需要密集的全局注意力,但通过采用稀疏的局部注意力,可以有效地进行模型微调。在LongLoRA中,引人的转移短暂的注意力机制能够有效地实现上下文扩展,从而在性能上与使用香草注意力(Vanilla Attention)进行微调的效果相似;其次,通过重新审视上下文扩展的参数高效微调机制,研究者发现在可训练嵌人和规范化的前提下,用于上下文扩展的LoRA 表现良好。
LongLoRA在从 70亿、130亿到700亿个参数的LLaMA2模型的各种任务上都取得了良好的结果。具体而言,LongLoRA 采用LLaMA2-7B模型,将上下文长度从4000个Token扩展到10万个Token.展现了其在增加上下文长度的同时保持了高效计算的能力。这为大型语言模型的进一步优化和应用提供了有益的思路。
2.3.10 VeRA
目前,LoRA 是一种常用的大型语言模型微调方法,它在微调大型语言模型时能够减少
可训练参数的数量。然而,随着模型规模的进一步扩大或者需要部署大量适应于每个用户或任务的模型时,存储问题仍然是一个挑战。研究者提出了一种基于向量的随机矩阵适应(Vector-based Random matrix Adaptation, VeRA)的方法,与LoRA 相比,VeRA 成功将可训练参数的数量减少了10倍,同时保持了相同的性能水平。
相关文章:
大语言模型的常用微调方法
文章目录 数据构造与清洗数据构造方法1.基于 Self-Instruct 方法的数据构造2.面向结构化知识的数据构造 数据清洗方法1.IFD 指标法2. MoDS 方法 2.2 分词器构造2.2.1 分词器概述BPE 分词器WordPiece 分词器Unigram 分词器 2.3 大型语言模型的微调方法前缀调优提示调优P-Tuning …...
安卓获取所有可用摄像头并指定预览
在Android设备中,做预览拍照的需求的时候,我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板,那么就会遇到多摄像头以及外置摄像头问题,简单的指…...
Jwt和Session的区别和优缺点
目录 一、Authentication和Authorization的区别 二、用户认证的两种主流方法 ① 、基于session认证流程如下: ②、基于token(令牌)用户认证如下: 三、区别和优缺点 JWT的优点: JWT的缺点: 安全性 …...
如何使用 Python 读取和写入 CSV 文件?
在Python中,处理CSV文件是一项常见的任务,通常用于数据交换和数据存储。 Python的标准库csv模块提供了一种方便的方式来读取和写入CSV文件。 下面我将详细介绍如何使用Python的csv模块来读取和写入CSV文件,并提供一些实际开发中的建议和注意…...
FR2012富芮坤PMU:设置PMU GPIO为输入读取状态;在睡眠功能中读取IO;PMU GPIO设置唤醒源中断
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?
当云计算席卷而来,基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署(On-premises)和公有云部署(Public Cloud)之间,不断融合的混合IT(Mixed IT)形式成为最常见的企业级…...
RabbitMQ 高级特性——延迟队列
文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列,当队列中的消息达到了过期时间之后,那么这个消息就会被死信交…...
Perl 引用
Perl 引用 Perl,作为一种灵活而强大的编程语言,广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中,引用(References)是一个核心概念,它允许变量引用其他数据,从而创建复杂的数据结构&a…...
llama2——微调lora,第一次参考教程实践完成包括训练和模型
前言:磕磕绊绊,不过收获很多,最大的收获就是解决报错error的分析方法和解决思路 1、首先,我参考的是这篇博客:怎样训练一个自己的大语言模型?全网最简单易懂的教程!_开源模型训练出一个语言模型…...
【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解(SVD) 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码:使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析(PCA࿰…...
C++常见面试题-初级2
1. C和C有什么区别? C是面向对象的语言,而C是面向过程的语言;C引入new/delete运算符,取代了C中的malloc/free库函数;C引入引用的概念,而C中没有;C引入类的概念,而C中没有࿱…...
R square 的计算方法和一点思考
模型的性能评价指标有几种方案:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score 其中,当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score࿱…...
梳理你的思路(从OOP到架构设计)_简介EIT造形
目录 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码结构 <基类/子类>代码结构的变形 2、 从<基类/子类>结构到EIT造形 3、 EIT造形的基本形与变形 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码…...
梳理你的思路(从OOP到架构设计)_认识EIT造形与内涵
目录 1、 认识类(Class)与内涵 2、 认识EIT造形与内涵 EIT造形: 类造形的组合编辑 复习EIT的基本形与变形编辑 不同内涵 EIT造形 1、 认识类(Class)与内涵 回顾 类(Class)是比较小的造形 各种不同内涵,可以透过类(Class)的形式(Form)来呈现出…...
【FTP】FTP基础知识点
文章目录 一、概述二、 工作原理2.1 两个连接2.2 安全性 三、代码实现:1. 选择合适的库2. 连接配置和初始化3. 连接状态检查4. 重连机制5. 文件操作6. 安全性7. 资源管理 参考: 一、概述 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机…...
排序算法(7):堆排序
问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 堆排序 堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构,即除了最后一层外,每一层都必须填满,且最后一层从左往右填充。 堆可以分为大根堆和小根堆。在大根堆中&…...
BERT模型入门(6)语言建模
文章目录 自回归语言建模自编码语言建模 BERT模型在以下两个任务上进行预训练: (1)掩蔽语言建模 (2)下一句预测 让我们逐一了解这两种预训练策略是如何工作的。在介绍掩蔽语言模型任务之前,首先让我们了…...
RNN LSTM Seq2Seq Attention
非端到端: data -》 cleaning -》 feature Engining (70%-80%工作 设计特征)-》 分类器 -》预测 端到端 End-to-End: data -》 cleaning -》Deep learning(表示学习,从数据中学习特征) -》…...
go语言使用websocket发送一条消息A,持续接收返回的消息
在Go语言中实现一个WebSocket客户端,可以使用gorilla/websocket这个非常流行的库来处理WebSocket连接。下面是一个简单的示例,展示了如何创建一个WebSocket客户端,向服务器发送消息"A",并持续接收来自服务器的响应。 首…...
音频进阶学习八——傅里叶变换的介绍
文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…...
沟通的艺术,学会转移矛盾
我的一位好友,资深项目经理,同时也是我公益课程的热心志愿者,最近向我倾诉了他在团队沟通上的挑战。 他发现,尽管辅导学员时感到轻松愉快,但与自己团队成员的沟通却充满挫折。 我询问了他的沟通方式,他解释…...
测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略
携程集团社招入职测评北森题库主要考察以下几个方面: 1. **言语理解**:这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**:包括文字题和图表题,考察应聘者快速找出关键信息…...
C++(进阶) 第4章 map和set的使⽤
C(进阶) 第4章 map和set的使⽤ 文章目录 前言一、序列式容器和关联式容器二、set1. insert2.迭代器遍历3.范围for4.erase5.count6.lower_bound和upper_bound 三、multiset总结 前言 上一篇博客写了二叉搜索树,这一篇博客会在上一篇博客原来的上在深入介…...
数独游戏app制作拆解(之三)——数字候选区实现
所谓的数据候选区就是这个: 数字候选区功能及实现: 说明:这部分其实也是textview. 本区功能: 一、实现数字显示到显示区。点击显示区选定某个格子后,再点击这里的数字,会在格子内显示相应的数字。在编辑…...
数据结构——排序
*排序属于数据的运算 1、定义:将一组杂乱无章的数据按一定规律顺次排列一起,即将无序序列排成一个有序序列的运算。 (如果参加排序的数据结构包含多个数据域,那么排序往往是针对其中某个域而言) 2、排序的应用十分广泛:程序中间接应用(二分查找、最短路径、最小生成树…...
制造业4.0:AI与机器人如何重塑生产线
引言:从传统到未来的转型 在轰鸣的生产线上,传统制造业曾以规模化生产和成本效益为核心竞争力,推动了全球工业化进程。然而,面对现代市场的多样化需求和激烈竞争,这种模式正暴露出越来越多的局限性:产能过剩…...
Fastdfs V6.12.1集群部署(arm/x86均可用)
文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统,特别适合用于存…...
【学习笔记】深入浅出详解Pytorch中的View, reshape, unfold,flatten等方法。
文章目录 一、写在前面二、Reshape(一)用法(二)代码展示 三、Unfold(一)torch.unfold 的基本概念(二)torch.unfold 的工作原理(三) 示例代码(四&a…...
解决Presto dirver timestamp时区问题
#bigdata/metabase 一、背景介绍 1、Presto版本 使用阿里云集群的版本 EMR-5.4.2,Presto的版本为338; Facebook后续不再维护,Trino 351为首个版本 2、Metabase版本 历史版本为0.38.4,新版本为0.51.5 3、0.38.4 cast to time…...
【优选算法】Prefix-Kage:前缀和的算法影(上)
文章目录 1.概念解析2.代码实现2.1【模版】前缀和(一维)2.1.1 原理2.1.2 代码实现 2.2【模版】前缀和(二维)2.2.1 原理2.2.2 代码实现 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算…...
中阳科技:量化交易模型的技术革新与实践应用
在金融市场日益复杂化的今天,量化交易作为数据驱动的现代化交易方式,已成为金融领域发展的关键方向。中阳科技凭借深厚的技术积累与创新能力,积极探索量化交易模型的优化与应用,开辟了智能金融新局面。 量化交易的优势与市场前景…...
golang 判断一个点是否在一个多边形内
我有一需求为:判断一个点(经纬度范围)是否在一个多边形范围内(多个经纬度点) 这里我借助几何库( github.com/paulmach/orb)来处理地理空间数据 可以通过在线获取经纬度来确认代码正确性 packa…...
图论笔记1
1.1邻接矩阵储存法 //创建:二维数组vector<vector<int>> graph(n,vector<int>(n,0));//储存for(int i0;i<m;i){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]1;}1.2邻接表储存法 补充:c中的list是链表 链接 //创建:数组…...
大模型QLoRA微调——基于Qwen2-7B的自动化病历摘要生成系统
01 项目简介 (1)项目背景 医疗文档中包含大量的诊疗信息,例如疾病诊断、手术名称、解剖部位、药物使用以及影像和实验室检查结果。这些信息是医疗数据分析的核心,但由于医疗文本内容复杂、格式多样,提取这些关键内容…...
CTFHub-ssrf
技能树--Web--SSRF 内网访问 开启题目 尝试访问位于127.0.0.1的flag.php吧 进入环境 根据提示输入即可 127.0.0.1/flag.php 伪协议读取文件 开启题目 尝试去读取一下Web目录下的flag.php吧 进入环境,根据提示输入 file:///var/www/html/flag.php 鼠标右键查看…...
使用ElasticSearch实现全文检索
文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件,并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…...
【docker】容器编排之docker swarm
Docker Swarm容器编排详细讲解 Docker Swarm是Docker的原生容器编排工具,它通过将多个Docker引擎组合成一个集群来实现高效的容器部署和管理。 Swarm提供了服务发现、负载均衡、扩展、自动恢复等功能,能够让开发者和运维人员以更简便的方式管理容器化应…...
微信小程序苹果手机自带的数字键盘老是弹出收起,影响用户体验,100%解决
文章目录 1、index.wxml2、index.js3、index.wxss1、index.wxml <!--index.wxml--> <view class="container"><view class="code-input-container"><view class="code-input-boxes"><!-- <block wx:for="{{…...
SCAU期末笔记 - Linux系统应用与开发教程样卷解析(2024版)
我真的不理解奥,为什么会有给样卷不自带解析的,对答案都没得对,故整理一篇 样卷1 一、选择题 1、为了遍历shell脚本调用时传入的参数,需要在shell脚本中使用_____。 A.$#表示参数的个数B.S表示所有参数C.$0表示脚本名D.$1表示…...
2024 年贵州技能大赛暨全省第二届数字技术应用职业技能竞赛“信息通信网络运行管理员”赛项--linux安全题
Linux操作系统渗透测试 Nmap -sS -p- ip 扫描 这题有俩种做法,一种用3306端口,另一种用48119端口 用48119端口是最简单的做法 nc 连接这个端口如何修改root密码 ssh连接 这样我们就成功的拿到root权限 1.通过本地PC中渗透测试平台Kali对服务器场景进…...
CTFshow-php特性(Web125-150)
CTFshow-php特性(Web125-150) Web125 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!p…...
机器学习一点基础
人工智能(Artificial Intelligence, AI)和机器学习(Machine Learning, ML)是当今最热门的技术领域之一。然而,初学者往往面对大量的术语和技术细节,不知道从何入手。本文将以通俗易懂的方式介绍机器学习的基…...
【C++】 While循环高级分析与实践扩展
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯While 循环基础知识1.1 基本语法形式1.2 if 与 while 的区别1.3 循环结构比较 💯While 循环实例分析2.1 执行结果2.2 计算流程分析 💯While 循环注意…...
React Native状态管理器Redux、MobX、Context API、useState
Redux、MobX、Context API、useState都是React中用于状态管理的工具,但它们各自有不同的特点和使用场景。 Redux 介绍: Redux是一个JavaScript状态管理库,最初由Dan Abramov和Andrew Clark于2015年开发。它基于Flux架构,强调状态…...
【AI系列】Paddle Speech安装指南
文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误:libssl.so.1.1解决方法: 5.2 错误࿱…...
【学习笔记总结】华为云:应用上云后的安全规划及设计
一、背景和问题 数字化时代,随着信息技术的飞速发展,企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势,如成本效益、可扩展性、灵活性以及便捷的资源共享等,已然成为了现代业务运营的重要支撑。 今年…...
数据可视化-2. 条形图
目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果(网页显示&#…...
设置Qt程序开机自启动(windows版本)
前言 本文展示在windows环境下,通过代码实现更改系统注册表的方式来实现程序的开机自动启动。 一、注册表 需要更改的系统注册表为: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 二、代码演示 1.头文件 头文件autorun.h #ifndef …...
LeetCode hot100-80
https://leetcode.cn/problems/partition-labels/description/?envTypestudy-plan-v2&envIdtop-100-liked 763. 划分字母区间 已解答 中等 相关标签 相关企业 提示 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。…...
Ubuntu批量修改文件名
文章目录 批量重命名文件:Ubuntu下使用find命令结合sed和mv参考 批量重命名文件:Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中,有时我们需要批量重命名一批文件,比如将文件名中的某个特定字符串替换为另一个字符串。…...