【LLM模型微调】LLMs-垂域微调-微调经验总结v2.0

【1】LLM-SFT-trick-202402

SFT训练-训练模式选择

在进行领域任务的SFT的时候我们通常会有以下训练模式进行选择,根据领域任务、领域样本情况、业务的需求我们可以选择合适的训练模式。

  • 模式一:基于base模型+领域任务的SFT;

  • 模式二:基于base模型+领域数据 continue pre-train +领域任务SFT;

  • 模式三:基于base模型+领域数据 continue pre-train +通用任务SFT+领域任务SFT;

  • 模式四:基于base模型+领域数据 continue pre-train +通用任务与领域任务混合SFT;

  • 模式五:基于base模型+领域数据 continue pre-train(混入SFT数据) +通用任务与领域任务混合SFT;

  • 模式六:基于chat模型+领域任务SFT;

  • 模式六:基于chat模型+领域数据 continue pre-train +领域任务SFT

a.是否需要continue pre-train

  • 大模型的知识来自于pre-train阶段,如果你的领域任务数据集与pre-train的数据集差异较大,(比如你的领域任务数据来自公司内部,pre-train训练样本基本不可能覆盖到)那一定要进行continue pre-train。

  • 如果你的领域任务数据量较大(token在1B以上),并只追求领域任务的效果,不考虑通用能力,建议进行continue pre-train。

b.是选择chat模型 还是base模型

  • 如果有好的base模型,在base模型与在chat模型上进行领域数据的SFT,效果上差异不大。

  • 基于chat模型进行领域SFT,会很容导致灾难性遗忘,在进行领域任务SFT之后,模型通用能力会降低,如只追求领域任务的效果,则不用考虑。

  • 如果你的领域任务与通用任务有很大的相关性,那这种二阶段SFT会提升你的领域任务的效果。

  • 如果你既追求领域任务的效果,并且希望通用能力不下降,建议选择base模型作为基座模型。

  • 在base模型上进行多任务混合训练,混合训练的时候需要关注各任务间的数据配比。

c.其他情况的选择方案

在资源允许的情况下,如只考虑领域任务效果,我会选择模式二;在资源允许的情况下,如考虑模型综合能力,我会选择模式五;在资源不允许的情况下,我会考虑模式六;

SFT训练-训练参数

a.学习率

学习率是非常重要的参数 ,如果学习率设置不当,很容易让你的SFT模型烂掉。SFT数据集不是特别大的情况下,建议设置较小学习率,一般sft的学习率设置为pre-train阶段学习率的0.1左右,如在pre-train阶段的学习率为9e-5,则SFT学习率设置为9e-6。在10万SFT样本上,采用与pre-train一样的学习率,发现loss一直不收敛,在调低学习率至原来0.1之后,loss在两个epoch之后就收敛。

b.warmup_ratio

通常pre-train训练的warmup_ratio 0.01~0.015之间,warmup-steps在2000左右。在SFT的时候,建议使用更小的ratio,因为相较于pre-train,SFT样本非常小,较小warmup_ratio可以使模型收敛更平滑。但如果你的学习率设置较大,那可以增大你的warmup_ratio,两者呈正相关。

c.Epoch

Epoch设置可以根据loss收敛情况设置,如果SFT样本较少,可以设置较大epoch,在较小的epoch上loss会不收敛,指令都很难遵循。较大epoch会容易导致过拟合,但过拟合要优于欠拟合。如果SFT样本数量较多,如在十万以上,一般2个epoch即可收敛。

SFT训练-其他注意

  • 如果SFT任务类型较多,可以尝试添加_system_prompt,_不同的任务使用不同的system_prompt;

  • 一个好的基座模型非常重要!模型的参数量非常重要;

  • 在SFT的时候,loss依然是你最重要的指标!一般在SFT过程中,loss会先升后降;

  • 可以尝试多种模式训练方案,如在continue pre-train 中添加SFT数据,在SFT数据中添加高质量的pre-train数据;

关于微调的一些新的尝试:

全参数SFT+LoRA微调模式:尝试了将全参数SFT与LoRA进行结合,具体微调的方式:前10%-30% step 采用全参数SFT的方式,后面的step采用LoRA的方式,比单纯的LoRA要更加稳定,比全部采用全量参数SFT更加节省资源。该方式动机,通常来讲,大模型微调的时候,前面step中,模型参数变化最快,loss也是下降的最快,后面step模型参数变化幅度越来越小,loss变化幅度变小,逐渐收敛。因此,可以在微调的最开始step采用全参数SFT,让模型能够尽快的学习到指令,后面采用LoRA的方式,让模型能够更好的遵循指令。全参数SFT与LoRA 训练step配比,可以依据自己的tokens来定。

尝试LoRA的升级版本:DoRA,DoRA: Weight-Decomposed Low-Rank Adaptation(http://arxiv.org/abs/2402.09353),目前还没有看出DoRA较LoRA的特别大的优势,后面还需做更多的实验进行观察。

【2】垂直领域大模型微调实践经验最全总结-202404

本篇从基座模型选择、模型整体架构、数据设计、训练微调四个角度总结垂直领域大模型微调经验。

一、基座模型选择

1. 医学类大模型微调怎么选择大模型

推荐BLOOMZ模型

BLOOMZ 模型系列使用了PILE语料库进行训练,该语料库包含各种医学文本,包括PubMed Central 和 PubMed Abstracts等。BLOOMZ模型的医学知识体系比较丰富。

二、模型整体架构

1. 不要指望一个单个垂直领域的LLM就可以满足所有需求,合理的做法可能是实时更新的知识库+微调的医疗LLM ,如 ChatLaw (https://github.com/PKU-YuanGroup/ChatLaw)

2. 超大参数模型(至少百亿) 即使被量化其能力依然能保持的较好。

三、数据设计

1. 在LLM时代,需要牢记 数据质量 > 数量 这个真理,如:[Less is More! 上交清源 && 里海 | 利用200条数据微调模型,怒超MiniGPT-4!],超大规模的SFT数据会让下游任务LLM减弱或者失去ICL、CoT等能力。

2. 为防止灾难性遗忘,在算力充足情况下推荐使用医疗数据和通用语料数据进行训练,这样模型既可以有医学上的训练学习,也可以保持通用能力(如指令遵循)

3. 大量数据进行二次预训练需要配比各类型其他数据:

(1) 语言模型训练完成后,参数各个区域负责部分已经确定,如果大量增加某类在预训练时没有的知识,会造成参数的大幅度变化,造成整个语言模型能力损失;

(2) 进行大规模数据的二次预训练,需要添加5-10倍原始预训练中的数据,并打混后一起训练。

4.训练数据要严格控制噪音:

(1) 预训练数据中如果出现少量连续的噪音数据,比如连续重复单词、非单词序列等,都可能造成特定维度的调整,从而使得模型整体PPL大幅度波动;

(2) 有监督微调指令中如果有大量与原有大语言模型不匹配的指令片段,也可能造成模型调整特定维度,从而使得模型整体性能大幅度下降。

5. 大模型混合多种能力数据微调时呈现:高资源冲突,低资源增益,所以混合不同数据进行微调需要一定的工程技巧,翻译总结一下就是:低资源但高质量,并结合不同领域需求进行配比。

6. 对于静态数据集,在多轮训练中多次迭代可能效果不佳。会导致过拟合,使训练结果恶化。

7. 对于静态数据集,想要让 LLM 强化成「全能选手」,在所有基线任务中都表现优异是不可能完成的。想要解决这个问题需要多样化的数据源,或者使用 LoRA 以外的技术。

四、 训练微调

1. 全流程的LLM训练包括:预训练、监督微调、奖励模型、强化学习,多数情况下监督微调即可满足自身需求。

2. 对于垂类模型,更应该关注PT的过程,而不是采集千万百万的SFT数据做训练,一般建议是 大规模预训练+小规模监督微调=超强的LLM模型。

  1. 指令微调阶段不能够进行过多轮次训练:

(1) 针对少量数据进行多个epoch的训练,可能会造成语言关键区域变化,从而导致整个模型失效;

(2) 为了特定任务提升的指令微调,为了保证模型语言能力关键区不被大幅度调整,需要添加通用指令微调数据或者预训练数据。

4. 通常来说,使用lora的效果不如full-tuning(如LoRA results in 4-6% lower performance compared to full fine-tuning )

5. 7B系列模型请优先采用全参数微调方式(条件不满足就P-tuning,动的参数越多效果通常会更好),13B及以上参数模型可使用LoRA,QLoRA等方法。

  1. 如果要结合 LoRA,确保它在所有层上应用,而不仅仅是 Key 和 Value 矩阵中,这样才能最大限度地提升模型的性能。

7. 虽然 LLM 训练(或者说在 GPU 上训练出的所有模型)有着不可避免的随机性,但多轮训练的结果仍非常一致。

8. 如果受 GPU 内存的限制,QLoRA 提供了一种高性价比的折衷方案。它以运行时间增长 39% 的代价,节省了 33% 的内存。

9. 在微调 LLM 时,优化器的选择不是影响结果的主要因素。无论是 AdamW、具有调度器 scheduler 的 SGD ,还是具有 scheduler 的 AdamW,对结果的影响都微乎其微。

10. 虽然 Adam 经常被认为是需要大量内存的优化器,因为它为每个模型参数引入了两个新参数,但这并不会显著影响 LLM 的峰值内存需求。这是因为大部分内存将被分配用于大型矩阵的乘法,而不是用来保留额外的参数。

11. 调整 LoRA rank 和选择合适的 α 值至关重要,可以把 α 值设置成 rank 值的两倍。

【★】垂直领域大模型微调实践经验最全总结-知乎@喜欢卷卷的瓦力:

**转载链接:**https://zhuanlan.zhihu.com/p/694044473

【3】浅谈大模型 SFT 的实践落地:10问10答-202404

前言:SFT 是“低端”的工作,但它与业务紧密相连。相较于难以实施且多数公司没资源训练的预训练,以及调试难度高的强化学习,SFT 可谓效果立竿见影,SFT在实际应用中更易显现成效。

本文关注如何通过 SFT 逼近大模型的表现,既确保效果又兼顾模型的泛化能力,从而满足业务需求,实现大模型的有效落地。接下来,我将采用 10 问 10 答的分享分享一些经验,这些经验源自实际业务中的实践、社区的交流和 阅读过的 Paper 中,不断总结出来的个人心得,这些经验也会随时间不断更新。期待与大家的交流探讨。

Q1: 常见 SFT的开发流程是如何的?

第一步,根据业务场景调整提示词(prompt):业务团队会提供具体场景,或者给出他们编写的prompt,也可能只提供场景和数据,需要算法工程师自行编写。编写优秀的 prompt 对发挥模型的最大性能至关重要,一个出色的 prompt 可能将性能提升至80分以上直接得到业务要求,而一个普通的prompt可能只能得到50分。这里可以参考 OpenAI 和 文心一言 的相关教程。

这里也介绍一些个人的经验:

  • 越详细越好,给到的定义越细越好:例如多标签分类分类,不同的标签起码要有 1-2 句标签定义,你会发现大 size 的模型是十分遵循你的标签定义的,写得越详细越贴近业务,效果越好。

  • 不要让模型理解任何歧义,如现在你输入是好几篇微博,你应该输入“微博 1:{微博 1 的内容}\n微博 2:{微博 2 的内容}…微博 n:{微博 n 的内容}”,通过一个明确的前缀让模型知道输入的是不同的微博,而不只是简单用换行符把不同的微博内容进行拼接。

  • 遵循System message,Input,Instruction 三段式:这样输出的结果格式和效果会较为稳定。

  • 通过模型输出的解析调整 prompt:现在的模型除了输出答案,还会输出解析理由,通过浏览模型判断错误的例子模型是怎么解释的,从而反馈到调整 prompt,看看是不是prompt 里的定义没说清楚。

第二步,尝试闭源和开源,并进行对比:Prompt 调整至差不多了,可以尝试使用不同的开源模型,如 Llama2 、 Qwen 、 Baichuan 等。实测下来,确实不同的开源模型擅长点不一样。如果开源模型效果不佳。这时考虑闭源模型,如 Chatgpt4、 Kimi 、 Qwen-max… ,以评估这闭源领先的 LLM 是否能解决这类场景问题,这一步工程师也要积累经验,对闭源和开源的效果差距要熟悉。若业务接受闭源模型的效果和成本,则直接调 API 就好。若不接受,则需转向微调闭源模型。

第三步,认真准备数据集:选定最佳闭源模型后,精选数据集,通常每个子任务的数据量不应超过1K条,数据集必须包含任务的边界样本和困难样本,并确保数据的多样性和标签的平衡。

第四步,上线迭代:最后,进行训练、上线和持续地迭代优化,以确保模型性能不断提升并满足业务需求。

这里推荐 OpenAI 在2023年11月6日 Dev Day 上的一个分会场的分享,会场的主题是如何使LLM 的效果最大化。https://www.youtube.com/watch?v=ahnGLM-RC1Y

Q2: 训练数据要注重什么?

  • 确保回答格式和风格的统一,如大家看 gpt4 的回答风格就是先复述理解问题,再回答,再总结,这就是一个格式的统一。经验是,训练数据的格式和风格越统一,越能最大限度地发挥模型在具体任务的效果上限。这在 LIMA、YI、 Reformatted Alignment 的论文中都有提到。

  • 数据集既要包含难也要包含易:数据集应同时包含容易错的 “Boundary use cases” 边界数据,但也要包含常规的 “Easy” 数据,以确保模型能够处理各种难度级别的样本。

  • 注意任务的多样性和标签的平衡。例如,若两个任务难度相当,但任务1的数据占比远大于任务2,那么微调后的模型在处理任务2时可能表现不佳。

  • 避免引入模型在预训练阶段未接触过的知识:以减少模型产生幻觉的风险。

这里可以吸收下 Llama2、Yi、Qwen、Deepseek 和 Tigerbot 等报告的SFT数据篇中的宝贵经验。

Q3: 大 size 和小 size 模型的选择?

在效率和资源都达标和到位的情况上,优先用大 size 的模型进行实验和微调,因为大 size 的模型在容错性上比小 size 的好太多。尽管大尺寸模型也可能存在多任务不稳定、标签不平衡等问题,但其表现通常会比小尺寸模型更为稳定。因此,选用大尺寸模型其实是节省了人力成本,避免了很多之后可能会遇到的各种坑。

Q4: 多任务训练时怎么确保每个任务都优秀?

阿里巴巴的 一篇研究:https://arxiv.org/abs/2310.05492 深入探讨了这一现象。

很尴尬的是,目前实践下来,任务的相互影响是一个普遍现象,例如

  • 训练集中包含四个任务,现在针对任务1补充了大量 bad cases 后重新训练,这种调整很可能会对其他任务产生或正或负的影响。

  • 训练集本身存在的任务数据不平衡也是一个不可忽视的问题,某个任务占比大,那其它占比小的任务大概率效果也是不稳定的。

有两种方法应对这种挑战:

  • 不同任务独立训练模型:针对每个任务单独训练一个模型。当某个任务至关重要,且要求性能指标高度稳定时,这是不得不采用的方法。

  • 任务取舍与额外训练:例如,在四个任务中,若其中两个任务尤为重要,可以在全部任务训练完毕后,对这两个关键任务额外训练多一个 epoch。这种做法能最大程度地确保重要任务的效果。

Q5: SFT真的不能学到知识?

很遗憾的说,经过一年的实践和普遍的认知。常识和世界知识难以通过 SFT 灌输给模型。

SFT更应该关注激发模型在预训练中已学到的知识、让模型学习业务所需要的特定规则、以及输出格式稳定。

那么,何为常识和世界知识?例如,“2023年NBA总冠军是掘金”便属于世界知识。如果 LLM 的训练数据仅更新至2022年,那么它自然无法得知这一信息。

即便你的SFT数据中包含 “谁是2023年NBA总冠军?答案是掘金” 这样的问答对,训练后的模型可能只能回答这个语序的问题,而无法举一反三。比如,当你问“掘金在哪一年获得了NBA总冠军?”时,它无法回答“2023年”。

这种举一反三的能力需要模型在预训练阶段就接触过“2023年NBA总冠军是掘金”这类知识的多种不同文本表达,如这条知识在预训练文本中出现在不同的表述中(主动句、被动句、出现在新闻语料、出现在聊天对话语料等等等等)。因此,从这个角度看,SFT并不能学得常识、世界知识。

类似的研究可以看看这几篇论文https://arxiv.org/abs/2309.14316 、http://arxiv.org/abs/2309.14402

但这并不意味着我们应该放弃SFT。

相反,我们应当关注SFT在以下方面:

  • 激发预训练知识:虽然SFT不能直接学的新知识,但需要靠它激发模型在预训练中已学到的知识。

  • 稳定格式输出:通过SFT,我们可以训练模型以稳定的格式输出结果,便于线上的稳定。

  • 更遵循具体任务:如多标签多分类时,模型老输出一些不在标签体系的任务。

  • 学习业务逻辑:SFT能够教导模型特定的业务规则,如让他习得“买了 20 万以上的车算有钱人”。

Q6: 怎么科学挑选数据集?

众多论文如 LIMA、LLaMa2 和 Yi 等均印证了 ”Quality is all you need“ 的观点。对于大部分业务场景,50条~几百条数据足矣,本人倾向于让工程师与业务团队共同审核每条数据,并确保数据的多样性。数据挑选涉及几个场景:

  • 场景1 精简业务数据:随着业务的发展,各种任务数据会不断累积。当某个子任务的数据过于庞大时,可能会影响其他任务的泛化能力。因此,当数据量超过一定阈值时,我们需要剔除“冗余”数据。

  • 场景2 筛选开源数据:当面临新的业务场景却缺乏专用SFT训练数据时,我们需要从海量的开源数据中精准“筛选”出对该场景有益的数据作为训练集。

  • 场景3 诡探数据秘密:探索我们的训练集中哪些数据对具体的业务场景带来增益最大。

这些场景都引出了一个核心问题:“如何科学地筛选数据集?”关于这个问题,我在另一篇博文中进行了探讨。

Q7: 怎么解决幻觉问题

幻觉问题是影响业务精准度的一个重要因素,它常导致召回率尚可,精确率却偏低。

实际体验下来,不论开源还是闭源模型,都容易“过度联想”,从而在某些业务场景下无法使用。

一个例子:

某个任务是“根据网民的发帖记录判断该网民是否有孩子”,若网民帖子中仅提及“喜欢回家吃饭”,LLM模型却可能过度解读,推断出“此人有孩子,因为爱回家吃饭表明其顾家,很可能有家庭和孩子”。这种过度联想问题,通过修改提示语(如添加“请你做出判断时不要过度臆想”等限制)无法完全解决,它依然会影响的精确率,导致某些业务无法使用。

目前,尚缺乏完美的解决方案,但可以考虑通过SFT或当积累更多相关场景数据后尝试运用强化学习方法来改善。关于幻觉问题的更多探讨,可以参考以下的综述。https://dl.acm.org/doi/abs/10.1145/3571730。https://arxiv.org/abs/2311.05232。

不过,从另一个角度看,个人觉得”喜欢联想“(或者说喜欢 YY)不是大模型的缺点。毕竟,联想是人类创新、发掘新思路的源泉之一。

Q8: BERT 开发与 LLM 开发有什么不同之处?

相同点:

BERT模型所面临的问题,LLM同样可能会遭遇。例如:

  • 标签不平衡问题:在进行分类任务时,如果正反标签比例为8:2,无论是BERT还是LLM,模型都可能出现偏差。

  • 多任务平衡:在进行多任务学习时,任务之间的平衡同样重要,Q4对这一问题进行了讨论。

不同点:

  • 开发体验差异:当BERT遇到难以处理的情况时,可能需要标注50甚至上百条类似数据才能解决问题。而LLM则更为高效,往往仅需标注2~4条数据即可解决这一场景的 bad cases。在数据集需求上,BERT可能需要近万条数据才能达到理想效果,而LLM可能仅需不到1K的数据就能实现相似的效果。这使得LLM在迭代速度和效率上更具优势。

  • 模型规模调整策略不同:当BERT的效果不佳时,我们可能会尝试增加模型规模。然而,对于LLM来说,当效果达到预期时,我们反而会考虑减小模型规模,这主要是因为LLM的参数量通常非常庞大,越大的效率会越慢。

Q9: 该选什么微调方法, Full tuning\P-tuning\Lora?

经过实际测试,发现在某些特定场景下,全量调优(full tuning)确实表现更佳,但优势并不明显。在数据量有限且应用场景不多的情况下,为了保持模型的泛化能力,Lora方法表现得最为稳定。考虑到泛化性,Lora已经足够应对大多数需求。

此外,DeepMind的一篇研究 SFT Scaling law 的论文中探讨了不同数据量下不同训练方式的效果及其对泛化性的影响。该研究指出,当数据量仅在几千条时,P-tuning是最佳选择;数据量在几千至万条之间时,Lora更为适合;而当数据量达到百万级别时,Full-tunning效果最佳。此外,使用 Full-tunning 会导致训练后的模型泛化性不如 Lora。当然,论文的实验任务是一个多语种的翻译任务,其它任务可能会不一样,但大概的趋势是这样。

因此在大多数场景下,我仍推荐使用Lora,因为稳定,效果不差,能尽可能保留模型原来的泛化性。

Q10: SFT 还有什么方面值得研究?

现在开源的 SFT 越来越完备了,SFT 需要做的东西越来越少,多做实验,快速迭代才是王道

  • 消除幻觉:对于依赖高精准率的应用来说,这是一个重要的解决方向。

  • 精选数据集和任务配比:现在更多是实验工程,期待有如 Less 等扎实的工作不断涌现。

  • 设置科学设计问答格式和 Data format:这是为了激发模型的最大潜能,这个可能要 model by model。

  • 探寻更高效的微调技巧:Lora表现出色且稳定,但仍在探索其他方法。Lora虽好,但仍有提升空间。目前已有一些如Lora+、PLora、PiSSA等工作的出现。

【★】浅谈大模型 SFT 的实践落地:10 问 10 答-知乎@周星星

**转载链接:**https://zhuanlan.zhihu.com/p/692892489

【4】大模型微调十诫:关于将微调模型部署到生产环境的十条建议-202405

**1.**切勿微调(Thou Shalt Not Fine-Tune)****:尽量写prompt,利用大模型本身的能力zeroshot,必要时辅以少量样本(few-shot examples)或检索增强生成(RAG)。微调成本高、速度慢且复杂,仅在确实需要时才进行。

注解:在一些接近大模型通用能力的场景上,随着模型基础能力的增强,微调的必要性越来越低。如果最近使用过gpt4o的接口的话,一定会被其拥有3.5的速度和4.5的效果震撼到,真的,如无必要,无需微调。

**2.**务必调调prompt(Thou Shalt Write a Freaking Prompt)****:用一个prompt创建一个baseline,并通过写prompt证明这个场景或者任务是可行的。如果写prompt就可以达到基本要求,那么微调可以进一步提升;如果prompt不起作用,微调成功的可能性就很低

注解:同第一条,相信大模型,如果你的任务与大模型本身的能力接近,不如好好调调prompt。

**3.**好好搞数据(Thou Shalt Review Thy Freaking Data)****:如果必须微调,确保你完全理解你的数据。大力修正问题数据。数据质量直接决定模型质量。

注解:数据决定了效果的上限,而模型能力只是逼近这个上限。这个机器学习老话,在大模型微调上同样适用。

**4.**用真实的数据(Thou Shalt Use Thy Actual Freaking Data)****:确保训练数据尽可能接近生产环境中模型将处理的数据。即使存在一些不完美的数据也没关系,只要整体分布一致和正确就可以。

注解:同上一条,同分布也是机器学习古老的训诫,在大模型微调中也是如此,有真实的数据,一定要用真实的数据,除非万不得已,再去蒸馏GPT4的数据。

**5.**必须保留测试集(Thou Shalt Reserve a Test Set)****:始终保留一部分数据用于测试,以评估模型的性能。

注解:就算评估是盲人摸象,你要带着尺子去摸。

6.必须选择合适的模型(Thou Shalt Choose an Appropriate Model):模型参数越多,训练就越昂贵且速度越慢。根据任务和预算选择适当的模型。不要使用过大的模型,也不要使用过小的模型。规模和参数量要匹配任务难度。

注解:参数量,数据量匹配任务难度,在所有的神经网络监督微调任务中都适用。

7.必须小步快跑评估(Thou Shalt Write Fast Evals):编写快速计算的评估指标,可以自动化计算的指标,不管是来源于规则或者模型,以便快速迭代。

注解:高频自动化评估,可以及时earlystop和监控模型异常,提高效率。小步快跑带给你更高频的刺激,从心理学上也应如此,干活儿更有干劲。

8.必须慢工细活评估(Also, Thou Shalt Write Slow Evals):花点时间编写更全面,更可靠的评估标准和评估指标,别管这些指标比较麻烦,设置要推理更大的reward模型,或者需要人工标注。都可以,目的是为了更深入地了解模型的性能。

注解:评估做不好的话,会影响实验效率,实验效率可以折算成单位时间的算力消耗, 可以推导出评估做不好 = 费钱费时。所以你做实验慢了,相当于比别人少了GPU。openai不仅仅卡多,还有实验效率倍增的buff,相当于 卡 * 效率倍数。

9.不要即发即弃(Thou Shalt Not Fire and Forget):不要执行一次性的模型训练后就结束。持续优化模型和pipeline。

注解:把流程串起来,形成pipeline,能更科学和高效地做事。

10.别太认真(Thou Shalt Not Take the Commandments Too Seriously):不要死板地遵循这些建议。根据具体情形调整建议的适用性。

注解:拥抱变化,大模型更应如此。尤其是有openai这样的存在。

【5】领域大模型-训练Trick&落地思考-202308

一、领域技术标准文档或领域相关数据是领域模型Continue PreTrain的关键。

现有大模型在预训练过程中都会加入书籍、论文等数据,那么在领域预训练时这两种数据其实也是必不可少的,主要是因为这些数据的数据质量较高、领域强相关、知识覆盖率(密度)大,可以让模型更适应考试。当然不是说其他数据不是关键,比如领域相关网站内容、新闻内容都是重要数据,只不过个人看来,在领域上的重要性或者知识密度不如书籍和技术标准。

二、领域数据训练后,往往通用能力会有所下降,需要混合通用数据以缓解模型遗忘通用能力。

如果仅用领域数据进行模型训练,模型很容易出现灾难性遗忘现象,通常在领域训练过程中加入通用数据。那么这个比例多少比较合适呢?目前还没有一个准确的答案,BloombergGPT(从头预训练)预训练金融和通用数据比例基本上为1:1,ChatHome(继续预训练)发现领域:通用数据比例为1:5时最优。个人感觉应该跟领域数据量有关,当数据量没有那多时,一般数据比例在1:5到1:10之间是比较合适的。

三、领域模型Continue PreTrain时可以同步加入SFT数据,即MIP,Multi-Task Instruction PreTraining。

预训练过程中,可以加下游SFT的数据,可以让模型在预训练过程中就学习到更多的知识。例如:T5、ExT5、Glm-130b等多任务学习在预训练阶段可能比微调更有帮助。并且ChatHome发现MIP效果在领域上评测集上绝群。

四、 仅用SFT做领域模型时,资源有限就用在Chat模型基础上训练,资源充足就在Base模型上训练。(资源=数据+显卡)

跟很多人讨论过一个问题,就是我们在SFT的时候是在Base模型上训练还是在Chat模型上训练。

其实很简单,如果你只有5k数据,建议你在Chat模型上进行微调;如果你有10w数据,建议你在Base模型上进行微调。因为你不知Chat模型在SFT时的数据质量如何,当自己有能力时,靠人不如靠己。

五、在Chat模型上进行SFT时,请一定遵循Chat模型原有的系统指令&数据输入格式。

如果你在Chat模型上进行SFT的时候,请跟Chat模型的输入格式一致,否则当你数据量不足时,可能会导致训练效果不明显。并且建议不采用全量参数训练,否则模型原始能力会遗忘较多。

六、领域评测集时必要内容,建议有两份,一份选择题形式自动评测、一份开放形式人工评测。

一定要有自己的领域数据集来验证模型效果,来选择最好的checkpoint。选择题形式可以自动评测,方便模型进行初筛;开放形式人工评测比较浪费时间,可以用作精筛,并且任务形式更贴近真实场景。

七、领域模型词表扩增是不是有必要的。

个人感觉,领域词表扩增真实解决的问题是解码效率的问题,给模型效果带来的提升可能不会有很大。(这里领域词表扩充是指在同语言模型上扩充词表,而不是英文模型的中文汉化)

八、所谓的领域大模型会更新的越来越快,越来越多。

由于很多人&公司并没有资源搞底座,因此需要在现有底座模型上进行增量预训练、微调等。而以目前各厂(ChatGLM、BaiChuan、Qwen、Llama)抢占开源社区占比的架势,感觉会有很多7B、13B级别模型开源。

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值