LLM学习:大模型微调&蒸馏&裁剪

文摘   2024-10-26 07:05   美国  

8问LLM

Transformer Layers as Painters

本文为了理解预训练变换器(transformer)模型中各层的作用和它们之间的相互作用。具体来说,作者们试图通过一系列实验来探究以下问题:

  1. 不同层是否使用相同的表示空间?

  2. 所有层是否都是必需的?

  3. 中间层是否执行相同的功能?

  4. 层的顺序是否重要?

  5. 层是否可以并行运行?

  6. 某些任务是否比其他任务更依赖于层的顺序?

  7. 循环是否有助于并行化层?

  8. 哪些变体对性能的影响最小?


 欢迎加入自动驾驶实战群


实验测试


本文对LLM的每一层进行了尝试(赞扬这种打破砂锅问到底的精神❤️)


可以看出:skip和switch起始层和结尾层对模型的影响很大,中间层几乎没有影响。


统计了下每一层的权重激活的分布,也发现中间的权重有很高的相似度。



最终得到如下结论:

1、起始层和结束层很重要,和其他层的表示空间不一样。

2、中间层的权重分布基本一致。可删除小部分层,交换少部分层、并行运行小部分层,对模型结果影响较小(删除/交换越多,性能影响越大)。


3、如果将相似的中间层全部替换为同一个层的权重,会导致严重的性能下降。(全部替换,改动太大)


4、从各种任务效果上看,数学推理这种逻辑要求较高的任务场景受到模型改动的影响更大。而聊天/翻译等场景略好一点。


修剪模型虽然有效,但修剪后的模型在回答事实问题或生成长答案时表现较差。即使在重新训练模型后,也难以弥补这些任务的性能损失,这表明虽然这些层中存储的大部分信息是多余的,但其中的某些部分可能是关键任务所必需的。


Prompt Compression

Characterizing Prompt Compression Methods for Long Context Inference

这篇论文试图解决的问题是长文本上下文推理中的挑战,特别是系统层面上计算和内存需求的增加,以及在处理长文本时准确度的下降。论文关注的是压缩提示(prompt)的方法,以减少上下文长度,同时保留重要信息。

论文通过以下步骤解决这个问题:

  • 方法分类:将方法分为提取式压缩、抽象式压缩和token剪枝。

  • 评估设置:使用GPT-3.5-Turbo、Mixtral 8x7B和DBRX Instruct等模型,以及LongBench基准测试,包括单文档问答、多文档问答和摘要任务。

  • 数据集:使用LongBench中的多个数据集进行评估,包括NarrativeQA、Qasper、MultiFieldQA等。

  • 压缩方法评估:评估了原始方法、LongLLMLingua、重排模型(Reranker)、结合重排和LongLLMLingua的方法,以及查询不可知的抽象压缩方法。


An illustration of different prompt compression methods: Token pruning



An illustration of query-aware and query-agnostic compression


  • 论文分析了提取式压缩、抽象式压缩和token剪枝三种主要方法,并通过一系列实验发现提取式压缩通常表现最佳,能够在几乎不降低准确度的情况下实现高达10倍的压缩率。

  • 论文还探讨了查询感知与查询不可知压缩方法,并发现查询感知的抽象压缩方法在某些情况下表现更好。


LazyLLM:token裁剪

LazyLLM: Dynamic Token Pruning for Efficient Long Context LLM Inference

本文解决的问题是提高基于Transformer的大型语言模型(LLM)在长文本上下文中的推理效率。特别是在推理的预填充(prefilling)阶段,对于长文本提示(prompts),必须计算所有token的KV缓存,这显著增加了生成第一个token所需的时间,可能导致预填充阶段成为生成过程中的瓶颈。

原理

已知LLM的推理过程由prefilling和decoding阶段组成


prompt-based LLM inference can be divided into two sequential stages: prefilling anddecoding


prefilling阶段是计算密集型,decoding阶段是传输密集型。decoding阶段的耗时和kv cache的size有关。

借鉴了LongBench论文中的注意力热力图表示,将全部layer的attention score显示出来可得下图,可以看出大部分score都很低,表示对结果影响极小。


ttention scores of input tokens


因此本文提出了LazyLLM,根据注意力分数有选择性的计算某些token,大大降低了计算量,减少了TTFT(首token耗时)。

Comparison between standard LLM and LazyLLM


具体选择过程如下所示。

Overview of the LazyLLM framework


  • 1、既然需要根据注意力分数筛选,那么就要计算所有token的注意力结果。考虑到使用单层计算可能不够鲁棒,这里选择前30%的层计算全部token,注意力分数取平均值。

  • 2、根据注意力分数按照top-k机制裁剪30%(通过mask方式处理)

  • 3、使用剩余70%的token继续运行30%的层数。使用上述计算的平均注意力继续裁剪掉30%,此时剩40%

  • 4、使用剩余40%的token继续运行30%的层数。使用上述计算的平均注意力继续裁剪掉30%,此时剩10%

  • 5、运行完最后10%的layer,得到输出token。

考虑到当前裁剪的token可能对后续N个token会有影响,因此裁剪不是一次性的,而是每次运行时都会重新进行裁剪。

这里有个小细节:每次都要重新裁剪,需要保证token不会重复计算。

结论

可以在几乎不影响模型质量的条件下,有接近一倍的性能提升(token最多计算一遍,所以最差也和原始模型性能相同)。


Minitron:模型蒸馏裁剪

Compact Language Models via Pruning and Knowledge Distillation

英伟达出品,试图解决的问题是如何有效地压缩大型语言模型(LLMs),以便在不同的部署规模和大小上使用,同时减少从头开始训练每种变体所需的计算资源。

Minitron 模型性能


背景:预训练模型很多,做预训练耗时耗力,因此考虑在现有开源预训练模型基础上进行微调。由于模型参数比较冗余,因此可以进行裁剪,从而减少模型参数,提高推理速度。

最终方案:剪枝+微调

原理

剪枝和蒸馏流程如下所示

High-level overview of our proposed iterative pruning and distillation approach to train afamily of smaller LLMs


在模型宽度上,将维度划分为多个block,尝试了简单求和以及L2、var等方法,简单求和的效果并不总是最好的。


在模型深度上,使用困惑度和block重要性进行评估。

删除单个层并计算其对该剪枝模型的PPL的影响;使用层的输入和输出之间的余弦距离来估计层的灵敏度。灵敏度可以在一次前向传递中计算出来,这使得它比基于 PPL 的重要性具有显着的速度优势。


灵敏度


剪枝后需要对修剪模型进行二次训练,这里有两种方式:传统continues training和Knowledge Distillation。此处尝试了蒸馏训练,将原本未裁剪的模型作为teacher,裁剪后的模型作为student。尝试了多种loss。


最终L

相差很大,因此动态计算合适的α可以达到更好的效果。

效果

MINITRON-BB和同级别模型的性能对比



MINITRON-4B和同级别模型的性能对比


从Nemotron-4-15B裁剪的MINITRON-8B模型和MINITRON-4B模型相比原始模型和其他同级别的base模型相比,具有不错的性能。

和其他裁剪的模型对比


裁剪方法对比


二次训练方法效果对比


Accuracy comparison for 4B using the 8T blend


  • 1、从原始4B模型上随机训练

  • 2、从15B模型裁剪到4B模型上,随机训练

  • 3、从15B模型裁剪到4B模型上,蒸馏训练

  • 3、从8B模型裁剪到4B模型上,蒸馏训练

可以看出裁剪+蒸馏>裁剪>原始模型

蒸馏训练的损失函数选择:尝试使用 Kullback-Leibler 散度 (KLD)、MSE、余弦相似度和反向 KLD (R-KLD) 来计算 Llogits。KLD效果最好。


loss对模型影响对比


训练过程中可以选择很多loss,哪种对模型提升最明显?单独使用 Llogits 可以获得最佳性能。


单次修剪和多次修剪对比。

将 Nemotron-4 15B 压缩为 MINITRON 4B 需要将原始模型重量大幅减少 73.3%。激进的一次性修剪会失去基础LLM的重要功能??? -->   首先修剪和重新训练 Nemotron-4 15B 以创建 MINITRON 8B(减少 46%),然后进一步修剪和重新训练后者为 MINITRON 4B(减少 50%)。

裁剪策略影响


二次裁剪模型质量更高。

二次训练单阶段和两阶段对比。有研究显示多阶段预训练例程的结果更高,测试表明对比本论文模型,单阶段训练就够了。

  • 1、修剪第 1 阶段检查点,使用第 1 阶段和第 2 阶段数据的部分进行重新训练;

  • 2、修剪第 2 阶段检查点,使用第 2 阶段数据的一部分进行重新训练。


FLAMe:RM模型

Foundational Autoraters: Taming Large Language Models for Better Automatic Evaluation

本文提出了FLAMe,这是一个用于自动评估大型语言模型输出的模型系列。FLAMe通过在多样化的人类评估任务集合上进行训练(包含 500 万多个人类判断的 100 多个不同质量评估任务的集合),提高了在各种任务上的泛化能力。

FLAMe-24B vs others


其中任务类型有四种:配对评估、单点评估、分类任务和开放式评估。


数据内容包含回答质量、事实性、安全性、编码和数学等。


结论

高质量数据得训练出高质量模型?其他好像没啥创新点。

WeLore:动态低秩微调

From GaLore to WeLore: How Low-Rank Weights Non-uniformly Emerge from Low-Rank Gradients

我们知道权重很容易出现低秩现象,因此出现了LoRA微调。但是如果以一个固定的低秩参数进行微调又很难得到理想的全量微调效果,因为每个模型的每个权重矩阵的分布都不一样,有些权重矩阵有可能出现满秩,用低秩去近似肯定会损害模型性能。


osine similarity of the gradients obtained from various checkpoints


因此对应于跨transformer的不同层的权重矩阵可以大致分类为:

  • 1、低秩分量(LRC),表现出高质量的低秩结构(可以通过 SVD 获得的排序奇异值中的重尾来估计)它们的梯度可以携带来自数据的丰富误差信号;

  • 2、非低秩分量 (N-LRC) 具有非收敛的低秩结构(奇异值分布中缺少重尾),并且无法在不引入明显重构误差的情况下进行低秩分解

本文根据SVD分解结果动态选择LRC矩阵的秩,并在微调过程中只训练低秩权重,冻结高秩的权重矩阵,以达到加速效果。


最终在精度和FT相当的情况下,大幅提高了微调速度。


Case2Code:代码领域合成数据集

论文试图提高大型语言模型(LLMs)在代码领域进行归纳推理(inductive reasoning)的能力。具体来说,它希望教会LLMs通过观察示例或序列变换来推断潜在的规则,但现有的LLMs大多擅长演绎推理(deductive reasoning)。在人类生成的数据中,需要归纳推理(inductive reasoning)的指令相对较少,这使得LLMs难以学习。

Examples of deductive and inductive reason-ing in the code domain


提出了一个数据合成框架,用于自动生成大规模高质量的Case2Code训练样本。通过在多种设置下训练不同的LLMs,展示了合成的Case2Code数据不仅可以提高LLMs在归纳推理任务上的性能,还可以提升它们在一般编程任务上的能力。

synthetic framework


scaling-with-vocab:词表的scaling law

这篇论文试图解决的问题是确定在扩展大型语言模型(LLMs)时,词汇表大小的最优值。


Vocabulary parameters of popular LLMs and predict vocab size


Llama2-7B 采用32K的词汇量,而 Gemma-7B采用更大的词汇量 256K,那么问题来了:LLM的计算最佳词汇量是多少?


为了分析,本文提出了三种方法:

  • 1、(通过 IsoFLOP 估计幂律):使用从 33M 到 1.13B 范围内的非词表参数预训练模型,模型组共享相同的 FLOP(“IsoFLOP”)但词表配置不同。分别将 FLOP 与非词表参数、词表参数和训练数据相关的幂律拟合。

  • 2、根据论文引入了一种基于导数的方法,通过使用 FLOPs w.r.t. 的导数来估计最佳词表量,并找到相应的零解。,导数计算公式如下



Beyond Chinchilla-Optimal: Accounting for Inference in Language Model Scaling Laws


  • 3、将vocab大小合并到Chinchilla 缩放规则中,并将结果公式拟合到模型上,以根据非词表参数、词表参数和训练量来预测归一化损失函数共同的字符。


分析

基于 Transformer 的语言模型的 FLOPs (C) 大概可以估计为 C ≈ 6N D,可以重写为 

随着词汇量的增加,模型性能先上升后下降的原因是:

  • (1)在较小的 V 下,增加词汇量很容易提高 f (V ) 的tokenizer能力。随后,可以使用固定数量的token从模型中学习更多的字符,从而提高模型性能。

  • (2) 当 V 很大时,分词生育率的增益会降低,而扩展词汇表带来的参数无法在有限的数据下得到充分的训练,从而导致模型性能下降。

FLOPs curve with various vocabulary sizes,


给定固定的 FLOP 预算,对于每个预算,采用一组总参数相似且词汇量从 4K 到 96K 不等的模型。可以发现随着词汇量的增加,loss先降后增,因此存在一个最优的vocab size。

Loss curveswith various vocabulary sizes given different FLOP budgets.


效果

ero-shot performance of models with Nnv = 2.87B



ero-shot performance of models with Nnv = 2.87B


使用优化后的词表大小可以得到更高的性能。


To Code, or Not To Code? Exploring Impact of Code in Pre-training

系统地研究了代码数据对总体性能的影响。


将数据分为通用数据和代码数据两部分。

Fine-tuning Large Language Models with Human-inspired Learning Strategies in Medical Question Answering

本文研究了相同数据和算力下,不同训练策略对模型性能的影响


FuseAI:模型融合蒸馏策略

Knowledge Fusion of Large Language Models

论文试图解决的问题是如何将多个大型语言模型(LLMs)融合,以创建一个统一的模型,该模型有效地利用多个结构不同的LLMs的集体能力和独特优势。


FuseChat与FuseLLM


从语言模型的角度来看,认为概率分布矩阵可以反映其在理解文本时的某些固有知识。因此,来自不同LLM的同一文本的不同概率分布矩阵可用于表示这些模型中嵌入的不同知识。FUSELLM 方法通过概率建模来解决 LLM 融合问题,旨在通过合并源 LLM 的概率分布来创建统一的 LLM。


Loss设计

常规的训练loss如下


将这种token级视图重新构建为顺序分布格式。CLM 目标可以解释为减少 Pθ t 与单热标签矩阵 Ot ∈ {0, 1}N ×V 之间的差异。


当从一组要融合的 LLM 开始时,FUSELLM 在反映预训练数据集的原始文本语料库上对目标 LLM 进行轻量级持续训练。FUSELLM 不是仅仅依赖于 CLM 目标,而是非常重视最小化目标 LLM 的概率分布与源 LLM 的概率分布之间的差异。

对于语料库 C 中的每个文本,应用提供的 K 个源 LLM 并获得一组概率分布矩阵,表示为 {Pθj t }K j=1,其中 θj 表示第 j 个 LLM 的参数。利用这些矩阵,将各个模型的知识外化到统一的空间中,本质上是在文本上创建统一的概率表示。


所得矩阵 Pt 被视为源 LLM 的集体知识和独特优势的表示,使用 Qt 来表示文本 t 的目标 LLM 的输出分布矩阵。为了将源 LLM 的功能转移到目标 LLM,强制目标 LLM 的预测和融合表示矩阵 Pt 之间的对齐。



最终loss为



对齐策略

这里需要注意的是,和模型蒸馏方法有些类似,计算的是logits之间的关系。当不同模型的tokenizer不同时,即使logits经过lm_head线性层转换后的token信息相同,logits分布也可能会差别很大,因此最好是融合同tokenizer的模型(比如qwen系列),不然效果可能会比较差。

我们承认,源 LLM 之间的词汇差异可能会导致矩阵错位 {Pθj t }K j=1。为了解决这个问题,我们采用了token对齐策略(第 3.3 节中对此进行了解释),以促进跨模型的更连贯的概率解释。对齐概率矩阵后,我们继续将它们融合成一个紧凑的表示。

论文中使用了多种对齐方式处理不同的tokenizer。


多个LLM之间的token对齐对于有效的知识融合至关重要,因为它保证了概率分布矩阵的正确映射。

tokne级对齐


token级对齐


为了结合来源法学硕士的集体知识,同时保留其独特优势,必须评估不同法学硕士的质量并为其各自的分布矩阵分配不同的重要性级别。为此,在处理文本 t 时,利用分布矩阵和黄金标签之间的交叉熵损失作为 LLM 预测质量的指标(Marion 等人,2023)。源LLM的交叉熵分数越低,意味着对文本的理解越准确,其预测应该具有更大的意义。基于这个标准,引入两个融合函数:(1)MinCE:该函数输出具有最小交叉熵得分的分布矩阵;(2) AvgCE:该函数根据交叉熵分数生成分布矩阵的加权平均值


logits级对齐


融合算法流程

整个流程可以简单概括为:

  • 1、初始化N个source LLM,并将其中某个复制一份作为target LLM。

  • 2、输入data到source LLM处理,得到N个logit分布,融合成一个最终分布。

  • 3、根据target LLm的结果分布和目标分布计算loss,更新target LLM参数。


LongWriter:模型长文本性能优化

LongWriter: Unleashing 10,000+ Word Generation from Long Context LLMs

本文认为虽然模型能够处理长达100,000个标记的输入,但在生成超过2,000词的输出时表现不佳。原因主要是长数据集的质量不高导致,因此提出了一个合成高质量超长文本数据集的方法。


gentWrite管线


简单来说,论文提出了一个名为AgentWrite的基于代理的流水线,该流水线将超长文本生成任务分解为多个子任务,使得现成的LLMs能够生成超过20,000词的连贯输出:

  • 第一步:计划(Plan),AgentWrite根据用户的输入制定详细的写作计划,包括每个段落的结构和目标字数。

  • 第二步:写作(Write),按照计划,模型依次为每个段落生成内容。为了保持输出的连贯性,在生成每个段落时,会将之前生成的段落作为上下文输入。

LongWriter-6k


最终训练的效果还不错:短文本上没啥优势,但是2k以上提升显著。


Evaluation results on LongBench-Write



最后别忘了,帮忙点“在看”。  

您的点赞,在看,是我创作的动力。


AiFighing是全网第一且唯一以代码、项目的形式讲解自动驾驶感知方向的关键技术。


长按扫描下面二维码,加入知识星球。

Ai fighting
全网第一且唯一分享自动驾驶实战,以代码、项目的形式讲解自动驾驶感知方向的关键技术,从算法训练到模型部署。主要致力于3D目标检测,3D目标追踪,多传感器融合,Transform,BEV,OCC,模型量化,模型部署等方向的实战。
 最新文章